了解一下 - struts2

  • Apache Struts 2是一種流行的 Java模型 - 視圖 - 控制器(MVC)框架,成功地結合了 WebWork和Struts1.x 兩種 web 框架。

struts2與struts1區別 (經常聽搞java的同事嗶嗶這個面試題)

  • Struts 2是Struts的下一代產品,是在 struts 1和WebWork的技術基礎上進行了合并的全新的Struts 2框架。其全新的Struts 2的體系結構與Struts 1的體系結構差別巨大。Struts 2以WebWork為核心,采用攔截器的機制來處理用戶的請求,這樣的設計也使得業務邏輯控制器能夠與ServletAPI完全脫離開,所以Struts 2可以理解為WebWork的更新產品。雖然從Struts 1到Struts 2有著太大的變化,但是相對于WebWork,Struts 2的變化很小。從某種程度上來看,Struts 2是WebWork的升級,而不是Struts 1的升級,甚至在Apache的Struts 2的官方文檔都提到:WebWork到Struts 2是一次平滑的過渡。實際上,Struts 2.0其實是WebWork 2.3而已。在很多方面,Struts 2僅僅是改變了WebWork下的名稱,Struts 2也刪除了WebWork中少量特性。

  • Struts實現MVC的原理


    Struts實現MVC的原理
  • 控制:通過圖可以看到有一個XML文件Struts-config.xml,與之相關聯的是Controller,它可以稱作為Struts神經中樞。承擔MVC中Controller角色的是一個Servlet,叫ActionServlet。ActionServlet是一個通用的控制組件。這個控制組件提供了處理所有發送到Struts的HTTP請求的入口點。它截取和分發這些請求到相應的動作類(這些動作類都是Action類的子類)。另外控制組件也負責用相應的請求參數填充 Action From(通常稱之為FromBean),并傳給動作類(通常稱之為ActionBean)。
  • 流程:在Struts中,用戶的請求一般以.do作為請求服務名,所有的.do請求均被指向ActionSevlet,ActionSevlet根據Struts-config.xml中的配置信息,將用戶請求封裝成一個指定名稱的FormBean,并將此FormBean傳至指定名稱的ActionBean,由ActionBean完成相應的業務操作,如文件操作,數據庫操作等。每一個*.do均有對應的FormBean名稱和ActionBean名稱,這些在Struts-config.xml中配置。動作類實現核心商業邏輯,它可以訪問java bean 或調用EJB。最后動作類把控制權傳給后續的JSP 文件,后者生成視圖。所有這些控制邏輯利用Struts-config.xml文件來配置。表現邏輯和程序邏輯。
  • 視圖:主要由JSP生成頁面完成視圖。
  • 模型:模型以一個或多個java bean的形式存在。這些bean分為三類:Action Form、Action、JavaBean or EJB。Action Form通常稱之為FormBean,封裝了來自于Client的用戶請求信息,如表單信息。Action通常稱之為ActionBean,獲取從ActionSevlet傳來的FormBean,取出FormBean中的相關信息,并做出相關的處理,一般是調用Java Bean或EJB等。
  • 核心:Struts的核心是ActionSevlet,ActionSevlet的核心是Struts-config.xml。
    20130904161742156.jpg
  • 客戶端(Client)向Action發用一個請求(Request)
  • Container通過web.xml映射請求,并獲得控制器(Controller)的名字
  • 容器(Container)調用控制器(StrutsPrepareAndExecuteFilter或FilterDispatcher)。在Struts2.1以前調用FilterDispatcher,Struts2.1以后調用StrutsPrepareAndExecuteFilter
  • 控制器(Controller)通過ActionMapper獲得Action的信息
  • 控制器(Controller)調用ActionProxy
  • ActionProxy讀取struts.xml文件獲取action和interceptor stack的信息。
  • ActionProxy把request請求傳遞給ActionInvocation
  • ActionInvocation依次調用action和interceptor
  • 根據action的配置信息,產生result
  • Result信息返回給ActionInvocation
  • 產生一個HttpServletResponse響應
  • 產生的響應行為發送給客服端。

