我正在研究一个现有的Spring MVC 3项目,在查看spring和context配置文件时我感到困惑,请清除它或建议我如果出现问题。
Upadte root-context.xml
档案
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- Root Context: defines shared resources visible to all other web components -->
<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<property name="basenames">
<list>
<value>classpath:messages</value>
</list>
</property>
<property name="defaultEncoding" value="UTF-8" />
</bean>
<bean id="localeChangeInterceptor"
class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
<property name="paramName" value="lang" />
</bean>
<bean id="localeResolver"
class="org.springframework.web.servlet.i18n.CookieLocaleResolver">
<property name="defaultLocale" value="en" />
</bean>
<bean id="themeSource" class="org.springframework.ui.context.support.ResourceBundleThemeSource">
<property name="basenamePrefix" value="detailtheme-" />
</bean>
<bean id="themeResolver" class="org.springframework.web.servlet.theme.CookieThemeResolver">
<property name="defaultThemeName" value="en" />
</bean>
<!-- Helper bean to load all properties files -->
<bean id="LoadPropertiesFiles" class="org.commons.utilities.LoadPropertiesFileHelper"
init-method="loadPropertiesFileMethod" lazy-init="false" />
</beans>
我不明白lang
是什么?我理解的是,它是一个可靠的名称,其值已分配给paramName
(DEFAULT_PARAM_NAME
),但我不明白如何为lang
分配价值,因为我不知道找不到任何设置某个值(如en,hi..etc)的单个位置。
最令人困惑的是,在servlet-context.xml
中将另一个具有相同类的bean定义为:
<mvc:interceptors>
<beans:bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
<beans:property name="paramName" value="lang" />
</beans:bean>
...
</mvc:interceptors>
为什么定义了相同类的两个bean ,这是错误的吗?如果没有,那么root-context.xml
和servlet-context.xml
中定义的bean的工作是什么?
以下是web.xml
以供参考:
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/root-context.xml</param-value>
</context-param>
<!-- Listener to prevent class loader leaks -->
<listener>
<listener-class>se.jiderhamn.classloader.leak.prevention.ClassLoaderLeakPreventor</listener-class>
</listener>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<servlet-name>appServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>appServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
<filter-name>sitemesh</filter-name>
<filter-class>org.sitemesh.config.ConfigurableSiteMeshFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>sitemesh</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<jsp-config>
<taglib>
<taglib-uri>/tagTld</taglib-uri>
<taglib-location>/resources/tld/EnumTag.tld</taglib-location>
</taglib>
</jsp-config>
</web-app>
答案 0 :(得分:2)
LocaleChangeInterceptor
会拦截对您的网络应用的网络请求,并查找名称为lang
的查询参数(例如http://mywebapp.com/login?lang=en),并尝试相应地设置应用的区域设置,以便您可以执行此操作您的网络应用的本地化。
至于两个文件root-context.xml
和servlet-context.xml
- <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
正在使用第一个文件,而org.springframework.web.servlet.DispatcherServlet
正在使用第二个文件。
ContextLoaderListener
也可用于初始化Spring。 DispatcherServlet
特定于Spring MVC,如果您正在使用它,则需要它。
有可能摆脱root-context.xml
,但它需要您检查应用程序的设计,因为可能存在依赖于定义的root-context.xml
bean的非SpringMVC组件。
答案 1 :(得分:1)
实际上,此bean定义不属于根上下文,因此您可以安全地删除root-context.xml
中定义的那个,并将其保留在servlet-context.xml
中。
对于paramName
参数,这是将用于更改区域设置的请求参数的名称 - see reference documentation。