在WEB开发中总时会遇到处理主题的问题,在系统运营中或许因为审美疲劳或者是提高用户体验度然后下系统需要增加一些主题样式,在遇到这些问题时我们都需要写大量代码来达到动态切换主题样式的目,而
Spring MVC 提供了针对主题的解方案。
今天主要说下Spring MVC实现主题切换用到的解析器“ThemeResolver”和资源文件管理“ResourceBundleThemeSource”它们的配置方法和注意事项。
第一步:解析配置
其中解析器包括固定主题解析器“
FixedThemeResolver
” ,“会话主题解析SessionThemeResolver”和Cookie解析器“
CookieThemeResolver
”。Spring MVC提供的三个简单的主题解析器可以满足我们一般的需要,如果有特殊需求可以实现ThemeResolver接口自定义自己主题解析器。
如下是解析器继承与实现关系图
ThemeResolver (接口) AbstractThemeResolver (抽象类) FixedThemeResolver (继承AbastractThemeResolver间接的实现ThemeResolver接口) SessionThemeResolver(继承AbastractThemeResolver间接的实现ThemeResolver接口) CookieThemeResolver 直接实现(ThemeResolver接口)如下是三种解析器的配置
1. FixedThemeResolver 解析器的配置 defaultThemeName是配置默认主题,当不填写时默认主题的名称为"theme"
<bean id="themeResolver" class="org.springframework.web.servlet.theme.FixedThemeResolver"> <property name="defaultThemeName" value="blue"/> </bean>
2. SessionThemeResolver 解析器的配置 defaultThemeName是配置默认主题,当不填写时默认主题的名称为"theme"
<bean id="themeResolver" class="org.springframework.web.servlet.theme.SessionThemeResolver"> <property name="defaultThemeName" value="blue"/> </bean>
3. CookieThemeResolver 解析器的配置 defaultThemeName是配置默认主题,当不填写时默认主题的名称为"theme"
<bean id="themeResolver" class="org.springframework.web.servlet.theme.CookieThemeResolver"> <property name="defaultThemeName" value="blue"/> </bean>
如上三种配置中都对Bean id属性进行了配置,id属性的配置是必须配置项。
注意:
在配置主题解析器时“id”是必须填写,而且名字名称必须是“themeResolver”,如果不填写你会发现你配置的主题解析器无法生效,原因应该是Spring MVC中的Dispatri Servlet 中只允许配置一个ThemeResolver的实例,如果不填写解析器的名称那么Spring MVC无法唯一获得一个具体的解析器。
如下是Spring MVC初始化ThemeResolver解析器的方法,通过源码可以发现初始化方法是通过BeanName 和 Class两个参数来获取主题解析器。
其实其他的解析器如“
MultipartResolver
”,“
LocaleResolver”在
DispatcherServlet中也是只有一个实例所有在配置时也必须配置Bean Name属性。
/** * Initialize the ThemeResolver used by this class. * <p>If no bean is defined with the given name in the BeanFactory for this namespace, * we default to a FixedThemeResolver. */ private void initThemeResolver(ApplicationContext context) { try { this.themeResolver = context.getBean(THEME_RESOLVER_BEAN_NAME, ThemeResolver.class); if (logger.isDebugEnabled()) { logger.debug("Using ThemeResolver [" + this.themeResolver + "]"); } } catch (NoSuchBeanDefinitionException ex) { // We need to use the default. this.themeResolver = getDefaultStrategy(context, ThemeResolver.class); if (logger.isDebugEnabled()) { logger.debug( "Unable to locate ThemeResolver with name '" + THEME_RESOLVER_BEAN_NAME + "': using default [" + this.themeResolver + "]"); } } }第二步:主题资源文件配置
主题资源文件“
ResourceBundleThemeSource
”的配置也不麻烦,只需要配置两个参数分别是“basenamePrefix”和“parentThemeSource”其中“parentThemeSource是非必填属性”即可。
属性basenamePrefix是配置资源文件所存放的目录,其中“ResourceBundleThemeSource”在加载资源文件时默认是在classse目录加载。
例如
如下配置程序将会在classse/theme目录下查找资源配置文件,资源文件名称后面必须要填写“.”。
<bean id="themeSource" class="org.springframework.ui.context.support.ResourceBundleThemeSource"> <property name="basenamePrefix" value="theme."/> <property name="parentThemeSource" value=""/> </bean>当basenamePrefix="theme." 并且 themename=“blue”那么ResourceBundleThemeSource的basename就是“theme.blue”。
如果basename是“theme.blue”那么它将会对应“theme/blue.properties”资源文件。
总结
在Spring MVC主题管理中的两个组件“ThemeResolver”和“ResourceBundleThemeSource”配置不麻烦,但是需要注意的地方却有两个分别是:
1. 在配置"ThemeResolver"时BeanName是要必须配置的属性,并且名称必须是“themeResolver”;
2. 在配置“ResourceBundleThemeSource”时属性“basenamePrefix”的值是用于和Theme名称拼接并作为basename属性的值。
当出现如下错误时请检查解析器“ThemeResolver”是否配置“id”,然后在检查资源文件的目录是否正确。
javax.servlet.jsp.JspTagException: Theme 'theme': No message found under code 'core' for locale 'zh_CN'