Struts2的學(xué)習(xí)筆記-基礎(chǔ)篇

一、Struts2概述

Struts2是一個(gè)基于MVC設(shè)計(jì)模式的Web應(yīng)用框架臼节,它本質(zhì)上相當(dāng)于一個(gè)servlet伍派,在MVC設(shè)計(jì)模式中,Struts2作為控制器(Controller)來(lái)建立模型與視圖的數(shù)據(jù)交互推溃。Struts 2是Struts的下一代產(chǎn)品,是在 struts 1和WebWork的技術(shù)基礎(chǔ)上進(jìn)行了合并的全新的Struts 2框架届腐。

二铁坎、Struts2主要功能

1.允許POJO(Plain Old Java Objects)對(duì)象 作為Action,
2.Action的execute 方法不再與Servlet API耦合犁苏,
3.更易測(cè)試硬萍,支持更多視圖技術(shù)(JSP、FreeMarker围详、Velocity)朴乖,
4.基于Spring AOP思想的攔截器機(jī)制,更易擴(kuò)展,
5.更強(qiáng)大买羞、更易用輸入校驗(yàn)功能
6.整合Ajax支持

三袁勺、Struts2的下載與安裝

http://struts.apache.org/download.cgi 去下載Struts2 最新版
struts2目錄結(jié)構(gòu)
apps 該文件夾包含了基于struts2 的示例應(yīng)用,這些示例應(yīng)用對(duì)于學(xué)習(xí)者是非常有用的
docs 該文件夾下包含了struts2 相關(guān)文檔畜普,包括struts2 快速入門魁兼、struts2的文檔以及API文檔等
lib 該文件夾下包含了Struts2框架和核心類庫(kù),以及struts2第三方插件類庫(kù)
src 該文件夾下包含了Struts2框架的全部源代碼
開發(fā)時(shí)沒必要將lib目錄下jar文件全部復(fù)制到項(xiàng)目中

三漠嵌、Struts2的的執(zhí)行流程

簡(jiǎn)單執(zhí)行流程

四咐汞、Struts2的HelloWorld

1.創(chuàng)建WEB工程

使用IDEA創(chuàng)建Struts2工程,自動(dòng)會(huì)下載導(dǎo)入對(duì)應(yīng)的jar包

asm-3.3.jar 【操作java字節(jié)碼的類庫(kù)】
asm-commons-3.3.jar 【提供了基于事件的表現(xiàn)形式】
asm-tree-3.3.jar 【提供了基于對(duì)象的表現(xiàn)形式】
commons-fileupload-1.2.2.jar 【文件上傳相關(guān)包】
commons-io-2.0.1.jar 【流相關(guān)包】
commons-lang3-3.1.jar 【struts對(duì)java.lang包的擴(kuò)展】
freemarker-2.3.19.jar 【struts的標(biāo)簽?zāi)0鍘?kù)jar文件】
javassist-3.11.0.GA.jar 【struts對(duì)字節(jié)碼的處理相關(guān)jar】
ognl-3.0.5.jar 【Ognl表達(dá)式功能支持表】
struts2-core-2.3.4.1.jar 【struts2核心功能包】
xwork-core-2.3.4.1.jar 【Xwork核心包】

2.編寫JSP頁(yè)面

helloword.jsp (發(fā)起請(qǐng)求頁(yè)面)

<a href="${pageContext.request.contextPath}/hello.action"> helloworld</a>

添加對(duì)Struts2 框架的訪問鏈接儒鹿,默認(rèn)情況下框架接受以.action請(qǐng)求化撕,并進(jìn)行處理

success.jsp (結(jié)果頁(yè)面)

<h1>Struts2 Hello</h1>

結(jié)果頁(yè)面顯示 struts2框架訪問成功

3.編寫Action處理訪問Struts2框架請(qǐng)求

public class HelloAction {
public String execute(){
    System.out.println("hello world");
    return "success"; // 結(jié)果頁(yè)面命名
  }
}

