Spring MVC实现长事务(conversation)
长事务指的是用户需要提交若干次表单的业务单元,该业务单元是不可分割的,是具有原子性的,必须确保所需提交的表单全部提交,该业务单元才完成;
实现长事务的思路是,用session存储长事务过程中产生的数据,业务单元完成后,才提交数据库;
我们使用Spring MVC的@SessionAttribute注解能完成这个需求;
@SeesionAttribute用于声明Controller,然后必须存在方法,该方法用于获得一个命令对象,且该方法必须被@ModelAttribute声明;
然后,形参为命令对象的功能处理方法被执行后,session里就有增加了一个属性,该属性为作为模型属性的命令对象,注意,是方法被执行后,session才会增加属性,以下是例子:
@Controller @Scope("request") @RequestMapping("/login") @SessionAttributes({"user"}) public class LogInController { @Resource(name = "logInServiceImpl") private LogInService logInService; @ModelAttribute("user") public User getUser() { return new User(); } /** * @ModelAttribute 表明user入参会作为属性添加进模型对象中; * errors紧跟user,作为其错误对象; * 入参model会自动作为属性被添加进模型对象; * session相当于request.getSession()的返回值; * username就是请求的一个参数; * sessionStatus配合@SessionAttributes使用; * locale就是Spring获得的本地对象; * @param user * @return */ @RequestMapping(value = "/checkid") // @ResponseStatus(reason = "登陆成功", value = HttpStatus.ACCEPTED) public Object checkID(@Valid @ModelAttribute("user") User user, Errors errors, Model model, HttpSession session, @RequestParam(value = "username") String username, SessionStatus sessionStatus, Locale locale) { System.out.println(user.getAsset());//暂时无效 System.out.println("locale是" + locale.getLanguage()); System.out.println("用户名是:" + user.getUsername()); System.out.println("用户密码是:" + user.getPassword()); System.out.println("错误的个数是:" + errors.getErrorCount()); // System.out.println(errors.getFieldErrors().get(0)); if(errors.hasErrors()) { System.out.println("前者"); return "WEB-INF/jsp/index"; } if(logInService.checkIdentity(user, session)) { System.out.println("打印请求参数,username:" + username); ModelAndView mv = new ModelAndView("WEB-INF/jsp/user_list"); model.addAttribute("userList", logInService.getAllUsers()); // sessionStatus.setComplete(); System.out.println("session范围里的user是否存在" + session.getAttribute("user")); // session.setAttribute("user", user); // session.setAttribute("user", user); return mv; } else { System.out.println("后者"); return "WEB-INF/jsp/log_in_fail"; } } }
注意,调用SessionStatus.setComplete(),就会把该长事务里存起来的属性删掉,仅限于长事务的过程中增加的属性;
注意,必须要有 @ModelAttribute 方法,且方法的作用是把 @SessionAttribute 里的value 添加进 implicitModel 里的,在这里,就是把user添加进去;
注意,要及时清除 SessionAttribute(通过 sessionStatus.setComplete() ),以免积存着无用的对象;
以上。
浙公网安备 33010602011771号