前面學習了編寫
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)
的佈局引擎,開發者可根據自身需求選擇合適的視圖解析器。