Struts2 源碼分析——項目分析


項目知識點分析

從上一章中我們知道了接下來我們要去了解源碼的項目(struts2-showcase)。而這一章將講述我三年后在次接觸struts2-showcase項目是一個什么樣子的情況。我有一個工作習慣。在參於每一個新項目開發的時候,我都希望項目負責人能跟我講講這個項目到底用到了哪些知識點。這樣子的目標是讓我心中對項目會有一個大體上的概念。悲劇的是struts2-showcase作者是不可能為你這個小小的角色特意打電話或是EMAIL你的。所以我的入手點是看這個項目的需要的JAR。如圖下。

從上面的圖片里面的紅框我們可以大概判斷出。可能用的是struts2 + spring + hibernate架構。而界面是用sitemesh + struts2-Tiles來實現的。在這里我並不認了hibernate有被用到。因為我沒有看到主要的hibernate包。而且這個項目並沒有用到數據庫方面的知識。所以最有可能是struts2 + spring 架構。為了進一步確定,我點開eclipse項目里同的WEB-INF來看。如下圖

 

我可以看到applicationContext.xml,而沒有看到hibernate相關的配置文件,我還特意去放代碼的根目標(src)里面去找。這次我更加確定用的是Spring,沒有用hibernate知識點。

項目總結:

    1.主體架構:struts2 + spring 架構。

    2.界面顯示:sitemesh + struts2-Tiles。

    3.其他:DWR框架,模板引擎(velocity,freemarker)。

struts2入口類

從上面的總結我們可以看到項目用到的相關知識點。當然這是我個人的分析並不全面。要分析一個開源的框架只有項目結合來分析才是最完美的。而接下來我們要做的是找到對應的入口類。顯然我們要從Web.xml入手。從Web.xml上面我們可以找到我們需要的類。StrutsPrepareFilter類和StrutsExecuteFilter類。如圖下(web.xml的部分內容)

從圖片中我們可看到struts2的入口類,我們可以想像一點struts2是不是用過濾器(Filter)來實現MVC思想呢?而不是用Servlet呢?。由於筆者正真看struts2源碼是在四年前,所以當筆看到上面圖片的寫法的時候,筆者腦中就會有這樣子的想法:每一個用戶請求都會通過struts2來進行過濾來找到對應用戶要請求的類。然后類執行對應的方法並返回相應的結果。在通過struts2來回應相關的結果頁面。如圖下。

我有個毛病,有思想之后,我都會試着去證明一下。首先假設我的想法是對的話,那么我們的目標也明確下來。我們就是要了解struts2是什么樣子處理每個用戶請求。又是什么樣子去處理找到對應的類。讓我們在看看上面的Web.xml 的信息。我們會發現這條內容(org.apache.struts2.dispatcher.filter.StrutsPrepareFilter)。我們可以根據這個內容找到他所在的JAR包——struts2-core-2.5.2.jar。讓我們點開他。如圖下。

從上面的圖片我們能發現在filter包下有四個類分別為:FilterHostConfig.class,StrutsExecuteFilter.class,StrutsPrepareAndExecuteFilter.class,StrutsPrepareFilter.class。從這點上我們就明白這將是未來要用到的第一個類。用心的程序員會發現上面還有com.opensymphony.xwork2。從這一點上我們不難發現這就是關於xwork2的源碼。既是Webwork框架的源碼。沒有錯,struts2是基於Webwork上面在進行研發的。所以如果是學過Webwork的人會很易容上手struts2。讓我們回頭過來看看這四個類。根據類名我就可以想像一種可能情況:StrutsExecuteFilter.class + StrutsPrepareFilter.class == StrutsPrepareAndExecuteFilter.class。我也試用把StrutsPrepareFilter類刪除掉,只用StrutsExecuteFilter。不好意思,不行。我記得我以前有帶過一個新生,他只用一個StrutsExecuteFilter類。而后做一個下午,最后受不了就是不知道哪里出錯了。就跑過來找我。我一看:小樣的,你是想讓我打死你嗎?

文章總結

這一章主要的目標是讓我們明白我們將要應對的知識點有。spring相關的知識。還有界面相關的知識。同時讓我們明白我們要入口類有哪一些。在進行struts2的Web.xml配置的時候,有倆種方式。一種是用StrutsExecuteFilter.class + StrutsPrepareFilter.class,一種是用 StrutsPrepareAndExecuteFilter.class。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM