如何将HTTPGET请求参数绑定到JavaBean对象变量



在这段时间里,我正在学习Sping MVC showcase示例可从STS仪表板下载。

在请求数据部分,展示了如何将HTTPGET请求的参数绑定到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个变量和getters/ssetters方法的对象,类似于以下内容:

public class JavaBean {
private String param1;
private String param2;
private String param3;
// GETTER & SETTER method
}

因此,HTTP请求中的param1参数存储在JavaBean对象的param1变量中,param2和param3也是如此。

好的。。。我想这对我来说很清楚…但是…谁做这个手术?它是由Spring框架自动制作的吗?

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

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

感谢

Andrea

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

如果目标方法参数类型不是String,则会自动应用类型转换。参见第16.3.3.14节"方法参数和类型转换"。

如果转到引用的部分,文档建议Spring自动转换基元对象类型(此处):

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

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

关于属性名称是否必须与参数匹配,这是一个猜测,因为我找不到任何文档来支持它,但我猜,根据您使用此"功能"的行为,Spring将根据名称而不是请求中参数的顺序来匹配参数与属性。

您可以在控制器中使用@RequestParam注释,该控制器具有Get-URL中使用的变量Name。

最新更新