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(主题变更拦截器),它允许在每一个请求中,使用一个很简单的请求参数来变更主题。