前面学习了编写
Web
请求的控制器,建立简单的视图,本篇博文讲解控制器完成请求到结果渲染到用户的浏览器的过程。html
前面所编写的控制器方法都没有直接产生浏览器中渲染所须要的HTML
,只是将数据填充到模型中,而后将模型传递给视图,方法返回值是String
类型的值,其是视图的逻辑名称,不会直接引用具体的视图实现。将控制器中请求处理的逻辑和视图中的渲染解耦是Spring MVC
的重要特征,控制器只经过逻辑视图名了解视图,而视图解析器用于肯定使用哪一个视图实现来渲染模型。前面在WebConfig
中,使用了InternalResourceViewResolver
,其配置了prefix
为/WEB-INF/views/
,suffix
为.jsp
用于肯定渲染模型的jsp
文件的物理位置。Spring
自带了12
个视图解析器用于将逻辑视图名转化为物理实现。java
对于不一样的视图解析器,通常对应某种特定的视图技术,如InternalResourceViewResolver
通常用于JSP
视图、TilesViewResolver
用于Apache Tiles
视图、FreeMarkerViewResolver
用于FreeMarker
视图、VelocityViewResolver
用于Velocity
视图。web
Spring
提供了两种支持JSP
视图的方式。spring
InternalResourceViewResolver
会将视图名解析为JSP
文件。Spring
提供了两个JSP
标签库,一个用于表单到模型的绑定,一个用于提供了通用的工具类特性。InternalResourceViewResolver
会在视图名上添加前缀和后缀,进而肯定Web
应用中的视图资源的物理路径,以下代码使用@Bean
注解,并设置了前缀和后缀的解析器。apache
@Bean public ViewResolver viewResolver() { InternalResourceViewResolver resolver = new InternalResourceViewResolver(); resolver.setPrefix("/WEB-INF/views/"); resolver.setSuffix(".jsp"); return resolver; }
也可以使用XML
的配置以下。浏览器
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver" p:prefix="/WEB-INF/views/" p:suffix=".jsp" />
配置视图解析器后,home
会被解析为/WEB-INF/views/home.jsp
,/books/detail
会被解析为/WEB-INF/views/books/detail.jsp
。jsp
InternalResourceViewResolver
最终会将逻辑视图名解析为InternalResourceView
实例,该实例会引用JSP
文件,若是JSP
文件中使用JSTL
标签处理信息和格式化时,须要将其解析为JSTLView
,此时须要设置解析器的viewClass
为JstlView.class
便可。工具
Spring
提供了两个用来帮助定义Spring MVC Web
视图的JSP
标签库,其中一个标签库会用来渲染HTML表单
标签,另外一个标签库包含工具类标签。布局
Spring
的表单绑定JSP
标签库包含了14
个标签,其中大多数用来渲染HTML
的表单标签,其可以根据模型中对象的属性填充值,还包含展示用户错误的的标签,其会将错误信息渲染到最终的HTML
中,可经过以下方式指定。学习
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="cf" %>
在声明后,便可使用以下14
个标签库。
针对不一样地区展现不一样信息已经是国际化的重要组成部分,其关键在于使用<s:message>
标签,如在home.jsp
中添加<s:message code="spittr.welcome" />
标签,而后在WebConfig
中添加以下代码。
@Bean public MessageSource messageSource() { ResourceBundleMessageSource resourceBundleMessageSource = new ResourceBundleMessageSource(); resourceBundleMessageSource.setBasename("messages"); return resourceBundleMessageSource; }
最后在resources/
下添加messages.properties
文件,并配置内容以下spitter.welcome=welcome!
,启动,显示welcome!
,还可配置message_zh.properties
文件,内容配置以下spitter.welcome=china welcome!
,启动,会显示china wecome!
,即会根据本地时区选择合适的messages
文件显示。
前面咱们并未关注Web
页面的布局问题,每一个jsp
彻底负责定义自身的布局,假定须要为全部页面定义一个通用的头部和底部,这时可以使用布局引擎如Apache Tiles
,定义适用于全部页面的通用页面布局。
首先须要配置TilesConfigurer
的bean
,它负责定位和加载Tile
定义并协调生成Tiles
,再者须要TilesViewResolver
的bean
将逻辑视图名称解析为Tile
定义。
@Bean public TilesConfigurer tilesConfigurer() { TilesConfigurer tilesConfigurer = new TilesConfigurer(); tilesConfigurer.setDefinitions("/WEB-INF/layout/tiles.xml"); tilesConfigurer.setCheckRefresh(true); return tilesConfigurer; }
而后再定义tils.xml
文件和对应的文件便可。
须要配置以下三个bean
。
ThymeleafViewResolver
,将逻辑视图名解析为Thymeleaf
模版视图。SpringTemplateEngine
,处理模板并渲染结果。TemplateResolver
,加载Thymeleaf
模板。添加bean
至WebConfig
中以下。
@Bean public ViewResolver viewResolver(SpringTemplateEngine templateEngine) { ThymeleafViewResolver viewResolver = new ThymeleafViewResolver(); viewResolver.setTemplateEngine(templateEngine); return viewResolver; } @Bean public SpringTemplateEngine templateEngine(TemplateResolver templateResolver) { SpringTemplateEngine templateEngine = new SpringTemplateEngine(); templateEngine.setTemplateResolver(templateResolver); return templateEngine; } @Bean public TemplateResolver templateResolver() { TemplateResolver templateResolver = new ServletContextTemplateResolver(); templateResolver.setPrefix("/WEB-INF/views/"); templateResolver.setSuffix(".html"); templateResolver.setTemplateMode("HTML5"); return templateResolver; }
Spring
的视图渲染十分灵活,有传统的jsp
方案(InternalResourceViewResolver
),还有Tiles(TilesViewResolver)
和Thymeleaf(ThymeleafViewResolver)
的布局引擎,开发者可根据自身需求选择合适的视图解析器。