一、springmvc如何解析视图
- 不论处理器方法返回一个String、ModelAndView还是View,Sping MVC 都会在内部将他们转换成一个ModelAndView对象,由视图解析器解析视图,然后,进行页面的跳转.
- Spring MVC借助视图解析器(ViewResolver)得到的最终视图对象(View),最终的视图可以是Html、jsp、Excel、JFreeChart等的各种表现形式的视图。
- 对于最终究竟采取何种视图对象对模型数据进行渲染,处理器并不关心,处理器工作重点聚焦在生产模型数据的工作上,从而实现 MVC 的充分解耦。
二、视图解析器
- 视图解析器的作用比较单一:将逻辑视图解析为一个具体的视图对象。
- 所有的视图解析器都必须实现 ViewResolver 接口
- 可以在 SpringMVC 上下文中配置一种或多种解析器,每个视图解析器都实现了 Ordered 接口并开放出一个 order 属性,可以通过 order 属性指定解析器的优先顺序,order 越小优先级越高。
- SpringMVC 会按视图解析器顺序的优先顺序对逻辑视图名进行解析,直到解析成功并返回视图对象,否则将抛出 ServletException 异常。
三、视图
- 视图的作用是渲染模型数据,将模型里的数据以某种形式呈现给客户。
- 视图对象由视图解析器负责实例化。由于视图是无状态的,所以他们不会有线程安全的问题。
- 为了实现视图模型和具体实现技术的解耦,Spring 在org.springframework.web.servlet 包中定义了一个高度抽象的 View 接口。
四、mvc:view-controller标签
如果希望不通过处理器的方法直接响应SpringMVC渲染的页面,则可以使用 mvc:view-controller 标签实现。
1)在SpringMVC的配置文件中配置mvc:view-controller标签
<!--配置不经过处理器方法直接响应的页面-->
<mvc:view-controller path="/testViewController" view-name="success"></mvc:view-controller>
2)配置了以上标签之后会导致其他请求路径都失效,还需要配置以下标签(后面的内容再讲述具体原因),而且在实际的开发中我们也都要配置以下标签。
<mvc:annotation-driven></mvc:annotation-driven>
五、重定向与请求转发
- 一般情况下,处理器方法返回字符串类型的值会被当成逻辑视图名处理。如果返回的字符串中带 forward: 或 redirect: 前缀时,SpringMVC 会对他们进行特殊处理:将 forward: 和 redirect: 当成指示符,其后的字符串作为 URL 来处理。
- redirect:/prefix_test.html:会完成一个到 prefix_test.html 的重定向的操作。
- forward:/prefix_test.html:会完成一个到 prefix_test.html 的转发操作。
这样直接写会报错、下面介绍处理静态资源中会解决
@RequestMapping("/testRedirect")
public String testRedirect(){
System.out.println("测试重定向");
// return "forward:/prefix_test.html"; //转发到prefix_test.html页面
return "redirect:/prefix_test.html"; //重定向到prefix_test.html页面
}
六、处理静态资源
- 直接手动转发或重定向到html页面时会出现404。
- 原因是请求静态资源html文件的请求被DispacherServlet拦截,但是没有找到映射该请求的处理方法,但是请求静态资源本来就不需要创建处理请求的方法,所以我们需要在SpringMVC的配置文件中添加如下配置:
<!--配置处理静态资源-->
<mvc:default-servlet-handler></mvc:default-servlet-handler>
<!--配置了处理静态资源之后也需要配置以下标签-->
<mvc:annotation-driven></mvc:annotation-driven>