struts2 的Action類似以前編寫的Servlet程序,可以處理用戶提交請(qǐng)求约炎,但是Struts2的Action可以POJO對(duì)象

4.配置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>

過(guò)濾器配置/* , 但是struts2 默認(rèn)處理.action結(jié)尾請(qǐng)求植阴,分發(fā)到相應(yīng)Action類

5.在struts.xml配置action

<struts>
    <!-- name 隨便寫   extends 固定寫法  -->
    <package name="default" extends="struts-default"  >
     <action name="hello" class="com.lanou.action.HelloAction" method="execute">
               <result name="success">/success.jsp</result>
     </action>
    </package>
</struts>
  • package,用于定義一個(gè)包圾浅,用于管理action
    name屬性必需的并且唯一
    extends屬性用于指定要擴(kuò)展的包
  • action元素用于配置Struts2的Action類
    name屬性是請(qǐng)求的的路徑
    class屬性是要調(diào)用的action類
    method屬性是要執(zhí)行類中的方法
  • result元素用于設(shè)定Action結(jié)束后掠手,系統(tǒng)下一步將要做什么
    name屬性為 action中method執(zhí)行方法的返回值
    type屬性為跳轉(zhuǎn)的結(jié)果類型
    dispatcher 轉(zhuǎn)發(fā) (默認(rèn))
    redirect 重定向
    redirectAction 重定向到action資源

執(zhí)行說(shuō)明:

  1. 瀏覽器發(fā)出xxx.action請(qǐng)求至服務(wù)器;

  2. 服務(wù)器接收后狸捕,根據(jù)web.xml的配置喷鸽,將請(qǐng)求發(fā)送給指定的Struts2的過(guò)濾器;

  3. 過(guò)濾器根據(jù)struts.xml的配置內(nèi)容灸拍,將請(qǐng)求發(fā)送給xxAction類的對(duì)象做祝,并調(diào)用默認(rèn)的execute()方法;

  4. 根據(jù)execute()方法的返回結(jié)果鸡岗,在struts.xml文件中根據(jù)匹配的處理果混槐,完成向success.jsp頁(yè)面跳轉(zhuǎn);

  5. 頁(yè)面根據(jù)上下文中的內(nèi)容轩性,借助Struts2的OGNL表達(dá)式和Struts2標(biāo)簽將內(nèi)容現(xiàn)在在頁(yè)面中声登。(注意:在使用Struts2標(biāo)簽的時(shí),首先導(dǎo)入Struts2的標(biāo)簽)

詳細(xì)請(qǐng)求流程

請(qǐng)求流程圖

Struts2請(qǐng)求流程

  1. 客戶端發(fā)送請(qǐng)求
  2. StrutsPrepareAndExecute通過(guò)ActionMapper來(lái)決定這個(gè)Request需要調(diào)用哪個(gè)Action
  3. 如果ActionMapper決定調(diào)用某個(gè)Action揣苏,F(xiàn)ilterDispatcher把請(qǐng)求的處理交給ActionProxy悯嗓,這兒已經(jīng)轉(zhuǎn)到它的Delegate--Dispatcher來(lái)執(zhí)行
  4. ActionProxy根據(jù)ActionMapping和ConfigurationManager找到需要調(diào)用的Action類
  5. ActionProxy創(chuàng)建一個(gè)ActionInvocation的實(shí)例
  6. ActionInvocation調(diào)用真正的Action,當(dāng)然這涉及到相關(guān)攔截器的調(diào)用
  7. Action執(zhí)行完畢舒岸,ActionInvocation創(chuàng)建Result并返回绅作,當(dāng)然,如果要在返回之前做些什么蛾派,可以實(shí)現(xiàn)PreResultListener

五、Struts2常用配置

1. 配置文件的加載順序

struts2框架要能執(zhí)行,必須先加載StrutsPrepareAndExecuteFilter.
在StrutsPrepareAndExecuteFilter的init方法中對(duì)Dispatcher進(jìn)行了初始化.
在Dispatcher類中定義的init方法內(nèi)就描述了struts2配置文件加載的順序

init_DefaultProperties(); // [1] ---------- org/apache/struts2/default.properties
init_TraditionalXmlConfigurations(); // [2] --- struts-default.xml,struts-plugin.xml,struts.xml
init_LegacyStrutsProperties(); // [3] --- 自定義struts.properties init_CustomConfigurationProviders(); // [5] ----- 自定義配置提供
init_FilterInitParameters() ; // [6] ----- web.xml
init_AliasStandardObjects() ; // [7] ---- Bean加載

1. default.properties文件
作用:定義了struts2框架中所有常量
位置: org/apache/struts2/default.properties 
                
2. struts-default.xml
作用:配置了bean, interceptor, result等洪乍。
位置:在struts的core核心jar包.
                
struts-plugin.xml
它是struts2框架中所使用的插件的配置文件眯杏。

struts.xml            
我們使struts2所使用的配置文件。
                    
3. 自定義的struts.properties
就是可以自定義常量壳澳。
                
4. web.xml
            
在開發(fā)中岂贩,后加載文件中的配置會(huì)將先加載文件中的配置覆蓋。
default.properties
struts-default.xml
struts.xml

2. 關(guān)于Action的配置

  1. <package> 作用:是用于聲明一個(gè)包巷波。用于管理action萎津。
  • name 它用于聲明一個(gè)包名,包名不能重復(fù)抹镊,也就是它是唯一的锉屈。
  • namespace 它與action標(biāo)簽的name屬性合并確定了一個(gè)唯一訪問action的路徑。
  • extends 它代表繼承的包名垮耳。
  • abstrace 它可以取值為true/false,如果為true,代表這個(gè)包是用于被繼承的颈渊。
  1. <action> 用于聲明 一個(gè)action
  • name 就是action的一個(gè)名稱,它是唯一的(在同包內(nèi)) 它與package中的namespace確定了訪問action的路徑终佛。
  • class Action類的全名
  • method 要訪問的Action類中的方法的名稱,方法無(wú)參數(shù) 俊嗽,返回值為String.
  1. <result> 用于確定返回結(jié)果類型
  • name 它與action中的方法返回值做對(duì)比,確定跳轉(zhuǎn)路徑铃彰。
  • type 跳轉(zhuǎn)的結(jié)果類型

關(guān)于action配置其它細(xì)節(jié):

  1. 關(guān)于默認(rèn)值問題
<package namespace="默認(rèn)值"> namespace的默認(rèn)值是""
<action class="默認(rèn)值"  method="默認(rèn)值">
class的默認(rèn)值是  com.opensymphony.xwork2.ActionSupport
method的默認(rèn)值是  execute
<result name="默認(rèn)值"> name的默認(rèn)值是 "success" 
  1. 關(guān)于訪問action的路徑問題
    Action的訪問路徑 = 包名稱空間 namespace + Action name屬性
    現(xiàn)在的action的配置是:
<package name="default" namespace="/" extends="struts-default">
<action name="hello" class="cn.lanou.action.DefaultAction">
  <result>/hello.jsp</result>
</action>
</package>
                
當(dāng)我們輸入:
http://localhost/struts2_day01_2/a/b/c/hello
也訪問到了action绍豁。
                
原因:struts2中的action被訪問時(shí),它會(huì)首先查找
1.namespace="/a/b/c"  action的name=hello  沒有.
2.namespace="/a/b     action的name=hello  沒有
3.namespace="/a"      action的name=hello  沒有
 4.namespace="/"        action的name=hello  查找到了.
如果最后也查找不到牙捉,會(huì)報(bào)404錯(cuò)誤.
  1. 默認(rèn)的action妹田。
    作用:處理其它action處理不了的路徑。
<default-action-ref name="action的名稱" />
配置了這個(gè)鹃共,當(dāng)訪問的路徑鬼佣,其它的action處理不了時(shí),就會(huì)執(zhí)行name指定的名稱的action霜浴。
  1. action的默認(rèn)處理類
    在action配置時(shí)晶衷,如果class不寫。默認(rèn)情況下是 com.opensymphony.xwork2.ActionSupport阴孟。
<default-class-ref class="cn.lanou.action.DefaultAction"/>
如果設(shè)置了晌纫,那么在當(dāng)前包下,默認(rèn)處理action請(qǐng)的的處理類就為class指定的類永丝。

3. Struts常量的配置

default.properties定義了struts2 框架的大量常量锹漱,開發(fā)者可以通過(guò)改變這些常量來(lái)滿足應(yīng)用的需求
修改struts2 的配置常量,可以通過(guò)以下三種方式配置

  1. 配置src/struts.xml
    <constant name="struts.devMode" value="true" />
  1. 配置src/struts.properties
    struts.devMode = false
  1. 配置web.xml
    <filter>
        <filter-name>struts2</filter-name>
        <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
        <init-param>
            <param-name>struts.devMode</param-name>
            <param-value>false</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

常用的常量介紹

   指定默認(rèn)編碼集,作用于HttpServletRequest的setCharacterEncoding方法 和freemarker 慕嚷、velocity的輸出
    <constant name="struts.i18n.encoding" value="UTF-8"/>
   該屬性指定需要Struts 2處理的請(qǐng)求后綴哥牍,該屬性的默認(rèn)值是action毕泌,即所有匹配*.action的請(qǐng)求都由Struts2處理。
   如果用戶需要指定多個(gè)請(qǐng)求后綴嗅辣,則多個(gè)后綴之間以英文逗號(hào)(,)隔開
    <constant name="struts.action.extension" value="action"/>
   設(shè)置瀏覽器是否緩存靜態(tài)內(nèi)容,默認(rèn)值為true(生產(chǎn)環(huán)境下使用),開發(fā)階段最好關(guān)閉 
    <constant name="struts.serve.static.browserCache" value="false"/>
   當(dāng)struts的配置文件修改后,系統(tǒng)是否自動(dòng)重新加載該文件,默認(rèn)值為false(生產(chǎn)環(huán)境下使用),開發(fā)階段最好打開 
    <constant name="struts.configuration.xml.reload" value="true"/>
   開發(fā)模式下使用,這樣可以打印出更詳細(xì)的錯(cuò)誤信息 
    <constant name="struts.devMode" value="true" />
   默認(rèn)的視圖主題 
    <constant name="struts.ui.theme" value="simple" />
  與spring集成時(shí)撼泛,指定由spring負(fù)責(zé)action對(duì)象的創(chuàng)建 
    <constant name="struts.objectFactory" value="spring" />
   該屬性設(shè)置Struts 2是否支持動(dòng)態(tài)方法調(diào)用,該屬性的默認(rèn)值是true澡谭。如果需要關(guān)閉動(dòng)態(tài)方法調(diào)用愿题,則可設(shè)置該屬性
   為 false
    <constant name="struts.enable.DynamicMethodInvocation" value="false"/>
   上傳文件的大小限制
     <constant name="struts.multipart.maxSize" value=“10701096"/>

4. 指定多個(gè)Struts配置文件

在大部分應(yīng)用里,隨著應(yīng)用規(guī)模的增加蛙奖,系統(tǒng)中Action的數(shù)量也會(huì)大量增加潘酗,導(dǎo)致struts.xml配置文件變得非常臃腫。為了避免struts.xml文件過(guò)于龐大雁仲、臃腫仔夺,提高struts.xml文件的可讀性,我們可以將一個(gè)struts.xml配置文件分解成多個(gè)配置文件伯顶,然后在struts.xml文件中包含其他配置文件囚灼。下面的struts.xml通過(guò)<include>元素指定多個(gè)配置文件:

<struts>
  <include file="struts-part1.xml"/>
  <include file="struts-part2.xml"/>
</struts>

通過(guò)這種方式,我們就可以將Struts 2的Action按模塊添加在多個(gè)配置文件中祭衩。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末灶体,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子掐暮,更是在濱河造成了極大的恐慌蝎抽,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,496評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件路克,死亡現(xiàn)場(chǎng)離奇詭異樟结,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)精算,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門瓢宦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人灰羽,你說(shuō)我怎么就攤上這事驮履。” “怎么了廉嚼?”我有些...
    開封第一講書人閱讀 162,632評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵玫镐,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我怠噪,道長(zhǎng)恐似,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,180評(píng)論 1 292
  • 正文 為了忘掉前任傍念,我火速辦了婚禮矫夷,結(jié)果婚禮上葛闷,老公的妹妹穿的比我還像新娘。我一直安慰自己口四,他們只是感情好孵运,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,198評(píng)論 6 388
  • 文/花漫 我一把揭開白布秦陋。 她就那樣靜靜地躺著蔓彩,像睡著了一般。 火紅的嫁衣襯著肌膚如雪驳概。 梳的紋絲不亂的頭發(fā)上赤嚼,一...
    開封第一講書人閱讀 51,165評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音顺又,去河邊找鬼更卒。 笑死,一個(gè)胖子當(dāng)著我的面吹牛稚照,可吹牛的內(nèi)容都是我干的蹂空。 我是一名探鬼主播,決...
    沈念sama閱讀 40,052評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼果录,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼上枕!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起弱恒,我...
    開封第一講書人閱讀 38,910評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤辨萍,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后返弹,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體锈玉,經(jīng)...
    沈念sama閱讀 45,324評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,542評(píng)論 2 332
  • 正文 我和宋清朗相戀三年义起,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了拉背。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,711評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡默终,死狀恐怖椅棺,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情穷蛹,我是刑警寧澤土陪,帶...
    沈念sama閱讀 35,424評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站肴熏,受9級(jí)特大地震影響鬼雀,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蛙吏,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,017評(píng)論 3 326
  • 文/蒙蒙 一源哩、第九天 我趴在偏房一處隱蔽的房頂上張望鞋吉。 院中可真熱鬧,春花似錦励烦、人聲如沸谓着。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)赊锚。三九已至,卻和暖如春屉栓,著一層夾襖步出監(jiān)牢的瞬間舷蒲,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工友多, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留牲平,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,722評(píng)論 2 368
  • 正文 我出身青樓域滥,卻偏偏與公主長(zhǎng)得像纵柿,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子启绰,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,611評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容

  • 概述 什么是Struts2的框架Struts2是Struts1的下一代產(chǎn)品昂儒,是在 struts1和WebWork的...
    inke閱讀 2,255評(píng)論 0 50
  • spring mvc 工作機(jī)制(原理): DispatcherServlet主要用作職責(zé)調(diào)度工作,本身主要用于控制...
    java大濕兄閱讀 1,894評(píng)論 5 24
  • 本文包括: 1酬土、Struts 2 概述2荆忍、Struts 2 快速入門3、Struts 2 的執(zhí)行流程4撤缴、配置 st...
    廖少少閱讀 2,958評(píng)論 3 13
  • 詳談 Struts2 的核心概念 本文將深入探討Struts2 的核心概念刹枉,首先介紹的是Struts2 的體系結(jié)構(gòu)...
    可愛傻妞是我的愛閱讀 1,122評(píng)論 0 2
  • 清明時(shí)節(jié),艷陽(yáng)天屈呕,周一微宝。 放假還能記得住日期是可以的,主要因?yàn)樽蛲砹泓c(diǎn)任務(wù)刷出了每周俠士虎眨。在去掃墓的路上蟋软,母親看不...
    蓮步輕舞閱讀 85評(píng)論 0 0