资讯专栏INFORMATION COLUMN

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

Ocean / 2689人阅读

摘要:此解析器不能动态设置主题。实战目标练习使用解析器,最终效果如下项目结构在下创建了主题文件夹及主题文件,下创建了静态资源文件。是默认的解析器,再此配置是为了自定义属性值,即属性文件名称。其实此解析器与的实现原理基本相同。

概述

主题就是系统的整体样式或风格,可通过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解析器,最终效果如下:

项目结构

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

主题配置文件(myTheme.properties)

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

background=/img/wolf.jpg

Spring配置文件

配置themeSource和themeResolver,如下:





    
    
    




    
    



    
    

说明:

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

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

视图

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

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


    Spring MVC Theme



    " style="width: 500px;height: 300px;">



控制器

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

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

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

总结

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

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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/69386.html

相关文章

  • SpringMVC源码分析--ThemeResolver(三)

    摘要:类继承关系如下该类实现接口,实现解析设置主题功能继承类,以具备操作功能。新增并更换一张不同的图片。配置文件只要替换即可,代码如下配置默认的主题文件视图和控制器视图和控制器代码与上一章一致,参考上章代码。 概述 上节介绍了SessionThemeResolver解析器,本章分析下CookieThemeResolver,两个解析器实现的功能是一样的,只是使用的主题载体有区别而已,Sessi...

    OldPanda 评论0 收藏0
  • SpringMVC源码分析--ThemeResolver(二)

    摘要:类实现接口,使用用户会话中的主题。新增并更换一张不同的图片。通过关闭浏览器,然后再访问进行测试总结本章通过拦截器和结合实现了通过请求参数控制会话主题。 概述 本章继续分析ThemeResolver的另一个实现类SessionThemeResolver,需要了解Spring MVC Theme情况的,可参考上一篇文章https://segmentfault.com/a/119000001...

    antyiwei 评论0 收藏0
  • SpringMVC源码分析--LocaleResolver和ThemeResolver应用

    摘要:需求根据客户端环境,界面显示不同的国旗图案。选择的技术方案可利用提供的国际化和主题定制来解决。注意此时返回的中没有国际化及主题相关的信息。修改请求参数的值为荷兰,即后再发起请求,结果如下与预期一致,测试通过。 概述 以上分析了Spring MVC的LocaleResolver和ThemeResolver两个策略解析器,在实际项目中很少使用,尤其是ThemeResolver,花精力去分析...

    qpal 评论0 收藏0
  • SpringMVC源码分析--请求过程

    摘要:概述根据规范,当用户请求到达应用时,由的方法进行处理,对于而言,处理用户请求的入口为,通过其父类的拦截处理。最后创建了群方便大家交流,可扫描加入,同时也可加我,共同学习共同进步,谢谢 概述 根据Servlet规范,当用户请求到达应用时,由Servlet的service()方法进行处理,对于Spring MVC而言,处理用户请求的入口为DispatcherServlet,通过其父类Fra...

    zxhaaa 评论0 收藏0
  • SpringMVC源码分析--View(

    摘要:概述通过上几章的介绍知道了的作用,即就是把返回的逻辑视图名称解析为视图对象。进而通过对象的视图渲染把最终的结果展现给用户。运用模板技术把数据和视图分开,同时提供支持很多的模板技术,比如等等。 概述 通过上几章的介绍知道了ViewResolver的作用,即ViewResolver就是把handler返回的逻辑视图名称解析为视图View对象。进而通过View对象的视图渲染把最终的结果展现给...

    jerryloveemily 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<