Struts 2 各種文件詳解:

  • Struts 2 體系結構 :
      1、Web瀏覽器請求一個資源。
      2、過濾器Dispatcher查找方法,確定適當的Action。
      3、攔截器自動對請求應用通用功能,如驗證和文件上傳操作。
      4、Action的execute方法通常用來存儲和重新獲得信息。
      5、結果被返回到瀏覽器。
  • 開發Struts 2 最少用到的jar文件:
    • Struts-core-2.x.x.jar : Struts 2 框架的核心類庫
    • xwork-2.x.x.jar : XWork類庫,Struts 2 在其上構建,由于struts2很多事基于webwork的,因此也需要這個的核心包
    • ognl-2.6.x.jar : Object Graph Navigation Language ,Struts 2 框架通過其讀寫對象的屬性,提供了OGNL表達式。
    • freemarker-2.3.x.jar : Struts 2 的UI標簽的模版使用 Freemarker編寫,提供了另一種展現方式。
    • commons-logging-1.1.x.jar : ASF出品的日志包,apache commons的jar包。
    • commons-fileupload-1.2.1.jar : 文件上傳組件,apache commons的jar包。
  • struts.xml文件
    • Struts.xml是 Struts 2 的核心配置文件,主要用于配置開發人員編寫的action。
    • struts.xml需要存放在WEB-INF/classes下,模板如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
</struts>
  • web.xml文件
    • 在Struts 2中,Struts框架是通過Filter啟動的,他在web.xml中的配置如下:
<!-- 配置Struts2 核心 Filter -->
  <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>
  • 在StrutsPrepareAndExecuteFilter的init()方法中將會讀取類路徑下默認的配置文件struts.xml完成初始化操作。
  • 注意:struts 2 讀取到 struts.xml的內容后,以javabean形式存放在內存中,以后Struts 2對用戶的每一次請求處理將使用內存中的數據。
  • Filter 過濾器是用戶請求和處理程序之間的一層處理程序。它可以對用戶請求和處理程序響應的類容進行處理,通常用于權限、編碼轉換等場合。
  • ActionSupport 類
    • ActionSupport 類為 Action 提供了一些默認實現,主要包括預定義常量、從資源文件中取文本資源、接收驗證錯誤信息和驗證的默認實現。
    • 數據校驗
      • Action 繼承了 ActionSupport 類 ,而該類實現了 Action 、Validateable 、 ValidationAware 、TextProvider、LocaleProvider、Serializable 接口。
      • 在Validateable 接口定義了一個 validate() 方法 , 在用戶自定義 Action 類中重寫該方法就可以實現驗證功能。
public class LoginAction extends ActionSupport{
    private String username ;  
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    } 
    @Override
    public String execute() throws Exception {
        // TODO Auto-generated method stub
        if ( ! username.equals("HelloWorld"))
        {
            Map request = (Map) ActionContext.getContext().get("request") ; 
            request.put("name", getUsername()) ; 
            return SUCCESS;
        }
        else return ERROR ; 
    } 
  //重寫的validate方法
    public void validate()
    {  
        //如果名字為空,則把錯誤信息天驕的Action類的fileError
        if (this.getUsername() == null || this.getUsername().trim().equals(""))
        {
            addFieldError("username" , "名字不能為空") ; 
        }
    } 
}
- 在類中定義了校驗方法后,該方法會在執行系統的execute() 方法之前執行。如果執行該方法后,Action類的fieldError中已經包含了數據校驗錯誤信息,將把請求轉發到input邏輯視圖處,所以在 Action配置中也要配置一下。
<action name = "LoginAction" class = "com.cnblogs.jbelial.login.LoginAction" >
            <!-- 定義3個邏輯視圖和物理資源之間的映射  -->
            <result name = "input">/login.jsp</result>
            <result name = "error">/error.jsp</result>
            <result name = "success">/main.jsp</result>
        </action>

result中name屬性有下:
  1、success :表示請求處理成功后跳轉的目標頁,該值也是默認值;
  2、error :表示請求處理失敗后跳轉的目標頁;
  3、none :表示請求處理完成后不跳轉到任何頁面;
  4、input :表示輸入時如果驗證失敗應該跳轉到什么地方;
  5、login :表示登錄失敗后跳轉的目標。

  • Struts 2 驗證框架的應用
  • Struts 2 提供了大量的數據校驗器,包括表單域校驗器和非表單域校驗器。
  • 必填字符串校驗器:
    該校驗器的名字是 requiredstring 其校驗規則定義文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC 
