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保存用戶信息進行其他接口的權限驗證。