Struts2框架的核心原理圖示淺析和配置文件作用
Mvc是java開發的核心策略。M-model(模型層),V-view(視圖層,表示層),c-controller(控制層邏輯層)。
Inbernate封裝的是持久層M的框架。
Struts2封裝的就是控制層C的框架。下圖可以看到Struts2在mvc結構中的作用。
簡單的一些整理, 希望對你們在學習的路上有所幫助。喜歡JAVA的小伙伴,在學習的,學習有困難或者想獲取相關學習資料點擊鏈接加入群【java】:網頁鏈接JAVA學習交流 253772578(←長按可復制)
簡單理解,就是控制層Struts.xml接受表現層xx.jsp文件的請求,調用相應的模型層實體類xx.java。然后再把實體類得到的信息返回,通過另一個xx.jsp文件展現出來。
下面的是專業的說法。 控制:如圖大家可以看到有一個XML文件Struts-config.xml,一般寫為Struts.xml。與之相關聯的是Controller。承擔MVC中Controller角色的是一個Servlet,叫ActionServlet。ActionServlet是一個通用的控制組件。這個控制組件提供了處理所有發送到Struts的HTTP請求的入口點。它截取和分發這些請求到相應的動作類(這些動作類都是Action類的子類)。另外控制組件也負責用相應的請求參數填充 Action From(通常稱之為FromBean),并傳給動作類(通常稱之為ActionBean)。動作類實現核心商業邏輯,Struts.xml它可以稱作為Struts神經中樞。控制了整個實現的流程。 Struts2是serclet的強化加強,所以可能才 ActionServlet就框架實現流程控制的核心。 視圖:主要由JSP生成頁面完成視圖,Struts提供豐富的JSP 標簽庫: Html,Bean,Logic,Template等,這有利于分開在Struts中。ActionServlet可以接受jsp的請求,并且它可以訪問java bean 或調用EJB。最后動作類把控制權傳給后續的JSP 文件,后者生成視圖。所有這些控制邏輯利用Struts.xml文件來配置。表現邏輯和程序邏輯。 模型:模型以一個或多個java bean的形式存在。這些bean分為三類:Action Form、Action、JavaBean or EJB。Action Form通常稱之為FormBean,封裝了來自于Client的用戶請求信息,如表單信息。Action通常稱之為ActionBean,獲取從ActionSevlet傳來的FormBean,取出FormBean中的相關信息,并做出相關的處理,一般是調用Java Bean或EJB等。 流程:在Struts中,用戶的請求一般以.do作為請求服務名,所有的.do請求均被指向ActionSevlet,ActionSevlet根據Struts.xml中的配置信息,將用戶請求封裝成一個指定名稱的FormBean,并將此FormBean傳至指定名稱的ActionBean,由ActionBean完成相應的業務操作,如文件操作,數據庫操作等。每一個*.do均有對應的FormBean名稱和ActionBean名稱,這些在Struts-config.xml中配置。 核心:Struts的核心是ActionSevlet,ActionSevlet的核心是Struts.xml。核心是Struts.xml。那么他是如何實現mvc的中專控制呢。
<package name="wwfy" extends="struts-default" namespace="/user"><action name="login" class="wwfy.action.LoginAction"><result>/success.jsp</result></action></package>核心就是action。明白它的配置要先明白url。Url=http://localhost:8080/+項目名+namespace(一般的只需要/)+name(action中的name,其實后面有個后綴action,記得不是jsp或者html。一般省略。)下面就是核心配置了。Name對接請求的jsp頁面。將獲得的信息發送給相對應的javaben。然后調用這個javaben的相對應方法返回不同的常量值,默認是success。然后result接收,默認的是name=success。可以省略。回到success.jsp表現層。當然也可以是其他參數,比如input。就回到input對應的頁面表現層。所以result可以有多個,不過action只定義了五個常量值。就好像switch 中的case。
明白了Struts2在mvc中的擔當,下面就詳細解析Struts2本身內部的運行的原理,其實核心還是Struts.xml。如圖。
Struts2PRepareAndExcuteFilter
1、 客戶端初始化一個指向Servlet容器(例如Tomcat)的請求2、 加載web.xml.讀取過濾器信息。可以是多個。這個請求經過一系列的過濾器(Filter)(這些過濾器中有一個叫做ActionContextCleanUp的可選過濾器,這個過濾器對于Struts2和其他框架的集成很有幫助,例如:SiteMesh Plugin) 接著Struts2PrepareAndExcuteFilter過濾器,其實這是兩個過濾器。淘汰的半本是FilterDispatcher過濾器。3、詢問ActionMapper來決定這個請是否需要調用某個Action 。action可有多個。4、 如果ActionMapper決定需要調用某個Action,ActionContextCleanUp把請求的處理交給ActionProxy ,好似一個前期準備核心。5 ActionProxy通過Configuration Manager詢問框架的配置文件,找到需要調用的Action類 。6、核心配置文件。7 、ActionProxy根據配置文件的反饋結果創建一個ActionInvocation的實例。就好像調度action ,result等元素的中心。8、 攔截器。ActionInvocation實例使用命名模式來調用,在調用Action的過程前后,涉及到相關攔截器(Intercepter)的調用。 多個攔截器組成攔截器棧。依次通過。9 、一旦Action執行完畢,ActionInvocation負責根據struts.xml中的配置找到對應的返回結果。返回結果通常是success(但不總是,也可 能是另外的一個Action鏈)一個需要被表示的JSP或者FreeMarker的模版。在表示的過程中可以使用Struts2 框架中繼承的標簽。在這個過程中需要涉及到ActionMapper10 、頁面,這個頁面還沒有呈遞給瀏覽器。11 、頁面再次一次倒著通過攔截器,原來是123,現在是321。12、回應頁面,這次的頁面才會被人看到。總結;從1的請求到9action的中轉直到最后12的回應。這就是一個完整請求回應會話。
ps:在上述過程中所有的對象(Action,Results,Interceptors,等)都是通過ObjectFactory來創建的。
新聞熱點
疑難解答