1. 程式人生 > >第5章:作為Web應用:屬性和監聽者/5.4 Servlet屬性的執行緒安全性、請求屬性與請求分派

第5章:作為Web應用:屬性和監聽者/5.4 Servlet屬性的執行緒安全性、請求屬性與請求分派

  • 上下文屬性

  1. 它不是執行緒安全的,因為它屬於應用所有,全部servlet都都可以修改它,所以在呼叫setAttribute,removeAttribute時要加鎖操作
  2. 操作方法如:鎖要針對getServletContext物件

 

  • 請求屬性-執行緒安全

  1. 請求屬性是執行緒安全的,因為每個屬性都是一個執行緒中,而且它的屬性值是獨立的,不是共享的,所以是安全的
  • 會話屬性-執行緒不安全

  1. 它不是執行緒安全的,因為一個使用者可能在多個瀏覽器視窗連續傳送請求,但是對容器來說,它還是屬於同一個使用者的會話,所以在會話中的setAttribute,removeAttribute操作也不是安全的,也要加鎖
  2. 操作方法如:,鎖要針對request.getSession( )物件

 

  • 請求屬性和請求分派

  1. 請求屬性就是用請求引數HttpServletRequest request呼叫setAttribute方法設定某些屬性,這些屬性可以是某個具體類的物件,然後將設定後的屬性傳遞給應用的其它部分,例如JSP,
  2. 請求分派就是通過請求引數HttpServletRequest request獲取某個JSP的分派器物件,然後再告訴JSP接受請求
  3. 獲取請求分派器物件的兩種方式
    1. 從請求物件獲取

        

         //獲取my.jsp分配器,這裡的my.jsp資源的路徑可以是相對路徑,也可以帶/的絕對路徑
      
                 RequestDispatcher requestDispatcher = request.getRequestDispatcher("my.jsp");

       

    2. 從上下文物件獲取
       //獲取my.jsp分配器,這裡的my.jsp必須帶/開頭的絕對路徑    
      
                 RequestDispatcher requestDispatcher2 = getServletContext().getRequestDispatcher("/my.jsp");

       

  4. 程式碼演示:
    //建立某個物件
    
               Dog dog1 = new Dog("mydog1");
    
               Dog dog2 = new Dog("mydog2");
    
               //設定物件屬性1
    
               request.setAttribute("dog1", dog1);
    
               //設定物件屬性2
    
               request.setAttribute("dog2", dog2);
    
               //獲取my.jsp分配器
    
               RequestDispatcher requestDispatcher = request.getRequestDispatcher("my.jsp");
    
               //傳送分派請求
    
               requestDispatcher.forward(request, response);
    //在後續的my.jsp中可以通過隱藏的HttpServletRequest物件通過getAttribute方法獲取到傳遞過去的屬性

    》》》》》未完:易學筆記--Servlet和JSP--入門就看這一篇就夠了》》》》》