Struts2工作原理以及核心思想
Struts2
JAVA基礎學完,肯定是要面臨三大框架的學習的,作為初學者,瞭解三大框架的原理,設計目的是首要任務,只有在把握了框架的設計目的以後,才能有針對性的取學習使用框架,這裡從strue2框架開始,介紹三大框架,讓新手能有一個總的瞭解跟思維導圖。
1. 什麼是Struts2?
- Struts2 是一個非常優秀的MVC框架,基於Model2 設計模型
由傳統Struts1和WebWork兩個經典框架發展而來 - Strust2 核心功能
(1)允許POJO(Plain Old Java Objects)物件 作為Action
(2)Action的execute 方法不再與Servlet API耦合,更易測試
(3)支援更多檢視技術(JSP、FreeMarker、Velocity)
(4)基於Spring AOP思想的攔截器機制,更易擴充套件
(5)更強大、更易用輸入校驗功能
2. 定位
SSH框架系統從職責上分為四層:表示層、業務邏輯層、資料持久層和域模組層(實體層)。
Struts2作為表現層的框架設計存在,Hibernate處於資料持久層,Spring處於業務邏輯層,擔任連線Struts和Hibernate橋樑的角色。系統的整個層次關係可以一目瞭然。
3. 技術優勢
Struts2有兩方面的技術優勢,一是所有的Struts2應用程式都是基於client/server HTTP交換協議,The Java Servlet API揭示了java Servlet只是Java API的一個很小子集,這樣我們可以在業務邏輯部分使用功能強大的Java語言進行程式設計。
二是提供了對MVC的一個清晰的實現,這一實現包含了很多參與對所以請求進行處理的關鍵元件,如:攔截器、OGNL表示式語言、堆疊。
因為struts2有這樣目標,並且有這樣的優勢,所以,這是我們學習struts2的理由,下面,我們在深入剖析一下struts的工作原理。
ActionServlet,前端控制器
1、根據相應的規則擷取Http請求的URL
2、將Http請求分發到相應的Action處理ActionForm,相當於實體
1、收集表單資料,將表單資料轉換成相應的資料型別
Action,業務層控制器
1、 取得表單資料
2、呼叫業務邏輯
3、返回轉向資訊
4.深入理解Struts2的工作過程
- 工作流程圖
工作原理圖
(1) 客戶端(Client)向Action發用一個請求(Request)
(2) Container通過web.xml對映請求,並獲得控制器(Controller)的名字
(3) 容器(Container)呼叫控制器(StrutsPrepareAndExecuteFilter或FilterDispatcher)。在Struts2.1以前呼叫FilterDispatcher,Struts2.1以後呼叫StrutsPrepareAndExecuteFilter
(4) 控制器(Controller)通過ActionMapper獲得Action的資訊
(5) 控制器(Controller)呼叫ActionProxy
(6) ActionProxy讀取struts.xml檔案獲取action和interceptor stack的資訊。
(7) ActionProxy把request請求傳遞給ActionInvocation
(8) ActionInvocation依次呼叫action和interceptor
(9) 根據action的配置資訊,產生result
(10) Result資訊返回給ActionInvocation
(11) 產生一個HttpServletResponse響應
(12) 產生的響應行為傳送給客服端。
StrutsPrepareAndExecuteFilter或FilterDispatcher)。在Struts2.1以前呼叫FilterDispatcher,Struts2.1以後調StrutsPrepareAndExecuteFilter,那麼,他們之間真正的區別目的在哪裡呢,作者特地去百度了下。- StrutsDispatch和StrutsPrepareAndExecuteFilter區別
FilterDispatcher是struts2.0.x到2.1.2版本的核心過濾器.!
StrutsPrepareAndExecuteFilter是自2.1.3開始就替代了FilterDispatcher的.!
這樣的改革當然是有好處的.!
為什麼這麼說.? 應該知道如果我們自己定義過濾器的話, 是要放在strtus2的過濾器之前的, 如果放在struts2過濾器之後,你自己的過濾器對action的過濾作用就廢了,不會有效!除非你是訪問jsp/html!
那我現在有需求, 我必須使用Action的環境,而又想在執行action之前拿filter做一些事, 用FilterDispatcher是做不到的.!
那麼StrutsPrepareAndExecuteFilter可以把他拆分成StrutsPrepareFilter和StrutsExecuteFilter,可以在這兩個過濾器之間加上我們自己的過濾器.!
給你打個比喻, 現在有病人要做手術, 現在struts2要做兩件事, 搭病床(環境),執行手術.! 那麼打麻藥的工作呢.? 不可能要病人站著打吧, 所以必須有病床的環境,打完麻藥之後再動手術.! 這個比喻非常形象了.!
struts2目錄結構
apps 該資料夾包含了基於struts2 的示例應用,這些示例應用對於學習者是非常有用的
docs 該資料夾下包含了struts2 相關文件,包括struts2 快速入門、struts2的文件以及API文件等
lib 該資料夾下包含了Struts2框架和核心類庫,以及struts2第三方外掛類庫
src 該資料夾下包含了Struts2框架的全部原始碼
開發時沒必要將lib目錄下jar檔案全部複製到專案中Struts執行必要jar包
struts2-core-2.3.1.1.jar:Struts 2框架的核心類庫
xwork-core-2.3.1.1.jar:Command模式框架,WebWork和Struts2都基於xwork
ognl-3.0.3.jar:物件圖導航語言(Object Graph Navigation Language),
struts2框架通過其讀寫物件的屬性
freemarker-2.3.18.jar:Struts 2的UI標籤的模板使用FreeMarker編寫
commons-logging-1.1.x.jar:ASF出品的日誌包,Struts 2框架使用這個日誌
包來支援Log4J和JDK 1.4+的日誌記錄。
commons-fileupload-1.2.2.jar: 檔案上傳元件,2.1.6版本後需要加入此檔案
commons-io-2.0.1.jar:傳檔案依賴的jar包
commons-lang-2.5.jar:對java.lang包的增強
開發中為了方便匯入,可以使用app/struts2-blank.war 攜帶jar包
6.第一個Struts2應用入門
- 建立WEB 工程
- 匯入必要jar包
- 編寫JSP 頁面
- 編寫Action 伺服器端處理邏輯
- 進行框架配置web.xml、struts.xml
- 執行測試
(1) 編寫JSP頁面
helloword.jsp (發起請求頁面)
<a href="${pageContext.request.contextPath}/hello.action"> helloworld</a>
新增對Struts2 框架的訪問連結,預設情況下框架接受以.action請求,並進行處理
success.jsp (結果頁面)
<h1>你好,Struts2<h1>
結果頁面顯示 struts2框架訪問成功
(2) 編寫Action處理訪問Struts2框架請求
public class HelloAction {
public String execute(){
System.out.println("hello world");
return "success"; // 結果頁面命名
}
}
struts2 的Action類似以前編寫的Servlet程式,可以處理使用者提交請求,但是Struts2的Action可以POJO物件
(3)配置Struts2核心控制器
web.xml
<filter>
<filter-name>struts2</filter-name>
<filter-class> org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
過濾器配置/* , 但是struts2 預設處理.action結尾請求,分發到相應Action類
(4)配置struts.xml
在src目錄下建立struts.xml
參加doc下 hello-world-using-struts-2.html