SpringMVC之源码分析--ThemeResolver(二)

概述

SessionThemeResolver

SessionThemeResolver类的继承关系如下:

SpringMVC之源码分析--ThemeResolver(二)

说明:

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并更换一张不同的图片。

  • Spring配置文件

本节我们结合拦截器进行设置,配置如下:

<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,我使用的一张狼的图片,效果如下:

SpringMVC之源码分析--ThemeResolver(二)

接下来我们利用请求参数设置会话主题,输入地址:http://localhost:8089/theme?theme=myTheme2,并回车,此时用户会话已经设置为了myTheme2,我使用的一张狗的图片,效果如下:

SpringMVC之源码分析--ThemeResolver(二)

设置了会话主题后,在后续的访问中将使用设置后的主题,但是用户会话结束后,在访问,系统将使用默认设置的主题。(通过关闭浏览器,然后再访问进行测试)

总结

本章通过拦截器ThemeChangeInterceptor和SessionThemeResolver结合实现了通过请求参数控制会话主题。

最后创建了qq群方便大家交流,可扫描加入,同时也可加我qq:276420284,共同学习、共同进步,谢谢!

SpringMVC之源码分析--ThemeResolver(二)

相关推荐