视图【View】和视图解析器【ViewResolver】对象
SpringMVC如何解析视图
-
1)不论处理器方法返回一个String,ModelAndView还是View,Spring MVC 都会在内部将它们转换成一个 ModelAndView 对象,由视图解析器解析视图,然后,进行页面的跳转。
-
2)Spring MVC 借助视图解析器(ViewResolver)得到最终的视图对象(View),最终的视图可以是 HTML ,也可能是JSP、 Excel、JFreeChart等各种表现形式的视图。
-
3)对于最终究竟采取何种视图对象对模型数据进行渲染,处理器并不关心,处理器工作重点聚焦在生产模型数据的工作上,从而实现 MVC 的充分解耦。
1 视图解析器对象【ViewResolver】
-
作用:将视图【View】对象从ModelAndView中解析出来
-
1)视图解析器的作用比较单一:将逻辑视图解析为一个具体的视图对象。
-
2)所有的视图解析器都必须实现 ViewResolver 接口
-
3)可以在 SpringMVC 上下文中配置一种或多种解析器,每个视图解析器都实现了 Ordered 接口并开放出一个 order 属性,可以通过 order 属性指定解析器的优先顺序,order 越小优先级越高。例如在springmvc.xml中配置的【ThymeleafViewResolver】解析器
-
4)SpringMVC 会按视图解析器顺序的优先顺序对逻辑视图名进行解析,直到解析成功并返回视图对象,否则将抛出 ServletException 异常。
2 视图对象【View】
-
作用
- 将数据共享到域中
- 跳转路径
-
1)视图的作用是渲染模型数据,将模型里的数据以某种形式呈现给客户。
-
2)视图对象由视图解析器负责实例化。由于视图是无状态的,所以他们不会有线程安全的问题。
-
3)为了实现视图模型和具体实现技术的解耦,Spring 在org.springframework.web.servlet 包中定义了一个高度抽象的 View 接口。
@RequestMapping("/responsedata")
public ModelAndView testResponseData(){
ModelAndView mv = new ModelAndView();
//为mv设置数据模型
mv.addObject("deptId",1001);
mv.addObject("deptName","秘书部门");
//为mv设置视图对象
mv.setViewName("success");
return mv;
}
mvc:view-controller标签
-
作用:匹配请求路径与逻辑视图名【如不需要处理业务,只希望跳转路径时,使用该标签】
-
注意:如添加当前标签,会导致@RequestMapping注解失效,此时需要添加如下标签解决问题:
<mvc:view-controller path="/" view-name="index"></mvc:view-controller> <mvc:annotation-driven></mvc:annotation-driven>
SpringMVC重定向及静态资源加载问题
重定向语法
1)一般情况下,处理器方法返回字符串类型的值会被当成逻辑视图名处理。如果返回的字符串中带 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拦截,但是没有找到映射该请求的处理方法。
之前【JavaWeb】没有被拦截,现在被拦截原因:DispacherServlet配置URL是【/】,将tomcat->config->web.xml中的defaultServlet配置URL的【/】覆盖了。
解决方案,添加如下配置
<!--配置处理静态资源-->
<mvc:default-servlet-handler></mvc:default-servlet-handler>
<!--配置了处理静态资源之后也需要配置以下标签-->
<mvc:annotation-driven></mvc:annotation-driven>
mvc:default-servlet-handler说明
-
配置了该标签之后将在 SpringMVC 上下文中定义一个 DefaultServletHttpRequestHandler,它会对进入 DispatcherServlet 的请求进行筛查,如果发现是没有经过映射的请求,就将该请求交由 WEB 应用服务器默认的 Servlet 处理,如果不是静态资源的请求,才由 DispatcherServlet 继续处理。
-
如果WEB服务器中配置的Servlet的名字不是default,那么mvc:default-servlet-handler标签中需要显示指定Servlet的名称;如果是default可以省略不指定。
<mvc:default-servlet-handler default-servlet-name="WEB服务器中配置的Servlet的名称"></mvc:default-servlet-handler>