java - Spring 3 MVC : form backing object has to be in session? 我怎样才能避免这种情况?

标签 java forms spring model-view-controller object

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

@SessionAttributes({"command"})

我使用旧版本的 Spring,如果 Controller 继承 SimpleFormController,其中有一个 formBacking 方法。

protected Object formBackingObject(HttpServletRequest 请求)

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

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

我可以避免在 Spring 3 的 MVC session 中存储表单支持对象吗?有什么指点吗?

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

问候。


有没有人知道我的理解对不对?

the GET controller adding the object to the model equates to adding it to session. How can Spring remember the object as the backing object when a form is submitted? Cheers.

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

感谢任何输入!

最佳答案

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

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

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

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

很明显,如果您不明确将其声明为 session 属性, Binder 将使用一个新实例;与从 AbstractFormController.isSessionForm() 返回 false 完全相同。


How can the form backing object added to the model in the GET controller survive a round trip between the server and client when a form is submitted? Does Spring serialize it on disk? I am guessing...

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

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

关于java - Spring 3 MVC : form backing object has to be in session? 我怎样才能避免这种情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8116612/

相关文章:

c++ - 防止 Content-Disposition 中的绝对文件路径 "filename"

java - GWT + Spring + Hibernate 中的示例应用程序

spring - Redis - 为什么使用 Spring Data Redis 将细节保存为 HASH 和 SET?

java - 使用 Java Web 应用程序中的 Google Docs API ( Gdata) 上传文档

java - Hadoop HDFS MapReduce 输出到 MongoDb

javascript - 填写表格 - Smarty

java - Mapper 的 Mapstruct 构造型

java - Libgdx Android - GL 线程(NullPointerException)和丢失类文件

java - spring表单路径数据绑定(bind)属性的文档

javascript - 将表单输入写入全局变量的更好方法?