【Spring】渲染Web視圖

前言

前面學習了編寫Web請求的控制器,建立簡單的視圖,本篇博文講解控制器完成請求到結果渲染到用戶的瀏覽器的過程。html

渲染Web視圖

理解視圖解析

前面所編寫的控制器方法都沒有直接產生瀏覽器中渲染所須要的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

建立JSP視圖

Spring提供了兩種支持JSP視圖的方式。spring

  • InternalResourceViewResolver會將視圖名解析爲JSP文件。
  • Spring提供了兩個JSP標籤庫,一個用於表單到模型的綁定,一個用於提供了通用的工具類特性。

配置適用於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.jspjsp

InternalResourceViewResolver最終會將邏輯視圖名解析爲InternalResourceView實例,該實例會引用JSP文件,若是JSP文件中使用JSTL標籤處理信息和格式化時,須要將其解析爲JSTLView,此時須要設置解析器的viewClassJstlView.class便可。工具

使用Spring的JSP庫

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文件顯示。

使用Apache Tiles視圖定義佈局

前面咱們並未關注Web頁面的佈局問題,每一個jsp徹底負責定義自身的佈局,假定須要爲全部頁面定義一個通用的頭部和底部,這時可以使用佈局引擎如Apache Tiles,定義適用於全部頁面的通用頁面佈局。

配置Tiles視圖解析器

首先須要配置TilesConfigurerbean,它負責定位和加載Tile定義並協調生成Tiles,再者須要TilesViewResolverbean將邏輯視圖名稱解析爲Tile定義。

@Bean
    public TilesConfigurer tilesConfigurer() {
        TilesConfigurer tilesConfigurer = new TilesConfigurer();
        tilesConfigurer.setDefinitions("/WEB-INF/layout/tiles.xml");
        tilesConfigurer.setCheckRefresh(true);

        return tilesConfigurer;
    }

而後再定義tils.xml文件和對應的文件便可。

使用Thymeleaf

配置Thymeleaf視圖解析器

須要配置以下三個bean

  • ThymeleafViewResolver,將邏輯視圖名解析爲Thymeleaf模版視圖。
  • SpringTemplateEngine,處理模板並渲染結果。
  • TemplateResolver,加載Thymeleaf模板。

添加beanWebConfig中以下。

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

相關文章
相關標籤/搜索