這裡先回顧一下struts1.x的基礎,到底乙個最簡單的struts程式包含哪些部分?
好了,有了以上部分,我們來猜測一下它的處理流程。眾所周知,tomcat啟動時就會載入web.xml檔案,根據servlet的生命週期,tomcat啟動時就會建立servlet的例項,並呼叫它的init()方法。因為整個web專案是從伺服器啟動開始的,所以整個struts程式就從actionservlet開始。因為struts配置檔案的路徑會作為actionservlet的初始化引數配進去,所以struts配置檔案也是在伺服器啟動時解析並載入的。
初始化完成後,接下來,就輪到接受使用者的請求了。很明顯,actionform就是用來封裝使用者請求資料的,所以使用者請求後第乙個站出來操作的就是actionform。
actionform接收了資料之後對整個流程有什麼推進作用呢?當然是將使用者資料交給action進行業務處理啦。為了讓使用者看到結果,action處理完成之後肯定要跳轉並渲染前端頁面,然後將前端頁面返回給使用者的。
說了一大堆廢話,好像看得有點懵了,接下來我們用一張圖梳理一下上面這些話:
以上只是我們對業務流程的猜想,從原理上講已經**不離了,因為每個環節都環環相扣,接下來我們從原始碼驗證。
首先,struts的所有配置都是在tomcat啟動時載入進來的,因為web.xml中配置了actionservlet的config初始化引數,而它的值正是struts配置檔案的路徑。所以不難看出actionservlet是struts的中心控制器,原因有兩點:
它在伺服器啟動時便建立了例項並執行init()方法,相當於整個程式的始祖;
在tomcat伺服器中,每個專案最先請求的只有servlet(jsp本質上也是servlet),所以每個使用者請求實際上都是交給servlet操作的。
好吧,上面說了那麼多都只是為了說明一點:actionservlet是struts原始碼分析的切入點。
以下是配置解析載入的核心**:
protected moduleconfig initmoduleconfig(string prefix, string paths) throws servletexception
//建立工廠類
moduleconfigfactory factoryobject = moduleconfigfactory.createfactory();
//建立配置元件
moduleconfig config = factoryobject.createmoduleconfig(prefix);
//建立並初始化檔案解析器
digester digester = this.initconfigdigester();
//解析多個配置檔案路徑,存到列表中
list urls = this.splitandresolvepaths(paths);
iterator i = urls.iterator();
while(i.hasnext())
//將moduleconfig存到servletcontext的乙個屬性中
this.getservletcontext().setattribute("org.apache.struts.action.module" + config.getprefix(), config);
return config;
}
以上的注釋已經把配置檔案的解析說得很清楚了,這裡我們用一張圖捋一下處理流程。
到這裡,各個類的工作基本上就明晰了,digester負責解析,不過重中之重就是:moduleconfig儲存了所有struts配置。
接下來就到了最重要的一部分,struts是怎樣處理使用者請求的?我們都知道,servlet的處理方法主要是service(),或者doget()和dopost(),所以我們就從這幾個方法入手。而doget()和dopost()都呼叫了process(request, response)方法,所以先來看一下actionservlet的process方法。
}由上述**看出,這個方法主要做了兩個操作:
//將客戶端語言環境儲存到session中
this.processlocale(request, response);
// response.setcontenttype(contenttype);
this.processcontent(request, response);
//設定響應頭無快取
this.processnocache(request, response);
if(this.processpreprocess(request, response))
} catch (invalidcancelexception var8) catch (ioexception var9) catch (servletexception var10)
//如果配置的action標籤中配置了forward屬性或include屬性,則直接跳轉
//建立action,加了鎖,執行緒安全,每個action只有乙個例項,用hashmap儲存
if(action != null) }}
}}}}
}接下來用一幅圖來闡述整個流程:
分析了源**之後,發現我們的猜想跟它的處理流程已經**不離十了,接下來我們再從原始碼來闡述一遍它的處理流程:
建立actionform並填充資料
如果設定指明不執行校驗或者無校驗方法,則繼續下一步;否則,執行校驗,並跳轉返回。如果校驗期間出現異常,則執行異常處理方法後返回。
如果配置的action標籤中配置了forward屬性或include屬性,則直接跳轉;否則,執行建立action並執行它的execute方法,期間將可以actionmessages儲存在request域,然後返回forward後進行頁面跳轉。
以上是我對struts1.x核心原始碼的解析,如有疏漏之處還請指正。
IO原理剖析 裝飾器設計模式(1)
模擬人發聲,用擴音器來裝飾人的聲音 裝飾器設計模式四大組成部分 1,抽象元件 需要裝飾的抽象物件,一般是介面或者抽象父類 say 2,具體元件 需要裝飾的物件 人 3,抽象裝飾類 包含了對抽象元件的引用,以及裝飾者共有的方法 4,具體的裝飾類 被裝飾的物件。public class ioprinci...
struts1 x 學習筆記四
5.顯示錯誤的兩種方式 5.1 直接顯示 5.2 使用message 標籤來顯示 使用這個方式的話,那麼錯誤是存放在request中的.6.若想呼叫配置檔案中的資訊 6.1 使用 message.就是資源檔案中配置的key.7.資源檔案的配置 三 兩個重要的tag 1.taglib uri pref...
struts1 x原理與應用 一
一 通過順序圖剖析sturts執行流程.由上圖可以struts1.x對請求的處理過程 1 預設情況下,do請求都將交給struts框架處理,首先會由控制器actionservlet攔截請求,在處理請求前會做一些初始化的工作,然後再轉交給請求處理器requestprocessor處理.2 reques...