SpringMVC之源码分析–ThemeResolver(一)

SpringMVC之源码分析–ThemeResolver(一)

大家好,又见面了,我是你们的朋友全栈君。

概述

主题就是系统的整体样式或风格,可通过Spring MVC框架提供的主题(theme)设置应用的整体样式风格,提高用户体验。Spring MVC的主题就是一些静态资源的集合,即包括样式及图片,用来控制应用的视觉风格。

Spring MVC主题包括两部分内容,分别是Theme和ThemeResolver,下面是对两部分内容的介绍:

Theme

应用中使用Theme主题时,必须实现org.springframework.ui.context.ThemeSource接口,web应用上下文WebApplicationContext接口继承自ThemeSource,但是实现功能委派给具体的实现,默认的委派给org.springframework.ui.context.support.ResouceBundleThemeSource类实现,此类默认从classpath加载主题属性文件。无论是自定义ThemeSource接口的实现还是通过配置属性文件路劲的ResourceBundleThemeSource实现,都需要在Spring上下文中定义此bean,并且bean的id必须为themeSource,Spring会自动发现并使用。

ThemeResolver

在Spring上下文中定义了Theme后,DispatcherServlet会在Spring容器中查找id为themeResolver的Bean并使用。ThemeResolver工作原理与LocaleResolver工作原理基本是一样的,它在request中查找theme主题并可以修改request的theme主题。Spring提供了如下的主题解析器:

  • FixedThemeResolver 默认主题解析器,使用固定的主题,通过defaultThemeName属性设置,即此属性指定主题属性文件的文件名。此解析器不能动态设置主题。
  • SessionThemeResolver 通过用户会话来保持主题,每个会话(session)仅需要设置一次,所有请求共享主题,但是不能两个会话共享。
  • CookieThemeResolver 使用客户端cookie存储的主题

Spring提供了ThemeChangeInterceptor拦截器,通过request参数控制改变用户请求的主题。

FixedThemeResolver

默认的主题解析器(在DispatcherServlet.properties中配置默认策略),实现ThemeResolver接口,使用固定的主题,主题的名字(就是主题的属性文件名)可通过defaultThemeName属性指定,该值默认是theme,该类比较简单,源码如下,做下注释介绍:

public class FixedThemeResolver extends AbstractThemeResolver {
    // 解析主题文件名
    @Override
    public String resolveThemeName(HttpServletRequest request) {
        // 返回主题文件名,默认值为theme(在父类中定义)
        return getDefaultThemeName();
    }
    // 设置主题文件名,此解析器不能设置。
    @Override
    public void setThemeName(
            HttpServletRequest request, @Nullable HttpServletResponse response, @Nullable String themeName) {
        throw new UnsupportedOperationException("Cannot change theme - use a different theme resolution strategy");
    }

}

实战

  • 目标

练习使用FixedThemeResolver解析器,最终效果如下:

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

  • 项目结构

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

在resources下创建了主题文件夹及主题文件,webapp下创建了静态资源文件。

  • 主题配置文件(myTheme.properties)

指定了一张测试图片,如下:


background=/img/wolf.jpg
  • Spring配置文件

配置themeSource和themeResolver,如下:

<!-- 默认Servlet处理静态资源 -->
<mvc:default-servlet-handler />
<!-- jsp视图映射与视图解析 -->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
    <property name="prefix" value="/WEB-INF/jsp/"/>
    <property name="suffix" value=".jsp"/>
</bean>

<!-- 加载主题资源文件 -->
<bean id="themeSource" class="org.springframework.ui.context.support.ResourceBundleThemeSource">
    <!-- 指定文件前缀,即文件所在目录,如果放在classpath下,value为空(默认从classpath下加载) -->
    <property name="basenamePrefix" value="theme."/>
</bean>
<!-- 使用FixedThemeResolver -->
<bean id="themeResolver" class="org.springframework.web.servlet.theme.FixedThemeResolver">
    <!-- 定义theme文件的名称 -->
    <property name="defaultThemeName" value="myTheme"/>
