需要帮助来了解spring配置文件

时间:2015-07-21 19:51:49

标签: java spring spring-mvc

我正在研究一个现有的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是什么?我理解的是,它是一个可靠的名称,其值已分配给paramNameDEFAULT_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.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 个答案:

答案 0 :(得分:2)

LocaleChangeInterceptor会拦截对您的网络应用的网络请求,并查找名称为lang的查询参数(例如http://mywebapp.com/login?lang=en),并尝试相应地设置应用的区域设置,以便您可以执行此操作您的网络应用的本地化。

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

即使您不一定使用Spring MVC,

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