Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring3MVC-如何将表单转换为查询字符串?_Java_Spring Mvc - Fatal编程技术网

Java Spring3MVC-如何将表单转换为查询字符串?

Java Spring3MVC-如何将表单转换为查询字符串?,java,spring-mvc,Java,Spring Mvc,我有一个简单的Spring表单,它绑定到post上的form对象。http POST处理程序做了一些工作,然后需要重定向到新的URL,将表单数据作为querystring参数传递 因此,假设我有一个属性为“param1”和“param2”的表单支持对象,我想构建一个如下所示的字符串: Assuming the form backing object "formObject" has been passed as a parameter to the controller handler meth

我有一个简单的Spring表单,它绑定到post上的form对象。http POST处理程序做了一些工作,然后需要重定向到新的URL,将表单数据作为querystring参数传递

因此,假设我有一个属性为“param1”和“param2”的表单支持对象,我想构建一个如下所示的字符串:

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";
重定向:/app/new/page?param1=值;参数2=值

现在,Spring将自动将querystring或form post中的值绑定到我的form对象中,但我想使用从form对象中获取的值生成querystring

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


谢谢。

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

好的,在跟踪Spring源代码之后,我想我有了一些明确的答案

1) 手动将查询参数添加到以“重定向:…”字符串形式传回的URL是一个非常糟糕的主意。Spring缓存这些URL所引用的视图,因此如果指定了大量不同的参数,则会使缓存包含大量不需要的值,从而有效地泄漏内存

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

2) 当控制器返回时,模型对象仍由Spring持有,并且Spring将自动将其中的任何值添加到您指定的URL(作为查询参数)——前提是模型值是纯字符串或基本体对象。现在,由于表单支持对象是作为单个属性存储的对象,因此Spring不会对其执行任何操作

因此,从带注释的控制器来看,最好的方法似乎是向handler方法添加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;参数2=值

似乎没有(在Spring中)内置机制将bean转换为键/值对列表以添加到映射中,但是如果您真的需要,ApacheBeanutils库可以很好地完成这项工作。当然,您不希望对大对象执行此操作,否则可能会超出URL的允许长度


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

似乎不起作用。。。我使用带注释的控制器,所以我的控制器只是一个普通的java类,而不是从任何Spring类继承。如果我创建一个新的RedirectView对象并从控制器返回它。。。它不会向URL追加任何内容。我看不出RedirectView对象将如何获得对表单对象的引用-在我的表单中没有可传递的setter或构造函数选项!处理重定向视图时,将调用>。此方法接收您的模型并呈现正确的url。如果我创建新的重定向视图,它将不会引用任何模型对象。没有setter给它一个模型对象。如果我在RedirectView上调用“render()”方法,传递一个包含我的模型对象的映射,那么它只会在运行时抛出一个IllegalStateException。在使用注释时,框架似乎忘记了支持这样做。。。
http://.../somewhere.htm?stuff=here