我在Spring控制器的GET请求处理程序中将form对象设置为request。用户第一次进入页面时,应创建一个新的表单对象并将其设置为request。如果用户发送表单,则从请求填充表单对象,现在表单对象具有所有用户givern属性。然后验证表单,如果验证成功,则将表单保存到数据库中。如果表单未通过验证,我希望将表单对象保存到会话,然后重定向到获取请求处理页面。当请求被重定向到GET处理程序时,它应该检查会话是否包含表单对象。
我已经知道在Spring中有@SessionAttributes(" form ")注释,但由于某种原因,下面的注释不起作用,因为在第一次,会话属性form为null,它会给出错误:
org.springframework.web.HttpSessionRequiredException: Session attribute 'form' required - not found in session这是我的控制器:
@RequestMapping(value="form", method=RequestMethod.GET)
public ModelAndView viewForm(@ModelAttribute("form") Form form) {
ModelAndView mav = new ModelAndView("form");
if(form == null) form = new Form();
mav.addObject("form", form);
return mav;
}
@RequestMapping(value="form", method=RequestMethod.POST)
@Transactional(readOnly = true)
public ModelAndView saveForm(@ModelAttribute("form") Form form) {
FormUtils.populate(form, request);
if(form.validate())
{
formDao.save();
}
else
{
return viewForm(form);
}
return null;
}发布于 2010-05-03 18:41:28
@SessionAttribute的工作是将现有的模型对象绑定到会话。如果它还不存在,你需要定义它。在我看来,这是不必要的混乱,但试着这样做:
@SessionAttributes({"form"})
@Controller
public class MyController {
@RequestMapping(value="form", method=RequestMethod.GET)
public ModelAndView viewForm(@ModelAttribute("form") Form form) {
ModelAndView mav = new ModelAndView("form");
if(form == null) form = new Form();
mav.addObject("form", form);
return mav;
}
@RequestMapping(value="form", method=RequestMethod.POST)
@Transactional(readOnly = true)
public ModelAndView saveForm(@ModelAttribute("form") Form form) {
// ..etc etc
}
}注意,@SessionAttributes是在类上声明的,而不是在方法上声明的。你可以把它放在你喜欢的任何地方,真的,但我认为这对这个类更有意义。
在我看来,The documentation on this可以更清晰。
发布于 2011-03-18 12:02:42
即使在类中添加了@SessionAttributes({"form"}),如果第一次调用控制器也会抛出异常。所以添加下面的populateForm方法就可以解决这个问题。
@SessionAttributes({"form"})
@Controller
public class MyController {
@ModelAttribute("form")
public Form populateForm() {
return new Form(); // populates form for the first time if its null
}
@RequestMapping(value="form", method=RequestMethod.GET)
public ModelAndView viewForm(@ModelAttribute("form") Form form) {
ModelAndView mav = new ModelAndView("form");
if(form == null) form = new Form();
mav.addObject("form", form);
return mav;
}
@RequestMapping(value="form", method=RequestMethod.POST)
@Transactional(readOnly = true)
public ModelAndView saveForm(@ModelAttribute("form") Form form) {
// ..etc etc
}
}发布于 2011-07-31 18:45:35
如果没有定义会话对象,那么我认为它将是这样的:
@SessionAttributes({"form"})
@Controller
public class MyController {
@RequestMapping(value="form", method=RequestMethod.GET)
public ModelAndView viewForm() {
ModelAndView mav = new ModelAndView("form");
if(form == null) form = new Form();
mav.addObject("form", form);
return mav;
}
@RequestMapping(value="form", method=RequestMethod.POST)
@Transactional(readOnly = true)
public ModelAndView saveForm(@ModelAttribute("form") Form form) {
// ..etc etc
}
}https://stackoverflow.com/questions/2757198
复制相似问题