瞎猜的,記下來,等看了源代碼再更正。
ServletContext只有一個實例,屬於應用服務器,如tomcat的,不同於struts2的ServletActionContext 。
public class ServletActionContext extends ActionContext:
public static HttpServletRequest getRequest()
{
return (HttpServletRequest)ActionContext.getContext().get("com.opensymphony.xwork2.dispatcher.HttpServletRequest");
}
ServletContext中有成員filter....和成員servlet....(或是filter數組、servlet數組),ServletContext只有一個實例,它的屬性filter和servlet被所有請求共享(filter....和servlet....(或是filter數組、servlet數組)也分別只有一個。解釋:只有一個人,那麼腦袋也只有一個了)----線程不安全。
ServletContext收到一個請求(ServletContext某個方法接收,方法中調用成員filter...和成員servlet....處理,其實也是調用它們的方法處理)。
而FilterDispatcher的某個方法處理請求(參數傳入FilterDispatcher的方法中),這個方法中呢,就會爲這個請求new ActionProxy線程處理(具體見下面)。FilterDispatcher沒有狀態,方法中涉及的對象都是局部變量,線程安全,即許多請求同時訪問該方法也沒危險。
FilterDispatcher的某個接收請求的成員方法(如構造函數)中爲每個請求創建new ActionProxy線程處理。ActionProxy線程對象中繼續new action,new interceptors...,ActionProxy線程對象中的處理就是線程安全的了。但若ActionProxy線程對象訪問servlet,就不安全了。