1

在此期间,我正在研究 Sping MVC 展示示例可下载表单 STS 仪表板。

请求数据部分显示了如何将 HTTP GET 请求的参数绑定到 JavaBean 的同名变量。

在实践中,我有以下链接:

 <a id="group" class="textLink" 
    href="<c:url value="/data/group?param1=foo&param2=bar&param3=baz" />">
       Group of query parameters
 </a>

此链接生成一个指向“/data/group” URL 的 GET HTTP 请求。该请求携带 3 个参数,名为 param1、param2、param3。

此请求由我的控制器类的以下方法处理:

@RequestMapping(value="group", method=RequestMethod.GET)
public @ResponseBody String withParamGroup(JavaBean bean) {
    return "Obtained parameter group " + bean;
}

withParamGroup() 方法使用一个 JavaBean 对象,该对象只是一个包含 3 个变量和 getter/setter 方法的对象,如下所示:

public class JavaBean {

    private String param1;
    private String param2;
    private String param3;

        // GETTER & SETTER method
}

所以 HTTP Request 中的 param1 参数存储在 JavaBean Object 的 param1 变量中,param2 和 param3 也是一样的。

好的...我想这对我来说很清楚...但是...谁做这个手术?它是由 Spring 框架自动生成的吗?

为什么我不必像在控制器方法中将单个 HTTP 请求参数与单个变量绑定时那样使用 @RequestParam 注释之类的东西?

另一个疑问是:HTTP 参数名称必须与 JavaBean 变量相同,还是只是第一个参数值存储在 JavaBean 对象的第一个变量中?

谢谢

安德烈亚

4

2 回答 2

2

有趣的是,Spring 文档似乎缺少有关此功能的详细信息,但 Spring MVC 文档中有一些要点似乎表明 Spring 负责在请求映射过程中应用此行为。@RequestParam在文档中有关使用属性将请求参数绑定到方法参数的部分中对此功能有参考(位于此处):

如果目标方法参数类型不是字符串,则会自动应用类型转换。请参阅第 16.3.3.14 节,“方法参数和类型转换”。

如果您然后转到引用的部分,文档建议 Spring 自动转换原始对象类型(此处):

从请求中提取的基于字符串的值,包括请求参数、路径变量、请求标头和 cookie 值,可能需要转换为方法参数或字段的目标类型(例如,将请求参数绑定到 @ModelAttribute 中的字段参数)他们绑定到。如果目标类型不是 String,Spring 会自动转换为合适的类型。支持所有简单类型,例如 int、long、Date 等。您可以通过 WebDataBinder(请参阅第 16.3.3.15 节,“自定义 WebDataBinder 初始化”)或通过向 FormattingConversionService 注册格式化程序(请参阅第 6.6 节,“Spring 3 字段格式”)进一步自定义转换过程。

不幸的是,这似乎没有充分解释为什么要转换非原始对象类型,但也许文档不是最新的功能。

关于属性名称是否必须与参数匹配的最后一点 - 这是我的推测,因为我找不到任何支持它的文档,但我会根据你对 Spring 将寻求的这个“特性”所经历的行为进行猜测按名称而不是请求中的参数顺序将参数与属性匹配。

于 2012-12-13T13:46:28.633 回答
0

您可以@RequestParam在控制器中使用带有在获取 URL 中使用的变量名称的注释。

于 2012-12-13T12:48:20.707 回答