SpringMVC 视图解析器

来源:互联网 发布:2016酒店业数据 编辑:程序博客网 时间:2024/06/05 23:52
1.SpringMVC如何解析视图概述:
     不论控制器返回一个String,ModelAndView,View,Map都会转换为ModelAndView对象,由视图解析器解析视图,然后,进行页面的跳转。  

2.视图解析器
     请求处理方法执行完成后,最终返回一个 ModelAndView 对象。对于那些返回 String,View 或 ModeMap 等类型的处理方法,Spring MVC 也会在内部将它们装配成一个 ModelAndView 对象,它包含了逻辑名和模型对象的视图 。
     Spring MVC 借助视图解析器(ViewResolver)得到最终的视图对象(View),最终的视图可以是 JSP ,也可能是 Excel、JFreeChart等各种表现形式的视图 。
     对于最终究竟采取何种视图对象对模型数据进行渲染,处理器并不关心,处理器工作重点聚焦在生产模型数据的工作上,从而实现 MVC 的充分解耦 。

3.视图
     视图的作用是渲染模型数据,将模型里的数据以某种形式呈现给客户。
     为了实现视图模型和具体实现技术的解耦,Spring 在 org.springframework.web.servlet 包中定义了一个高度抽象的 View 接口。
     视图对象由视图解析器负责实例化。由于视图是无状态的,所以他们不会有线程安全的问题 。

4.常用视图的实现类


5.视图解析器
     SpringMVC 为逻辑视图名的解析提供了不同的策略,可以在 Spring WEB 上下文中配置一种或多种解析策略,并指定他们之间的先后顺序。每一种映射策略对应一个具体的视图解析器实现类。
     视图解析器的作用比较单一:将逻辑视图解析为一个具体的视图对象。
     所有的视图解析器都必须实现 ViewResolver 接口。

6.常用的视图解析器实现类

     SpringMVC 会按视图解析器顺序的优先顺序对逻辑视图名进行解析,直到解析成功并返回视图对象,否则将抛出 ServletException 异常     程序员可以选择一种视图解析器或混用多种视图解析器 ,
每个视图解析器都实现了 Ordered 接口并开放出一个 order 属性,可以通过 order 属性指定解析器的优先顺序,order  越小优先级越高。
     InternalResourceViewResolver :JSP 是最常见的视图技术,可以使用 InternalResourceViewResolve作为视图解析器:

7.mvc:view-controller标签
     对应WEB-INF目录下面的JSP页面,我们知道是不能直接使用URL访问到。需要通过转发的方式,而我们一般都是在控制器中做转发映射,对应一些我们不需要其他操作的JSP页面,我们可以使用<mvc:view-controller path=""/>来配置,这样就可以不用再控制器中再去做转发映射。
     如果想要在请求页面直接去目标页面而不经过核心控制器,只需要在springmvc.xml中做如下配置:
<!-- 直接配置响应的页面:无需经过控制器来执行结果,path是请求视图的名字,view-name 是跳转成功页面的路径--><mvc:view-controller path="/success" view-name="success"/>
     配置<mvc:view-controller>会导致其他请求路径失效
<!-- 在实际开发过程中都需要配置mvc:annotation-driven标签。 --><mvc:annotation-driven/>
8.转发和重定向:
     一般情况下,控制器方法返回字符串类型的值会被当成逻辑视图名处理,如果返回的字符串中带 forward: 或 redirect: 前缀时,SpringMVC 会对他们进行特殊处理:将 forward 和 redirect:当成指示符,其后的字符串作为 URL 来处理
     redirect:success.jsp:会完成一个到 success.jsp 的重定向的操作
     forward:success.jsp:会完成一个到 success.jsp 的转发操作
    ② 定义页面链接
<a href="springmvc/testRedirect">testRedirect</a>
    ③ 定义控制器方法
@RequestMapping("/testRedirect")public String testRedirect(){     System.out.println("testRedirect");     return "redirect:/index.jsp";     //return "forward:/index.jsp";}
        通过转发可以直接去WEB-INF 下的目标页面,而通过重定向是不能直接去目标页面的,因为 WEB-INF下的内容不能被浏览器端直接访问。