Spring in Acton 4 读书笔记之视图解析

字数753 大约花费3分钟

目录

  1. 1. 什么是视图解析
  2. 2. 创建 JSP 视图
  3. 3. 小结

什么是视图解析

浏览器只识别静态的 html 文件。MVC 中,controller 并不直接生成 html 文件,而只负责为 model 填充数据,然后将 model 转给视图(view)。并且 controller 只知道视图的逻辑名称,并不负责视图的内容。这样,就将转发请求和解析视图这两件事在 Spring MVC 中进行了解耦。controller 和 view 之间的耦合只在于对 model 中数据的定义。
由于 controller 只提供了视图的逻辑名称,Spring 要知道怎样渲染视图,就需要视图解析器的帮助。视图解析器定义了视图模板文件所在的目录和后缀,和视图逻辑名称拼接之后,就构成了视图完整的路径。

Spring MVC 中定义的视图解析器接口和视图接口如下:

1
2
3
4
5
6
7
8
9
10
11
public interface ViewResolver {
View resolveViewName(String viewName, Locale locale)
throws Exception;

}

public interface View {
String getContentType();
void render(Map<String, ?> model,
HttpServletRequest request,
HttpServletResponse response) throws Exception
;

}

ViewResolver 解析视图名称,并返回 View。View 则根据 model(数据)以及 request 渲染出 response。只要实现了代码中的两个方法,就可以解析视图了。然而在 Spring MVC 中,一般不需要再这样做,因为 Spring MVC 为各种常用视图框架提供了视图解析器的实现。

视图解析器 描述
InternalResourceViewResolver 将视图解析为 Web 应用的内部资源(一般为 JSP)
TilesViewResolver 将视图按 Apache Tile 定义进行解析,Tiles 2.0 和 Tiles 3.0 分别有一个 TilesViewResolver 实现。
FreeMarkerViewResolver 将视图按 FreeMarker 模板解析
ThymeleafViewResolver 将视图按 Thymeleaf 模板解析
ResourceBundleViewResolver 将视图解析为 ResourceBundle(一般是属性文件)
UrlBasedViewResolver 根据视图名称直接解析
VelocityViewResolver 根据 Velocity 模板解析
VelocityLayoutViewResolver 根据 Velocity 布局,找到对应定义进行解析
BeanNameViewResolver 将视图解析成 Spring 应用上下文中的 bean,bean 的 id 和视图一样
XmlViewResolver 解析 XML, 和 BeanNameViewResolver 类似
XsltViewResolver 解析 XSLT
ContentNegotiatingViewResolver 根据视图的类型将视图转发给相应的另一个视图解析器
JasperReportsViewResolver 将视图按 JasperReports 定义解析

其中,InternalResourceViewResolver 一般用来解析 JSP,TilesViewResolver 用来解析 Apache Tile,FreeMarkerViewResolver 用来解析 FreeMarker,ThymeleafViewResolver 用来解析 Thymeleaf。ResourceBundleViewResolver 一般用来解析属性文件。在一个项目中,可以同时使用多个视图解析器,解析不同类型的文件。

创建 JSP 视图

使用 InternalResourceViewResolver 解析 jsp 模板文件很简单,只需要配置前缀和后缀。

1
2
3
4
5
6
7
8
@Bean
public ViewResolver viewResolver() {
InternalResourceViewResolver resolver =
new InternalResourceViewResolver();
resolver.setPrefix("/WEB-INF/views/");
resolver.setSuffix(".jsp");
return resolver;
}

经过这样配置后,home 将会解析到 /WEB-INF/views/home.jsp

小结

本文讲解了视图解析,以及如何创建 JSP 视图,将在后续文章中讲解如何解析其它视图模板。

谈谈 IT的文章均为原创或翻译(翻译会注明外文来源),转载请以链接形式标明本文地址: http://tantanit.com/spring-mvc-view-resolution/

谈谈IT

欢迎关注官方微信公众号获取最新原创文章