WebX原始碼研讀

2021-08-27 13:18:35 字數 3266 閱讀 2109

webx是公司應用最為廣泛的web框架,目前已經開源。一直以為webx是基於spring mvc的,但其實並不是,那麼不同之處到底在何處,又是為什麼這樣實現?看過了原始碼,在這裡梳理下思路

我以為,在業務層面上來講web框架解決的核心事情是web請求處理,那麼下面就從這個主線出發來看看這個框架是怎麼做的:

注釋是這樣寫的:「初始化spring容器的filter。」

那麼他本質上是乙個servlet的filter,實現了filter介面,我們知道servlet filter 有兩個主要方法,init(),dofilter(),init()來做初始化,dofilter()完成當前filter要做的主要事情,下面是dofilter原始碼

}這個方法做了兩件事:

1.檢查當前request的path是不是處在排除列表中,就立即放棄控制,將請求控制還給filterchain

2. 獲取已經初始化好的webx容器,把控制權交給相應的webxrootcontroller的service方法。注意,webx是有個子容器的概念的,這種劃分在業務複雜的時候可以保證良好的業務隔離性。

2.webxrootcontroller

webxrootcontroller是個介面,abstractwebxrootcontroller對這個介面做了實現,從上面**來看

webxframeworkfilter

呼叫了該類的service方法來進一步處理web請求,下面是service的方法原始碼

// 請求未結束,則繼續處理...

request = requestcontext.getrequest();

response = requestcontext.getresponse();

// 如果是乙個內部請求,則執行內部請求

if (handleinternalrequest(request, response))

// 如果不是內部的請求,並且沒有被passthru,則執行handlerequest

if (isrequestpassedthru(request) || !handlerequest(requestcontext))

} catch (throwable e) finally

}service方法首先會獲取當前請求的requestcontext。requestcontext是webx乙個比較獨特的實現,它封裝了httpservletrequest,httpservletresponse,以及servletcontext。可以說囊括了當前http請求的各種狀態。

getrequestcontext()方法實現了requestcontext獲取過程,具體來講,就是如果發現request attributes 裡有沒有以key為"_outer_webx3_request_context_" 儲存的requestcontext物件,如果有就拿過來,沒有則建立乙個******requestcontext並將其置入request attributes

獲取到requestcontext後,如果不是內部請求或者不需要進一步處理的請求,接下來就走到handlerequest方法,這個方法預設實現如下:

@override

protected boolean handlerequest (requestcontext requestcontext) throws exception finally

}return served;

}

可以看到,根據path路由到了對應的子容器,並觸發webxcontroller的service方法

3.webxcontroller

直接來看service方法

public boolean service(requestcontext requestcontext) throws exception 

這裡看到最終是執行到pipeline。pipeline是一組順序執行操作的抽象介面,這裡應該是借鑑了tomcat 和struts的實現方法,是一種典型的責任鏈設計模式。pipline包含了乙個valve的概念,valve在源**裡注釋說是「如同真實世界的水管中的閥門,可以控制液體流向,也可以控制pipline裡後續valves的執行

**中pipelineinvocationhandle 實際上儲存了當前pipline的狀態,觸發的invoke方法實際上是pipleimpl裡的invokenext(),這個方法最終觸發不同的valve呼叫invoke()方法,可見,valve是webx整個流程的金字塔底部,處理不同請求的worker。valve的各種實現包括渲染頁面、登陸認證、異常處理等等,構建了webx處理請求的基石。

通過上述分析,總體感覺webx對模組化執行的比較徹底,甚至可以允許產生不同的子容器,每個子容器有不同的配置。requestcontext介紹說是對request、response和servletcontext進行了封裝,但是從上面的請求過程來看,只是對request進行了包裝(或者其他地方我還沒看到)。pipline是乙個很經典的設計,讓整個web請求處理過程更加內聚化,流程也比較清晰。但是同時也可能讓這個流程比較重。

相信webx這些實踐是公司**發展過程中解決所遇到問題的乙個框架上的反映。換句話說,按照公司目前的**規模與穩定性要求,它應該比較適合於大型**,因為整個框架還是顯得比較重的。

CI框架原始碼研讀 整體架構

部落格搬家 有人說phper的深入要從研讀mvc框架開始,我跳了乙個常用的ci框架入手,一是因為 ci框架簡單輕巧,二是原來用的最多的就是ci框架了。1 core 系統核心 2 database資料庫相關的操作和幫助類 3 helers 系統提供的一些工具類 4 language 語言包 5 lib...

CI框架原始碼研讀 整體架構

1 core 系統核心 2 database資料庫相關的操作和幫助類 3 helpers 系統提供的一些工具類 4 language 語言包 5 libraries 系統依賴類 我們初次訪問ci的時候進入的welcome頁面,那麼這個welcome的頁面請求都經過了哪些地方呢,我們來追蹤一下。所以對...

位元幣原始碼研讀之一

菜菜子 forest 關注 圖中紅色矩形框選中的src資料夾為位元幣原始碼所在目錄,因此我的位元幣原始碼之旅將從這個資料夾開始。二 找到入口函式 眾所周知,任何事物都有其起始位置,就像我們走進一棟房子應該先找到大門一樣。軟體程式也不例外,每個軟體程式都有其入口函式,那麼要研讀位元幣原始碼,首先需要從...