我在Spring MVC World中很新,我也有一个问题。
我已经通过STS模板创建了一个新的Spring MVC项目。
所以现在我有一个最小的项目,一旦执行,显示一个显示当前日期和时间的Hello World消息
这是该项目唯一控制器类的代码:
package org.gnagna.bla;
import java.text.DateFormat;
import java.util.Date;
import java.util.Locale;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
/**
* Handles requests for the application home page.
*/
@Controller
public class HomeController {
private static final Logger logger = LoggerFactory.getLogger(HomeController.class);
/**
* Simply selects the home view to render by returning its name.
*/
@RequestMapping(value = "/", method = RequestMethod.GET)
public String home(Locale locale, Model model) {
logger.info("Welcome home! The client locale is {}.", locale);
Date date = new Date();
DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale);
String formattedDate = dateFormat.format(date);
model.addAttribute("serverTime", formattedDate );
return "home";
}
}
所以只有一个名为 home 的方法处理HTTP GET调用“/”URL,这对我来说很明显。
这个不清楚的是关于这个方法的输入参数,你可以看到这个方法接收两个输入参数:
1)模型
2)Locale对象,包含有关用户的一些信息
但是:谁创建了这个Locale对象,以及何时在我的控制器中作为输入参数传递?
TNX
安德烈
答案 0 :(得分:4)
LocaleResolver正在这样做。
HandlerMethodInvokere最终使用一个这样的解析器来检查您正在调用的@RequestMapping方法的参数(在您的情况下为“home”方法)。当遇到Locale参数时,它只是使用语言环境解析器来获取Locale对象以作为参数传递。
您可以在此处查看有关它的更多信息: http://static.springsource.org/spring/docs/3.0.0.M3/reference/html/ch16s06.html
http://templth.wordpress.com/2010/07/21/configuring-locale-switching-with-spring-mvc-3/
http://www.mkyong.com/spring-mvc/spring-mvc-internationalization-example/
答案 1 :(得分:1)
在您的GET请求中,您可以使用该请求的特殊参数,例如?language=en
,将区域设置信息发送到服务器。但问题是你的servlet容器如何知道language
参数是带有你的语言环境信息的参数。要让Spring MVC容器知道这个特殊的locale参数,你需要在targer-servlet.xml
中添加两个特殊的拦截器,如下所示:
<bean id="localeChangeInterceptor"
class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
<property name="paramName" value="language" />
</bean>
<bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping" >
<property name="interceptors">
<list>
<ref bean="localeChangeInterceptor" />
</list>
</property>
</bean>
现在,您的servlet容器知道通过GET请求传递的locale参数的值。但是仍然需要有人根据所选语言链接更改语言环境,并相应地显示属性文件中的消息。一个名为localeResolver
的特殊bean来救援工作,就像轰鸣声:
<bean id="localeResolver"
class="org.springframework.web.servlet.i18n.SessionLocaleResolver">
<property name="defaultLocale" value="en" />
</bean>
现在,如果您想在GET请求处理程序方法中使用语言环境对象,则可以编写方法签名,如public String home(Locale locale, Model model)
(就像您所做的那样)。然后你的servlet容器得到一个额外的工作,在调用它之前把这个locale对象作为你的方法参数,然后你就像魔术一样在你的方法中得到它!