【问题标题】:How to bind HTTP GET Request parameters to JavaBean object variables?如何将 HTTP GET 请求参数绑定到 JavaBean 对象变量?
【发布时间】:2012-12-01 08:35:28
【问题描述】:

在此期间,我正在研究 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 对象的第一个变量中?

谢谢

安德烈亚

【问题讨论】:

    标签: java spring spring-mvc


    【解决方案1】:

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

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

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

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

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

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

    【讨论】:

      【解决方案2】:

      您可以在控制器中使用 @RequestParam 注释,并在 Get URL 中使用变量 Name。

      【讨论】:

      • 他说它是自动完成的,不需要@RequestParam 注释,他打开这个问题问为什么以及由谁...
      • 因此,例如,如果在我的 JavaBean 对象中我有 3 个名为:var1、var2、var3 的变量,我可以执行以下操作:我将 JavaBean ogject 作为输入参数传递给我的控制器方法,然后我可以使用@RequestParam 将每对paramX\varX 的param1 HTTP Req 参数映射到var1 等吗?我明白了吗?
      猜你喜欢
      • 2012-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-03
      • 2023-04-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多