我有一个简单的Spring表单,它绑定到post上的表单对象.http POST处理程序可以完成一些工作,然后需要重定向到新的URL,将表单数据作为查询字符串参数传递.
所以,假设我有一个带有属性"param1"和"param2"的表单支持对象,我想构建一个看起来像这样的字符串:
redirect:/app/new/page?param1=value;param2=value
现在,Spring会自动将值从查询字符串或表单帖子绑定到我的表单对象中,但是我想生成一个查询字符串,其中的值取自表单对象.
显然,手动执行此操作是微不足道的,但由于我将拥有许多不同的表单支持对象,因此Spring中是否有一些内置工具可以从表单对象生成查询字符串,适合构建到URL中?
谢谢.
好的,在对 Spring 源代码进行一些追踪之后,我想我有了一些明确的答案。
1) 手动将查询参数添加到以“redirect:...”字符串传回的 URL 中是一个非常糟糕的主意。Spring 会缓存这些 url 引用的视图,因此,如果您指定了许多不同的参数,那么您会通过使缓存保存大量不需要的值来有效地泄漏内存。
请注意,Spring 发行版中的 PetClinic 示例代码正是这样做的,并且显然已经提出了一个 Jira 问题来纠正它:-)
2) 当控制器返回时,模型对象仍然由 Spring 持有,并且 Spring 会自动将其中的任何值添加到您指定的 URL 上(作为查询参数) - 前提是模型值是纯字符串或原始对象。现在,由于表单支持对象是一个存储为单个属性的对象,因此 Spring 不会对它执行任何操作。
因此,从带注释的控制器来看,最好的方法似乎是将 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";
Run Code Online (Sandbox Code Playgroud)
Spring 将发出重定向到 /my/url?param1=value;param2=value
似乎没有内置机制(在 Spring 中)将 bean 转换为键/值对列表以添加到映射中,但如果您确实需要它,Apache BeanUtils 库会做得很好。当然,您不想对大对象执行此操作,否则可能会超出 URL 允许的长度。
找出所有这些似乎比需要的要困难得多:-)
| 归档时间: |
|
| 查看次数: |
3286 次 |
| 最近记录: |