?
Ce document utilise Manuel du site Web PHP chinois Libérer
Sping的web MVC框架允許你通過主題(theme)來控制網(wǎng)頁的風(fēng)格,這將進(jìn)一步改善用戶的體驗(yàn)。 簡單來說,一個主題就是一組靜態(tài)的資源(比如樣式表和圖片),它們可以影響應(yīng)用程序的視覺效果。
為了在web應(yīng)用中使用主題,需要設(shè)置org.springframework.ui.context.ThemeSource
。
WebApplicationContext
是從ThemeSource
擴(kuò)展而來,
但是它本身并沒有實(shí)現(xiàn)ThemeSource
定義的方法,它把這些任務(wù)轉(zhuǎn)交給別的專用模塊。
如果沒有明確設(shè)置,真正實(shí)現(xiàn)ThemeSource
的類是org.springframework.ui.context.support.ResourceBundleThemeSource
。
這個類在classpath的根部(比如在/WEB-INF/classes
目錄下)尋找合適的屬性文件來完成配置。
如果想自己實(shí)現(xiàn)ThemeSource
接口,
或者需要配置ResourceBundleThemeSource
所需的屬性文件的前綴名(basename prefix),
可以在應(yīng)用上下文中定義一個名為"themeSource"的bean(注意,必須用這個名字)。
web application context會自動檢測并使用這個bean。
在使用ResourceBundleThemeSource
時,每個主題是用一個屬性文件來配置的。
這個屬性文件中列舉了構(gòu)成一個主題所需的資源。比如:
styleSheet=/themes/cool/style.css background=/themes/cool/img/coolBg.jpg
這些屬性的名字應(yīng)該和視圖中的某些主題元素(themed element)一一對應(yīng)。
在JSP視圖中,這些元素通常用spring:theme
標(biāo)簽聲明(這個標(biāo)簽的用法和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 background="<spring:theme code="background"/>"> ... </body> </html>
除非有特殊配置,當(dāng)ResourceBundleThemeSource
尋找所需的屬性文件時,它默認(rèn)在配置的屬性文件名中沒有任何前綴,
也就是說,它只會在classpath的根部尋找。舉例來說,如果一個主題的定義包含在cool.properties
這個屬性文件中,
需要把這個文件放在classpath的根部,比如在/WEB-INF/classes
目錄下。
同時,ResourceBundleThemeSource
使用標(biāo)準(zhǔn)的Java resource bundle管理機(jī)制,
這意味著實(shí)現(xiàn)主題的國際化是很容易的。
比如,/WEB-INF/classes/cool_nl.properties
這個屬性文件中可以指向一個顯示荷蘭文字的圖片。
譯者注:如果對ResourceBundle和它的屬性文件名的規(guī)范不熟悉,請參閱JavaDoc中關(guān)于ResourceBundle.getBundle(String baseName,Locale locale)這個API。
這個baseName參數(shù)和屬性文件名有一定關(guān)系。
比如,如果cool.properties這個屬性文件放置在了/WEB-INF/classes/com/aa/bb/cc目錄下,
那么這個baseName的值應(yīng)該為com.aa.bb.cc.cool。
在這里,com.aa.bb.cc就是這個屬性文件名的前綴(basename prefix)。
支持前綴的API會在前綴所聲明的目錄下尋找相應(yīng)的文件,比如getBundle()。
如果沒有特殊的配置,ResourceBundleThemeSource
不支持前綴,
在這種情況下你要把它所需要的屬性文件放在/WEB-INF/classes
目錄下。
現(xiàn)在我們已經(jīng)知道如何定義主題了,剩下的事就是決定該用哪個主題。
DispatcherServlet
會尋找一個叫“themeResolver”的bean,
這個bean應(yīng)該實(shí)現(xiàn)了ThemeResolver
接口。
主題解析器的工作流程和LocaleResolver
差不多。
它可以解析每個請求所對應(yīng)的主題,也可以動態(tài)地更換主題。下面是Spring提供的幾個主題解析器:
表?13.6.?ThemeResolver
的實(shí)現(xiàn)
Java類 | 描述 |
---|---|
FixedThemeResolver |
選用一個固定的主題,這個主題由“defaultThemeName”屬性決定。 |
SessionThemeResolver |
主題保存在用戶的HTTP session。在每個session中,這個主題只需要被設(shè)置一次,但是每個新session的主題都要重新設(shè)置。 |
CookieThemeResolver |
用戶所選擇的主題以cookie的形式存在客戶端的機(jī)器上面。 |
Spring 也支持一個叫ThemeChangeInterceptor
的請求攔截器。它可以根據(jù)請求中包含的參數(shù)來動態(tài)地改變主題。