簡單模擬struts2及struts2的處理流程介紹

用了幾天模擬struts2,最後結果仍是很成功的,也基本沒有什麼趕上比較難解決的問題,萬事開頭難,在最開始的時候無從下手,看着下面這張struts2工做流程圖配合着網上的博客看了一天終於有了眉目。html


看到圖的時候應該最早看圖例:第一個橙色(Servlet Filter)表示過濾器;第二個藍色的(Struts Core)表示struts2的核心,是struts2最重要的部分;第三個(Interceptors)表示攔截器,是struts2中一個運用的很好的一個地方;最後一個(User created)是用戶本身須要書寫的代碼java

struts2的入口是什麼?這個問題曾經把我問住了。如今想一想若是這張圖深深地記住,那麼struts2的基本工做流程也就明白了。struts2的入口是過濾器,一個HttpServletRequest進來首先是過濾器,注意是過濾器,在圖上咱們也能夠看到,用戶發起的請求首先進入到過濾器,有些時候感受過濾器是struts2的基礎,可是這麼說有些絕對,struts2由於有了過濾器,讓有些代碼變得簡單。Struts實際上使用了一個所謂的ServletFilter來「使事情有效」。通常來講,使用Struts 2時不須要編寫Servlet。在模擬struts2的時候須要本身定義一個過濾器,自定義的過濾器須要實現Filter接口,在doFilter方法中寫入本身定義的規則基本上這個過濾器就可使用了,注意須要在web.xml文件中進行配置,咱們在開發struts2項目的時候也是須要在web.xml文件中配置一下,定義過濾器須要過濾哪些信息,只有通過過濾器選擇出來須要進入struts2框架中處理的纔會進入,其餘的直接跳轉到指定頁面。本身定義了一個LoginFilter,在下面的配置中須要指定過濾器類,在url-patten中定義過濾的規則,/*表明全部的請求都會過濾。web

    <filter>
        <filter-name>LoginFilter</filter-name>
        <filter-class>com_filter.LoginFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>LoginFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
在過濾器類中是能夠執行跳轉頁面代碼的,在上面也說到了在使用struts2的時候不須要編寫Servlet,struts2主要是把Servlet隱藏了,Servlet主要是執行了從一個頁面到另外一個頁面的跳轉,而過濾器是能夠徹底代替這些功能的,在過濾器的diFilter方法中聲明瞭ServletRequest和ServletResponse兩個類型的參數req、resp,在須要使用跳轉的的時候把這兩個參數強轉成HttpServletRequest和HttpResponse類型的參數便可。在struts2源碼中可見:
HttpServletRequest request = (HttpServletRequest)req;
HttpServletResponse response = (HttpServletResponse)res;
接着向下,通過過濾器的請求到了ActionMapper,可是ActionMapper只是簡單的判斷,在上面的過濾器中講到了判斷此時的請求是否過濾掉,這個ActionMapper是判斷通過過濾器的請求是否須要struts2處理,也就是判斷調用哪一個Action。ActionMapper實際上是HttpServletRequest和Action調用請求的一個映射,它屏蔽了Action對於Request等javaServlet類的依賴。Struts2中它的默認實現類是DefaultActionMapper。

在struts2的工做流程圖中能夠看到ActionMapper處理以後又返回給了FilterDispatcher,讓FilterDispatcher把請求交給ActionProxy,最終調用仍是由ActinProxy調用,注意ActionProxy是一個代理類,這裏用到了動態代理這種設計模式,個人關於代理模式的文章:Java設計模式-代理模式,在模擬這裏的時候代碼,其實動態代理咱們接觸的不多,代碼結構很不熟悉。ActionProxy經過ConfigurationManager讀取了struts.xml配置文件,這裏就要用到xml解析,經過對xml配置文件的解析,讀出數據,包括Action類及作出響應的頁面等信息。設計模式

ActionProxy經過ActionInvocation來執行用戶請求對應Acion的攔截器。ActionInvocation負責管理攔截器(Interceptor)。在攔截器這裏又用到了責任鏈設計模式,詳見個人責任鏈的文章:Java設計模式-責任鏈模式,關於責任鏈仍是比較好理解的,把不一樣的處理都放在攔截器中,而後組建成一條鏈,讓用戶的請求在這條鏈上走一遍完成各個不一樣的處理。
在<interceptors>標籤中定義了攔截器類的名字和對應的類
數據結構

而後在<interceptor-stack>中配置攔截器棧,這裏至關於數據結構中的棧,從第一個走到最後,想要返回還要從最後一個依次返回,實際上struts2中調用的攔截器就是這些攔截器棧,用戶也能夠本身定義攔截器棧,把想要的功能組成一個interceptor-stack
app


在struts2的源碼中struts-default.xml文件中配置了好多攔截器。模擬這裏的時候,關於讀出Action類,這裏主要用到了反射,利用反射對類中的屬性賦值及執行方法。框架

最後的返回的結果HttpServletResponse仍是要經過過濾器返回的,在模擬的時候,把一些處理的調用放在了過濾器中這樣在返回的時候就能夠在過濾器中返回。實際上struts2的類遠遠不止這些,看到仔細的分析,寫出了30多個類。簡單的模擬只是實現了表單內容驗證登陸,不少東西都是寫死的。
url

相關文章
相關標籤/搜索