【问题标题】:Spring 3 MVC - how to turn a form into a query string?Spring 3 MVC - 如何将表单转换为查询字符串?
【发布时间】:2010-03-23 16:58:00
【问题描述】:

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

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

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

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

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

谢谢。

【问题讨论】:

    标签: java spring-mvc


    【解决方案1】:

    好的,在对 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";
    

    Spring 会重定向到 /my/url?param1=value;param2=value

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

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

    【讨论】:

      【解决方案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
      

      【讨论】:

        【解决方案3】:

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

        【讨论】:

        • 似乎不起作用...我使用的是带注释的控制器,所以我的控制器只是一个普通的 java 类,不继承自任何 Spring 类。如果我创建一个新的 RedirectView 对象并从控制器返回它......它不会向 URL 附加任何内容。我看不到 RedirectView 对象如何获得对表单对象的引用——我的表单中没有设置器或构造器选项!
        • 处理 RedirectView 时 static.springsource.org/spring/docs/3.0.x/javadoc-api/org/…> 被调用。此方法接收您的模型并呈现正确的 url。
        • 如果我创建一个新的 RedirectView 它不会引用任何模型对象。并且没有设置器给它一个模型对象。如果我在 RedirectView 上调用“render()”方法,传递一个包含我的模型对象的 Map,那么它只会在运行时抛出 IllegalStateException。看起来框架在使用注释时忘记包含对执行此操作的支持...
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-12
        • 1970-01-01
        相关资源
        最近更新 更多