一、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í)行流程
四咐汞、Struts2的HelloWorld
1.創(chuàng)建WEB工程
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ō)明:
瀏覽器發(fā)出xxx.action請(qǐng)求至服務(wù)器;
服務(wù)器接收后狸捕,根據(jù)web.xml的配置喷鸽,將請(qǐng)求發(fā)送給指定的Struts2的過(guò)濾器;
過(guò)濾器根據(jù)struts.xml的配置內(nèi)容灸拍,將請(qǐng)求發(fā)送給xxAction類的對(duì)象做祝,并調(diào)用默認(rèn)的execute()方法;
根據(jù)execute()方法的返回結(jié)果鸡岗,在struts.xml文件中根據(jù)匹配的處理果混槐,完成向success.jsp頁(yè)面跳轉(zhuǎn);
頁(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)求流程
Struts2請(qǐng)求流程
- 客戶端發(fā)送請(qǐng)求
- StrutsPrepareAndExecute通過(guò)ActionMapper來(lái)決定這個(gè)Request需要調(diào)用哪個(gè)Action
- 如果ActionMapper決定調(diào)用某個(gè)Action揣苏,F(xiàn)ilterDispatcher把請(qǐng)求的處理交給ActionProxy悯嗓,這兒已經(jīng)轉(zhuǎn)到它的Delegate--Dispatcher來(lái)執(zhí)行
- ActionProxy根據(jù)ActionMapping和ConfigurationManager找到需要調(diào)用的Action類
- ActionProxy創(chuàng)建一個(gè)ActionInvocation的實(shí)例
- ActionInvocation調(diào)用真正的Action,當(dāng)然這涉及到相關(guān)攔截器的調(diào)用
- 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的配置
- <package> 作用:是用于聲明一個(gè)包巷波。用于管理action萎津。
- name 它用于聲明一個(gè)包名,包名不能重復(fù)抹镊,也就是它是唯一的锉屈。
- namespace 它與action標(biāo)簽的name屬性合并確定了一個(gè)唯一訪問action的路徑。
- extends 它代表繼承的包名垮耳。
- abstrace 它可以取值為true/false,如果為true,代表這個(gè)包是用于被繼承的颈渊。
- <action> 用于聲明 一個(gè)action
- name 就是action的一個(gè)名稱,它是唯一的(在同包內(nèi)) 它與package中的namespace確定了訪問action的路徑终佛。
- class Action類的全名
- method 要訪問的Action類中的方法的名稱,方法無(wú)參數(shù) 俊嗽,返回值為String.
- <result> 用于確定返回結(jié)果類型
- name 它與action中的方法返回值做對(duì)比,確定跳轉(zhuǎn)路徑铃彰。
- type 跳轉(zhuǎn)的結(jié)果類型
關(guān)于action配置其它細(xì)節(jié):
- 關(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"
- 關(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ò)誤.
- 默認(rèn)的action妹田。
作用:處理其它action處理不了的路徑。
<default-action-ref name="action的名稱" />
配置了這個(gè)鹃共,當(dāng)訪問的路徑鬼佣,其它的action處理不了時(shí),就會(huì)執(zhí)行name指定的名稱的action霜浴。
- 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ò)以下三種方式配置
- 配置src/struts.xml
<constant name="struts.devMode" value="true" />
- 配置src/struts.properties
struts.devMode = false
- 配置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è)配置文件中祭衩。