天天看點

Spring MVC 頁面渲染( render view )

在spring mvc 中,controllers不會負責具體的頁面渲染,它僅僅是調用業務邏輯并傳回model資料給view層,至于view層具體怎麼用html展現,由專門的view層具體負責,這就是mvc模式,業務層與展示層是松耦合的。那麼,spring mvc是如何解耦合請求處理邏輯和頁面渲染的呢?

對于普通的jsp頁面,最常用到的就是view resolver就是<code>internalresourceviewresolver</code>,它有兩個屬性,一個是比對實體view的字首,一個是字尾。字首一般就是view頁面的路徑位置,字尾就是檔案的格式,而字首字尾之間的就是邏輯view名稱。

比如按照上面的配置,如果controller傳回的邏輯view名稱是home的話,<code>internalresourceviewresolver</code>會根據這個邏輯view名home找到其對應的實際實體view:<code>/web-inf/views/home.jsp</code>。

Spring MVC 頁面渲染( render view )

viewresolver接口:

這個接口很簡單,當我們傳入一個邏輯view名和locale對象,就會傳回一個view執行個體。

view接口:

view接口的職責就是接收model對象、request對象、response對象,并渲染輸出結果給response對象。如果我們要自己寫一個viewresolver也很簡單,我們隻需要實作viewresolver和view兩個接口,在view接口中把需要渲染的内容輸出到response對象中去就可以了。

當然,我們基本上不需要自己去寫viewresolver,spring mvc為我們提供了各種各樣的viewresolver:

Spring MVC 頁面渲染( render view )

上面雖然列了很多個viewresolver,但我們具體用哪個好呢?其實上面的每個viewresolver都對應着一種view頁面的實作技術,比如<code>internalresourceviewresolver</code>就是用來處理jsp頁面,<code>tilesviewresolver</code>主要處理<code>apache tiles views</code>,<code>freemarkerviewresolver</code>和<code>velocityviewresolver</code>分别對應着<code>freemarker</code>和<code>velocity template</code>頁面渲染技術。

無可否認,在java web程式設計領域,曆史最悠久的頁面處理技術便是jsp。是以,這裡我們就拿jsp技術來展示spring是如何渲染頁面的。

spring有兩種方式來支援jsp頁面:

無論我們使用jstl還是spring jsp标簽類庫,我們都需要配置一個viewresolver來解析jsp頁面。當然一些其他的viewresolver也可以解析jsp頁面,但internalresourceviewresolver是專門針對jsp技術設計的解析器,是以對于jsp頁面,它用起來最簡單也最友善。

其實<code>internalresourceviewresolver</code>的配置在1.1節已經介紹了,它可以直接把一個邏輯view名映射到轉實際渲染資料的實體view頁面。如果按照我們這樣的配置:

那麼對于下面這些邏輯view名,<code>internalresourceviewresolver</code>則會将其映射成相應的jsp頁面:

home 解析成 /web-inf/views/home.jsp

productlist 解析成 /web-inf/views/productlist.jsp

books/detail 解析成 /web-inf/views/books/detail.jsp

上面例子中還可以看到,當我們的邏輯名稱中含有反斜線/時,解析器會将其解析成資源檔案的路徑,這樣我們就可以對頁面資源檔案進行目錄管理了。

如果要想在jsp中使用jstl标簽很簡單,我們隻需在internalresourceviewresolver中指定一個viewclass屬性即可:

上面已經講過,spring jsp提供了兩種類庫,一種是表單資料綁定标簽庫,另一種提供了更多樣話的通用标簽庫。

spring的表單資料綁定标簽庫提供了14個标簽,它和普通标簽的差別就是能夠将表單屬性和model對象屬性綁定在一起。要想使用表單資料綁定标簽庫,隻需要在jsp頁面中聲明:

标簽庫中的14個标簽:

Spring MVC 頁面渲染( render view )

下面舉個例子,我們使用這個标簽庫來重寫一個注冊頁面:

commandname:對應後端model資料對象名稱,也就是model中的對應的key值

path:我們可以看到form表單内部每個标簽都有個path屬性,這個屬性對應的就是model對象的屬性

除了表單資料綁定标簽庫之外,spring還提供了一個更加通用的标簽庫,要想使用這個更通用的标簽庫,隻需要在jsp頁面中添加:

标簽庫中的标簽:

Spring MVC 頁面渲染( render view )

關于這些标簽的詳細使用說明可以檢視spring的官方文檔,這裡不多做介紹了。