Spring MVC主题如何支持? (对拟议的具体例子有些怀疑)

时间:2015-09-06 11:32:21

标签: java spring spring-mvc java-ee

我是Spring MVC的新手,我实际上正在研究主题支持。

所以我正在开发一个具有以下特征的示例应用程序:

1)在 src / webapp / resources / css 中定义3个CSS主题文件,分别命名为: theme-black.css 主题 - 巧克力.css theme-dafault.css 。因此,这些文件表示与主题相关联的CSS设置,必须由用户选择。

2)进入 servlet-context.xml 配置文件(应该是配置MVC支持的文件),定义了与主题支持相关的以下bean:

<beans:bean id="themeSource"
    class="org.springframework.ui.context.support.ResourceBundleThemeSource">
    <beans:property name="basenamePrefix" value="META-INF.theme-" />
</beans:bean>


<beans:bean id="themeChangeInterceptor"
    class="org.springframework.web.servlet.theme.ThemeChangeInterceptor">
    <beans:property name="paramName" value="theme" />
</beans:bean>


<mvc:interceptors>
    <beans:ref bean="themeChangeInterceptor" />
</mvc:interceptors> 

<beans:bean id="themeResolver"
    class="org.springframework.web.servlet.theme.CookieThemeResolver">
    <beans:property name="defaultThemeName" value="default" />
</beans:bean>

META-INF 应用程序文件夹中,有以下3个与之前的CSS主题文件相关的属性文件:

theme-black.properties

css=resources/css/theme-black.css

theme-chocolate.properties

css=resources/css/theme-chocolate.css

theme-default.properties

css=resources/css/theme-default.css

现在我需要你的帮助才能理解这些bean到底做了什么。

据我所知,Spring MVC主题支持的工作方式如下:

Web应用程序在开头有一个默认主题(默认情况下是名为 theme-default.css 的主题吗?所以如果我使用 theme-default.css 对于一个主题它被加载为默认主题或我错过了什么?)

我需要向用户提供一组主题,从中选择他想要使用的主题。

当用户选择主题时,应用程序会向用户浏览器发送 cookie ,此cookie包含有关所选主题的信息。

然后,每当用户向应用程序发出任何HTTP请求(由控制器处理)时,必须有一些东西拦截这些请求并读取cookie以获取选择的主题标识,然后使用此主题进行响应。

所以我认为之前声明的bean按以下方式工作:

1)第一堂课是主题来源

<beans:bean id="themeSource"
    class="org.springframework.ui.context.support.ResourceBundleThemeSource">
    <beans:property name="basenamePrefix" value="META-INF.theme-" />
</beans:bean>

并将名为 basenamePrefix 的属性作为输入参数,用于标识包含具体主题路径的先前属性文件( theme-black.properties 主题 - chocolate.properties theme-default.properties )。

所以这个bean应该完成主题支持的第一个要求(识别和访问主题列表)

2)第二类是主题拦截器

<beans:bean id="themeChangeInterceptor"
    class="org.springframework.web.servlet.theme.ThemeChangeInterceptor">
    <beans:property name="paramName" value="theme" />
</beans:bean>

这是一个我可以用来拦截用户发出的任何请求的类,并执行预操作发布操作,并根据我的理解定义了URL参数允许用户更改主题的名称。

因此,在此示例中,参数名称为主题,因此当用户调用以下URL时:

http://localhost:8080/springchocolatestore/?theme=chocolate

正在选择与 theme-chocolate.properties 相关的巧克力主题,以便 resources / css / theme-chocolate.css 文件。

所以我的疑问是:预操作是检查URL中?theme = chocolate 的先例并应用样式?

3)第三个bean是主题解析器

<beans:bean id="themeResolver"
    class="org.springframework.web.servlet.theme.CookieThemeResolver">
    <beans:property name="defaultThemeName" value="default" />
</beans:bean>

所以这个解析器使用 cookie 来识别选择的主题。

因此,例如,如果我选择巧克力主题(通过请求 http://localhost:8080/springchocolatestore/?theme=chocolate ),网络应用会向浏览器发送存储指定必须使用巧克力主题的信息。

然后,如果我再次重新加载应用程序页面仍然使用巧克力主题(而不是默认主题)。

这意味着 CookieThemeResolver 有权访问此Cookie,阅读并使用此信息选择要使用的主题?

所以我有以下疑问:这个cookie在我的文件系统上,Web应用程序在远程应用程序服务器上。如何在我的文件系统上访问cookie?这个cookie进入我的文件系统的位置是什么? (我想用文本编辑器打开它来检查它)

最后,它也声明了这个配置:

<mvc:interceptors>
    <beans:ref bean="themeChangeInterceptor" />
</mvc:interceptors> 

这个配置究竟是什么?

TNX

1 个答案:

答案 0 :(得分:1)

org.springframework.web.servlet.theme.ThemeChangeInterceptor

从指定的基础加载属性文件,通常是classpath.From spring api docs ResourceBundleThemeSource是一个ThemeSource实现,它查找每个主题的单个ResourceBundle。主题名称被解释为ResourceBundle basename,支持所有主题的公共basename前缀。

org.springframework.web.servlet.theme.CookieThemeResolver

拦截器,允许通过可配置的请求参数(默认参数名称:“主题”)更改每个请求的当前主题。 更多信息可以在spring api docs中找到

var cell: UITableViewCell

ThemeResolver实现,它使用在自定义设置的情况下发送回用户的cookie,并回退到默认主题。这对于没有用户会话的无状态应用程序特别有用。 再次提供更多信息here

  

此cookie位于我的文件系统上,Web应用程序位于远程应用程序服务器上。如何在我的文件系统上访问cookie?这个cookie进入我的文件系统的位置是什么?

What's an HTTP cookie in the first place?

要检查任何网站发送的Cookie,如果您使用的是Firefox或开发人员工具,请使用firebug