"-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" 
"http://struts.apache.org/dtds/struts-2.1.dtd">
<validators>
    <field name = "username">
        <!-- 需要驗證的字段的字段名 -->
        <field-validators type = "requiredstring">
            <!-- 去空格 -->
            <param name = "trim">true</param>
            <!-- 錯誤提示信息 -->
            <message>請輸入用戶名</message>
        </field-validators>
    </field>
</validators>

文件命名:ActionName-validation.xml:其中ActionName 就是需要校驗的用戶自定義的Action 類的名字。而且該文件應該與Action 類文件放置在同一路徑下。
- 必填校驗器
該校驗器的名字就是 required 。該校驗器與requiredstring 的差別就是 可以有空字符串。配置如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC 
"-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" 
"http://struts.apache.org/dtds/struts-2.1.dtd">
<validators> 
        <!-- 需要驗證的字段的字段名 -->  
    <field name = "username">
        <field-validators type = "required"> 
            <!-- 錯誤提示信息 -->
            <message>請輸入用戶名</message>
        </field-validators>
    </field>
</validators>
- 整數校驗器

該校驗器的名字為 int ,該校驗器要求字段的整數值必須在一定范圍內。配置如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC 
"-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" 
"http://struts.apache.org/dtds/struts-2.1.dtd">
<validators>
    <!-- 需要驗證的字段的字段名 -->
    <field name = "number">
        <field-validators type = "int"> 
            <!-- 數值的最小值 -->
            <param name = "min">50</param>
            <!-- 數值的最大值 -->
            <param name = "max">100</param>
            <!-- 錯誤提示信息 -->
            <message>大小必須在50至100之間</message>
        </field-validators>
    </field>
</validators>
  • Struts 2 攔截器:
    • Struts 2 框架的絕大部分功能是通過攔截器來完成的,當F ilterDispatcher攔截到用戶請求后,大量攔截器將會對用戶請求進行處理,然后調用用戶自定義的Action 類中的方法來處理請求。
    • 攔截器的配置:
      在struts.xml文件中來定義的,使用<interceptor.../>元素,格式如下:
<interceptor name = "攔截器名" class = "攔截器實現的類">
    <param name = "參數名">參數值</param>
</interceptor>

其中<param.../>可以省略,但在有的時候就需要為其傳入攔截器參數。
- 有時候一個Action要配置不只一個攔截器,往往多個攔截器一起使用來進行過濾。這時候就要配置幾個攔截器組成的攔截器棧。定義攔截器棧用
<interceptor-stack.../>,格式如下:

<interceptor-stack name = "攔截器棧名">
    <interceptor-ref name = "攔截器一"></interceptor-ref>
    <interceptor-ref name = "攔截器二"></interceptor-ref>
    <interceptor-ref name = "攔截器三"></interceptor-ref>
</interceptor-stack>

注意:在配置攔截器棧時,用到的攔截器必須是已經存在的攔截器。攔截器棧也可以引用攔截器棧。
- 攔截器實現類:
- Struts 2 提供了一些接口或類供程序員自定義攔截器。如:com.opensymphony.xwork2.interceptor.Interceptor 接口。
- 該接口中有三個方法:
  void init () :用于初始化資源。
  String intercept (ActionInvocation invocation) :用于實現攔截的動作。
  destroy () :用于銷毀在init()方法中打開的資源。


兩個簡單struts2入門示例


兩個簡單的struts1入門示例


最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,908評論 6 541
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,324評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,018評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,675評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,417評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,783評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,779評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,960評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,522評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,267評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,471評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,009評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,698評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,099評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,386評論 1 294
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,204評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,436評論 2 378

推薦閱讀更多精彩內容

  • 本文包括: 1、Struts 2 概述2、Struts 2 快速入門3、Struts 2 的執行流程4、配置 st...
    廖少少閱讀 2,985評論 3 13
  • 概述 什么是Struts2的框架Struts2是Struts1的下一代產品,是在 struts1和WebWork的...
    inke閱讀 2,269評論 0 50
  • 概述 Struts就是基于mvc模式的框架!(struts其實也是servlet封裝,提高開發效率!) Strut...
    奮斗的老王閱讀 2,967評論 0 51
  • 1、struts2工作流程 Struts 2框架本身大致可以分為3個部分: 核心控制器FilterDispatch...
    重山楊閱讀 1,532評論 0 38
  • struts2 (2017.7.24)1.在struts2的jar包中拿出apps/blank.war文件,放進T...
    瀟湘雨smile閱讀 169評論 0 0