Struts 2 入門

Struts 2 入門:

一:Struts 2執行流程:

1 客戶端發送請求;
2這個請求通過一系列的過濾器(Filter)(這些過濾器中有一個叫作ActionContextCleanUp的可選過濾器,這個過濾器對於Struts2和其餘框架的集成頗有幫助,例如:SiteMeshPlugin)
3接着FilterDispatcher被調用,FilterDispatcher詢問ActionMapper來決定這個請是否須要調用某個Action。FilterDispatcher的功能以下:
(1)執行Actions
(2)清除ActionContext
(3)維護靜態內容
(4)清除request生命週期內的XWork的interceptorsjava

4若是ActionMapper決定須要調用某個Action,FilterDispatcher把請求的處理交給ActionProxy
5 ActionProxy經過ConfigurationManager詢問框架的配置文件,找到須要調用的Action類
6ActionProxy建立一個ActionInvocation的實例。
7ActionInvocation實例使用命名模式來調用,在調用Action的過程先後,涉及到相關攔截器(Intercepter)的調用。
8一旦Action執行完畢,ActionInvocation負責根據struts.xml中的配置找到對應的返回結果。返回結果一般是(但不老是,也多是另外的一個Action鏈)一個須要被表示的JSP或者FreeMarker的模版。在表示的過程當中可使用Struts2框架中繼承的標籤。在這個過程當中須要涉及到ActionMapper數據庫

二:攔截器與過濾器:

一、攔截器是基於java反射機制的,而過濾器是基於函數回調的
二、過濾器依賴於servlet容器,而攔截器不依賴於servlet容器。
三、攔截器只能對Action請求起做用,而過濾器則能夠對幾乎全部請求起做用。
四、攔截器能夠訪問Action上下文、值棧裏的對象,而過濾器不能。
五、在Action的生命週期中,攔截器能夠屢次調用,而過濾器只能在容器初始化時被調用一次。apache

在上述過程當中全部的對象(Action,Results,Interceptors,等)都是經過ObjectFactory來建立的。Struts2的目標很簡單--使Web開發變得更加容易。爲了達成這一目標,Struts2中提供了不少新特性,好比智能的默認設置、annotation的使用以及"慣例重於配置"原則的應用,而這一切都大大減小了XML配置。Struts2中的Action都是POJO,這一方面加強了Action自己的可測試性,另外一方面也減少了框架內部的耦合度,而HTML表單中的輸入項都被轉換成了恰當的類型以供action使用。開發人員還能夠經過攔截器(能夠自定義攔截器或者使用Struts2提供的攔截器)來對請求進行預處理和後處理,這樣一來,處理請求就變得更加模塊化,從而進一步減少耦合度。模塊化是一個通用的主題--能夠經過插件機制來對框架進行擴展;開發人員可使用自定義的實現來替換掉框架的關鍵類,從而得到框架自己所不具有的功能;能夠用標籤來渲染多種主題(包括自定義的主題);Action執行完畢之後,能夠有多種結果類型--包括渲染JSP頁面,Velocity和Freemarker模板,但並不只限於這些api

三:Struts 2概述

  1. Struts 2缺陷:
    (1.)表單成支持單一
    (2.)對Servlet api的依賴
    (3.)不利於代碼的重用
    2.Struts 2的獲取:
    官方網站:http://struts.apache.org
    資源包:http://strust.apache.org/download.cgi
  2. Strust 2項目的基礎jar文件: 文件名 --------------------- 說明 Struts2-core-xxx.jar :Struts2框架的核心類庫。 xwork-core-xxx.jar:XWork類庫,Struts2的構建基礎。 Ognl-xxx.jar:Struts2使用的一種表達式語音類庫 Freemarker-xxx.jar:Struts2的標籤模板使用類庫 Javassist-xxx.GA.jar:對字節代碼進行處理 Commons-fileupload-xxx.jar:文件上傳時須要使用 Commons-io-xxx.jar:Java Io擴展 Commons-lang-xxx.jar:包含一些數據庫類型的工具類。

四:Action接口中常量字符串的邏輯含義

常量---------值------------------------------邏輯含義
SUCCESS:  success:表示程序處理異常,並返回給用戶成功後的結果
NONE    none    表示處理正常結束,但不返回給用戶任何提示
ERROR   error     表示處理結果失敗
INPUT   input    表示須要更多用戶輸入才能順利執行
LOGIN   login    表示須要用戶正確登陸後才能順利執行

五:Struts 2配置詳解

<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd" >session

<struts>app

