2010-03-23 94 views
6

我有一个简单的Spring表单,它被绑定到表单对象上。 http POST处理程序做了一些工作,然后需要重定向到一个新的URL,将表单数据作为查询字符串参数传递。Spring 3 MVC - 如何将表单转换为查询字符串?

因此,假设我有一个属性“参数1”和“参数2”的表单支持对象,我想建立一个字符串,它看起来是这样的:

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

现在,春天将自动绑定值从一个查询字符串或表单发布到我的表单对象,但我想生成一个查询字符串与从表单对象采取的值。

很明显,手动做这件事很简单,但由于我将有很多不同的表单支持对象,Spring中是否有一些内置工具可以从表单对象生成查询字符串,适合构建为网址是什么?

谢谢。

回答

2

好的,经过一些追溯到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的允许长度。

发现了这一切,似乎更难比它需要的是:-)

0

我认为你应该使用RedirectView类的方法setExposeModelAttributes,但是如果你在你的控制器上使用Spring 3.0注解,可能很难获得这个方法。

+0

似乎不工作...我使用Annotated控制器,所以我的控制器只是一个普通的java类,不能从任何Spring类继承。 如果我创建一个新的RedirectView对象并从控制器返回它...它不会追加任何内容到URL。我无法看到RedirectView对象如何获得对表单对象的引用 - 没有设置器或构造器选项可以传入我的表单! – David 2010-03-23 17:19:35

+0

处理RedirectView时调用renderMergedOutputModel。此方法接收您的模型并呈现正确的url。 – uthark 2010-03-23 17:51:48

+0

如果我创建一个新的RedirectView,它将不会有任何对任何模型对象的引用。而且没有二流派给它一个模型对象。如果我在RedirectView上调用“render()”方法,传递包含模型对象的Map,那么它只会在运行时抛出IllegalStateException。 看起来像框架在使用注释时忘记了包含对此的支持...... – David 2010-03-23 18:17:59

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 
相关问题