了不起的厂长 2019-06-27
SessionThemeResolver类的继承关系如下:
说明:
1、与FixedThemeResolver
解析器的继承关系一样,都继承自AbstractThemeResolver
抽象类,其中抽象类中定义了defaultThemeName
属性,用于设置属性文件的名称,默认为theme
。
2、SessionThemeResolver类实现ThemeResolver接口,使用用户会话(session)中的主题。
该类源代码如下:
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)); } }
myTheme.properties与上一章内容一致,参考上章。
新增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,共同学习、共同进步,谢谢!