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

什么是视图解析

浏览器只识别静态的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
12
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视图,将在后续文章中讲解如何解析其它视图模板。

© 2022 谈谈IT All Rights Reserved. 本站访客数人次 本站总访问量
Theme by hiero