VVL1295

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

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() ),以免积存着无用的对象;

  以上。

posted on 2016-08-18 16:32  bobo2018  阅读(383)  评论(0)    收藏  举报