2015-07-21 63 views
0

我正在研究现有的Spring MVC 3项目,同时查看Spring和上下文配置文件,我感到困惑,请清除它或建议我如果出现错误。需要帮助了解弹簧配置文件

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?我知道这是一个可靠的名字,其价值被分配到paramNameDEFAULT_PARAM_NAME),但我不明白价值是如何分配到lang,因为我没有找到任何单个位置,其中一些值(如en,hi..etc )已设置。

<mvc:interceptors> 
     <beans:bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"> 
      <beans:property name="paramName" value="lang" /> 
     </beans:bean> 
... 
</mvc:interceptors> 

为什么两个bean同一类的定义,这是错的:

最令人困惑的事情与同级别多一个豆在servlet-context.xml的定义?如果不是,那么什么是root-context.xmlservlet-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> 

回答

2

LocaleChangeInterceptor将拦截Web请求您的Web应用程序,并查找带有名称lang(例如http://mywebapp.com/login?lang=en)查询参数,并尝试进行相应的设置应用程序的位置,这样你可以做你的web应用程序的本地化。

至于两个文件root-context.xmlservlet-context.xml关注 - 第一个文件正在使用<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>和第二个文件正在使用org.springframework.web.servlet.DispatcherServlet

ContextLoaderListener即使在您不一定使用Spring MVC时也可以用于初始化Spring。 DispatcherServlet是Spring MVC特有的,如果您正在使用它,则需要它。

它可能会摆脱root-context.xml,但它会要求您审查您的应用程序的设计,因为可能有非SpringMVC组件依赖于定义的root-context.xml豆。

+0

所以这就像是'LocaleChangeInterceptor'只会拦截具有查询参数的名称为'lang'的请求?或者它会拦截所有请求并检查查询参数? – Amogh

+1

它会拦截所有请求,但只有当lang参数存在时才会采取行动 –

+0

如果请求是“POST”,该怎么办?我想改变它的语言环境? – Amogh

1

事实上,这个bean定义不属于根上下文,所以你可以放心删除root-context.xml定义的,只是留在servlet-context.xml之一。

至于paramName参数,这是将用于更改语言环境的请求参数的名称 - see reference documentation

+0

如果请求是POST类型,该怎么办? – Amogh

+0

@Amogh为什么会这样?另外,POST请求可以有querystrings。 –

+0

@NeilMcGuigan,因为在项目中,我可以看到一些请求映射,它们是POST方法并返回到视图,实际上我得到了一个任务,我必须将该区域设置切换为'ar',否则默认为'en'。我不知道这是可能的'LocaleChangeInterceptor'或不是,但我会尽力... – Amogh