struts2瞎猜想

瞎猜的,記下來,等看了源代碼再更正。

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,就不安全了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章