Struts2學習筆記

来源:http://www.cnblogs.com/caden1225/archive/2016/10/18/5939953.html
-Advertisement-
Play Games

一、struts2的工作原理 上圖為struts整體結構。 1.客戶端初始化一個指向servlet的請求; 2.請求通過一系列過濾器(其中的ActionContextCleanUp為可選過濾器,對struts與其他框架集成有幫助),到達StrutsPrepareAndExecuteFilter過濾器 ...


一、struts2的工作原理

  

上圖為struts整體結構。

1.客戶端初始化一個指向servlet的請求;

2.請求通過一系列過濾器(其中的ActionContextCleanUp為可選過濾器,對struts與其他框架集成有幫助),到達StrutsPrepareAndExecuteFilter過濾器;

3.StrutsPrepareAndExecuteFilter詢問ActionMapper是否調用某個action;

4.AcitonMapper決定調用某個action,Filter將請求的處理交給ActionProxy;

5.ActionProxy通過Configuration Manager詢問框架的配置文件找到需要的Action類;

6.ActionProxy創建一個ActionInvocation實例;

7.ActionInvocation實例使用命名模式來調用,在調用Action的前後,涉及到相關攔截器(Intercepter)的調用;

8.一旦Action調用完畢,ActionInvocation負責根據struts.xml中的配置找到對應的返回結果,返回結果通常是(但不總是,也可 能是另外的一個Action鏈)一個需要被表示的JSP或者FreeMarker的模版。在表示的過程中可以使用Struts2 框架中繼承的標簽。在這個過程中需要涉及到ActionMapper

 

struts與mvc模型

控制:XML文件Struts-config.xml,與之相關聯的是Controller,它可以稱作為Struts神經中樞。

視圖:主要由JSP生成頁面完成視圖,Struts提供豐富的JSP 標簽庫: Html,Bean,Logic,Template等,這有利於分開在Struts中,承擔MVC中Controller角色的是一個Servlet,叫ActionServlet。ActionServlet是一個通用的控制組件。這個控制組件提供了處理所有發送到Struts的HTTP請求的入口點。它截取和分發這些請求到相應的動作類(這些動作類都是Action類的子類)。另外控制組件也負責用相應的請求參數填充 Action From(通常稱之為FromBean),並傳給動作類(通常稱之為ActionBean)。動作類實現核心商業邏輯,它可以訪問java bean 或調用EJB。最後動作類把控制權傳給後續的JSP 文件,後者生成視圖。所有這些控制邏輯利用Struts-config.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-config.xml中的配置信息,將用戶請求封裝成一個指定名稱的FormBean,並將此FormBean傳至指定名稱的ActionBean,由ActionBean完成相應的業務操作,如文件操作,資料庫操作等。每一個*.do均有對應的FormBean名稱和ActionBean名稱,這些在Struts-config.xml中配置。

核心:Struts的核心是ActionSevlet,ActionSevlet的核心是Struts-config.xml。

 

二、struts2的實現流程

1.包含jar包到項目lib目錄

 

2.配置web項目的web.xml文件,添加struts2濾器:

<filter>

    <filter-name>struts2</filter-name>
    <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepaerAndExecuteFilter</filter-class>
</filter>

<filter-mapping>
    <filter-name>struts2</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

