Java Spring3MVC:表单支持对象必须处于会话中?我怎样才能避免这种情况?

Java Spring3MVC:表单支持对象必须处于会话中?我怎样才能避免这种情况?,java,forms,spring,model-view-controller,object,Java,Forms,Spring,Model View Controller,Object,我读了一些关于Spring3MVC中表单和提交的教程。所有这些示例都表明,在会话中存储备份对象的方式如下: @SessionAttributes({“command”}) 我使用了Spring的旧版本,其中如果控制器继承SimpleFormController,则有一个formBacking方法 受保护对象formBackingObject(HttpServletRequest请求) 如果我的理解是正确的,旧版本方法在表单提交时动态加载表单备份对象,并且不需要在会话中存储此对象 如果我对Spri

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

@SessionAttributes({“command”})

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

受保护对象formBackingObject(HttpServletRequest请求)

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

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

我可以避免在Spring3的MVC会话中存储表单备份对象吗?有指针吗

谢谢你的任何意见,如果我错了,请纠正我

问候


还有谁知道我的理解是否正确

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

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


谢谢你的意见

您需要将备份对象添加到模型中,而不是会话中。这里有一个教程

如果您只是不在
@SessionAttributes
中列出您的命令,那么每次都会实例化它

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

您可以在
HandlerMethodInvoker.resolveModelAttribute(…)
private方法中检查如何绑定模型属性:

if (implicitModel.containsKey(name)) {
    // ...
} else if (this.methodResolver.isSessionAttribute(name, paramType)) {
    // ...
else {
    bindObject = BeanUtils.instantiateClass(paramType);
}
所以很明显,如果您没有明确地将其声明为会话属性,那么绑定器将使用一个新实例;与从
AbstractFormController.isSessionForm()
返回false完全相同


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

Spring并不(总是)需要在表单视图和表单提交之间存储备份对象。如果填充命令对象所需的一切都随请求而来,那么Spring可以简单地实例化一个新的命令对象(要么自己实例化,要么在提供适当方法的情况下让您实例化),然后将请求绑定到该新实例


关于
SimpleFormController
AbstractWizardFormController
实现之间的差异,请参见上面与旧API的比较。第一个不需要在会话上存储任何内容,它将提交请求绑定到新创建的对象。对于新的带注释的处理程序,流是相同的;如果您不想存储它,它将在提交时重新创建:
BeanUtils.InstanceClass(…)
或您自己的自定义工厂方法。

谢谢您的回复。我在发帖前读了那个教程。在本教程中,表单支持对象不是从数据库加载的。我说的是从数据库加载表单支持对象。如果我的理解是正确的,GET控制器将对象添加到模型等同于将其添加到会话。当表单提交时,Spring如何将该对象作为支持对象?干杯。具有讽刺意味的是,@madth3的答案正是我想要的,也就是说,一个由与数据库无关的对象支持的表单,其他搜索可能也会遇到这个问题。Costi,非常感谢您的详细解释。我觉得我已经达到了目标,但并非完全没有看到一个例子。>>Spring可以简单地实例化一个新的命令对象(或者它本身,或者如果您提供了一个合适的方法,就让您这样做),然后将请求绑定到这个新实例。请您给我举一个Spring3MVC示例,其中表单支持对象是在表单提交时从数据库加载的(或者您可以向我展示步骤和方法?)。干杯