【问题标题】:Spring 3 MVC: form backing object has to be in session? How can I avoid this?Spring 3 MVC:表单支持对象必须在会话中?我怎样才能避免这种情况?
【发布时间】:2011-12-28 07:58:49
【问题描述】:

我阅读了一些关于 Spring 3 MVC 中的表单和提交的教程。所有这些示例都表明,在会话中存储支持对象的方式如下:

@SessionAttributes({"command"})

我使用旧版本的 Spring,如果控制器继承 SimpleFormController,则有一个 formBacking 方法。

protected Object formBackingObject(HttpServletRequest request)

如果我的理解是正确的,旧版本的方法会在表单提交时动态加载表单支持对象,并且不需要将该对象存储在会话中。

如果我对 Spring 3 MVC 的理解是正确的,那么我不喜欢 session 方法,因为在大用户的情况下它会消耗大量内存,并且 session 中存储的对象可能在提交表单时已经过时。

我可以避免在 Spring 3 的 MVC 中将表单支持对象存储在会话中吗?有指针吗?

感谢您的任何意见,如果我错了,请纠正我。

问候。


还有人知道我的理解是否正确吗?

将对象添加到模型中的 GET 控制器等同于将其添加到会话中。提交表单时,Spring如何记住该对象作为支持对象?干杯。

在提交表单时,在 GET 控制器中添加到模型的表单支持对象如何在服务器和客户端之间的往返传输中幸存? Spring 是否在磁盘上对其进行序列化?我猜……

感谢您的任何意见!

【问题讨论】:

    标签: java forms spring model-view-controller object


    【解决方案1】:

    您需要将支持对象添加到模型,而不是会话。这是一个教程...http://www.roseindia.net/tutorial/spring/spring3/web/spring-3-mvc-form-example.html

    【讨论】:

    • 感谢您的回复。我在发帖之前阅读了该教程。在本教程中,不会从数据库加载表单支持对象。我说的是从数据库加载表单支持对象。如果我的理解是正确的,将对象添加到模型中的 GET 控制器等同于将其添加到会话中。提交表单时,Spring如何记住该对象作为支持对象?干杯。
    • 讽刺的是@madth3 的答案正是我想要的,即由与数据库无关的对象支持的表单,其他搜索也可能遇到此问题。
    【解决方案2】:

    如果您只是没有在@SessionAttributes 中列出您的命令,它将每次都被实例化。

    在旧的 Controller API 中,实现可以决定是否要将其命令对象保留在会话中:请参阅 AbstractFormController.isSessionForm()SimpleFormController 返回false,而AbstractWizardFormController 返回true,因为它实际上需要将命令存储在会话中。

    您可以在 HandlerMethodInvoker.resolveModelAttribute(...) 私有方法中检查模型属性的绑定方式:

    if (implicitModel.containsKey(name)) {
        // ...
    } else if (this.methodResolver.isSessionAttribute(name, paramType)) {
        // ...
    else {
        bindObject = BeanUtils.instantiateClass(paramType);
    }
    

    很明显,如果你没有明确地将它声明为会话属性,活页夹将使用一个新的实例;与从 AbstractFormController.isSessionForm() 返回 false 完全相同。


    在提交表单时,在 GET 控制器中添加到模型中的表单支持对象如何在服务器和客户端之间的往返中幸存下来? Spring 是否在磁盘上对其进行序列化?我猜……

    Spring 并不(总是)需要在表单视图和表单提交之间存储支持对象。如果为了填充命令对象所需的一切都随请求一起提供,Spring 可以简单地实例化一个新的命令对象(它自己或如果你提供适当的方法让你这样做),然后将请求绑定到那个新实例。

    参见上面与旧 API 的比较,了解 SimpleFormControllerAbstractWizardFormController 实现之间的区别。第一个不需要在会话中存储任何内容,它将提交请求绑定到新创建的对象。使用新的带注释的处理程序,流程是一样的;如果您不想存储它,它将在提交时重新创建:BeanUtils.instantiateClass(...) 或您自己的自定义工厂方法。

    【讨论】:

    • Costi,非常感谢您的详细解释。我觉得我到了那里,但并非完全没有看到一个例子。 >>Spring 可以简单地实例化一个新的命令对象(它自己或者如果你提供了适当的方法让你这样做),然后将请求绑定到那个新实例。您能否指出一个 Spring 3 MVC 示例,其中在提交表单时从数据库加载表单支持对象(或者您可以向我展示步骤和方法?)。干杯!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-14
    • 1970-01-01
    • 1970-01-01
    • 2011-01-27
    • 2015-08-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多