3.創建action類,繼承ActionSupport類:

  public class HelloWorldAction extends ActionSupport{

    //預設執行execute()方法

    public String execute(){}

 

4.創建struts2的核心配置文件struts.xml並配置action:

  <struts>

    <include file="struts-users.xml"></include>                    //通過include標簽實現多個配置文件的組件式包含。

 

    

    <package name="default" namespace="/" extends="struts-default">       //配置文件中可有多個package,但名稱必須唯一。 

      <intercepters>                                 //定義攔截器。。。

        <intercepter name="timer" class="com.kay.Timer"></intercepter>

      </intercpters>

 

      <global-results>                                //全局結果集

          <result name="input">/error.jsp</result>

      </global-results>     

 

       <action name="helloworld" class="com.action.HelloWorldAction">      //每個包可以定義多個action,name為其訪問路徑,有命名空間需添加命名空間首碼

        <result>/result.jsp</result>                              //結果集,無name與type為預設結果

      </action>

      <param name="url">http://www.sina.com</param>             //參數

    </package>

    <constant name="struts.i18n.reload" value="true"></constant>          //常量值,參考struts.propertise

  </struts>

  補充:調用動態方法:

  第一種-同一action下的不同方法可通過配置同一package下的不同action標簽實現,指向同一class,通過method屬性區別(name不能相同)。 

  第二種-通過通配符實現:

      <action name="helloworld_*" name="{1}" class....>

        <result  name = "add">/{1}.jsp</result>                //通過...helloworld_add.action實現

    或:<action name="*_*" name="{2}" class="com.action.{1}Action">

        <resutl name="add">/{2}.jsp</result>                  //通過HelloWorld_add.action實現

 

5.接收參數

  -使用Action的屬性接收參數:

    直接在繼承ActionSupport的Action中添加參數同名欄位,並添加getter和setter,可通過欄位直接調用參數;簡單,但參數數量多時不宜使用;

  -使用DomainModel接收:

    創建對象類封裝參數,通過action中添加對象欄位實現調用,參數傳遞頁面須將參數名稱改為對象.參數(user.password)以傳遞到指定對象。

  -使用ModelDriven接收:

    為Action添加ModelDriven介面,同時將封裝參數的對象類,併在Action類中添加getModel方法(返回對象user);調用時須先對對象類進行實例化                 (DomainModel不需要實例化),同時參數傳遞頁面的參數名稱不需添加對象首碼。

  當參數為複雜對象時,第三種方法可直接通過數組的下標,對象的“."欄位調用進行傳遞。。。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • VS中如何快捷地給自己的代碼添加創建信息註釋 Intro 以下討論的都是沒有使用 GIT 來管理源代碼的情況,如果使用 GIT 管理源代碼可直接使用VS的Git擴展就不需要考慮以下問題。 什麼是創建信息註釋? 創建信息註釋,類似於文件的創建信息,一般來說,至少要有創建人和創建時間。如果說有人修改了方 ...
  • spring的事務處理分為兩種: 1、編程式事務:在程式中控制事務開始,執行和提交;(不建議使用,所以這裡我就不說明太多) 2、聲明式事務:在Spring配置文件中對事務進行配置,無須在程式中寫代碼;(建議使用) 我對”聲明式“的理解是這樣的:Spring配置文件中定義好了這樣一個規則, 這個規則可 ...
  • 回到目錄 挺有意思的一件事 對於MVC視圖渲染來說,大家應該不會陌生,但對於模型的渲染,不知道是否聽說過,主要是說Model通過它屬性的相關特性(DataType,UIHint)來將它們自動渲染到View上,這是一個比較不錯的技術,因為使用傳統的Html.EditorForModel去渲染是不能滿足 ...
  • 需求分析 ”null exception“很見的一種異常,但在某些情況下卻會引起嚴重的bug! 本文目的就是對代碼進行null 的檢查,避免不應該出現的Error。 本文藉助reshaper,全局檢測項目中所有可能出現的null exception 關於resharper的知識:http://zzk ...
  • 一、動態語言 Objective-C語言是一門動態語言,它將很多靜態語言在編譯和鏈接時期做的事放到了運行時來處理。這種動態語言的優勢在於:具有靈活性,比如:消息轉發,方法交換等。它有一個運行時系統Objc Runtime,其實是一個Runtime庫,基本上是用C和彙編寫的,這個庫使得C語言有了面向對 ...
  • 多線程技術可以更好地利用系統資源,減少用戶的響應時間,提高系統的性能和效率,但同時也增加了系統的複雜性和運維難度,特別是在高併發、大壓力、高可靠性的項目中。線程資源的同步、搶占、互斥都需要慎重考慮,以避免產生性能損耗和線程死鎖。 建議118:不推薦覆寫start方法 多線程比較簡單的實現方式是繼承T ...
  • 來來來,來看這篇文章: http://www.cnblogs.com/biyeymyhjob/archive/2012/07/19/2598815.html ...
  • 在寫PHP程式時,經常要用到include或require包含其他文件,但是各文件里包含的文件多了之後,就會產生路徑問題。 如下目錄: <web>(網站根目錄) ├<A>文件夾 │ │ │ └1.php ├<B>文件夾 │ │ │ └2.php └index.php 現在根目錄下的index.php ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...