public class BaseController {
protected HttpServletRequest request;
protected HttpServletResponse response;
protected HttpSession session;
@ModelAttribute
public void setBaseController(HttpServletRequest request, HttpServletResponse response) {
this.request = request;
this.response = response;
this.session = request.getSession();
}
}
原来为了方便,编写了这样一个基类(在方法中就不需要编写request和response参数),慢慢的发现会丢失参数。为什么呢?
答案:多线程问题, 由于controller都是单实例的,而且无状态的,所以每次都需要将参数控制在局部变量中,这样的话就不会被其他线程访问到,而现在使用了成员变量 ,多线程会变更成员变量的值,所以这里就会出现前面的参数刚接收还没处理就被替换了,如果把这里加上synchronized就可以保证成员变量的正确性了,但是如果这样做,就会降低服务器每秒处理的并发,根据http的无状态和servlet的无状态,还是乖乖的把参数写到局部变量吧。
而一个无状态的servlet既不包含任何成员变量,也不包含对其他类的成员变量的引用,