1. 程式人生 > 其它 >Spring MVC檢視解析器(ViewResolver)

Spring MVC檢視解析器(ViewResolver)

檢視解析器(ViewResolver)是 Spring MVC 的重要組成部分,負責將邏輯檢視名解析為具體的檢視物件

Spring MVC 提供了很多檢視解析類,其中每一項都對應 Java Web 應用中特定的某些檢視技術。下面介紹一些常用的檢視解析類。

URLBasedViewResolver

UrlBasedViewResolver 是對 ViewResolver 的一種簡單實現,主要提供了一種拼接 URL 的方式來解析檢視

UrlBasedViewResolver 通過 prefix 屬性指定字首,suffix 屬性指定字尾。當 ModelAndView 物件返回具體的 View 名稱時,它會將字首 prefix 和字尾 suffix 與具體的檢視名稱拼接,得到一個檢視資原始檔的具體載入路徑,從而載入真正的檢視檔案並反饋給使用者。

使用UrlBasedViewResolver 除了要配置字首和字尾屬性之外,還需要配置“viewClass”,表示解析成哪種檢視。示例程式碼如下。

<bean id="viewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver">            
    <property name="viewClass" value="org.springframework.web.servlet.view.InternalResourceViewResolver"/> <!--不能省略-->
    <!--字首-->
    <property name="prefix" value="/WEB-INF/jsp/"
/> <!--字尾--> <property name="suffix" value=".jsp"/> </bean>

上述檢視解析器配置了字首和字尾兩個屬性,這樣縮短了 view 路徑。因此《一個Spring MVC應用》一節中的 RegisterController 和 LoginController 控制器類的檢視路徑僅需提供 register 和 login,檢視解析器將會自動新增字首和字尾,此處解析為 /WEB-INF/jsp/register.jsp 和 /WEB-INF/jsp/login.jsp。

上述 viewClass 值為 InternalResourceViewResolver,它用來展示 JSP 頁面。如果需要使用 jstl 標籤展示資料,將 viewClass 屬性值指定為 JstlView 即可。

另外,存放在 /WEB-INF/ 目錄下的內容不能直接通過 request 請求得到,所以為了安全性考慮,通常把 jsp 檔案放在 WEB-INF 目錄下。

InternalResourceViewResolver

InternalResourceViewResolver 為“內部資源檢視解析器”,是日常開發中最常用的檢視解析器型別。它是 URLBasedViewResolver 的子類,擁有 URLBasedViewResolver 的一切特性。

InternalResourceViewResolver 能自動將返回的檢視名稱解析為InternalResourceView 型別的物件。InternalResourceView 會把 Controller 處理器方法返回的模型屬性都存放到對應的 request 屬性中,然後通過 RequestDispatcher 在伺服器端把請求 forword 重定向到目標 URL。也就是說,使用InternalResourceViewResolver 檢視解析時,無需再單獨指定 viewClass 屬性。示例程式碼如下。

<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="viewClass" value="org.springframework.web.servlet.view.InternalResourceViewResolver"/> <!--可以省略-->
    <!--字首-->
    <property name="prefix" value="/WEB-INF/jsp/"/>
    <!--字尾-->
    <property name="suffix" value=".jsp"/>  
 </bean>

FreeMarkerViewResolver

FreeMarkerViewResolver 是 UrlBasedViewResolver 的子類,可以通過 prefix 屬性指定字首,通過 suffix 屬性指定字尾。

FreeMarkerViewResolver 最終會解析邏輯檢視配置,返回 freemarker 模板。不需要指定 viewClass 屬性。

FreeMarkerViewResolver 配置如下。

<bean class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
    <property name="prefix" value="fm_"/>
    <property name="suffix" value=".ftl"/>
</bean>

下面指定 FreeMarkerView 型別最終生成的實體檢視(模板檔案)的路徑以及其他配置。需要給 FreeMarkerViewResolver 設定一個 FreeMarkerConfig 的 bean 物件來定義 FreeMarker 的配置資訊,程式碼如下。

<bean class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
    <property name="templateLoaderPath" value="/WEB-INF/ftl" />
</bean>

定義了templateLoaderPath 屬性後,Spring 可以通過該屬性找到 FreeMarker 模板檔案的具體位置。當有模板位於不同的路徑時,可以配置 templateLoaderPath 屬性,來指定多個資源路徑。

然後定義一個 Controller,讓其返回 ModelAndView,同時定義一些返回引數和檢視資訊。

@Controller
@RequestMapping("viewtest")
public class ViewController {
    @RequestMapping("freemarker")
    public ModelAndView freemarker() {
        ModelAndView mv = new ModelAndView();
        mv.addObject("username", "BianChengBang");
        mv.setViewName("freemarker");
        return mv;
    }
}

當FreeMarkerViewResolver 解析邏輯檢視資訊時,會生成一個 URL 為“字首+檢視名+字尾”(這裡即“fm_freemarker.ftl”)的 FreeMarkerView 物件,然後通過 FreeMarkerConfigurer 的配置找到templateLoaderPath 對應文字檔案的路徑,在該路徑下找到該文字檔案,從而 FreeMarkerView 就可以利用該模板檔案進行檢視的渲染,並將 model 資料封裝到即將要顯示的頁面上,最終展示給使用者。

在 /WEB-INF/ftl 資料夾下建立 fm_freemarker.ftl,程式碼如下。

<html>
<head>
<title>FreeMarker</title>
</head>
<body>
    <b>Welcome!</b>
    <i>${username }</i>
</body>
</html>

最終返回給使用者的檢視如下所示。

fm_freemarker.ftl頁面 來源: http://c.biancheng.net/spring_mvc/view-resolver.html