ServletContext HttpSession 以及HttpServletRequest之間的關系


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM