Spring 3 MVC - 如何将表单转换为查询字符串?

时间:2010-03-23 16:58:00

标签: java spring-mvc

我有一个简单的Spring表单,它绑定到post上的表单对象。 http POST处理程序可以完成一些工作,然后需要重定向到新的URL,将表单数据作为查询字符串参数传递。

所以,假设我有一个带有属性“param1”和“param2”的表单支持对象,我想构建一个类似于这样的字符串:

redirect:/app/new/page?param1=value;param2=value

现在,Spring会自动将来自查询字符串或表单帖子的值绑定到我的表单对象中,但是我想生成一个查询字符串,其值来自表单对象。

显然手动执行此操作是微不足道的,但由于我将拥有许多不同的表单支持对象,因此Spring中有一些内置工具可以从表单对象生成查询字符串,适合构建到URL ?

感谢。

3 个答案:

答案 0 :(得分:2)

好的,在对Spring源代码进行一些跟踪后,我认为我有一些明确的答案。

1)手动将查询参数添加到您在“重定向:...”字符串中传回的URL是一个非常糟糕的想法。 Spring缓存那些url引用的视图,因此如果你指定了许多不同的参数,你可以通过使缓存保存许多不需要的值来有效地泄漏内存。

请注意,Spring发行版中的PetClinic示例代码就是这样做的,显然已经出现了一个Jira问题来纠正它: - )

2)当控制器返回时,Spring仍然保持模型对象,Spring会自动将其中的任何值添加到您指定的URL(作为查询参数) - 提示模型值是纯String或原始对象。现在,由于表单支持对象是作为单个属性存储的对象,因此Spring不会对其执行任何操作。

所以 - 从带注释的Controller中,最好的方法似乎是将一个ModelMap参数添加到处理程序方法中。当你准备回来时,做这样的事情:

Assuming the form backing object "formObject" has been passed as a parameter to the controller handler method (via the ModelAttribute annotation) and has properties "param1" and "param2" that are Strings -

modelMap.clear();
modelMap.addAttribute("param1", formObject.getParam1());
modelMap.addAttribute("param2", formObject.getParam2());
return "redirect:/my/url";

Spring将重定向到/ my / url?param1 = value; param2 = value

似乎没有内置机制(在Spring中)将bean转换为用于添加到地图中的键/值对列表,但如果你真的需要,那么Apache BeanUtils库会做很好。当然,您不希望对大对象执行此操作,否则您可能会超出URL的允许长度。

找到所有这些似乎比它需要的更难: - )

答案 1 :(得分:2)

Map<String, Object> model = new HashMap<String, Object();
model.put("stuff", "here");
ModelAndView mv = new ModelAndView("redirect:/somewhere.htm", model);
return mv;

<强>可生产

http://.../somewhere.htm?stuff=here

答案 2 :(得分:0)

我认为,您应该使用RedirectView类的方法setExposeModelAttributes,但如果您在控制器上使用Spring 3.0注释,则可能很难访问此方法。