本章继续分析ThemeResolver的另外一个实现类SessionThemeResolver,须要了解Spring MVC Theme状况的,可参考上一篇文章http://www.javashuo.com/article/p-tcauonfx-dq.htmlweb
SessionThemeResolver类的继承关系以下:spring
说明:segmentfault
一、与FixedThemeResolver
解析器的继承关系同样,都继承自AbstractThemeResolver
抽象类,其中抽象类中定义了defaultThemeName
属性,用于设置属性文件的名称,默认为theme
。浏览器
二、SessionThemeResolver类实现ThemeResolver接口,使用用户会话(session)中的主题。session
该类源代码以下:mvc
public class SessionThemeResolver extends AbstractThemeResolver { // 用于设置session Attribute中的key使用 public static final String THEME_SESSION_ATTRIBUTE_NAME = SessionThemeResolver.class.getName() + ".THEME"; // 解析请求中使用的主题 @Override public String resolveThemeName(HttpServletRequest request) { // 从请求会话中获取到主题 String themeName = (String) WebUtils.getSessionAttribute(request, THEME_SESSION_ATTRIBUTE_NAME); // 若是会话中不存在,使用默认的主题 return (themeName != null ? themeName : getDefaultThemeName()); } // 设置请求的主题 @Override public void setThemeName( HttpServletRequest request, @Nullable HttpServletResponse response, @Nullable String themeName) { // 从客户端请求获取主题并设置到session的Attribute区中 WebUtils.setSessionAttribute(request, THEME_SESSION_ATTRIBUTE_NAME, (StringUtils.hasText(themeName) ? themeName : null)); } }
与上一章项目结构一致,参考http://www.javashuo.com/article/p-tcauonfx-dq.htmljsp
myTheme.properties与上一章内容一致,参考上章。ide
新增myTheme2.properties并更换一张不一样的图片。学习
本节咱们结合拦截器进行设置,配置以下:测试
<mvc:interceptors> <!-- 该拦截器经过名为”theme”的参数来拦截HTTP请求,设置Theme主题 --> <bean class="org.springframework.web.servlet.theme.ThemeChangeInterceptor"> <!-- 用户请求参数的名称为:theme --> <property name="paramName" value="theme"/> </bean> </mvc:interceptors> <!-- 指定ThemeResolver --> <bean id="themeResolver" class="org.springframework.web.servlet.theme.SessionThemeResolver"> <!-- 配置默认的主题文件 --> <property name="defaultThemeName" value="myTheme"/> </bean> <!-- 其他配置省略,参加上章 --> ...
jsp视图和Controller控制器代码与上一章一致,参考上章代码。
启动应用服务,在浏览器客户端输入访问地址http://localhost:8089/theme,此时使用的是默认设置的主题文件,即:myTheme.properties,我使用的一张狼的图片,效果以下:
接下来咱们利用请求参数设置会话主题,输入地址:http://localhost:8089/theme?theme=myTheme2,并回车,此时用户会话已经设置为了myTheme2,我使用的一张狗的图片,效果以下:
设置了会话主题后,在后续的访问中将使用设置后的主题,可是用户会话结束后,在访问,系统将使用默认设置的主题。(经过关闭浏览器,而后再访问进行测试)
本章经过拦截器ThemeChangeInterceptor和SessionThemeResolver结合实现了经过请求参数控制会话主题。
最后建立了qq群方便你们交流,可扫描加入,同时也可加我qq:276420284,共同窗习、共同进步,谢谢!