SpringMVC --- 视图

一、简介

    SpringMVC的视图有View和ViewResolver共同来完成。在标有ReqeustMapping注解的函数中返回的情况有:String,Model,ModelAndView等多种情况。不管是哪种情况,都会最终转变为ModelAndView,然后通过ViewResolver最终转换为View
(SpringMVC中的视图就是View接口,其作用就是渲染数据,将模型Model中的数据展示给用户。)

二、常见视图

SpringMVC视图的种类有很多,默认的有转发视图(InternalResourceView)和重定向视图(RedirectView),工程引入了 jstl 依赖,转发视图就会自动转换成 jstlView(特殊的转发视图)。

1. 转发视图

   在SpringMVC中转发视图默认就是 InternalResourceView,如果工程引入了 jstl 依赖,转发视图就会自动转换成 jstlView。

SpringMVC创建转发视图的方式:

 当控制器方法中所返回的视图名称以 "forward:" 为前缀的时候,创建InternalResourceView视图,此时视图名称不会被SpringMVC配置文件中所配置的视图解析器所解析,而是将前缀去掉,将剩余部分作为路径去解析,通过转发的方式实现跳转。

//作为示例页面
@RequestMapping("/templates")
public String helloTemp(){
    return "servlet-yu";
}
//通过视图转发的方式进行跳转
@RequestMapping("/interView")
public String interView(){
    return "forward:/templates";
}

   可以看见我访问 /templates路径会显示 servlet-yu.html页面,我在访问 /interView路径的时候方法返回的是一个路径,经过转发的方式重新按照新的路径找寻视图进行加载返回给浏览器显示。

   转发过程: 客户端浏览器发送http请求 → web服务器接受此请求 → 调用内部的一个方法在容器内部完成请求处理和转发动作 → 将目标资源发送给客户。

2. 重定向视图

   SpringMVC中默认的重定向视图是 RedirectView

SpringMVC视图重定向的方式:

   当控制器方法中做设置的视图名称以 "redirect: "为前缀时,创建RedirectView视图,此时视图名称不会被SpringMVC配置文件中的视图解析器所解析,而是会将前缀 "redirect: "去掉,將剩余部分最为新路径通过重定向的方式实现跳转。(重定向是重定向一个请求路径给浏览器,重新访问,而不是重定向一个视图。)

//通过重定向的方式进行跳转
@RequestMapping("/redirectView")
public String redirectView(){
    return "redirect:/templates";
}

   这里注意 第二张图片的访问路径是 localhost:8090/redirectView  但是访问后路径就会自动变换成 方法返回的路径,浏览器接收后,从新发送请求访问。

  重定向过程: 客户端浏览器发送http请求 → web服务器接收后发送30X状态码响应及对应新的location给客户浏览器 → 客户浏览器发现是30X响应,则自动再发送一个新的http请求,请求url是新的location地址 → 服务器根据此请求寻找资源并发送给客户。

3. 集成的第三方视图(Thymeleaf为例)

  首先你要引入Thymeleaf的依赖,并且在spring.xml文件中配置Thymeleaf视图解析器

  当控制器方法中设置的视图名称没有任何前缀是,此时的视图名称就会被SpringMVC配置文件中配置的视图解析器所解析,视图名称拼接视图的前缀和后缀得到新的路径,通过转发的方式实现跳转。

//作为示例页面 -- 
@RequestMapping("/templates")
public String helloTemp(){
    return "servlet-yu";
}

   直接获取了视图的名称,通过跳转加载页面

4. 视图控制器 view-controller

   当控制器方法中,仅仅用来实现页面跳转,只需要设置视图名称时,可以将处理器方法使用view-controller标签进行标识。

<!--
path :设置处理的请求地址
view-name :设置请求地址所对应的视图名称
-->
<mvc:view-controller path = "/templates " view-name = "servlet-yu " ></mvc:view-controller>
<!--
 我一旦设置这个控制器,就可以不用再后端写 /templates这个路径对应的方法,也可以直接访问servlet-yu页面
 在什么情况下使用,在请求映射方法中没有其他请求映射处理,只需要一个视图名称时,就可以使用,
