gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:23:32 29 4
gpt4 key购买 nike

我有一个简单的 Spring 表单,它在发布时绑定(bind)到一个表单对象。 http POST 处理程序做了一些工作,然后需要重定向到一个新的 URL,将表单数据作为查询字符串参数传递。

因此,假设我有一个具有属性“param1”和“param2”的表单支持对象,我想构建一个看起来像这样的字符串:

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

现在,Spring 会自动将查询字符串或表单帖子中的值绑定(bind)到我的表单对象中,但我想使用从表单对象中获取的值生成一个查询字符串。

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

谢谢。

最佳答案

好的,在对 Spring 源代码进行一些追踪之后,我想我有了一些明确的答案。

1) 手动将查询参数添加到您在“redirect:...”字符串中传回的 URL 是一个非常糟糕的想法。 Spring 缓存这些 url 引用的 View ,因此如果您指定许多不同的参数,您会通过让缓存保存大量不需要的值来有效地泄漏内存。

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

2) 当 Controller 返回时,模型对象仍然由 Spring 持有,并且 Spring 会自动将其中的任何值添加到您指定的 URL 中(作为查询参数)——前提是模型值是纯字符串或原始对象。现在,由于表单支持对象是作为单个属性存储的对象,因此 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 的允许长度。

找出所有这些似乎比需要的要难得多:-)

关于java - Spring 3 MVC - 如何将表单转换为查询字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2501918/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com