我有一个简单的Spring表单,它绑定到post上的表单对象。 http POST处理程序可以完成一些工作,然后需要重定向到新的URL,将表单数据作为查询字符串参数传递。
所以,假设我有一个带有属性“param1”和“param2”的表单支持对象,我想构建一个类似于这样的字符串:
redirect:/app/new/page?param1=value;param2=value
现在,Spring会自动将来自查询字符串或表单帖子的值绑定到我的表单对象中,但是我想生成一个查询字符串,其值来自表单对象。
显然手动执行此操作是微不足道的,但由于我将拥有许多不同的表单支持对象,因此Spring中有一些内置工具可以从表单对象生成查询字符串,适合构建到URL ?
感谢。
答案 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注释,则可能很难访问此方法。