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

来源:互联网 发布:linux运维工程师培训 编辑:程序博客网 时间:2024/04/27 22:07

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

1 0