1. 共同点 :不管对象的作用域怎样,共享变量和获得变量的 方法都是一致的
–setAttribute(“Name”,obj1)
–getAttribute(“Name”)
2. 变量的作用域
ServletContext– 范围最大。应用程序级别的,整个应用程序都能访问,也就是只要这个服务不停止就会一直存在。
HttpSession – 次之,会话级别的,在当前的浏览器中都能访问 不论是在同一浏览器开多少窗体,都能够访问 。可是换个浏览器就不行了。就必须又一次创建session
HttpServletRequest – 范围最小,请求级别,请求结束,变量的作用域也结束[也就是仅仅是一次访问,访问结束,这个也结束],换句话说就是在同一浏览器请求相同接口是可以的,同一浏览器不同接口或者不同浏览器都是为null的。
@RequestMapping("/sessiontest1") public void session1(HttpServletRequest request, HttpServletResponse response,HttpSession session1) throws Exception { // 1 ServletContext sc = request.getServletContext(); ServletContext sc1 = session1.getServletContext(); System.out.println("HttpServletRequest和HttpSession获取的ServletContext是否是一个对象"+(sc==sc1)); sc.setAttribute("sc_name", "ServletContext值"); // 2 HttpSession session = request.getSession(); session.setAttribute("session_name", "HttpSession值"); // 3 request.setAttribute("request_name", "HttpServletRequest值"); String sc_value = (String) sc.getAttribute("sc_name"); String session_value = (String) session.getAttribute("session_name"); String request_value = (String) request.getAttribute("request_name"); System.out.println(sc_value+": "+session_value+": "+request_value); // request.getRequestDispatcher("MyServlet2").forward(request, response); } @RequestMapping("/sessiontest2") public void session2(HttpServletRequest request, HttpServletResponse response,HttpSession session1) throws Exception { // 1 ServletContext sc = request.getServletContext(); ServletContext sc1 = session1.getServletContext(); System.out.println("HttpServletRequest和HttpSession获取的ServletContext是否是一个对象"+(sc==sc1)); HttpSession session = request.getSession(); String sc_value = (String) sc.getAttribute("sc_name"); String session_value = (String) session.getAttribute("session_name"); String request_value = (String) request.getAttribute("request_name"); System.out.println("测试他们的作用域: "+sc_value+": "+session_value+": "+request_value); }
测试流程:1. /sessiontest1 2. /sessiontest1 3. /sessiontest2 4. /sessiontest2(另外一个浏览器)
结果:
HttpServletRequest和HttpSession获取的ServletContext是否是一个对象true
ServletContext值: HttpSession值: HttpServletRequest值
HttpServletRequest和HttpSession获取的ServletContext是否是一个对象true
ServletContext值: HttpSession值: HttpServletRequest值
HttpServletRequest和HttpSession获取的ServletContext是否是一个对象true
测试他们的作用域: ServletContext值: HttpSession值: null
HttpServletRequest和HttpSession获取的ServletContext是否是一个对象true
测试他们的作用域: ServletContext值: null: null
结论:
HttpServletRequest 仅仅是浏览器的一次访问,除非servlet做处理,比方
request.getRequestDispatcher("Mytest").forward(request, response),
就会传递。
HttpSession用于同一浏览器,能够互相调用数据
ServletContext 整个应用程序都能够访问.
所以如果使用session用于用户登录就使用HttpSession保存用户信息进行其他接口的权限验证。