SpringMVC学习笔记(三)

SpringMVC(三)

视图和视图解析器
-请求处理方法执行完成后,最终返回一个ModelAndView对象。对于那些返回String,View或ModeMap等类型的处理方法,SpringMVC也会在内部将它们装配成一个ModelAndView对象,它包含了逻辑名和模型对象的视图
-SpringMVC借助视图解析器(ViewResolver)得到最终的视图对象(View),最终的视图可以是JSP,也可能是Excel、JFreeChart等各种表现形式的视图

  • 视图
    视图的作用是渲染模型数据,将模型里的数据以某种形式呈现给客户。视图对象由视图解析器负责实例化。由于视图是无状态的,所以他们不会有线程安全问题。
  • 视图解析器
    SpringMVC为逻辑视图名的解析提供了不同的策略,可以在Spring WEB上下文中配置一种或多种解析策略,并指定他们之间的先后顺序。每一种映射策略对应一个具体的视图解析器实现类。
    作用:将逻辑视图解析为一个具体的视图对象。
    所有的视图解析器都必须实现ViewResolver接口
  • InternalResourceViewResolver
    JSP是最常见的视图技术,可以使用InternalResourceViewResolver作为视图解析器:
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<!-- 前缀 -->
		<property name="prefix" value="/WEB-INF/views/"></property>
		<!-- 后缀 -->
		<property name="suffix" value=".jsp"></property>
	</bean>

作了解:
若项目中使用了JSTL,则SpringMVC会自动把视图由InternalResourceViewResolver转为JstlView。
若使用了JSTL的fmt标签则需要在SpringMVC的配置文件中配置国际化资源文件

<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="basename" value="i18n"/>
</bean>
value的值为资源文件前缀

若希望直接响应SpringMVC渲染的页面,可以使用mvc:view-controller标签实现(不经过handler)

<mvc:view-controller path="springmvc/testJstlView" view-name="success'/>

在实际开发中通常需要配置<mvc:annotation-driven标签一同使用(使得配置mvc:view-controller 后,之前的handler依然起作用)

<mvc:annotation-driven></mvc:annotation-driven>

-自定义视图

<!-- 配置BeanNameViewResolver视图解析器:使用视图的名字解析视图 -->
	<!-- 通过order属性来定义视图解析器的优先级,order值越小,优先级越高 -->
	<bean class="org.springframework.web.servlet.view.BeanNameViewResolver">
		<property name="order" value="100"></property>
	</bean>
  • 重定向
    一般情况下,控制器方法返回字符串类型的值会被当成逻辑视图名处理
    如果返回的字符串中带forward:或redirect:前缀时,SpringMVC会对他们进行特殊处理:将forward:和redirect:当成指示符,其后的字符串作为URL处理
    -redirect:success.jsp:会完成一个到success.jsp的重定向的操作
    -forward:success.jsp:会完成一个到success.jsp的转发操作

  • Spring表达标签

    <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
    
<form:form action="emp" method="POST" modelAttribute="employee">
...	  //注意,其中标签的path值对应html表单标签name属性值
</form>

通过SpringMVC的表单标签可以实现将模型数据中的属性和HTML表单元素相绑定,以实现表单数据更便捷编辑和表单值的回显。
注意:可以通过modelAttribute属性指定绑定的模型(bean)属性(默认为command)在向request域添加属性时添加,若没有指定该属性,则默认从request域对象中读取command的表单bean,如果该属性值也不存在,则会发生错误。

  • SpringMVC静态资源
    REST风格的资源URL不希望带.html或.do等后缀
    若将DispatcherServlet请求映射配置为 /,则SpringMVC将捕获WEB容器的所有请求,包括静态资源的请求,SpringMVC会将他们当成一个普通请求处理,因找不到对应处理器将导致错误。
    解决方法:
    可以在SpringMVC的配置文件中配置<mvc:default-servlet-handler/>的方式解决静态资源的问题:
    -mvc:default-servlet-handler/将在SpringMVC上下文中定义一个DefaultServletHttpRequestHandler,它会对进入DispatcherServlet的请求进行筛查,如果发现是没有经过映射的请求,就将该请求交由WEB应用服务器的默认Servlet处理,如果不是静态资源的请求,才由DispatcherServlet继续处理。
    -一般WEB应用服务器默认的Servlet的名称都是default。若所使用的WEB服务器的默认Servlet名称不是default,则需要通过default-servlet-name属性显示指定。
    注意:配合mvc:annotation-driven一同使用
    <!-- 设置配置方案 -->
    <mvc:annotation-driven/>
    	
    <!-- 使用默认的servlet来响应静态文件 -->
    <mvc:default-servlet-handler/>
  • SpringMVC数据绑定流程
    1、SpringMVC主框架将ServletRequest对象及目标方法的入参实例传递给WebDataBinderFactory实例,以创建DataBinder实例对象。
    2、DataBinder调用装配在SpringMVC上下文中的ConversionService组件进行数据类型转换、数据格式化工作。将Servlet中请求信息填充到入参对象中
    3、调用Validator组件对已经绑定了请求消息的入参对象进行数据合法性校验,并最终生成数据绑定结果BindingData对象
    4、SpringMVC抽取BindingResult中的入参对象和校验错误对象,将它们赋给处理方法的响应入参。

  • 自定义类型转换器(作了解)
    。。。。。。

  • mvc:annotation-driven
    <mvc:annotation-driven/>会自动注册RequestMappingHandlerMapping、RequestMappingHandlerAdapter与ExceptionHandlerExceptionResolver三个bean。
    还提供以下支持:
    -支持使用ConversionService实例对表单参数进行类型转换
    -支持使用@NumberFormatannotation、@DateTimeFormat注解完成数据类型的格式化
    -支持使用@Valid注解对JavaBean实例进行JSR303验证
    -支持使用@RequestBody和@ResponseBody注解

  • @InitBinder
    由@InitBinder标识的方法,可以对WebDataBinder对象进行初始化。WebDataBinder是DataBinder的子类,用于完成由表单字段到JavaBean属性的绑定
    -@InitBinder方法不能有返回值,它必须声明为void
    -@InitBinder方法的参数通常是WebDataBinder

猜你喜欢

转载自blog.csdn.net/zz60708320/article/details/83508625
今日推荐