ServletContext(application)、HttpSession(session)、HttpServletRequest(request)三者的区别与联系:
a)相同点:都可以用来传递数据,都有相同的存取数据的方法。
- 存:xxx.setAttribute("name",ObjectValue);
- 取:Object value = xxx.getAttribute("name");
- 删: xxx.removeAttribute("name");
b)不同点:
- ServletContext(appliation)是Servlet上下文对象,在服务器启动阶段解析web.xml文件创建ServletContext对象,在同一个web app中所有的Servlet对象共享同一个ServletContext对象。该对象一旦创建不会被销毁,除非将服务器停掉。所以尽量不要往这个对象中存放大数据,因为这是一个所有用户共享的空间,往该对象中存储的数据在多线程环境下涉及到修改操作的话注意线程安全问题。一般存储在该对象中的数据首先是所有用户共享的,不会被修改的,少量数据。ServletContext对象传递数据可以跨Servlet、跨请求、跨用户(跨会话)传递数据。
- HttpSession(session)是会话对象,每一个用户都有一个这样的对象,是一个用户级别的对象,存储在该对象中的数据一般都是该用户专属的数据,例如购物车对象可以存储在session中,HttpSession对象传递数据可以跨Servlet、跨请求(这些请求必须属于同一个会话)、但是不能跨用户传递数据。
- HttpServletRequest(request)是请求对象,一次请求一个对象,每一次请求都会新建一个请求对象,是一个请求级别的对象,存储该对象中的数据一般都是请求级别的数据,一次请求之后这个数据就不再使用的数据可以存储在该对象中,HttpServletRequest对象传递数据可以跨Servlet,但是不能跨请求,更不能跨用户传递数据。
- 原则:尽量从小范围向大范围使用。(考虑原则:request< session < application)
ServletContext、HttpSession、HttpServletRequest接口的对比:
以上都是范围对象:
- ServletContext application; 是应用范围
- HttpSession session; 是会话范围
- HttpServletRequest request; 是请求范围
三个范围的排序:application > session > request
- application完成跨会话共享数据、
- session完成跨请求共享数据,但是这些请求必须在同一个会话当中
- request完成跨Servlet共享数据,但是这些Servlet必须在同一个请求当中【转发】
使用原则:有小到大尝试,优先使用小范围。例如:
- 登录成功之后,已经登录的状态需要保存起来,可以将登录成功的这个状态保存到session对象中。
- 登录成功状态不能保存到request范围中,因为一次请求对应一个新的request对象。
- 登录成功状态也不能保存到application范围中,因为登录成功状态是属于会话级别的,不能所有用户共享。