1. 概述
在Spring中,提供View Resolver以使用模型中可用的数据来解析视图,而无需紧密绑定到View技术,无论是JSP,Velocity,JSON 还是 Thymeleaf ,Spring都可以根据需要轻松灵活地配置一个或多个View Resolvers。
2. Spring MVC 请求处理流程
在我们继续了解多个View Resolvers如何实现之前,我们看看 SpringMVC 是如何处理请求的流程:
- 传入请求来自web.xml,DispatcherServlet 并最终到达 Controller。
- Controller与应用程序层交互并准备Model。
- Controller返回ModelAndView,包含模型和视图名称。
- ViewResolver提供视图名称和实际视图之间的映射。
- View接口决定了展示View的技术。
- 然后将视图与模型数据一起呈现到浏览器上。
3.实施
让我们从pom依赖开始:
1 | <!-- Spring 3 dependencies --> |
web.xml中没有太大的变化。
1 |
|
这是 mvc-dispatcher-servlet,它定义了多个View Resolvers。
mvc-dispatcher-servlet.xml内容如下所示:
1 | <beans xmlns="http://www.springframework.org/schema/beans" |
请注意,配置的两个View Resolvers是InternalResourceViewResolver和 BeanNameViewResolver。我们还使用View Resolver 的order属性设置了优先级。因此 BeanNameViewResolver 具有更高的优先级。这意味着当返回ModelAndView对象时, BeanNameViewResolver将使用返回的视图名称检查可用的bean视图。如果找到匹配的bean视图,则呈现它。如果没有,则下一个View Resolver即 InternalResourceViewResolver尝试解析,同样检查具有ModelAndView返回的视图名称的JSP 。如果找到,则呈现视图。但如果没有,并且层次结构中没有更多View Resolvers,则抛出适当的异常。
继续实现,我们先定义一个 Employee 实体类:
1 | public class Employee { |
接下来是 EmployeeController:
1 |
|
然后写一个JSP(employeeDetails.jsp):
1 | <%"text/html" pageEncoding="UTF-8"%> contentType= |
4. 运行验证
当我们运行应用程序时,我们看到如下的界面:
请注意,我们没有任何名为employeeDetails的 bean,而是与实际的JSP视图文件employeeDetails.jsp匹配。因此,视图将作为JSP解析。
现在让我们将视图名称设置为 jsonView 返回(我们之前的 XML 配置中有一个 jsonView 的
Bean),修改 Controller 中的视图名称:
1 | modelAndView.setViewName("jsonView"); |
BeanNameViewResolver 优先级更高,所以这次查找到名为 jsonView 的Bean视图并完成解析,而不是呈现JSP视图,相同的URI现在返回一个JSON。