渲染Web视图
理解视图解析
我们知道Controller方法返回逻辑视图的名称,DispatcherServlet将视图逻辑名称传递给视图实现类处理获得物理视图资源。Controller并不直接返回物理视图,而是返回逻辑视图名称,这样就很好的实现了解耦,保证了在不影响请求处理逻辑的情况下维护和修改视图。那么视图实现如果根据逻辑视图名称解析物理视图资源呢?Spring自带了13个视图解析器,能够将逻辑视图名转换为物理实现。
BeanNameViewResolver
将视图解析为Spring应用上下文中的bean,其中bean的ID与视图的名字相同
ContentNegotiatingViewResolver
通过考虑客户端需要的内容类型来解析视图,委托给另外一个能够产生对应内容类型的视图解析器
FreeMarkerViewResolver
将视图解析为FreeMarker模板
InternalResourceViewResolver
将视图解析为Web应用的内部资源(一般为JSP)
JasperReportsViewResolver
将视图解析为JasperReports定义
ResourceBundleViewResolver
将视图解析为资源bundle(一般为属性文件)
TilesViewResolver
将视图解析为Apache Tile定义,其中tileID与视图名称相同。注意有两个不同的TilesViewResolver实现,分别对应于Tiles 2.0和Tiles 3.0
UrlBasedViewResolver
直接根据视图的名称解析视图,视图的名称会匹配一个物理视图的定义
VelocityLayoutViewResolver
将视图解析为Velocity布局,从不同的Velocity模板中组合页面
VelocityViewResolver
将视图解析为Velocity模板
XmlViewResolver
将视图解析为特定XML文件中的bean定义。类似于BeanName-ViewResolver
XsltViewResolver
将视图解析为XSLT转换后的结果
FreeMarkerViewResolver
将视图解析为FreeMarker模板
InternalResourceViewResolver
将视图解析为Web应用的内部资源(一般为JSP)
JasperReportsViewResolver
将视图解析为JasperReports定义
ResourceBundleViewResolver
将视图解析为资源bundle(一般为属性文件)
TilesViewResolver
将视图解析为Apache Tile定义,其中tileID与视图名称相同。注意有两个不同的TilesViewResolver实现,分别对应于Tiles 2.0和Tiles 3.0
UrlBasedViewResolver
直接根据视图的名称解析视图,视图的名称会匹配一个物理视图的定义
VelocityLayoutViewResolver
将视图解析为Velocity布局,从不同的Velocity模板中组合页面
VelocityViewResolver
将视图解析为Velocity模板
XmlViewResolver
将视图解析为特定XML文件中的bean定义。类似于BeanName-ViewResolver
XsltViewResolver
将视图解析为XSLT转换后的结果
以上所有的视图实现类都是些了ViewResolver接口。这个接口的作用就是根据逻辑视图名称返回物理视图(即View接口)。
package org.springframework.web.servlet;
import java.util.Locale;
public interface ViewResolver {
View resolveViewName(String viewName, Locale locale) throws Exception;
}
View接口的任务就是接受模型以及Servlet的request和response对象,并将输出结果渲染到response中。View接口有两个核心方法:
String getContentType();
void render(Map<String, ?> model, HttpServletRequest request, HttpServletResponse response) throws Exception;
InternalResourceViewResolver视图实现
我们在java中最常用的视图技术就是jsp。InternalResourceViewResolver视图实现的作用就是将逻辑视图名称解析成一个jsp资源。我么看一下如果在Spring MVC中使用InternalResourceViewResolver。 /**
* 配置视图解析器
*
* @return
*/
@Bean
public ViewResolver viewResolver() {
InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
viewResolver.setPrefix("/WEB-INF/views/"); // 在视图路径添加前缀
viewResolver.setSuffix(".jsp"); // 在视图路径添加后缀
viewResolver.setExposePathVariables(true);
viewResolver.setExposeContextBeansAsAttributes(true);
viewResolver.setViewClass(JstlView.class); //jsp中使用JSTL,将物理视图解析成JstlView
return viewResolver;
}
我们对InternalResourceViewResolver的配置都很基础和简单。它最终会将逻辑视图名解析为InternalResourceView实例,这个实例会引用JSP文件。但是如果这些JSP使用JSTL标签来处理格式化和信息的话,那么我们会希望InternalResourceViewResolver将视图解析为JstlView。JSTL的格式化标签需要一个Locale对象,以便于恰当地格式化地域相关的值,如日期和货币。信息标签可以借助Spring的信息资源和Locale