在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'
相关推荐
在`app/Providers`目录下创建`ThemeServiceProvider.php`,并在其中注册主题管理器。 ```php public function register() { $this->app->singleton('theme', function () { return new ThemeManager(config('...
应用控制器其实拆为处理器映射器(Handler Mapping)进行处理器管理和视图解析器(View Resolver)进行视图管理;页面控制器/动作/处理器为Controller接口(仅包含ModelAndView handleRequest(request, response) 方法)...
- **Defining a Theme**:可以通过配置来定义主题,指定不同样式的资源路径等。 - **Resolving Themes**:主题解析器负责根据用户的请求或配置确定使用哪个主题。 - **Multipart Requests**:对于包含文件上传...
38. **什么是Spring MVC的主题(Theme)** - 主题是一种用于改变应用程序外观的功能。Spring MVC通过`ThemeSource`接口支持主题。 39. **解释Spring MVC的多部分(Multipart)请求处理** - Spring MVC通过`...
使用MultipartResolver 13.8.3. 在表单中处理分段文件上传 13.9. 使用Spring的表单标签库 13.9.1. 配置标签库 13.9.2. form标签 13.9.3. input标签 13.9.4. checkbox标签 13.9.5. radiobutton标签 13.9.6. ...
使用MultipartResolver 13.8.3. 在表单中处理分段文件上传 13.9. 使用Spring的表单标签库 13.9.1. 配置 13.9.2. form标签 13.9.3. input标签 13.9.4. checkbox标签 13.9.5. checkboxes标签 13.9.6. ...
使用MultipartResolver 13.8.3. 在表单中处理分段文件上传 13.9. 使用Spring的表单标签库 13.9.1. 配置标签库 13.9.2. form标签 13.9.3. input标签 13.9.4. checkbox标签 13.9.5. radiobutton标签 13.9.6. ...
使用MultipartResolver 13.8.3. 在表单中处理分段文件上传 13.9. 使用Spring的表单标签库 13.9.1. 配置标签库 13.9.2. form标签 13.9.3. input标签 13.9.4. checkbox标签 13.9.5. radiobutton标签 13.9.6. password...
使用MultipartResolver 13.8.3. 在表单中处理分段文件上传 13.9. 使用Spring的表单标签库 13.9.1. 配置 13.9.2. form标签 13.9.3. input标签 13.9.4. checkbox标签 13.9.5. checkboxes标签 13.9.6. ...