【问题标题】:Parameter of a controller method in Spring MVCSpring MVC中控制器方法的参数
【发布时间】:2012-12-05 16:28:08
【问题描述】:

我是 Spring MVC 世界的新手,我想问你一个问题。

我已经通过 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 的方法可以处理对“/” URL 的 HTTP GET 调用,这对我来说很清楚。

这不是clead的是关于这个方法的输入参数,你可以看到这个方法接收两个输入参数:

1) 模型

2) 包含有关用户的一些信息的 Locale 对象

但是:谁创建了这个 Locale 对象,什么时候作为输入参数传递给我的控制器?

Tnx

安德烈亚

【问题讨论】:

标签: java spring spring-mvc locale


【解决方案1】:

LocaleResolver 正在这样做。

HandlerMethodInvokere 最终使用一个这样的解析器来检查您正在调用的 @RequestMapping 方法的参数(在您的情况下为“home”方法)。当它遇到一个 Locale 参数时,它只是使用 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/

【讨论】:

  • mmm...我已经阅读了一些关于 Spring 应用程序国际化的教程...但是在这种情况下,我没有在 servlet-context.xml 和 web.xml 文件中声明 LocalResolver...为什么?
  • 如果您不指定任何语言环境解析器,Spring 将默认为 AcceptHeaderLocaleResolver。所以你总是有一个语言环境解析器。
  • 好的,如果我很了解它是如何工作的,请告诉我 Spring 默认为我提供一个本地解析器,这会查看我的 HTTP 请求的标头,因此知道我存储在我可以将其作为输入参数传递给要在其中使用的控制器方法的语言环境对象...对吗?谢谢
  • 是的,就是这样。默认查看“接受语言”HTTP 请求标头以提取语言环境。
  • 默认支持大量参数类型(即它们具有默认解析器),您可以在RequestMapping 看到这些参数类型的列表。语言环境只是其中之一。所以基本上你可以在你的控制器方法上使用其中的任何一个。
【解决方案2】:

在您的 GET 请求中,您可以使用该请求的特殊参数(例如 ?language=en)将区域设置信息发送到服务器。但问题是您的 servlet 容器如何知道 language 参数是承载您的语言环境信息的参数。要让 Spring MVC 容器知道这个特殊的语言环境参数,您需要在 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 容器会在调用它之前将该语言环境对象作为您的方法参数进行额外的工作,然后您就可以像魔术一样将它放入您的方法中!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-02
    相关资源
    最近更新 更多