<!-- include節點是struts2中組件化的方式 能夠將每一個功能模塊獨立到一個xml配置文件中 而後用include節點引用 -->
<include file="struts-default.xml"></include>


<!-- package提供了將多個Action組織爲一個模塊的方式
    package的名字必須是惟一的 package能夠擴展 當一個package擴展自
    另外一個package時該package會在自己配置的基礎上加入擴展的package
    的配置 父package必須在子package前配置 
    name:package名稱
    extends:繼承的父package名稱
    abstract:設置package的屬性爲抽象的 抽象的package不能定義action 值true:false
    namespace:定義package命名空間 該命名空間影響到url的地址,例如此命名空間爲/test那麼訪問是的地址爲http://localhost:8080/struts2/test/XX.action
 -->
<package name="com.kay.struts2" extends="struts-default" namespace="/test">
    <interceptors>
        <!-- 定義攔截器 
            name:攔截器名稱
            class:攔截器類路徑
         -->
        <interceptor name="timer" class="com.kay.timer"></interceptor>
        <interceptor name="logger" class="com.kay.logger"></interceptor>
        <!-- 定義攔截器棧 -->
        <interceptor-stack name="mystack">
            <interceptor-ref name="timer"></interceptor-ref>
            <interceptor-ref name="logger"></interceptor-ref>
        </interceptor-stack>
    </interceptors>
    
    <!-- 定義默認的攔截器 每一個Action都會自動引用
     若是Action中引用了其它的攔截器 默認的攔截器將無效 -->
    <default-interceptor-ref name="mystack"></default-interceptor-ref>
    
    
    <!-- 全局results配置 -->
    <global-results>
        <result name="input">/error.jsp</result>
    </global-results>
    
    <!-- Action配置 一個Action能夠被屢次映射(只要action配置中的name不一樣)
         name:action名稱
         class: 對應的類的路徑
         method: 調用Action中的方法名
    -->
    <action name="hello" class="com.kay.struts2.Action.LoginAction">
        <!-- 引用攔截器
            name:攔截器名稱或攔截器棧名稱
         -->
        <interceptor-ref name="timer"></interceptor-ref>
    
        <!-- 節點配置
            name : result名稱 和Action中返回的值相同
            type : result類型 不寫則選用superpackage的type struts-default.xml中的默認爲dispatcher
         -->
     <result name="success" type="dispatcher">/talk.jsp</result>
     <!-- 參數設置 
         name:對應Action中的get/set方法 
     -->
     <param name="url">http://www.sina.com</param>
    </action>
</package>

</struts>框架

補充:

struts.xml是咱們在開發中利用率最高的文件,也是Struts2中最重要的配置文件。 一下分別介紹一下幾個struts.xml中經常使用到的標籤 一、<include>
利用include標籤,能夠將一個struts.xml配置文件分割成多個配置文件,而後在struts.xml中使用<include>標籤引入其餘配置文件。 好比一個網上購物程序,能夠把用戶配置、商品配置、訂單配置分別放在3個配置文件user.xml、goods.xml和order.xml中,而後在struts.xml中將這3個配置文件引入: struts.xml: ? 1 2 3 4 5 6 7 8 9 10 <?xmlversion="1.0"encoding="UTF-8"?>jsp

<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd">ide

<struts> <includefile="user.xml"/> <includefile="goods.xml"/> <includefile="order.xml"/> </struts>模塊化

user.xml: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 <?xmlversion="1.0"encoding="UTF-8"?>

<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts> <packagename="wwfy"extends="struts-default"> <actionname="login"class="wwfy.user.LoginAction"> <!--省略Action其餘配置--> </action> <actionname="logout"class="wwfy.user.LogoutAction"> <!--省略Action其餘配置--> </action> </package> </struts>

二、<constant> 在以前提到struts.properties配置文件的介紹中,咱們曾經提到全部在struts.properties文件中定義的屬性,均可以配置在struts.xml文件中。而在struts.xml中,是經過<constant>標籤來進行配置的: ? 1 2 3 4 5 6 7 8 9 10 11 12 <?xmlversion="1.0"encoding="UTF-8"?>

<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts> <!--設置開發模式--> <constantname="struts.devMode"value="true"/> <!--設置編碼形式爲GB2312--> <constantname="struts.i18n.encoding"value="GB2312"/> <!--省略其餘配置信息--> </struts>

三、<package> 一、包屬性介紹 在Struts2框架中是經過包來管理action、result、interceptor、interceptor-stack等配置信息的。包屬性以下: 屬性 是否必需 描述 name 是 包名,做爲其它包應用本包的標記 extends 否 設置本包繼承其它包 namespace 否 設置包的命名空間 abstact 否 設置爲抽象包

