第5章:作為Web應用:屬性和監聽者/5.4 Servlet屬性的執行緒安全性、請求屬性與請求分派
阿新 • • 發佈:2018-11-04
-
上下文屬性
- 它不是執行緒安全的,因為它屬於應用所有,全部servlet都都可以修改它,所以在呼叫setAttribute,removeAttribute時要加鎖操作
- 操作方法如:,鎖要針對getServletContext物件
-
請求屬性-執行緒安全
- 請求屬性是執行緒安全的,因為每個屬性都是一個執行緒中,而且它的屬性值是獨立的,不是共享的,所以是安全的
-
會話屬性-執行緒不安全
- 它不是執行緒安全的,因為一個使用者可能在多個瀏覽器視窗連續傳送請求,但是對容器來說,它還是屬於同一個使用者的會話,所以在會話中的setAttribute,removeAttribute操作也不是安全的,也要加鎖
- 操作方法如:,鎖要針對request.getSession( )物件
-
請求屬性和請求分派
- 請求屬性就是用請求引數HttpServletRequest request呼叫setAttribute方法設定某些屬性,這些屬性可以是某個具體類的物件,然後將設定後的屬性傳遞給應用的其它部分,例如JSP,
- 請求分派就是通過請求引數HttpServletRequest request獲取某個JSP的分派器物件,然後再告訴JSP接受請求
- 獲取請求分派器物件的兩種方式
- 從請求物件獲取
//獲取my.jsp分配器,這裡的my.jsp資源的路徑可以是相對路徑,也可以帶/的絕對路徑 RequestDispatcher requestDispatcher = request.getRequestDispatcher("my.jsp");
- 從上下文物件獲取
//獲取my.jsp分配器,這裡的my.jsp必須帶/開頭的絕對路徑 RequestDispatcher requestDispatcher2 = getServletContext().getRequestDispatcher("/my.jsp");
- 從請求物件獲取
- 程式碼演示:
//建立某個物件 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--入門就看這一篇就夠了》》》》》