1. 程式人生 > >Struts2工作原理以及核心思想

Struts2工作原理以及核心思想

Struts2

JAVA基礎學完,肯定是要面臨三大框架的學習的,作為初學者,瞭解三大框架的原理,設計目的是首要任務,只有在把握了框架的設計目的以後,才能有針對性的取學習使用框架,這裡從strue2框架開始,介紹三大框架,讓新手能有一個總的瞭解跟思維導圖。

1. 什麼是Struts2?

  1. Struts2 是一個非常優秀的MVC框架,基於Model2 設計模型
    由傳統Struts1和WebWork兩個經典框架發展而來
  2. 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

這裡寫圖片描述