Spring MVC通过使用一组静态资源(比如图像、样式等)提供了主题化支持。主题架构包含三个主要机制:支持主题的资源包、主题解析器和主题更改拦截器。
主题支持的资源包:是ThemeResource的实现,从类路径中加载属性文件。一个属性文件通过键/值对的形式列出了所有的主题资源。其中键是资源名称,而值是访问该资源的URI
style=css/light.css
style=css/dark.css
style是键值,css/dark or css/light是合适样式表的定位器路径
主题解析器:决定哪个主题被解析,以及哪个支持主题的资源包被应用程序所使用。为了初始化解析器,Dispatcher Servlet将在应用程序上下文中查找一个名为themeResolver的Spring Bean。如果该Bean不存在,则配置使用FixedThemeResolver
主题更改拦截器:拦截器负责拦截由控制器处理的HTTP请求。paramName属性是JSP中用来设置主题的键值
在配置文件中,三个机制的定义如下:
<!--定义主题解析器和主题更改拦截器-->
<bean id="themeSource" class="org.springframework.ui.context.support.ResourceBundleThemeSource"/>
<bean id="themeResolver" class="org.springframework.web.servlet.theme.SessionThemeResolver">
<property name="defaultThemeName" value="dark"/>
</bean>
<mvc:interceptors>
<bean id="themeChangeInterceptor" class="org.springframework.web.servlet.theme.ThemeChangeInterceptor">
<property name="paramName" value="theme"/>
</bean>
</mvc:interceptors>
实现的效果如图,当用户点击其中一个主题超链接时,主题名被设置为请求参数,并且触发执行ThemeChangeInterceptor,JSP代码如下:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
<%@ taglib prefix="mvc" uri="http://www.springframework.org/tags/form" %>
<html>
<head>
<title>Spring Theme</title>
<link rel="stylesheet" href="<spring:theme code="style"/>" type="text/css"/>
</head>
<body>
Theme:
<a href="?theme=light">Light</a> - <a href="?theme=dark">Dark</a>
<br>
<mvc:form modelAttribute="userTheme" action="resultTheme.mvc" method="post">
<table>
<tr>
<td><mvc:label path="username">User Name</mvc:label></td>
<td><mvc:input path="username" /></td>
<td><mvc:errors path="username" /></td>
</tr>
<tr>
<td><mvc:label path="email">E-Mail</mvc:label></td>
<td><mvc:input path="email" /></td>
<td><mvc:errors path="email" /></td>
</tr>
<tr>
<td><mvc:label path="ccNumber">Credit Card Number</mvc:label></td>
<td><mvc:input path="ccNumber" /></td>
<td><mvc:errors path="ccNumber" /></td>
</tr>
<tr>
<td><mvc:label path="password">Password</mvc:label></td>
<td><mvc:password path="password" /></td>
<td><mvc:errors path="password" /></td>
</tr>
<tr>
<td colspan="3">
<input type="submit" value="Submit" />
</td>
</tr>
</table>
</mvc:form>
</body>
</html>
通过使用Spring标签库的theme标签,在a标签的href特性中将主题设置为HTML link标签。theme标签的code特性指定主题属性文件中定义的键值,在本例中该键值为style。
更改主题的另一个方法:
使用CookieThemeResolver类,该类在客户端搜索一个Cookie,如果存在,则设置主题。对于那些不需要管理会话以及行为无状态的应用程序来说,使用该解析器是可行的。
<bean id="themeResolver" class="org.springframework.web.servlet.theme.CookieThemeResolver"/>