SpringMVC视图解析与配置(六)
视图解析
-
SpringMVC如何解析视图
-
不论控制器返回一个String, ModelAndView, View都会转换为 ModelAndView对象, 由视图解析器解析视图, 然后, 进行页面的跳转.
- 视图和视图解析器
-
请求处理方法执行完成后, 最终返回一个ModelAndView对象. 对于那些返回String, View或Model/Map等类型的处理方法, SpringMVC 也会在内部将它们装配成一个ModelAndView对象, 它包含了逻辑名和模型对象的视图.
-
SpringMVC借助视图解析器(ViewResolver)得到最终的视图对象, 最终的视图可以是JSP, 也可能是Excel, JFreeChart等各种表现形式的视图.
-
对于最终究竟采取何种视图对象对模型数据进行渲染, 处理器并不关心, 处理器工作重点聚焦在生产模型数据的工作上, 从而实现MVC的充分解耦.
- 视图
-
视图的作用是处理模型数据, 实现页面跳转(转发, 重定向)
-
为了实现视图模型和具体实现技术的解耦, Spring 在org.springframework.web.servlet包中定义了一个高度抽象的View接口
-
视图对象由视图解析器负责实例化. 由于视图是无状态的, 所以他们不会有线程安全的问题.
-
常用的视图实现类
- 视图解析器
-
SpringMVC为逻辑视图名的解析提供了不同的策略, 可以在SpringMVC上下文中配置一种或多种解析策略, 并指定他们之间的先后顺序. 每一种映射策略对应一个具体的视图解析器实现类.
- 视图解析器的作用比较单一: 将逻辑视图解析为一个具体的视图对象.
- 所有的视图解析器都必须实现ViewResolver接口
- 常见的视图解析器实现类
- 可以选择一种视图解析器或混用多种视图解析器.
- 每个视图解析器都实现了Ordered接口并开放出一个order属性, 可以通过order属性指定解析器的优先顺序, order越小优先级越高.
- SpringMVC会按视图解析器顺序的优先顺序对逻辑视图名进行解析, 直到解析成功并返回视图对象, 否则抛出ServletException异常.
- 转发与重定向
- 一般情况下, 控制器方法返回字符串类型的值会被当成逻辑视图名处理.
- 若返回的字符串中带有forward:或redirect:前缀时, Spring会进行特殊处理.
- 将forward:和redirect:当成指示符, 其后的字符串作为URL来处理.
- 例如
- redirect:success.jsp 会完成一个到success.jsp的重定向操作.
- forward:success.jsp 会完成一个到success.jsp的转发操作.
配置问题
-
SpringMVC指定配置
-
指定配置文件位置和名称
- 在web.xml中的<init-param>标签配置.
- contextConfigLocation是上下文配置路径, 用来设置SpringMVC配置文件的位置及名称.
- classpath: 前缀后写的是类路径
<init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:springMVC.xml</param-value> </init-param>
-
设置servlet的加载时间
-
默认是在第一次访问时加载.
-
在<servlet>中使用<load-on-startup>标签, 会将servlet的加载时间提前到项目启动时.
-
该标签中可以写整数, 但写负整数和0没效果.
-
值越小, 优先级越高.
<load-on-startup>1</load-on-startup>
-
- 编码过滤器
- 在前端页面写入中文, 传到后端后可能出现乱码问题, 所以需要使用编码过滤器来解决
-
编码过滤器必须在web.xml中第一个配置.
-
核心类是CharacterEncodingFilter
-
要在<filter>的<init-param>中配置encoding属性
<filter> <filter-name>CharacterEncodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>CharacterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
-
- 综合配置web.xml
- 必须先配置编码过滤器
<filter> <filter-name>CharacterEncodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>CharacterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
- 配置HiddenHttpMethodFilter过滤器
<filter> <filter-name>HiddenHttpMethodFilter</filter-name> <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class> </filter> <filter-mapping> <filter-name>HiddenHttpMethodFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
- 配置前端控制器, 并指定配置文件路径conf/springMVC.xml
<servlet> <servlet-name>springDispatcherServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <!-- 这个springMVC.xml应该创建在resources目录下 --> <param-value>classpath:springMVC.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>springDispatcherServlet</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
- 必须先配置编码过滤器
- SpringMVC配置文件中整合thymeleaf模板引擎
- 除了要导入Spring, SpringMVC必须的依赖, 还需导入
<dependency> <groupId>org.thymeleaf</groupId> <artifactId>thymeleaf-spring5</artifactId> <version>3.0.9.RELEASE</version> </dependency>
- 在springMVC.xml中加入如下配置
<!-- templateResolver的characterEncoding和viewResolver的都要设置成UTF-8中文才不会乱码 --> <bean id="templateResolver" class="org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver"> <property name="prefix" value="/templates/"></property> <property name="suffix" value=".html"></property> <property name="characterEncoding" value="UTF-8"></property> <property name="order" value="1"></property> <property name="templateMode" value="HTML5"></property> <!-- 这里要设置成false, 否则看不到实时的页面数据 --> <property name="cacheable" value="false"></property> </bean> <bean id="templateEngine" class="org.thymeleaf.spring5.SpringTemplateEngine"> <property name="templateResolver" ref="templateResolver"></property> </bean> <bean id="viewResolver" class="org.thymeleaf.spring5.view.ThymeleafViewResolver"> <property name="templateEngine" ref="templateEngine"></property> <property name="characterEncoding" value="UTF-8"></property> </bean>
- 这样就能使用thymeleaf了.