二、extends屬性的詳解 當一個包經過配置extends屬性繼承了另外一個包的時候,該包將會繼承父包中全部的配置,包括action、result、interceptor等。 因爲包信息的獲取是按照配置文件的前後順序進行的,因此父包必須在子包以前被定義。 一般咱們配置struts.xml的時候,都繼承一個名爲「struts-default.xml」的包,這是struts2中內置的包。

三、namespace的詳解 namespace主要是針對大型項目中Action的管理,更重要的是解決Action重名問題,由於不在同一個命名空間的Action可使用相同的Action名的。 1)若是使用命名空間則URL將改變 好比咱們有一下配置文件 ? 1 2 3 4 5 <packagename="wwfy"extends="struts-default"> <actionname="login"class="wwfy.action.LoginAction"> <result>/success.jsp</result> </action> </package>

則此配置下的Action的URL爲http://localhost:8080/login.action

假如爲這個包指定了命名空間 ? 1 2 3 4 5 <packagename="wwfy"extends="struts-default"namespace="/user"> <actionname="login"class="wwfy.action.LoginAction"> <result>/success.jsp</result> </action> </package>

則此配置下的Action的URL爲http://localhost:8080/user/login.action 2)默認命名空間 Struts2中若是沒有爲某個包指定命名空間,該包使用默認的命名空間,默認的命名空間老是""。 3)指定根命名空間 當設置了命名空間爲「/」,即指定了包的命名空間爲根命名空間時,此時全部根路徑下的Action請求都會去這個包中查找對應的資源信息。 倘若前例中路徑爲http://localhost:8080/login.action則全部http://localhost:8080/*.action都會到設置爲根命名空間的包中尋找資源。

四、<action>與<result> 一、<action>屬性介紹 屬性名稱 是否必須 功能描述 name 是 請求的Action名稱 class 否 Action處理類對應具體路徑 method 否 指定Action中的方法名 converter 否 指定Action使用的類型轉換器 若是沒有指定method則默認執行Action中的execute方法。 二、<result>屬性介紹 屬性名稱 是否必須 功能描述 name 否 對應Action返回邏輯視圖名稱,默認爲success type 否 返回結果類型,默認爲dispatcher

三、通配符的使用 隨着result的增長,struts.xml文件也會隨之變得愈來愈複雜。那麼就可使用通配符來簡化配置: 例以下面這個案例: Action爲Test.java

? 1 2 3 4 5 6 7 8 9 10 11 12 13 publicclassTest { publicString test1(){ return"result1"; }

publicString test2(){
    return"result2";
}
  
publicString test3(){
    return"result3";
}

}

struts.xml中配置爲 ? 1 2 3 4 5 <packagename="wwfy"extends="struts-default"> <actionname="test*"class="wwfy.action.test{1}"> <resultname="result{1}">/result{1}.jsp</result> </action> </package> 四、訪問Action方法的另外一種實現方式 在Struts2中若是要訪問Action中的指定方法,還能夠經過改變URL請求來實現,將本來的「Action名稱.action」改成「Action名稱!方法名稱.action」在struts.xml中就不須要指定方法名了。

五、<exception-mapping>與<global-exception-mapping> 這兩個標籤都是用來配置發生異常時對應的視圖信息的,只不過一個是Action範圍的,一個是包範圍的,當同一類型異常在兩個範圍都被配置時,Action範圍的優先級要高於包範圍的優先級.這兩個標籤包含的屬性也是同樣的: 屬性名稱 是否必須 功能描述 name 否 用來表示該異常配置信息 result 是 指定發生異常時顯示的視圖信息,這裏要配置爲邏輯視圖 exception 是 指定異常類型

兩個標籤的示例代碼爲: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 <?xmlversion="1.0"encoding="UTF-8"?>

<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts> <packagename="default"extends="struts-default"> <global-exception-mappings> <exception-mappingresult="邏輯視圖"exception="異常類型"/> </global-exception-mappings> <actionname="Action名稱"> <exception-mappingresult="邏輯視圖"exception="異常類型"/> </action> </package> </struts>

六、<default-class-ref> 當咱們在配置Action的時候,若是沒有爲某個Action指定具體的class值時,系統將自動引用<default-class-ref>標籤中所指定的類。在Struts2框架中,系統默認的class爲ActionSupport,該配置咱們能夠在xwork的核心包下的xwork-default.xml文件中找到。 有特殊須要時,能夠手動指定默認的class ? 1 2 3 4 5 6 7 packagewwfy.action;

