SpringMVC视图解析与配置(六)

视图解析

  • SpringMVC如何解析视图
  1. 不论控制器返回一个String, ModelAndView, View都会转换为 ModelAndView对象, 由视图解析器解析视图, 然后, 进行页面的跳转.
  • 视图和视图解析器
  1. 请求处理方法执行完成后, 最终返回一个ModelAndView对象. 对于那些返回String, View或Model/Map等类型的处理方法, SpringMVC 也会在内部将它们装配成一个ModelAndView对象, 它包含了逻辑名和模型对象的视图.
  2. SpringMVC借助视图解析器(ViewResolver)得到最终的视图对象, 最终的视图可以是JSP, 也可能是Excel, JFreeChart等各种表现形式的视图. 
  3. 对于最终究竟采取何种视图对象对模型数据进行渲染, 处理器并不关心, 处理器工作重点聚焦在生产模型数据的工作上, 从而实现MVC的充分解耦.
  • 视图
  1. 视图的作用是处理模型数据, 实现页面跳转(转发, 重定向)
  2. 为了实现视图模型和具体实现技术的解耦, Spring 在org.springframework.web.servlet包中定义了一个高度抽象的View接口
  3. 视图对象由视图解析器负责实例化. 由于视图是无状态的, 所以他们不会有线程安全的问题.
  4. 常用的视图实现类
  • 视图解析器
  1. SpringMVC为逻辑视图名的解析提供了不同的策略, 可以在SpringMVC上下文中配置一种或多种解析策略, 并指定他们之间的先后顺序. 每一种映射策略对应一个具体的视图解析器实现类.
  2. 视图解析器的作用比较单一: 将逻辑视图解析为一个具体的视图对象.
  3. 所有的视图解析器都必须实现ViewResolver接口
  4. 常见的视图解析器实现类
    • 可以选择一种视图解析器或混用多种视图解析器.
    • 每个视图解析器都实现了Ordered接口并开放出一个order属性, 可以通过order属性指定解析器的优先顺序, order越小优先级越高.
    • SpringMVC会按视图解析器顺序的优先顺序对逻辑视图名进行解析, 直到解析成功并返回视图对象, 否则抛出ServletException异常.
  • 转发与重定向
  1. 一般情况下, 控制器方法返回字符串类型的值会被当成逻辑视图名处理.
  2. 若返回的字符串中带有forward:redirect:前缀时, Spring会进行特殊处理.
    • 将forward:和redirect:当成指示符, 其后的字符串作为URL来处理.
    • 例如
      • redirect:success.jsp 会完成一个到success.jsp的重定向操作.
      • forward:success.jsp 会完成一个到success.jsp的转发操作.

配置问题

  • SpringMVC指定配置
  1. 指定配置文件位置和名称
    • 在web.xml中的<init-param>标签配置.
    • contextConfigLocation是上下文配置路径, 用来设置SpringMVC配置文件的位置及名称.
    • classpath: 前缀后写的是类路径
      <init-param>
           <param-name>contextConfigLocation</param-name>
           <param-value>classpath:springMVC.xml</param-value>
      </init-param>
  2. 设置servlet的加载时间
    • 默认是在第一次访问时加载.
    • 在<servlet>中使用<load-on-startup>标签, 会将servlet的加载时间提前到项目启动时.
    • 该标签中可以写整数, 但写负整数和0没效果. 
    • 值越小, 优先级越高.
      <load-on-startup>1</load-on-startup>
  • 编码过滤器
  1. 在前端页面写入中文, 传到后端后可能出现乱码问题, 所以需要使用编码过滤器来解决
  2. 编码过滤器必须在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模板引擎
  1. 除了要导入Spring, SpringMVC必须的依赖, 还需导入
            <dependency>
                <groupId>org.thymeleaf</groupId>
                <artifactId>thymeleaf-spring5</artifactId>
                <version>3.0.9.RELEASE</version>
            </dependency>
  2. 在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>
  3. 这样就能使用thymeleaf了.
posted @ 2020-06-05 18:24  yellowstreak  阅读(537)  评论(0编辑  收藏  举报