在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>。

viewresolver接口:
這個接口很簡單,當我們傳入一個邏輯view名和locale對象,就會傳回一個view執行個體。
view接口:
view接口的職責就是接收model對象、request對象、response對象,并渲染輸出結果給response對象。如果我們要自己寫一個viewresolver也很簡單,我們隻需要實作viewresolver和view兩個接口,在view接口中把需要渲染的内容輸出到response對象中去就可以了。
當然,我們基本上不需要自己去寫viewresolver,spring mvc為我們提供了各種各樣的viewresolver:
上面雖然列了很多個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個标簽:
下面舉個例子,我們使用這個标簽庫來重寫一個注冊頁面:
commandname:對應後端model資料對象名稱,也就是model中的對應的key值
path:我們可以看到form表單内部每個标簽都有個path屬性,這個屬性對應的就是model對象的屬性
除了表單資料綁定标簽庫之外,spring還提供了一個更加通用的标簽庫,要想使用這個更通用的标簽庫,隻需要在jsp頁面中添加:
标簽庫中的标簽:
關于這些标簽的詳細使用說明可以檢視spring的官方文檔,這裡不多做介紹了。