Spring 弹簧3控制器';列表类型的s私有变量为空。会话超时?

Spring 弹簧3控制器';列表类型的s私有变量为空。会话超时?,spring,session,tomcat,controller,portlet,Spring,Session,Tomcat,Controller,Portlet,我有一个portlet控制器,它有两个列表变量 private List<MyObject1DTO> list1; private List<MyObject2DTO> list2; 私有列表列表1; 私人名单2; 在JSP中,我使用AJAX请求将对象发送回添加该对象的控制器 根据用户提交的内容添加到任一列表。当用户会话超时时,这些列表会发生什么变化 有时,当用户将对象添加到那些列表中(这是一个大表单)并且 填写表单的其余部分并按submit键,这些列表的验证(不能为

我有一个portlet控制器,它有两个列表变量

private List<MyObject1DTO> list1;
private List<MyObject2DTO> list2;
私有列表列表1;
私人名单2;
在JSP中,我使用AJAX请求将对象发送回添加该对象的控制器 根据用户提交的内容添加到任一列表。当用户会话超时时,这些列表会发生什么变化

有时,当用户将对象添加到那些列表中(这是一个大表单)并且 填写表单的其余部分并按submit键,这些列表的验证(不能为空)失败。我想知道当用户填写表单并清除这些列表时,会话是否会以某种方式超时。还有什么会导致列表变空

我这样做是不是设计上的缺陷?有更好的方法吗

这是一个非常大的形式,有很多领域。表单中有两个不同的部分创建这些对象并通过AJAX请求将它们发送到列表。当我在控制器中处理ajax请求时,我没有访问模型本身的权限,因此我可以将对象添加到模型中。所以我用控制器中的列表来做

编辑:

@Controller(“myController”)
@请求映射(“视图”)
公共类MyController{
私人名单1;
私人名单2;
@ModelAttribute(value=“myFormDTO”)
公共MyFormDTO getMyFormDTO(){
....
}
//控制器映射等。
}
我有一个对象绑定为表示表单的模型属性。但这不包括
那些名单。因为我不知道在ajax请求中访问该模型属性的方法(我认为这是不可能的),我使用该属性将对象添加到列表中。基本上,用户看到的表单是绑定到模型属性的字段。然后有两个不同的“篮子”(列表),用户可以向其中添加项目(控制器中的列表包含用户添加的对象)。我将项目添加到篮子中的方法是通过ajax请求。

查看SpringWebFlow,或者将模型属性设置为会话属性

您可以按如下方式注释您的类

@Controller("myController")
@RequestMapping("VIEW")
@SessionAttributes("myFormDTO")
public class MyController {
    ....
}
spring将把您的模型属性添加到会话中,这样您就可以在控制器方法中访问您的模型属性

@RequestMapping("/ajax/addToList1")
public void ajaxAddToList1(@ModelAttribute("myFormDTO") MyFormDTO form, ....) {
    form.getList1().add(.....);
}

不要使用控制器成员变量(除非使用@Scope注释),因为Spring控制器默认为单例,并发用户可能相互干扰。

查看Spring Webflow,或者将模型属性设置为会话属性

您可以按如下方式注释您的类

@Controller("myController")
@RequestMapping("VIEW")
@SessionAttributes("myFormDTO")
public class MyController {
    ....
}
spring将把您的模型属性添加到会话中,这样您就可以在控制器方法中访问您的模型属性

@RequestMapping("/ajax/addToList1")
public void ajaxAddToList1(@ModelAttribute("myFormDTO") MyFormDTO form, ....) {
    form.getList1().add(.....);
}

不要使用控制器成员变量(除非使用@Scope注释),因为Spring控制器默认为单例,并发用户可能相互干扰。

这些列表是表单支持bean的一部分吗?这个bean是否存储在会话中?您能提供控制器的一些代码吗?附加信息有用吗?这些列表是表单支持bean的一部分吗?这个bean是否存储在会话中?你能提供一些你的控制器的代码吗?附加信息有帮助吗?非常感谢!我觉得自己完全是个傻瓜,因为我没有考虑并发用户之间的相互干扰。另一个问题:除了使用SessionStatus.complete()之外,是否还可以从SessionAttributes中删除myFormDTO?我似乎无法将其移除。我的意思是,如果用户没有完成表单(离开页面),然后返回,那么他之前填写的字段将填充该数据(当用户单击“提交”一次或至少与表单交互一次时)。让我再澄清一点:当用户进入页面时,它由我的“默认”方法处理。它使用@modeldattribute注释myFormDTO。由于它位于SessionAttributes中,因此不会重新创建。您可以手动创建模型属性。我想您至少有一个只呈现表单的GET方法和一个处理表单提交的POST方法。在GET方法中,您始终可以自己在会话中放置一个新创建的模型:model.addAttribute(“myFormDTO”,new myFormDTO);Spring会自动把它放在会话中是的,对不起。找到按钮。:)第一次在这里写作。事实上,我刚刚按照您所说的方式解决了这个问题,在我的渲染方法中手动添加了一个新的模型属性。非常感谢你的帮助。非常感谢!我觉得自己完全是个傻瓜,因为我没有考虑并发用户之间的相互干扰。另一个问题:除了使用SessionStatus.complete()之外,是否还可以从SessionAttributes中删除myFormDTO?我似乎无法将其移除。我的意思是,如果用户没有完成表单(离开页面),然后返回,那么他之前填写的字段将填充该数据(当用户单击“提交”一次或至少与表单交互一次时)。让我再澄清一点:当用户进入页面时,它由我的“默认”方法处理。它使用@modeldattribute注释myFormDTO。由于它位于SessionAttributes中,因此不会重新创建。您可以手动创建模型属性。我想您至少有一个只呈现表单的GET方法和一个处理表单提交的POST方法。在GET方法中,您始终可以自己在会话中放置一个新创建的模型:model.addAttribute(“myFormDTO”,new myFormDTO);Spring会自动把它放在会话中是的,对不起。找到按钮。:)第一次在这里写作。事实上,我刚刚按照您所说的方式解决了这个问题,在我的渲染方法中手动添加了一个新的模型属性。非常感谢你的帮助。