2015-11-24 92 views
0

我在我的spring应用程序中安装了多语言,并且我不想让'lang'参数出现在URL中(我使用sessionLocaleResolver或cookieLocaleResolver存储区域设置/两者均不起作用) 。 我已经搜索了几个小时来找到这个问题的解决方案,但显然它应该已经与我所做的工作。这里是我的代码:从URL中删除GET参数Spring 4

视图(的welcome.jsp):

Language : <a href="?lang=en">English</a>|<a href="?lang=fr_FR">Francais</a>|<a href="?lang=ro_RO">Romanian</a> 
<h2>welcome.springmvc : <spring:message code="welcome.text" text="default text" /></h2> 

我servlet.xml中

<!-- Multi-Language/Localization Setup --> 
<mvc:interceptors> 
    <mvc:interceptor> 
     <mvc:mapping path="/**" /> 
     <bean id="localeChangeInterceptor" 
      class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"> 
      <property name="paramName" value="lang" /> 
     </bean> 
    </mvc:interceptor> 
</mvc:interceptors> 
<mvc:annotation-driven ignore-default-model-on-redirect="true" /> 

<bean id="messageSource" 
    class="org.springframework.context.support.ReloadableResourceBundleMessageSource"> 
    <property name="basenames"> 
     <list> 
      <value>classpath:lang.files/welcome</value> 
      <!-- <value>classpath:messages2</value> --> 
     </list> 
    </property> 
    <property name="defaultEncoding" value="UTF-8" /> 
</bean> 

<bean id="localeResolver" 
    class="org.springframework.web.servlet.i18n.CookieLocaleResolver"> 
    <property name="defaultLocale" value="en" /> 
    <property name="cookieName" value="lang" /> 
    <property name="cookieMaxAge" value="60000" /> 
    <property name="cookiePath" value="/" /> 
</bean> 

我的控制器代码 - 注意,我住在同一个页面时,我点击链接更改语言。因为理想情况下是一个下拉,我会留在同一个页面

@RequestMapping("/welcome") 
public ModelAndView helloWorld() { 

    String message = "<br/ ><div style='text-align:center;'>" 
      + "<h3>********** Hello World, Spring MVC Tutorial</h3></div><br />"; 

    ModelAndView mv = new ModelAndView(); 
    // ModelAndView mv = new ModelAndView(new 
    // RedirectView("welcome.do", true, true, true)); 
    RedirectView view = new RedirectView("/welcome", true); 
    view.setExposeModelAttributes(false); 
    mv.setView(view); 

    mv.addObject("message", message); 
    mv.addObject("activities", activityService.getAll()); 
    mv.addObject("act", activityService.getR()); 

    return new ModelAndView(view); 
} 

结果是“404”说,“本地主机/ MYAPP /欢迎”未找到。

最后这个控制器,工作,但在URL中添加 '郎' 参数:

@RequestMapping("/welcome") 
public ModelAndView helloWorld() { 

    String message = "<br/ ><div style='text-align:center;'>" 
      + "<h3>********** Hello World, Spring MVC Tutorial</h3></div><br />"; 

    ModelAndView mv = new ModelAndView(); 

    mv.addObject("message", message); 
    mv.addObject("activities", activityService.getAll()); 
    mv.addObject("act", activityService.getR()); 

    return mv; 
} 

请帮助。 谢谢:)

回答

1
@RequestMapping("/welcome") 
public ModelAndView helloWorld() { 

    String message = "<br/ ><div style='text-align:center;'>" 
      + "<h3>********** Hello World, Spring MVC Tutorial</h3></div><br />"; 

    ModelAndView mv = new ModelAndView(); 
    // ModelAndView mv = new ModelAndView(new 
    // RedirectView("welcome.do", true, true, true)); 
    RedirectView view = new RedirectView("/welcome", true); 
    view.setExposeModelAttributes(false); 
    mv.setView(view); 

    mv.addObject("message", message); 
    mv.addObject("activities", activityService.getAll()); 
    mv.addObject("act", activityService.getR()); 

    return new ModelAndView(view); 
} 

此代码会导致你被重定向到/欢迎一遍又一遍的无限循环。

此外,当您获得类似<a href="?lang=en">English</a>的链接时,您点击该参数时该参数将始终显示在网址中。

最简单的方法(不是最好的),以达到你想要的目标是创建另一个控制器的方法类似

@RequestMapping("/changeLocale") 
public ModelAndView changeLocale() { 
    RedirectView redirectView = new RedirectView("/welcome"); 
    redirectView.setExposePathVariables(false); 
    return new ModelAndView(redirectView); 
} 

和链接看起来像

<a href="/changeLocale?lang=en">English</a>|<a href="/changeLocale?lang=fr_FR">Francais</a>|<a href="/changeLocale?lang=ro_RO">Romanian</a> 
+0

谢谢你的帮助。我设法使用你的帮助来使它工作,虽然我不熟练使用Spring MVC,但我可以使用我的指导方针来推进我的项目。最好的祝福:) – pegas