第四部分ssh框架后第六章struts2基礎(chǔ)_第1頁
第四部分ssh框架后第六章struts2基礎(chǔ)_第2頁
第四部分ssh框架后第六章struts2基礎(chǔ)_第3頁
第四部分ssh框架后第六章struts2基礎(chǔ)_第4頁
第四部分ssh框架后第六章struts2基礎(chǔ)_第5頁
已閱讀5頁,還剩25頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

第六章struts2基礎(chǔ)理論部分目錄STRUTS2.0的MVC架構(gòu)Struts2詳細配置搭建Struts2開發(fā)環(huán)境指定需要Struts2處理的請求后綴Action中result的各種轉(zhuǎn)發(fā)類型Struts2的處理流程為應(yīng)用指定多個struts配置文件Action的調(diào)用方式STRUTS2.0的MVC架構(gòu)STRUTS2.0核心組件框架元素的配置文件Struts2詳細配置Struts2是在WebWork2基礎(chǔ)發(fā)展而來的。和struts1一樣,Struts2也屬于MVC框架。不過有一點大家需要注意的是:盡管Struts2和struts1在名字上的差別不是很大,但Struts2和struts1在代碼編寫風(fēng)格上幾乎是不一樣的。那么既然有了struts1,為何還要推出struts2。主要是因為struts2有以下優(yōu)點:1,在軟件設(shè)計上Struts2沒有像struts1那樣跟ServletAPI和strutsAPI有著緊密的耦合,Struts2的應(yīng)用可以不依賴于ServletAPI和strutsAPI。Struts2的這種設(shè)計屬于無侵入式設(shè)計,而Struts1卻屬于侵入式設(shè)計。publicclassOrderListActionextendsAction{ publicActionForwardexecute(ActionMappingmapping,ActionFormform,

HttpServletRequestrequest,HttpServletResponseresponse) throwsException{ }}2,Struts2提供了攔截器,利用攔截器可以進行AOP編程,實現(xiàn)如權(quán)限攔截等功能。3,Strut2提供了類型轉(zhuǎn)換器,我們可以把特殊的請求參數(shù)轉(zhuǎn)換成需要的類型。在Struts1中,如果我們要實現(xiàn)同樣的功能,就必須向Struts1的底層實現(xiàn)BeanUtil注冊類型轉(zhuǎn)換器才行。4,Struts2提供支持多種表現(xiàn)層技術(shù),如:JSP、freeMarker、Velocity等5,Struts2的輸入校驗可以對指定方法進行校驗,解決了Struts1長久之痛。6,提供了全局范圍、包范圍和Action范圍的國際化資源文件管理實現(xiàn)搭建Struts2開發(fā)環(huán)境搭建Struts2環(huán)境時,我們一般需要做以下幾個步驟的工作:1》找到開發(fā)Struts2應(yīng)用需要使用到的jar文件.2》編寫Struts2的配置文件3》在web.xml中加入Struts2MVC框架啟動配置搭建Struts2開發(fā)環(huán)境--開發(fā)Struts2應(yīng)用依賴的jar文件大家可以到下載struts-2.x.x-all.zip,目前最新版為2.1.8。下載完后解壓文件,開發(fā)struts2應(yīng)用需要依賴的jar文件在解壓目錄的lib文件夾下。不同的應(yīng)用需要的JAR包是不同的。下面給出了開發(fā)Struts2程序最少需要的JAR。struts2-core-2.x.x.jar:Struts2框架的核心類庫xwork-core-2.x.x.jar:XWork類庫,Struts2在其上構(gòu)建ognl-2.6.x.jar:對象圖導(dǎo)航語言(ObjectGraphNavigationLanguage),struts2框架通過其讀寫對象的屬性freemarker-2.3.x.jar:Struts2的UI標(biāo)簽的模板使用FreeMarker編寫commons-logging-1.x.x.jar:ASF出品的日志包,Struts2框架使用這個日志包來支持Log4J和JDK1.4+的日志記錄。commons-fileupload-1.2.1.jar文件上傳組件,2.1.6版本后必須加入此文件搭建Struts2開發(fā)環(huán)境--Struts2應(yīng)用的配置文件Struts2默認(rèn)的配置文件為struts.xml,該文件需要存放在WEB-INF/classes下,該文件的配置模版如下:<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPEstrutsPUBLIC"-//ApacheSoftwareFoundation//DTDStrutsConfiguration2.0//EN"""><struts></struts>搭建Struts2開發(fā)環(huán)境--Struts2在web中的啟動配置在struts1.x中,struts框架是通過Servlet啟動的。在struts2中,struts框架是通過Filter啟動的。他在web.xml中的配置如下:<filter><filter-name>struts2</filter-name><filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class><!--自從Struts2.1.3以后,下面的FilterDispatcher已經(jīng)標(biāo)注為過時<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>--></filter><filter-mapping><filter-name>struts2</filter-name><url-pattern>/*</url-pattern></filter-mapping>在StrutsPrepareAndExecuteFilter的init()方法中將會讀取類路徑下默認(rèn)的配置文件struts.xml完成初始化操作。注意:struts2讀取到struts.xml的內(nèi)容后,以javabean形式存放在內(nèi)存中,以后struts2對用戶的每次請求處理將使用內(nèi)存中的數(shù)據(jù),而不是每次都讀取struts.xml文件第一個Struts2應(yīng)用--HelloWorld在默認(rèn)的配置文件struts.xml中加入如下配置:<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPEstrutsPUBLIC"-//ApacheSoftwareFoundation//DTDStrutsConfiguration2.0//EN"""><struts><packagename="itcast"namespace="/test"extends="struts-default"><actionname="helloworld"class="cn.itcast.action.HelloWorldAction"method="execute"> <resultname="success">/WEB-INF/page/hello.jsp</result></action></package></struts>Struts.xml配置中的包介紹<packagename="itcast"namespace="/test"extends="struts-default"> <actionname="helloworld"class="cn.itcast.action.HelloWorldAction"method="execute"> <resultname="success">/WEB-INF/page/hello.jsp</result> </action></package>1、在struts2框架中使用包來管理Action,包的作用和java中的類包是非常類似的,它主要用于管理一組業(yè)務(wù)功能相關(guān)的action。在實際應(yīng)用中,我們應(yīng)該把一組業(yè)務(wù)功能相關(guān)的Action放在同一個包下。2、配置包時必須指定name屬性,該name屬性值可以任意取名,但必須唯一,他不對應(yīng)java的類包,如果其他包要繼承該包,必須通過該屬性進行引用。包的namespace屬性用于定義該包的命名空間,命名空間作為訪問該包下Action的路徑的一部分,如訪問上面例子的Action,訪問路徑為:/test/space屬性可以不配置,對本例而言,如果不指定該屬性,默認(rèn)的命名空間為“”(空字符串)。3、通常每個包都應(yīng)該繼承struts-default包,因為Struts2很多核心的功能都是攔截器來實現(xiàn)。如:從請求中把請求參數(shù)封裝到action、文件上傳和數(shù)據(jù)驗證等等都是通過攔截器實現(xiàn)的。struts-default定義了這些攔截器和Result類型??梢赃@么說:當(dāng)包繼承了struts-default才能使用struts2提供的核心功能。struts-default包是在struts2-core-2.x.x.jar文件中的struts-default.xml中定義。struts-default.xml也是Struts2默認(rèn)配置文件。Struts2每次都會自動加載struts-default.xml文件。4、包還可以通過abstract=“true”定義為抽象包,抽象包中不能包含action。第一個Struts2應(yīng)用--HellWorld例子中使用到的cn.itcast.action.HelloWorldAction類如下:publicclassHelloWorldAction{ privateStringmessage;

publicStringgetMessage(){ returnmessage; } publicvoidsetMessage(Stringmessage){ this.message=message; } publicStringexecute(){ this.message="我的第一個struts2應(yīng)用"; return"success"; }}第一個Struts2應(yīng)用--HelloWorld例子中使用到的/WEB-INF/page/hello.jsp如下:<%@pagelanguage="java"pageEncoding="UTF-8"%><!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN"><html><head><title>第一個struts2應(yīng)用</title></head><body>

${message}<br></body></html>可以使用EL表達式訪問Action中的屬性。訪問HelloWorld應(yīng)用在struts1中,通過<actionpath=“/test/helloworld”>節(jié)點的path屬性指定訪問該action的URL路徑。在struts2中,情況就不是這樣了,訪問struts2中action的URL路徑由兩部份組成:包的命名空間+action的名稱,例如訪問本例子HelloWorldAction的URL路徑為:/test/helloworld(注意:完整路徑為::端口/內(nèi)容路徑/test/helloworld)。另外我們也可以加上.action后綴訪問此Action。<packagename="itcast"namespace="/test"extends="struts-default"><actionname="helloworld"class="cn.itcast.action.HelloWorldAction"method="execute"> <resultname="success">/page/hello.jsp</result></action></package>Action名稱的搜索順序1.獲得請求路徑的URI,例如url是:2.首先尋找namespace為/path1/path2/path3的package,如果不存在這個package則執(zhí)行步驟3;如果存在這個package,則在這個package中尋找名字為test的action,當(dāng)在該package下尋找不到action時就會直接跑到默認(rèn)namaspace的package里面去尋找action(默認(rèn)的命名空間為空字符串“”),如果在默認(rèn)namaspace的package里面還尋找不到該action,頁面提示找不到action3.尋找namespace為/path1/path2的package,如果不存在這個package,則轉(zhuǎn)至步驟4;如果存在這個package,則在這個package中尋找名字為test的action,當(dāng)在該package中尋找不到action時就會直接跑到默認(rèn)namaspace的package里面去找名字為test的action,在默認(rèn)namaspace的package里面還尋找不到該action,頁面提示找不到action4.尋找namespace為/path1的package,如果不存在這個package則執(zhí)行步驟5;如果存在這個package,則在這個package中尋找名字為test的action,當(dāng)在該package中尋找不到action時就會直接跑到默認(rèn)namaspace的package里面去找名字為test的action,在默認(rèn)namaspace的package里面還尋找不到該action,頁面提示找不到action5.尋找namespace為/的package,如果存在這個package,則在這個package中尋找名字為test的action,當(dāng)在package中尋找不到action或者不存在這個package時,都會去默認(rèn)namaspace的package里面尋找action,如果還是找不到,頁面提示找不到action。Action配置中的各項默認(rèn)值<packagename="itcast"namespace="/test"extends="struts-default"><actionname="helloworld"class="cn.itcast.action.HelloWorldAction"method="execute"> <resultname="success">/WEB-INF/page/hello.jsp</result></action></package>1>如果沒有為action指定class,默認(rèn)是ActionSupport。2>如果沒有為action指定method,默認(rèn)執(zhí)行action中的execute()方法。3>如果沒有指定result的name屬性,默認(rèn)值為success。Action中result的各種轉(zhuǎn)發(fā)類型<actionname="helloworld"class="cn.itcast.action.HelloWorldAction">

<resultname="success">/WEB-INF/page/hello.jsp</result></action>result配置類似于struts1中的forward,但struts2中提供了多種結(jié)果類型,常用的類型有:dispatcher(默認(rèn)值)、redirect、redirectAction、plainText。在result中還可以使用${屬性名}表達式訪問action中的屬性,表達式里的屬性名對應(yīng)action中的屬性。如下:<resulttype="redirect">/view.jsp?id=${id}</result>下面是redirectAction結(jié)果類型的例子,如果重定向的action中同一個包下:<resulttype="redirectAction">helloworld</result>如果重定向的action在別的命名空間下:<resulttype="redirectAction"> <paramname="actionName">helloworld</param> <paramname="namespace">/test</param></result>plaintext:顯示原始文件內(nèi)容,例如:當(dāng)我們需要原樣顯示jsp文件源代碼的時候,我們可以使用此類型。<resultname="source"type="plainText"> <paramname="location">/xxx.jsp</param> <paramname="charSet">UTF-8</param><!--指定讀取文件的編碼--></result>多個Action共享一個視圖--全局result配置當(dāng)多個action中都使用到了相同視圖,這時我們應(yīng)該把result定義為全局視圖。struts1中提供了全局forward,struts2中也提供了相似功能:<package>

<global-results> <resultname="message">/message.jsp</result>

</global-results></package>為Action的屬性注入值Struts2為Action中的屬性提供了依賴注入功能,在struts2的配置文件中,我們可以很方便地為Action中的屬性注入值。注意:屬性必須提供setter方法。publicclassHelloWorldAction{ privateStringsavePath; publicStringgetSavePath(){ returnsavePath; } publicvoidsetSavePath(StringsavePath){ this.savePath=savePath; }

}<packagename="itcast"namespace="/test"extends="struts-default"> <actionname="helloworld"class="cn.itcast.action.HelloWorldAction">

<paramname="savePath">/images</param> <resultname="success">/WEB-INF/page/hello.jsp</result> </action></package>上面通過<param>節(jié)點為action的savePath屬性注入“/images”指定需要Struts2處理的請求后綴前面我們都是默認(rèn)使用.action后綴訪問Action。其實默認(rèn)后綴是可以通過常量”struts.action.extension“進行修改的,例如:我們可以配置Struts2只處理以.do為后綴的請求路徑:<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPEstrutsPUBLIC"-//ApacheSoftwareFoundation//DTDStrutsConfiguration2.0//EN"""><struts><constantname="struts.action.extension"value="do"/></struts>如果用戶需要指定多個請求后綴,則多個后綴之間以英文逗號(,)隔開。如:<constantname="struts.action.extension"value="do,go"/>細說常量定義常量可以在struts.xml或perties中配置,建議在struts.xml中配置,兩種配置方式如下:在struts.xml文件中配置常量<struts><constantname="struts.action.extension"value="do"/></struts>在perties中配置常量struts.action.extension=do因為常量可以在下面多個配置文件中進行定義,所以我們需要了解struts2加載常量的搜索順序:struts-default.xmlstruts-plugin.xmlstruts.xmlpertiesweb.xml如果在多個文件中配置了同一個常量,則后一個文件中配置的常量值會覆蓋前面文件中配置的常量值.常用的常量介紹<!--指定默認(rèn)編碼集,作用于HttpServletRequest的setCharacterEncoding方法和freemarker、velocity的輸出--><constantname="struts.i18n.encoding"value="UTF-8"/><!--該屬性指定需要Struts2處理的請求后綴,該屬性的默認(rèn)值是action,即所有匹配*.action的請求都由Struts2處理。

如果用戶需要指定多個請求后綴,則多個后綴之間以英文逗號(,)隔開。--><constantname="struts.action.extension"value="do"/><!--設(shè)置瀏覽器是否緩存靜態(tài)內(nèi)容,默認(rèn)值為true(生產(chǎn)環(huán)境下使用),開發(fā)階段最好關(guān)閉--><constantname="struts.serve.static.browserCache"value="false"/><!--當(dāng)struts的配置文件修改后,系統(tǒng)是否自動重新加載該文件,默認(rèn)值為false(生產(chǎn)環(huán)境下使用),開發(fā)階段最好打開--><constantname="struts.configuration.xml.reload"value="true"/><!--開發(fā)模式下使用,這樣可以打印出更詳細的錯誤信息--><constantname="struts.devMode"value="true"/><!--默認(rèn)的視圖主題--><constantname="struts.ui.theme"value="simple"/><!–與spring集成時,指定由spring負(fù)責(zé)action對象的創(chuàng)建--><constantname="struts.objectFactory"value="spring"/><!–該屬性設(shè)置Struts2是否支持動態(tài)方法調(diào)用,該屬性的默認(rèn)值是true。如果需要關(guān)閉動態(tài)方法調(diào)用,則可設(shè)置該屬性為false。--><constantname="struts.enable.DynamicMethodInvocation"value="false"/><!--上傳文件的大小限制--><constantname="struts.multipart.maxSize"value=“10701096"/>Struts2的處理流程StrutsPrepareAndExecuteFilterInterceptorActionResultJsp/html用戶請求Struts2內(nèi)置的一些攔截器或用戶自定義攔截器用戶編寫的action類,類似struts1中的Action類似struts1中的forward響應(yīng)StrutsPrepareAndExecuteFilter是Struts2框架的核心控制器,它負(fù)責(zé)攔截由<url-pattern>/*</url-pattern>指定的所有用戶請求,當(dāng)用戶請求到達時,該Filter會過濾用戶的請求。默認(rèn)情況下,如果用戶請求的路徑不帶后綴或者后綴以.action結(jié)尾,這時請求將被轉(zhuǎn)入Struts2框架處理,否則Struts2框架將略過該請求的處理。當(dāng)請求轉(zhuǎn)入Struts2框架處理時會先經(jīng)過一系列的攔截器,然后再到Action。與Struts1不同,Struts2對用戶的每一次請求都會創(chuàng)建一個Action,所以Struts2中的Action是線程安全的。為應(yīng)用指定多個struts配置文件在大部分應(yīng)用里,隨著應(yīng)用規(guī)模的增加,系統(tǒng)中Action的數(shù)量也會大量增加,導(dǎo)致struts.xml配置文件變得非常臃腫。為了避免struts.xml文件過于龐大、臃腫,提高struts.xml文件的可讀性,我們可以將一個struts.xml配置文件分解成多個配置文件,然后在struts.xml文件中包含其他配置文件。下面的struts.xml通過<include>元素指定多個配置文件:<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPEstrutsPUBLIC"-//ApacheSoftwareFoundation//DTDStrutsConfiguration2.0//EN"""><struts> <includefile="struts-user.xml"/> <includefile="struts-order.xml"/></struts>通過這種方式,我們就可以將Struts2的Action按模塊添加在多個配置文件中。動態(tài)方法調(diào)用如果Action中存在多個方法時,我們可以使用!+方法名調(diào)用指定方法。如下:publicclassHelloWorldAction{ privateStringmessage;

publicStringexecute()throwsException{ this.message="我的第一個struts2應(yīng)用"; return"success"; }

publicStringother()throwsException{ this.message="第二個方法"; return"success"; }}假設(shè)訪問上面action的URL路徑為:/struts/test/helloworld.action要訪問action的other()方法,我們可以這樣調(diào)用:/struts/test/helloworld!other.action如果不想使用動態(tài)方法調(diào)用,我們可以通過常量struts.enable.DynamicMethodInvocation關(guān)閉動態(tài)方法調(diào)用。<constantname="struts.enable.DynamicMethodInvocation"value="false"/>使用通配符定義action<packagename="itcast"namespace="/test"extends="struts-default"> <actionname="helloworld_*"class="cn.itcast.action.HelloWorldAction"method="{1}"> <resultname="success">/WEB-INF/page/hello.jsp</result> </action></package>publicclassHelloWorldAction{ privateStringmessage;

publicStringexecute()throwsException{ this.message="我的第一個struts2應(yīng)用"; return"success"; }

publicStringother()throwsException{ this.message="第二個方法"; return

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論