二、Beetl與Spring MVC整合
本章主要介紹通過beetl-spring完成Beetl與Spring MVC整合的功能。和Beetl自帶的BeetlSpringViewResolver及BeetlSpringView相比,本項目提供的BeetlViewResolver增強了視圖解析器的功能,使多視圖解析器各自使用各自的GroupTemplate以使用不同的Beetl配置成為可能。
2.1 BeetlViewResolver
BeetlViewResolver是一個Spring MVC視圖解析器實現,它具有以下屬性,都是可選的:
參數名 | 參數類型 |
說明 |
常規配置屬性 |
||
contentType |
String | 用於指定Http響應包Content-Type頭 默認MIME類型為text/html 字符集通過GroupTemplate使用的ResourceLoader的charset推斷(如果無法獲取則取當前JVM進程的默認字符集) |
prefix,suffix | String | 使用模版path的前綴和后綴 默認都為空字符串 BeetlView以如下方式進行字符串拼接以得到實際傳給Beetl ResourceLoader的模版path: path = prefix + viewName + suffix; |
多視圖解析器配置屬性 |
||
groupTemplate | GroupTemplate | 該視圖解析器所使用的GroupTemplate實例 默認視圖解析器會取Spring上下文中唯一的GroupTemplate 如果Spring上下文中有多個GroupTemplate,該屬性必須設置 |
order | int | 配置視圖解析器的優先級 值越小優先級越高,默認為0。當Spring上下文中有多個視圖解析器時,必須設置 詳情請參見本章2.3小節。 |
viewNames | List<String> | 配置若干個帶*號通配符表示的視圖名表達式,只有視圖名匹配其中一個表達式才會被當前視圖解析器處理(在多視圖解析器的環境下,如果當前視圖解析器判定不能處理該視圖名,就會讓下一個解析器嘗試處理) 默認所有接收到的視圖名都被當前視圖解析器處理,通常在多視圖解析器環境下應該設置。 |
2.2 視圖名與BeetlView
BeetlView由BeetlViewResolver根據視圖名產生。一般不手工生成該對象(在使用時,BeetlView需要Spring注入一些必須的環境數據)。
並不是所有的視圖名BeetlViewResolver都一定產生BeetlView實例,有兩種特殊的情況:
視圖名 |
說明 |
以"redirect:"為前綴時 | 表示重定向,不產生BeetlView渲染模版,而直接通過Servlet的機制返回重定向響應 redirect:前綴后面的內容為重定向地址,可以采用相對地址(相對當前url),絕對地址(完整的url) 如果采用/開頭的地址,會自動的在前面接上當前Web應用的contentPath,即contentPath為test的Web應用中使用 redirect:/admin/login.html 實際重定向地址為 ${contentPath}/admin/login.html |
以"forward:"為前綴時 | 表示轉發,不產生BeetlView渲染模版。而是直接通過Servlet的機制轉發請求(關於轉發和重定向的區別,請自行查看Servlet API) forward:前綴后面的內容為轉發地址,一般都是以/開頭相對於當前Web應用的根目錄 |
其他 | 產生BeetlView渲染模版輸出響應 |
2.3 Spring多視圖解析器配置
Spring上下文中,如果有多個視圖解析器實例存在,會按照視圖解析器的order設置從小到大對他們進行排序處理。(這里說的視圖解析器主要是說的是UrlBasedViewResolver的實現子類,只有它才支持多視圖解析器並存,大部分的Spring視圖解析器類都是UrlBasedViewResolver的子類)。
判斷一個視圖是否由該視圖解析器處理,核心的方法是UrlBasedViewResolver的canHandle(),將視圖名傳入返回true/false以表示該視圖名是否能處理,與上文描述的一樣,默認的canHandle()實現是通過比對視圖名對viewNames屬性設置的視圖名匹配表達式來完成的。如果canHandle()返回true,則視圖會交給該解析器的resolveViewName()方法以返回對應的View實例,否則交給排在后面的視圖解析器處理。
對Beetl與Spring MVC整合及多視圖解析器的配置,請參見beetl-spring-web-example示例