SpringMVC的ViewResolver

本文介绍Spring MVC中如何配置多个ViewResolver实现视图查找,并解释DispatcherServlet如何按优先级顺序调用它们。还讨论了不同类型的ViewResolver及其优先级设置。

http://blog.youkuaiyun.com/prince2270/article/details/5891085


24.4.2 ViewResolver查找序列(Chain Of ViewResolver)

虽然我们在之前的示例中一直都是使用一个InternalResourceViewResolver进行视图查找,但这并不意味着每个基于Spring MVC的Web应用程序只能使用一个ViewResolver。实际上,Dispatcher- Servlet不但可以接受多个HandlerMapping以处理Web请求到具体Handler的映射,也可以接受多个ViewResolver以处理视图的查找。

DispatcherServlet初始化时,将根据类型扫描自己的WebApplicationContext中定义的ViewResolver。如果查找到存在多个ViewResolver的定义,DispatcherServlet将根据这些ViewResolver的优先级进行排序,然后当需要根据逻辑视图名查找具体的View实例的时候,将按照排序后的顺序遍历这些ViewResolver,只要期间任何一个ViewResolver返回非空的View实例,当前查找即告结束。如果DispatcherServlet没能在当前的WebApplicationContext中找到任何的ViewResolver定义,它将使用InternalResourceViewResolver作为默认的ViewResolver使用。

ViewResolver的优先级的指定使用Ordered接口作为标准,这已经成为Spring框架内设定优先级方式的惯例了。假设我们希望主要使用ResourceBundleViewResolver进行逻辑视图名到具体View实例的查找,如果没能找到,再寻求InternalResourceViewResolver的帮助。我们可以在Dispatcher- Servlet的WebApplicationContext中添加如下配置内容:

  1. <bean id="resourceBundleViewResolver" ?  
  2. class="org.springframework.Web.servlet.view.
    ResourceBundleViewResolver"
    >  
  3.     <property name="order" value="1"></property>  
  4. </bean>  
  5.  
  6. <bean id="viewResolver" ?  
  7. class="org.springframework.Web.servlet.view.
    InternalResourceViewResolver"
    >  
  8.     <property name="prefix" value="/WEB-INF/jsp/"/>  
  9.     <property name="suffix" value=".jsp"/>  
  10. </bean> 

相应ViewResolver的bean定义对应的id或者name属性值是任意的,DispatcherServlet将按照类型来获取ViewResolver。如果没有为某个ViewResolver指定order值的话,默认值为Integer.MAX_ VALUE,对应的是最低优先级。

如果为DispatcherServlet指定多个ViewResolver的话,不要给予InternalResour- ceViewResolver以及其他UrlBasedViewResolver子类过高的优先级,因为这些ViewResolver即使找不到相应的视图,也不会返回null以给我们轮询下一个ViewResolver的机会,这样,我们所指定的其他ViewResolver实际上就形同虚设。合理的处理方式是,给予ResourceBundleView- Resolver或者XmlViewResolver这种能够通过返回null以表明无法找到相应视图的ViewResolver较高的优先级,而只是将InternalResourceViewResolver(或者其他类似行为的ViewResolver)添加为最低优先级ViewResolver,以作为DispatcherServlet的后备查找对象。


### ViewResolver的作用 在Spring MVC中,`ViewResolver` 是一个重要的组件,用于解析视图名称并返回相应的视图对象。其主要作用是将控制器返回的逻辑视图名称转换为实际的物理视图资源(如JSP页面、Thymeleaf模板等)。通过配置 `ViewResolver`,可以定义视图的前缀和后缀,从而简化视图的管理和使用[^4]。 例如,以下是一个配置 `InternalResourceViewResolver` 的示例: ```java @Configuration @EnableWebMvc public class MvcConfig implements WebMvcConfigurer { @Bean public ViewResolver viewResolver() { InternalResourceViewResolver resolver = new InternalResourceViewResolver(); resolver.setPrefix("/WEB-INF/views/"); resolver.setSuffix(".jsp"); return resolver; } } ``` 在这个例子中,控制器方法返回的逻辑视图名称会被解析为 `/WEB-INF/views/` 目录下的 `.jsp` 文件。 ### ResponseEntity的作用 `ResponseEntity` 是 Spring MVC 中用于构建 HTTP 响应的类,它可以包含响应体、状态码和响应头。与 `ViewResolver` 不同,`ResponseEntity` 主要用于直接返回数据而不是视图名称。这在构建 RESTful Web 服务时非常有用,因为它允许开发者完全控制 HTTP 响应的内容和格式。 例如,以下是一个使用 `ResponseEntity` 返回 JSON 数据的示例: ```java @GetMapping("/data") public ResponseEntity<String> getData() { String data = "{\"message\": \"Hello, World!\"}"; return ResponseEntity.ok().header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON).body(data); } ``` 在这个例子中,`ResponseEntity` 被用来返回一个包含 JSON 数据的 HTTP 响应。 ### 区别与联系 - **区别**: - `ViewResolver` 主要用于解析视图名称并将请求转发到相应的视图资源,适用于传统的 MVC 应用程序。 - `ResponseEntity` 主要用于构建自定义的 HTTP 响应,适用于需要直接返回数据的 RESTful Web 服务[^3]。 - **联系**: - 在某些情况下,`ResponseEntity` 可以与 `ViewResolver` 结合使用。例如,可以通过 `ResponseEntity` 返回一个 HTML 页面的字符串内容,但这通常不如直接使用 `ViewResolver` 高效。 - 当控制器方法返回 `ResponseEntity` 时,Spring MVC 会跳过视图解析过程,直接使用 `ResponseEntity` 中定义的响应内容[^2]。 ### 示例代码 以下是一个简单的控制器示例,展示了如何使用 `ViewResolver` 和 `ResponseEntity`: ```java @Controller public class ExampleController { @GetMapping("/view") public String showView() { return "home"; // 这里的"home"会被ViewResolver解析为"/WEB-INF/views/home.jsp" } @GetMapping("/response") public ResponseEntity<String> showResponse() { return ResponseEntity.ok("This is a response body"); } } ``` 在上面的例子中,`showView` 方法返回一个逻辑视图名称,而 `showResponse` 方法返回一个 `ResponseEntity` 对象,直接提供 HTTP 响应内容。 ### 总结 `ViewResolver` 和 `ResponseEntity` 在 Spring MVC 中各有其用途。`ViewResolver` 用于解析视图名称并将请求转发到相应的视图资源,而 `ResponseEntity` 用于构建自定义的 HTTP 响应。理解它们的区别和联系有助于更好地设计和实现 Spring MVC 应用程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值