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