请求处理方法执行完成后,最终返回一个 ModelAndView 对象。对于那些返回 String、View 或 ModelMap 等类型的处理方法,Spring MVC 也会在内部将它们装配成一个 ModelAndView 对象,该对象包含了视图逻辑名和模型对象的信息。
Spring MVC 借助视图解析器(ViewResolver)得到最终的视图对象(View),这可能是我们常见的 JSP 视图,也可能是一个基于 FreeMarker、Velocity 模板技术的视图,还可能是 PDF、Excel、XML、JSON 等各种形式的视图。
对于最终究竟采取何种视图对象对模型数据进行渲染,处理器并不关心,处理器的工作重点聚焦在生产模型数据的工作上,从而实现 MVC 的充分解耦。
1.认识视图
视图的作用是渲染模型数据,将模型里的数据以某种形式呈现给客户。视图对象可以是常见的 JSP,还可以是 Excel 或 PDF 等形式不一的媒体形式。为了实现视图模型和具体实现技术的解耦,Spring 在 org.springframework.web.servlet 包中定义了一个高度抽象的 View 接口,该接口中定义了两个方法。
1)String getContentType():视图对应的 MIME 类型,如 text/html、Image/jpeg 等。
2)void render(Map model,HttpServletRequest request,HttpServletResponse response):将模型数据以某种 MIME 类型渲染出来。
视图对象是一个 Bean,通常情况下,视图对象由视图解析器负责实例化。由于视图 Bean 是无状态的,所以它们不会有线程安全的问题。
不同类型的视图实现技术对应不同的 View 实现类,这些视图实现类都位于 org.springframework.web.servlet.view 包中。
2.认识视图解析器
Spring MVC 为逻辑视图名的解析提供了不同的策略,可以在 Spring Web 上下文中配置一种或多种解析策略,并指定它们之间的先后顺序。每种解析策略对应一个具体的视图解析器实现类。视图解析器的工作比较单一,即将逻辑视图名解析为一个具体的视图对象。所有视图解析器都实现了 ViewResolver 接口,该接口仅有一个方法。
View resolveViewName(String viewName,Locale locale)
resolveViewName() 方法的签名清楚地向我们传达了视图解析器工作的内涵:根据逻辑视图名和本地化对象得到一个视图对象。Spring 拥有众多的视图解析器实现类,通过下图进行概括性说明。
用户可以选择一种视图解析器或混用多种视图解析器,每个视图解析器都实现了Ordered 接口并开放出一个 orderNo 属性,可以通过该属性指定解析器的优先顺序,值越小优先级越高。有些视图解析器默认为最高优先级(如 ContentNegotiatingViewResolver),而有些视图解析器默认为最低优先级(如 InternalResourceViewResoIver、XsltViewResolver 等),具体请参考 API 文档。
Spring MVC 会按照视图解析器的优先级顺序对逻辑视图名进行解析,直到解析成功并返回视图对象,否则将抛出 ServletException 异常。
原文地址:https://www.cnblogs.com/jwen1994/p/11161296.html