SpringMVC 中设置任何一个 view-controller 时,其他控制器中的请求映射将全部失效,此时需要在SpringMVC 的核心配置文件中设置开启 mvc 注解驱动的标签:
<mvc:annotation-driven />
-->

5. 转发和重定向的区别

  转发: 浏览器发起了一次请求(在服务器内部跳转),可以获取请求域中的数据(因为是同一个request域对象),可以访问WEB-INF下的资源,不可以跨域访问(服务器内部方法无法跨域访问,浏览器可以跨域访问)。

 重定向: 浏览器发起两次请求,第一次访问servlet,第二次访问的是重定向的路径,不可以获取请求域中的数据(两次请求的request域对象不是同一个),不可以访问WEB-INF下的资源(因为WEB-INF下的资源具有安全性、隐藏性,只有服务器内部方法才可以访问,浏览器不可以直接访问),可以跨域访问。

三、视图解析器

   不论控制器(就是我们使用@Controller注解标记的类)返回的是String,ModelAndView,View数据SpringMVC都会转换为ModelAndView对象,ModelAndView对象(包含了逻辑名和模型对象的视图)由视图解析器解析成视图对象,然后解析,进行页面的跳转。
   视图解析器的作用:
  • 将逻辑视图解析为一个具体的视图对象。
  • 在SpringMVC 中为逻辑视图名的解析提供了不同的策略,可以在 Spring WEB 上下文中配置一种或多种解析策略,并指定他们之间的先后顺序。
  • 每一种映射策略对应一个具体的视图解析器实现类。
  • 所有的视图解析器都必须实现 ViewResolver 接口。
  • 可以选择一种视图解析器或混用多种视图解析器使用,每个视图解析器都实现了 Ordered 接口并开放出一个 order 属性,可以通过 order 属性指定解析器的优先顺序,order 越小优先级越高。
  • SpringMVC 会按视图解析器顺序的优先顺序对逻辑视图名进行解析,直到解析成功并返回视图对象,否则将抛出 ServletException 异常。
JSP 是最常见的视图技术,可以使用 InternalResourceViewResolve作为视图解析器。
  

 

 在SpringMVC.XML中配置视图解析器 , 以thymeleaf为例。

<!--扫描组件: 自动扫描包下被注解标识的类-->
<context:component-scan base-package="com.kk.controller"></context:component-scan>
<!--配置视图解析器  此处以Thymeleaf为例-->
<bean id="viewResolver" class="org.thymeleaf.spring5.view.ThymeleafViewResolver">
    <property name="order" value="1"/>
    <property name="characterEncoding" value="UTF-8"/>
    <property name="templateEngine">
        <bean class="org.thymeleaf.spring5.SpringTemplateEngine">
            <property name="templateResolver">
                <bean class="org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver">
                    <!--视图前缀-->
                    <property name="prefix" value="/WEB-INF/templates"/>
                    <!--视图后缀-->
                    <property name="suffix" value=".html"/>
                    <property name="templateMode" value="HTML5"/>
                    <property name="characterEncoding" value="UTF-8"/>
                </bean>
            </property>
        </bean>
    </property>
</bean>
<!--处理静态资源,例如html、js、css、jpg
    若只设置该标签,则只能访问静态资源,其他请求则无法访问
    此时必须设置<mvc:annotation-driven/>标签来解决问题-->
<!--<mvc:default-servlet-handler/>-->
<!--开启mvc注解驱动-->
<!--<mvc:annotation-driven>
    <mvc:message-converters>
        <bean class="org.springframework.http.converter.StringHttpMessageConverter">
           <property name="defaultCharset" value="utf-8"/>
            <property name="supportedMediaTypes">
                <list>
                    <value>/html</value>
                    <value>application/json</value>
                </list>
            </property>
        </bean>
    </mvc:message-converters>
</mvc:annotation-driven>-->


版权声明:本文为weixin_58668484原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。