渲染Web视图
- 将模型数据渲染为HTML
- 使用JSP视图
- 通过tiles定义视图布局
- 使用Thymealeaf视图
理解视图渲染
控制器只负责处理请求并返回模型数据和视图名
将控制器中请求处理逻辑与视图中的渲染实现解耦是Spring MVC一个重要特性。
视图解析器通过视图名确定渲染模型的物理位置。
// Spring MVC通过该接口的方法传入视图名和Locale对象,可得到一个view
public interface ViewResolver {
View resolveViewName(String viewName, Locale locale) throw Exception;
}
// View接口任务就是接受模型以及请求、响应对象,并将输出结果渲染到response中。
public interface View {
String getContentType();
void render(Map<String, ?> model,
HttpServletRequest request,
HttpServletResponse response) throws Exception;
}
在一般情况下,我们不需要编写 ViewResolver 和 View 的实现,Spring MVC提供了多个内置的实现。
视图解析器 | 描述 |
---|---|
BeanNameViewResolver | 将视图解析为Spring Bean,Bean ID与视图名相同 |
ContentNegotiatingViewResolver | 根据客户端需要的内容类型来解析视图,委托给另外一个能够产生对应内容类型的视图解析器 |
FreeMarkerViewResolver | 将视图解析为FreeMarker模板 |
InternalResourceViewResolver | 将视图解析为Web应用的内部资源(一般为JSP) |
JasperReportsViewResolver | 将视图解析为JasperReports定义 |
ResourceBundleViewResolver | 将视图解析为资源bundle(一般为属性文件) |
TilesViewResolver | 将视图解析为Apache Tile定义,其中tile ID与视图名称相同。注意有两个不同的TilesViewResolver实现,分别对应于Tiles 2.0/3.0 |
UrlBasedViewResolver | 直接根据视图的名称解析视图,视图的名称会匹配一个屋里视图的定义 |
VelocituLayoutViewResolver | 将视图解析为Velocity布局,从不同的Velocity模板中组合页面 |
VelocityViewResolver | 将视图解析为Velocity模板 |
XmlViewResolver | 将视图解析为特定XML文件中的bean定义。类似于beanNameViewResolver |
XsltViewResolver | 将视图解析为XSLT转换后的结果 |
Spring 4 和Spring 3.2支持以上所有视图解析器。
Spring3.1 除Tiles 3外都支持
配置JSP
- 配置InternalResourceViewResolver作为视图解析器
- 配置标签库
1) 解析JSTL视图,设置视图解析器的ViewClass为org.springframework.web.servlet.view.JstlView.class
2) 使用Spring的JSP库
声明前缀
表单绑定库:<%@ taglib uri="http://www.springframework.org/tags/form" prefix="sf" %>
Spring通用库:<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
配置Thymealeaf
Thymeleaf可实现前后端分离。
在Spring MVC中使用Thymeleaf,需配置三个启用 Thymeleaf 与 Spring 集成的bean:
- ThymeleafViewResolver:将逻辑视图名解析为Thymeleaf模板视图;
- SpringTemplateEngine:处理模板并渲染结果;
- TemplateResolver:加载Thymeleaf模板。
@Bean //Thymeleaf视图解析器
public ThymeleafViewResolver viewResolver(SpringTemplateEngine templateEngine) {
ThymeleafViewResolver viewResolver = new ThymeleafViewResolver();
viewResolver.setTemplateEngine(templateEngine);
return viewResolver;
}
@Bean //模板引擎
public TemplateEngine templateEngine(TemplateResolver templateResolver) {
SpringTemplateEngine templateEngine = new SpringTemplateEngine();
templateEngine.setTemplateResolver(templateResolver);
return templateEngine ;
}
@Bean //模板解析器
public TemplateResolver templateResolver() {
TemplateResolver templateResolver = new SerlvetContextTemplateResolver();
templateResolver.setPrefix("/WEB-INF/templates");
templateResolver.setSufix(".html");
templateResolver.setTemplateMode("HTML5");
return templateResolver;
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。