publicclassDefaultClassRef { publicvoidexecute(){ System.out.println("默認class開始執行……"); } }

在struts.xml中配置

? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 <?xmlversion="1.0"encoding="UTF-8"?>

<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts> <packagename="wwfy"extends="struts-default"> <!-- 指定默認class爲Test --> <default-class-refclass="wwfy.action.DefaultClassRef"/> <actionname="test1"> <result>/index.jsp</result> </action> </package> </struts>

七、<default-action-ref> 若是在請求一個沒有定義過的Action資源時,系統就會拋出404錯誤。這種錯誤不可避免,但這樣的頁面並不友好。咱們可使用<default-action-ref>來指定一個默認的Action,若是系統沒有找到指定的Action,就會指定來調用這個默認的Action。 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 <?xmlversion="1.0"encoding="UTF-8"?>

<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts> <packagename="wwfy"extends="struts-default">

<default-action-refname="acctionError"></default-action-ref>
    <actionname="acctionError">
        <result>/jsp/actionError.jsp</result>
    </action>
</package>

</struts>

八、<default-interceptor-ref> 該標籤用來設置整個包範圍內全部Action所要應用的默認攔截器信息。事實上咱們的包繼承了struts-default包之後,使用的是Struts的默認設置。咱們能夠在struts-default.xml中找到相關配置: ? 1 <default-interceptor-refname="defaultStack"/>

在實際開發過程當中,若是咱們有特殊的需求是能夠改變默認攔截器配置的。當時一旦更改這個配置,「defaultStack」將再也不被引用,須要手動最加。

九、<interceptors> 經過該標籤能夠向Struts2框架中註冊攔截器或者攔截器棧,通常多用於自定義攔截器或攔截器棧的註冊。該標籤使用方法以下: ? 1 2 3 4 5 6 <interceptors> <interceptorname="攔截器名"class="攔截器類"/> <interceptor-stackname="攔截器棧名"> <interceptor-refname="攔截器名"> </interceptor-stack> </interceptors>

十、<interceptor-ref> 經過該標籤能夠爲其所在的Action添加攔截器功能。當爲某個Action單獨添加攔截器功能後,<default-interceptor-ref>中所指定的攔截器將再也不對這個Action起做用。

十一、<global-results> 該標籤用於設置包範圍內的全局結果集。在多個Action返回相同邏輯視圖的狀況下,能夠經過<global-results>標籤統一配置這些物理視圖所對應的邏輯視圖。 ? 1 2 3 4 5 6 7 8 9 10 11 12 <?xmlversion="1.0"encoding="UTF-8"?>

<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts> <packagename="wwfy"extends="struts-default"> <global-results> <resultname="test">/index.jsp</result> </global-results> </package> </struts> ### 六:Struts 2訪問Servlet API對象 1. 最經常使用的Servlet api三個接口: HttpServletRequest HttpSession ServletContext 2. Servlet API解耦的訪問方式: //解偶方式得到session request ActionContext context=ActionContext.getContext(); //得到session Map session=context.getSession(); //得到request Map request=(Map)context.get("request"); 3. 關於注入的概念: 簡單的說就是經過框架自動對Action屬性進行賦值,和Spring中的依賴注入相似。 ### 七:Struts 2標籤: 1.<%@ taglib prefix=」s」 uri=」/struts-tags」%> 2.UI標籤:可分爲三大部分: 表單標籤 非表單標籤 Ajax標籤

表單標籤的圖解:
標籤 說明
<s:form>…..</s:form> 獲取相應的form值
<s:textfield>……..</> 文本框輸入
<s:password>……..</> 密碼框輸入
<s:textarea>………</> 文本域輸入
<s:radio>……………..</> 單選按鈕
<s:checkbox>………….</> 複選框
<s:submit>………….</> 提交按鈕
<s:reset>………………</> 重置按鈕
<s:hidden>……………</> 隱藏域標籤

  1. 通用標籤:

名稱 標籤
根據表達式的值,判斷將要執行的內容

條件標籤 <s:if>…..</>
<s:elseif>……</>
<s:else>……….</>

迭代標籤 <s:iterator>………….</> 用於遍歷集合

注意:

(1.)三個標籤中只有<s:if……./>標籤能夠單獨使用。 (2.)三個標籤能夠組合使用<s:elseif……../>標籤與<s:else……/>標籤不能單獨使用,必須與<s:if…../>標籤結合才能使用。 (3.)<s:if……./>標籤能夠與多個<s:elseif……./>結合使用,可是隻能與一個<s:else……../>標籤結合在一塊兒。

相關文章
相關標籤/搜索