首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring Framework 3和会话属性

Spring Framework 3和会话属性
EN

Stack Overflow用户
提问于 2010-05-03 17:43:41
回答 5查看 70.1K关注 0票数 22

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

我已经知道在Spring中有@SessionAttributes(" form ")注释,但由于某种原因,下面的注释不起作用,因为在第一次,会话属性form为null,它会给出错误:

代码语言:javascript
复制
org.springframework.web.HttpSessionRequiredException: Session attribute 'form' required - not found in session

这是我的控制器:

代码语言:javascript
复制
@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;
}
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-05-03 18:41:28

@SessionAttribute的工作是将现有的模型对象绑定到会话。如果它还不存在,你需要定义它。在我看来,这是不必要的混乱,但试着这样做:

代码语言:javascript
复制
@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可以更清晰。

票数 25
EN

Stack Overflow用户

发布于 2011-03-18 12:02:42

即使在类中添加了@SessionAttributes({"form"}),如果第一次调用控制器也会抛出异常。所以添加下面的populateForm方法就可以解决这个问题。

代码语言:javascript
复制
@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
   }
}
票数 32
EN

Stack Overflow用户

发布于 2011-07-31 18:45:35

如果没有定义会话对象,那么我认为它将是这样的:

代码语言:javascript
复制
@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
   }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2757198

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档