1. 程式人生 > >Spring4.x官方參考文件中文版——第21章 Web MVC框架(22)

Spring4.x官方參考文件中文版——第21章 Web MVC框架(22)

21.9 主題(theme)的使用

21.9.1 主題概況

你能夠使用Spring Web MVC框架在你的應用中設定全域性生效的主題,從而提升使用者的體驗。主題是那些影響著應用裡視覺樣式的靜態資源(一般是表的樣式和影象)的集合。

21.9.2 主題的定義

為了在你的web應用中使用主題,你必須實現org.springframework.ui.context.ThemeSource介面。WebApplicationContext介面繼承自ThemeSource,但是它是委派給負責從classpath的根路徑中讀取屬性(properties)檔案的org.springframework.ui.context.support.ResourceBundleThemeSource的實現來處理。為了使用自定的ThemeSource,或者去配置ResourceBundleThemeSource的基礎名稱的字首,你能在應用的context中,themeSource這個保留的名稱中註冊一個bean來實現。Web應用的context會自動檢測並使用相應名字的bean。

       當使用ResourceBundleThemeSource時,主題是在一個簡易的屬性檔案中被定義的。這個屬性檔案列出了組成這個主題的資源列表。見下例:

styleSheet=/themes/cool/style.css

background=/themes/cool/img/coolBg.jpg

屬性的鍵就是那些代表著從檢視程式碼中,被主題化的元素的名字。對於一個JSP,一般來說就是使用spring:theme這個自定的標籤,這個標籤與spring:message標籤是很相似的。下面的JSP片段就是使用了在前面例子中定義的主題:

<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%>
<html>
    <head>
        <link rel="stylesheet" href="<spring:theme code=''styleSheet''/>" type="text/css"/>
    </head>
    <body style="background=<spring:theme code=''background''/>">
        ...
    </body>
</html>

        預設情況下,ResourceBundleThemeSource使用一個空的base name(基礎名)字首。這樣,屬性檔案就從classpath的根路徑下讀取出來了。因此,你可以在classpath根路徑下的地方放置cool.properties主題的定義檔案,比如,放在/WEB-INF/classes中。ResourceBundleThemeSource使用java基本的資源繫結讀取機制,可以完全支援國際化的主題。比如,我們可能有一個/WEB-INF/classes/cool_n1.properties檔案,它代表著擁有一個印著荷蘭語文字的特殊的背景圖片。

21.9.3 主題解析器

定義了主題之後,就像先前定義的章節那樣,你能夠決定使用哪一個主題。DispatcherServlet會從叫做themeResolver的bean中尋找所使用的對應ThemeResolver的實現。主題解析器的運作非常像LocaleResolver(地區解析器)。它會檢測特定請求需要使用的對應主題,並且也能改變請求的主題。下面的表是Spring所提供的主題解析器:

表21.5. ThemeResolver(主題解析器)的實現

描述

FixedThemeResolver

(固定主題解析器)

通過設定defaultThemeName屬性,來選擇一個固定的主題。

SessionThemeResolver

(session主題解析器)

在使用者的HTTP session中維持的主題。它只需在每個session中設定一次。但是並不在session間保留。

CookieThemeResolver

(cookie主題解析器)

被選中的主題會在客戶端的cookie中儲存。


Spring也提供了ThemeChangeInterceptor(主題變更攔截器),它允許在每一個請求中,使用一個很簡單的請求引數來變更主題。