好的,经过一些追溯到Spring源代码后,我想我有一些明确的答案。
1)将查询参数手动添加到您在“redirect:...”字符串中传回的URL是一个非常棒的IDEA。 Spring会缓存这些URL所引用的视图,所以如果你指定了很多不同的参数,你可以通过让缓存保存很多不需要的值来有效地泄漏内存。
注意,在春季分布的PetClinic示例代码正是这样做的,而且显然也已提高到纠正:-)
2)模型对象是否仍然由春天举行的控制器时,JIRA问题返回,并且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";
和春季会发出一个重定向到/我/ URL参数1 =值;参数2 =值
似乎没有要一个内置的机制(在Spring中)将bean变成一个键/值对列表以添加到地图中,但如果真的需要,Apache BeanUtils库将会很好地完成。当然,您不希望为大对象执行此操作,否则您可能会超出URL的允许长度。
发现了这一切,似乎更难比它需要的是:-)
似乎不工作...我使用Annotated控制器,所以我的控制器只是一个普通的java类,不能从任何Spring类继承。 如果我创建一个新的RedirectView对象并从控制器返回它...它不会追加任何内容到URL。我无法看到RedirectView对象如何获得对表单对象的引用 - 没有设置器或构造器选项可以传入我的表单! – David 2010-03-23 17:19:35
处理RedirectView时调用renderMergedOutputModel。此方法接收您的模型并呈现正确的url。 – uthark 2010-03-23 17:51:48
如果我创建一个新的RedirectView,它将不会有任何对任何模型对象的引用。而且没有二流派给它一个模型对象。如果我在RedirectView上调用“render()”方法,传递包含模型对象的Map,那么它只会在运行时抛出IllegalStateException。 看起来像框架在使用注释时忘记了包含对此的支持...... – David 2010-03-23 18:17:59