《Spring In Action(第4版)》閱讀總結(四)渲染Web視圖

渲染Web視圖

  1. 將模型數據渲染爲HTML
  2. 使用JSP視圖
  3. 經過tiles定義視圖佈局
  4. 使用Thymealeaf視圖

理解視圖渲染

控制器只負責處理請求並返回模型數據和視圖名
將控制器中請求處理邏輯與視圖中的渲染實現解耦是Spring MVC一個重要特性。
視圖解析器經過視圖名肯定渲染模型的物理位置。html

// 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提供了多個內置的實現。web

視圖解析器 描述
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外都支持spring

配置JSP

  1. 配置InternalResourceViewResolver做爲視圖解析器
  2. 配置標籤庫

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:佈局

  1. ThymeleafViewResolver:將邏輯視圖名解析爲Thymeleaf模板視圖;
  2. SpringTemplateEngine:處理模板並渲染結果;
  3. 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;
}
相關文章
相關標籤/搜索