在Spring MVC 3中,单击本地更改链接时本地不会更改

时间:2013-06-26 10:45:26

标签: spring-mvc internationalization

我已经为我的Spring MVC项目设置了i18n。点击链接时,语言没有改变:

<a href="?lang=hi">Hindi</a>
<a href="?lang=en">English</a>

控制器servlet.xml中

    <mvc:annotation-driven/> 
    <context:component-scan base-package="com.avvas.search.controller" />

    <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" />

    <bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
        <property name="basename" value="classpath:resources/messages" />
        <property name="defaultEncoding" value="UTF-8"/>
        <property name="cacheSeconds" value="0" />
    </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="handlerMapping"
        class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
        <property name="interceptors">
            <ref bean="localeChangeInterceptor" />
        </property>
    </bean>

    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
        <property name="prefix" value="/WEB-INF/pages/" />
        <property name="suffix" value=".jsp" />
    </bean>

    <mvc:resources mapping="/css/**" location="/css/" />
    <mvc:resources mapping="/javascript/**" location="/javascript/" />

本地更改链接:

<a href="?lang=hi">Hindi</a>
<a href="?lang=en">English</a>

问题是,当我点击印地语时,页面应该用印地语显示,语言不会改变。然而,我将默认语言更改为hindi <property name="defaultLocale" value="hi"/>然后它将本地作为印地语,但当我点击英语本地更改链接时,本地不会更改。

2 个答案:

答案 0 :(得分:2)

<mvc:annotation-driven/>正在注册自己的处理程序映射(RequestMappingHandlerMapping),并且您的拦截器配置不适用于此。

像这样定义你的拦截器:

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

答案 1 :(得分:0)

这是完整的代码。基本上我们需要明确地注册我们的拦截器。

<bean id="localeChangeInterceptor"
    class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
    <property name="paramName" value="lang" />

在上面给出的xml中,你给出了“localeChangeInterceptor”,但是你没有提到它应该默认拦截所有请求。

所以Spring会加载所有bean,但是除非你定义它应该拦截哪个请求,否则它不会将它注册为拦截器。

在下面的示例中,我在mvc拦截器中定义它并告诉框架它应该在处理任何请求之前咨询该拦截器。

    <mvc:interceptor>
        <mvc:mapping path="/**/**/" />
        <bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
            <property name="paramName" value="locale" />
        </bean>
    </mvc:interceptor>
</mvc:interceptors>