</bean>

说明:

1、ResourceBundleThemeSource的属性basenamePrefix即为主题属性文件所在目录名称,其后必须有”.”或”/”。

2、FixedThemeResolver是Spring默认的解析器,再此配置是为了自定义defaultThemeName属性值,即属性文件名称。

  • 视图

本例使用jsp视图展示,代码如下:

<%@ page contentType="text/html;charset=UTF-8" %>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%>
<html>
<head>
    <title>Spring MVC Theme</title>
</head>
<body>

    <img src="<spring:theme code='background'/>" style="width: 500px;height: 300px;">

</body>
</html>
  • 控制器

为了测试,编写Controller控制器,跳转至jsp页面,代码如下:

@RequestMapping("/theme")
public String theme(){
    return "theme";
}

至此,启动程序并访问/theme地址即可看到之前的效果图。

总结

  • 本例主要分析了Spring MVC对Theme整体支持,并实战了默认的ThemeResolver,后续继续分析SessionThemeResolver和CookieThemeResolver。其实此解析器与LocaleResolver的实现原理基本相同。

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/107512.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • winform窗体跳转代码_js在当前页面打开新页面

    winform窗体跳转代码_js在当前页面打开新页面在前台用JS写的脚本方法,除了可以直接用在前台控件的属性中,还可以在后台运用。即在后台页面加载时,调用JS方法。语法格式有两种,如下: 1.第一种写法:控件ID名.Attributes.Add(“事件名称”,“JS方法”);如:一个按钮控件Button1.Attributes.Add(“onclick”,“returnconfirm(‘确认?’)”);

    2022年9月26日
    0
  • 怎么提高开车技术_全日行车计划

    怎么提高开车技术_全日行车计划Description现在有n个城市,每个城市有它的高度HiH_i,保证每个HiH_i互不相同。我们定义两个城市之间的距离disi,j=|Hi−Hj|dis_{i,j}=|H_i-H_j|,并且只能从编号小的城市去到编号大的城市。现在有两个人,小A和小B要开车(雾)去旅行。小A先开一天,小B再开一天。每一天都可以从一个开到另一个城市。小A会选择去离当前城市第二近的城市,小B会选择去离当前城市最近的那

    2022年8月22日
    3
  • linux上查看mysql的密码_Linux下MySQL忘记密码「建议收藏」

    linux上查看mysql的密码_Linux下MySQL忘记密码「建议收藏」1、前沿今天在服务器安装mysql之后,登录发现密码错误,但是我没有设置密码呀,最后百度之后得知,mysql在5.7版本之后会自动创建一个初始密码。报错如下:[root@mytestlnx02~]#mysql-uroot-pEnterpassword:ERROR1045(28000):Accessdeniedforuser’root’@’localhost'(usingp…

    2022年6月21日
    242
  • (java)五大常用算法

    (java)五大常用算法算法一:分治法基本概念1.把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。2.分治策略是对于一个规模为n的问题,若该问题可以容易地解决(比如说规模n较小)则直接解决,否则将其分解为k个规模较小的子问题,这些子问题互相独立且与原问题形式相同,递归地解这些子问题,然后将各子问题的解合并得到原…

    2022年7月18日
    17
  • WebSocket :用WebSocket实现推送你必须考虑的几个问题

    WebSocket :用WebSocket实现推送你必须考虑的几个问题目录:目录WebSocket简介项目背景硬件环境及客户端支持本文研究内容基于javaxwebsocket服务端代码源码后续补充git连接客户端代码问题探索如何做到支持几千个client同时在线人数后续1.WebSocket简介WebSocket_百度百科2.项目背景、硬件环境及客户端支持本项目通过WebSocket实现同时在线用户量5k推送服务器(可内网运行)。且可实时查看用户在线状

    2022年7月15日
    18
  • Java程序设计(高级及专题)- IO流与序列化

    Java程序设计(高级及专题)- IO流与序列化

    2021年7月20日
    59

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号