小编典典

Spring Framework 3和会话属性

spring-mvc

我在Spring控制器的GET请求处理程序中设置了要请求的表单对象。首次用户进入页面时,应创建一个新的表单对象并将其设置为request。如果用户发送表单,则从请求中填充表单对象,现在表单对象具有所有用户指定属性。然后验证表单,如果验证通过,则将表单保存到数据库。如果表单未经验证,我想将表单对象保存到会话中,然后重定向到GET请求处理页面。当请求重定向到GET处理程序时,则应检查会话是否包含表单对象。

我已经知道在Spring中有@SessionAttributes(“
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;
}

阅读 379

收藏
2020-06-01

共1个答案

小编典典

的工作@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是在类而不是方法上声明的。您可以随意放置任何地方,但我认为这在课堂上更有意义。

我认为有关此的文档可能会更清晰。

2020-06-01