課件三章struts2配置詳解_第1頁
課件三章struts2配置詳解_第2頁
課件三章struts2配置詳解_第3頁
課件三章struts2配置詳解_第4頁
課件三章struts2配置詳解_第5頁
已閱讀5頁,還剩79頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第三章:struts2配置詳解

主講:劉雷學(xué)習(xí)目標(biāo)掌握struts2的幾個主要配置文件:perties、struts-default.xml和struts.xml、struts-plugin.xml掌握struts.xml中各項內(nèi)容的配置重點掌握Action和Result的配置掌握使用注解來配置ActionStruts2框架的主要配置文件web.xml<?xmlversion="1.0"encoding="UTF-8"?><web-appid="WebApp_9"version="2.4"xmlns=""xmlns:xsi=""xsi:schemaLocation=""><filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class> </filter><filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern></filter-mapping></web-app>說明: 準(zhǔn)確的說,web.xml并不是Struts2框架特有的文件。作為部署描述符文件,web.xml是所有JavaWeb應(yīng)用程序都需要的核心配置文件。

struts2框架需要你在web.xml文件中配置一個前端控制器-----FilterDispatcher,用于對struts2框架進行初始化,以及處理所有的請求。pertiesstruts2.0框架有兩核心的配置文件:struts.xml和perties

struts.xml文件主要負(fù)責(zé)管理應(yīng)用中的action映射,以及該Action中包含的result定義等。

perties通常放在WEB應(yīng)用下的WEB-INF/classes路徑下。其實,perties的內(nèi)容均可在struts.xml中以<constantname=“”value=“”/>加載

以下是整合一些資料總結(jié)的詳細(xì)配置參數(shù)pertiespertiespertiespertiespertiespertiesstruts.xmlstruts.xml----Bean設(shè)置Bean設(shè)置Struts2框架是一個高度可擴展的框架,框架的大部分核心組件,Struts2并不是直接以硬編碼的方式寫在代碼中的,而是以自己的IOC(控制反轉(zhuǎn)容器)來管理框架的核心組件.Struts2框架以可配置的方式來管理Struts2的核心組件,從而允許開發(fā)者可以非常方便的擴展該框架的核心組件.當(dāng)開發(fā)者需要擴展,或者替換Struts2的核心組件的時候,只需要提供自己的組件實現(xiàn)類,并且將組件實現(xiàn)類部署在Struts2的IOC容器當(dāng)中就可以了.打開Struts-core-2.1.6.jar壓縮文件中的struts-default.xml文件,看到在該文件中配置了大量的Bean定義,該配置文件的代碼如下:

上面的配置文件配置了Struts2框架的內(nèi)置Bean,其中有三個類型檢測Bean,就是在前面perties文件中允許使用的類型檢測器.(struts.objectTypeDeterminer:該屬性指定Struts2的類型檢測機制,通常支持tiger和notiger兩個屬性值.).在struts.xml文件中定義bean時,通常有如下兩個作用

a.創(chuàng)建該bean的實例,將該實例作為struts2框架的核心組件使用

b.bean包含的靜態(tài)方法需要注入一個值。在第一種用法下,因為Bean實例往往是作為一個核心組件使用的,因此需要告訴Struts2容器該實例的作用----就是該實例實現(xiàn)了哪個接口,這個接口往往定義了該組件所必須遵守的一個規(guī)范.struts.xml----常量配置這里配置有錯,寫反了struts.xml----包的配置下面的struts.xml文件當(dāng)中配置了兩個包,其中名為

default的包,繼承了Struts2框架的默認(rèn)包struts-defaultstruts.xml-----命名空間配置struts.xml----包含的配置struts.xml----包攔截器配置

攔截器的定義片段struts.xml-----Action配置詳解Struts2的核心功能是action,對于開發(fā)人員來說,使用struts2框架,主要的編碼工作就是編寫action類。Action類通常都要實現(xiàn)com.opensymphony.xwork2.Action接口,并實現(xiàn)該接口中的execute()方法,該方法語法格式如下:

publicStringexecute()throwsException當(dāng)然,struts2并不要求你所編寫的action類一定要實現(xiàn)Action接口,你也可以編寫一個普通的Java類作為action,只要該類提供一個返回類型為String的無參的public方法,如下所示:publicStringxxx()在實際開發(fā)中,action類很少直接實現(xiàn)Action接口,通常都是從com.opensymphony.xwork2.ActionSupport類繼承。ActionSupport實現(xiàn)了Action接口和Validateable,ValidationAware,TextProvider,LocaleProvider,Serializable的接口,提供了輸入驗證、錯誤信息存取,以及國際化的支持,選擇從ActionSupport繼承,可以簡化action的開發(fā)。開發(fā)action后,就需要配置action映射,以告訴struts2框架,針對某個URL的請求應(yīng)該交由哪一個action進行處理。Action的配置在struts2框架中每一個Action是一個工作單元。Action負(fù)責(zé)將一個請求對應(yīng)到一個Action處理上去,每當(dāng)一個Action類匹配一個請求的時候,這個Action類就會被Struts2框架調(diào)用。Struts.xml中的每一個action元素就是一個action映射。action完整的屬性如表所示:舉例說明<actionname=“l(fā)ogin”class=“com.ibm.struts2.action.LoginAction”><result>/success.jsp</result><resultname=“error”>/error.jsp</result></action>Action的name屬性是必需的,其他屬性是可選的。在為action取名時,默認(rèn)情況下在名字中是不允許出現(xiàn)斜杠(/)的。如果想在名字中使用斜杠(/):(例如,<actionname=“com/manager”class=“com.ibm.BookManager”/>),就需要在struts.xml文件中通過指定<constantname=“struts.enable.SlashesInActionNames”value=“true”/>來打開這個功能。此外,在為action取名時,名字中盡量不要使用點號(.)(例如create.user)和連接字符(-)(例如:my-action),否則會出現(xiàn)一些莫名其妙的問題。其實我們不用去記憶名字中不允許出現(xiàn)哪些字符,只要按照通常的命名習(xí)慣去為action取名就可以了,頂多在名字中使用一下下劃線(_)(例如:my_action),這樣是可以保證不會出現(xiàn)問題。使用method屬性在軟件開發(fā)中,經(jīng)常會用到CRUD操作,CRUD即create(創(chuàng)建)、Read/Retrieve(讀取)、Update(更新)和Delete(刪除)的首字母的縮寫。例如:在一個用戶管理系統(tǒng)中,對用戶有四種操作:添加用戶、瀏覽用戶、編輯用戶和刪除用戶,分別對應(yīng)CRUD的四種操作。在具體實現(xiàn)時,為了節(jié)省action類的數(shù)量,通常是在一個action類中編寫四個方法來實現(xiàn)CRUD操作。publicStringloginUser()throwsException{}//查詢用戶publicStringaddUser()throwsException{}//添加用戶publicStringupdateUser()throwsException{}//修改用戶publicStringdeleteUser()throwsException{}//刪除用戶現(xiàn)在的問題是,我們?nèi)绾尾拍茏尶蚣茉诓煌恼埱蟮絹頃r,去調(diào)用Action中的相應(yīng)方法呢?要知道,在執(zhí)行action時,默認(rèn)調(diào)用方法是execute().使用method屬性在配置action時,我們可以通過action元素的method屬性來指定action調(diào)用的方法。所指定的方法必須遵循與execute方法相同的格式。在struts.xml文件中,我們可以為同一個action類配置不同的別名,并使用method屬性,如下所示:

<actionname="reg"class="UserAction"method="addUser"><resultname="success"type="redirect">index.jsp</result><resultname="input">reg.jsp</result></action><actionname="login"class="UserAction"method="loginUser"><resultname="success">index.jsp</result><resultname="input">reg.jsp</result></action><actionname="update"class="UserAction"method="updateUser"><resultname="success">index.jsp</result><resultname="input">reg.jsp</result></action><actionname="delete"class="UserAction"method="deleteUser"><resultname="success">index.jsp</result><resultname="input">reg.jsp</result></action>注意:使用method屬性使用action的method屬性可以任意指定處理請求的方法(只要該方法和execute方法具有相同的格式),這樣就可以在同一個類中完成相關(guān)的任務(wù),而不需要去編寫不同的Action類。Struts2在根據(jù)action元素的method屬性查找方法時有兩種途徑:1)查找與method屬性值完全一致的方法2)查找doMethod()形式的方法。以上面的例子為例,當(dāng)請求/reg時,struts2首先查找addUser()方法,如果找不到,則繼續(xù)查找名為doAddUser()的方法。這種特性是從WebWork繼承而來的,而WebWork提供這種特性,一方面是為了兼容舊版本W(wǎng)ebWork遺留的功能,另一方面是因為一些方法別名的需要,例如,default是Java的關(guān)鍵字,不能作為方法名,你可以使用doDefault作為方法名,在配置時,可以使用method=“default”.這種特性同樣也適用于下一節(jié)要講述的動態(tài)方法調(diào)用,例如,請求/users!addUser.action,struts2會依次查找addUser()和doAddUser()方法Action動態(tài)方法調(diào)用(一)另一種無須配置就可以直接調(diào)用Action中的非execute()方法的方式,就是使用struts2的動態(tài)方法調(diào)用。動態(tài)方法調(diào)用(DynamicMethodInvocation,DMI)是在action的名字中使用感嘆號(!)來標(biāo)識要調(diào)用的方法名,其語法格式為:actionName!methodName.action例如,我們配置了如下的Action<actionname=“users”class=“com.ibm.UserAction”>…..</action>當(dāng)請求/users!addUser.action時,將調(diào)用UserAction的addUser()方法;當(dāng)請求/users!updateUser.action時,將調(diào)用UserAction的updateUser()方法;DMI的實現(xiàn)本質(zhì)是,其實現(xiàn)代碼掃描action名字中的“!”字符,如果找到,則“欺騙”框架來調(diào)用“!”字符后的方法,而非execute方法。雖然調(diào)用的是其它方法,但是它使用的仍然是execute方法的配置,包括驗證??蚣堋跋嘈拧彼谡{(diào)用的是Action類的execute()方法。Action動態(tài)方法調(diào)用(二)在struts2中使用DMI有兩個要注意的問題。首先,DMI可能會帶來安全隱患,由于通過URL可以執(zhí)行action中的任意方法,惡意的用戶會利用這一特性來執(zhí)行一些敏感的方法,即使你不想這些方法被執(zhí)行。所以在確定使用DMI時,你應(yīng)該確保Action中的方法都是普通、開放的方法;否則,你應(yīng)該加上安全控制。其次,DMI與下一節(jié)要介紹的通配符方法有所重疊。由于上述兩個原因,struts2提供了一個屬性配置,用于禁止DMI。你可以在struts.xml文件中,使用constant元素將struts.enable.DynamicMethodInvocation屬性設(shè)置為false,來關(guān)閉DMI那么什么時候使用動態(tài)方法調(diào)用,什么時候使用action元素的mrthod屬性呢?或者二者有什么區(qū)別嗎?如果同一個Action的不同方法使用的是相同的配置(同樣的攔截器引用,同樣的result映射),那么可以使用動態(tài)方法調(diào)用;如果不同的方法調(diào)用需要配置不同的攔截器引用、不同的result映射,那么可以使用action元素的method屬性,為同一個Action配置多個別名。Action通配符映射一些時候?qū)ction中方法的調(diào)用滿足一定的規(guī)律,例如edit.Action對應(yīng)edit方法,delete.Action對應(yīng)delete方法,這個時候我們可以使用方法通配符,例如:

<actionname="*Crud"class=“com.ibm.Crud"method="{1}">這時,editCrud.Action的引用將調(diào)用edit方法,同理,deleteCrud.Action的引用將調(diào)用delete方法。

另外一種比較常用的方式是使用下劃線分割,例如:

<actionname="Crud_*"class=“com.ibm.Crud"method="{1}">

這樣當(dāng)遇到如下調(diào)用的時候可以找到對應(yīng)的方法。

"action=Crud_input"

=>

input方法

"action=Crud_delete"

=>

delete方法

通配符和普通的配置具有相同的地位,可以結(jié)合使用框架的所有其他功能。

Action通配符映射通配符即星號(*),用于匹配0個或多個字符。在配置action時,可以在action元素的name屬性中使用星號(*)來匹配任意的字符。通配符中幾個特殊的標(biāo)記,如下所述:*:可以匹配0個或多個任意字符,但是不包括正斜杠”/”;**:可以匹配0個或多個任意字符,包括正斜杠”/”在內(nèi)\:反斜杠,轉(zhuǎn)義字符。因為*不能匹配正斜杠,所以前面/editSubscription/add不會被匹配上。在actionmapping中,被通配符所匹配上的值可以用符號{N}來訪問,其中N是一個1到9之間的數(shù),用來表示代替第N個被匹配上的值,說通俗點就是第N個*號所表示的內(nèi)容,比方說通配符表達式是/edit*/add*/confirm*,它匹配上了/editOrder/addItem/confirmResult,那么{1}就代表Order,{2}就代表Item,{3}就代表Result,依此類推。配置Result一個result代表了一個可能的輸出。當(dāng)Action類的方法執(zhí)行完成時,它返回一個字符串類型的結(jié)果碼,框架根據(jù)這個結(jié)果碼選擇對應(yīng)的result,向用戶輸出。在com.opensymphony.xwork2.Action接口中定義了一組標(biāo)準(zhǔn)的結(jié)果代碼,可供開發(fā)人員使用,如下所示:publicinterfaceAction{ publicstaticfinalStringSUCCESS=“success”; publicstaticfinalStringNONE=“none”; publicstaticfinalStringERROR=“error”; publicstaticfinalStringINPUT=“input”; publicstaticfinalStringLOGIN=“l(fā)ogin”;} 除了這些預(yù)定義的結(jié)果碼外,開發(fā)人員也可以定義其它的結(jié)果碼來滿足自身應(yīng)用程序的需要。 Result配置由兩部分組成:一部分是result映射,另一部分是result類型。下面我們分別對這兩部分進行介紹。結(jié)果映射----result映射在struts.xml文件中,使用result元素來配置result映射。Result元素有兩個可選的屬性:如下:屬性是否必需說明name否指定result的邏輯名type否指定result的類型,不同類型的result代表了不同的結(jié)果輸出在result元素中,可以使用param子元素來指定這個結(jié)果對應(yīng)的實際資源的位置。param元素有一個必需的屬性name,用于指定參數(shù)名,param元素的內(nèi)容給出參數(shù)值。如果要指定資源的位置,name屬性的值需要設(shè)置為location.配置result映射看完上面的配置,感覺是否有一點復(fù)雜。為什么我們之前的配置沒有這樣復(fù)雜呢?在上面的例子中我們用result元素的type屬性來指定結(jié)果的類型,同時還使用param子元素來指定資源的實際位置,因此就變得復(fù)雜了。配置result映射在struts2中允許你定義一個默認(rèn)的Result類型,這是通過result-type元素來定義的。在框架的默認(rèn)配置文件struts-default.xml中,在struts-default包中有如下的一個配置:

<result-types><result-typename="dispatcher" class="org.apache.struts2.dispatche.ServletDispatcherResult" default="true"> </result-type>

</result-types>result-type元素的default屬性指定名為dispatcher的結(jié)果類型為默認(rèn)的結(jié)果類型。dispatcher結(jié)果類型使用ServletAPI中的RequestDispatcher將請求導(dǎo)向到目標(biāo)資源,通常是JSP頁面。如果你在使用result元素配置result映射時,沒有使用type屬性,那么框架將使用默認(rèn)的dispatcher類型。配置result映射由于struts2中的包是可以繼承的,在上面的實例中我們定義的default包繼承自struts-default包,因此也繼承了默認(rèn)的結(jié)果類型定義(當(dāng)然,你也可以在“子”包中定義自己的默認(rèn)結(jié)果類型)。既然有了默認(rèn)的結(jié)果類型,而你想要使用的也正是這種結(jié)果類型,那么就可以省略result元素的type屬性。在result的配置中,當(dāng)結(jié)果類型為dispatcher時,如果你使用param子元素為該類型的result設(shè)置location參數(shù)(這是最常用的參數(shù)),那么param子元素也是可以省略的。此外如果你沒有指定result元素的name屬性,那么框架將把它命名為“success”.使用框架提供的這些默認(rèn)設(shè)置,我們簡化配置:<packagename="default"extends="struts-default"><actionname="login"class="com.ibm.LoginAction"> <!--省略name屬性,框架將其命名為“success”, 配置名為success的結(jié)果映射,結(jié)果類型為dispatcher--> <result>/success.jsp</result> <!--省略param子元素,直接在result元素的內(nèi)容中給出實際資源的位置--> <resultname="error">/error.jsp</result></action></package>配置result映射在result映射的配置中,在指定實際資源的位置時,可以使用絕對路徑,也可以使用相對路徑。絕對路徑以斜杠(/)開頭,相對于當(dāng)前的Web應(yīng)用程序的上下文路徑;相對路徑不以斜杠(/)開頭,相對于當(dāng)前執(zhí)行的action的路徑。例如:

<packagename="default"extends="struts-default"namespace="/admin"><actionname="login"class="com.ibm.LoginAction"> <result>success.jsp</result> <resultname="error">/error.jsp</result></action></package>如果當(dāng)前Web應(yīng)用程序的上下文路徑是/Shop,那么請求/Shop/admin/login.action,執(zhí)行成功后,轉(zhuǎn)向的頁面路徑為:/Shop/admin/success.jsp;執(zhí)行失敗后,轉(zhuǎn)向的頁面路徑為/Shop/error.jsp.result結(jié)果類型在框架調(diào)用Action對請求進行處理之后,就要向用戶呈現(xiàn)一個結(jié)果視圖。Struts2支持多種類型的視圖,這些視圖是由不同的結(jié)果類型來管理的。一個結(jié)果類型就是實現(xiàn)了com.opensymphony.xwork2.Result接口的類,在struts2中,預(yù)定義了多種結(jié)果類型,如表:結(jié)果類型在包中使用result-type元素來定義,上面的結(jié)果類型都是在框架的默認(rèn)配置文件struts-default.xml中定義的。struts-default.xmldispatcher結(jié)果類型(一)最常用的結(jié)果類型當(dāng)然是dispatcher了,要不然struts2也不會將它設(shè)為默認(rèn)的結(jié)果類型了。Struts2在后臺使用ServletAPI的RequestDispatcher來轉(zhuǎn)發(fā)請求,因此在用戶的整個請求/響應(yīng)過程中,目標(biāo)Servlet/JSP接收到的request/response對象,與最初的Servlet/JSP相同。Dispatcher結(jié)果類型的實現(xiàn)是org.apache.struts2.dispatcher.ServletDispatcherResult,該類的二個屬性(property):location和parse,這兩個屬性可以通過struts.xml配置文件中的result元素的param子元素來設(shè)置。param元素的name屬性指定結(jié)果類型實現(xiàn)類的屬性名,param元素的內(nèi)容是屬性的值。例如:<resultname=“success”type=“dispatcher”> <paramname=“l(fā)ocation”>/success.jsp</param> <paramname=“parse”>true</param></result>其中l(wèi)ocation參數(shù)用于指定action執(zhí)行完畢后要轉(zhuǎn)向的目標(biāo)資源,parse屬性是一個布爾類型的值,如果為true,則解析location參數(shù)中的OGNL表達式;如果為false,則不解析。parse屬性的默認(rèn)值就是true.location參數(shù)是默認(rèn)的參數(shù),在所有的Result實現(xiàn)類中,都定義了一個字符串類型的DEFAULT_PARAM靜態(tài)常量,專門用于指定默認(rèn)的參數(shù)名。DEFAULT_PARAM常量的定義:publicstaticfinalStringDEFAULT_PARAM=“l(fā)ocation”;dispatcher結(jié)果類型(二)在設(shè)置location參數(shù)時,可以在參數(shù)值中使用OGNL表達式。<actionname=“viewNews”class=“com.ibm.ViewNewsAction”<resultname=“success”type=“dispatcher”> <paramname=“l(fā)ocation”>/viewNews.jsp?id=${id}</param> <paramname=“parse”>true</param></result></action> 考慮到默認(rèn)值的使用,上述可以簡化為:<actionname=“viewNews”class=“com.ibm.ViewNewsAction”<resultname=“success”type=“dispatcher”>viewNews.jsp?id=${id}</param></result></action>redirect結(jié)果類型(一)Redirect結(jié)果類型在后臺使用HttpServletResponse的sendRedirect方法將請求重定向到指定的URL,它的實現(xiàn)類是org.apache.struts2.dispatcher.ServletRedirectResult.在使用redirect結(jié)果類型的場景中,用戶要完成一次與服務(wù)器之間的交互,瀏覽器需要完成兩次請求,如下圖:redirect結(jié)果類型(二)①瀏覽器發(fā)出一個請求,struts2框架調(diào)用對應(yīng)的Action實例對請求進行處理;②Action返回”success”結(jié)果碼,框架根據(jù)這個結(jié)果碼選擇對應(yīng)的結(jié)果類型,在上圖是redirect結(jié)果類型;③ServletRedirectResult在內(nèi)部使用HttpServletResponse的sendRedirect方法將請求重定向到目標(biāo)資源;④瀏覽器重新發(fā)起一個針對目標(biāo)資源的新的請求;⑤目標(biāo)資源作用為響應(yīng)呈現(xiàn)給用戶。由于在一次用戶交互過程中存在著兩次請求,因此第一次請求中的數(shù)據(jù)在第二次請求中是不可用的,這意味在目標(biāo)資源中是不能訪問action實例、action錯誤以及錯誤等。如果有某些數(shù)據(jù)需要在目標(biāo)資源中訪問,一種方式是將數(shù)據(jù)保存到Session中,另一種方式是通過請求參數(shù)來傳遞數(shù)據(jù)。redirectAction結(jié)果類型(一)redirectAction結(jié)果類型的實現(xiàn)類是org.apache.struts2.dispatcher.ServletActionRedirectResult,該類是ServletDispatcherResult的子類,因此我們也就可以判斷出redirectAction結(jié)果類型和redirect結(jié)果類型的后臺工作原理是一樣的,即都是利用HttpServletResponse的sendRedirect方法將請求重定向到指定的URL。那么redirect與redirectAction有什么區(qū)別呢?從結(jié)果類型的名字上,我們可以大致判斷出redirectAction結(jié)果類型主要是用于重定向到action。也就是說,在請求處理完成后,如果你需要重定向到另一個action,那么建議你使用redirectAction結(jié)果類型。使用redirectAction結(jié)果類型可以簡化對那些帶有名稱空間的actionURL的設(shè)置,ServletActionRedirectResult類在內(nèi)部使用ActionMapper來構(gòu)建訪問action的URL,這樣你就不需要在struts.xml配置文件中手動去編碼訪問action的URL了.redirectAction結(jié)果類型(二)redirectAction結(jié)果類型有二個參數(shù):actionName(default):指定重定向的action的名字。該參數(shù)是默認(rèn)參數(shù)。namespace:指定action所屬的名稱空間,如果沒有使用這個參數(shù),那么默認(rèn)使用當(dāng)前的名稱空間。redirectAction結(jié)果類型(三)plainText結(jié)果類型(一)plainText結(jié)果類型可能不是很常用,但是它是一個非常有趣的結(jié)果類型,因為它可以用于輸出JSP或HTML的源代碼。想一想,你制作一個在線實例教程,用戶看完頁面效果后,想看看你的頁面如何編寫的,點擊你提供的“查看源代碼鏈接”,整個頁面的源代碼就以頁面的形式在瀏覽器中顯示出來,這個功能是不是很貼心呢!通常情況下,要想在瀏覽器中顯示一個JSP或HTML頁面的代碼,你必須對其中的標(biāo)記使用實體引用或字符引用的方式來做置換,這樣才能在瀏覽器中顯示頁面代碼。不過如果這樣做,一方面工作量太大,另一方面你的源文件也被破壞了。所以我們通常是編寫一個轉(zhuǎn)換程序,在頁面輸出時,由程序讀取頁面的內(nèi)容,將其中的特殊字符轉(zhuǎn)換成對應(yīng)的字符引用,然后再輸出到瀏覽器中。在struts2中你不需要這樣去編寫這樣的程序了,直接使用plainText結(jié)果類型就可以實現(xiàn)輸出頁面源代碼的功能。plainText結(jié)果類型(二)plainText結(jié)果類型有兩個參數(shù),如下所示:Location:指定要輸出原始內(nèi)容的頁面(JSP或HTML)。該參數(shù)是默認(rèn)的。charSet:指定輸出頁面內(nèi)容時使用的字符編碼。這個字符編碼將被用作設(shè)置響應(yīng)類型(例如:Content-Type=text/plain;charset=GBK),以及使用Reader對象讀取文件時的編碼。<actionname=“displayJspRawContent”><resulttype=“plaintext”> <paramname=“l(fā)ocation”>/myJspFile</param> <paramname=“charSet”>GBK</param></result></action>如果你在myJspFile.jsp中使用了中文,那么需要設(shè)置charSet參數(shù)為GBK或者GB2312,否則在瀏覽器中顯示時會出現(xiàn)亂碼。chain結(jié)果類型(一)Struts2框架支持配置多個Action組成一個鏈或者工作流來處理用戶的請求,而Action鏈的實現(xiàn),是通過攔截器ChainingInterceptor完成的。ChainingInterceptor在源Action執(zhí)行完畢后,將源Action的用戶請求參數(shù)、值棧、session的數(shù)據(jù)賦值給目的Action,就是說,在執(zhí)行多個Action過程中,參數(shù)都是保留的。chain結(jié)果類型(二)下面配置中,通過chain結(jié)果類型,將3個Action組成了一個鏈,共同完成一個用戶請求。chain結(jié)果類型(三)①第一個Action的result定義為chain,并指向名為login的Action;該Action中result同樣指定type為chain,但是增加了actionName屬性和namespace屬性,actionName屬性指定目的Action的名稱,namespace屬性指定了目的Action所在的命名空間名稱,也就是定位該Action所在的package名稱。②第3個Action存在另外一個package中,也就是第2個Action的result中指定的命名空間中,該Action的result沒有指定type屬性,則使用默認(rèn)值dispatcher,即JSP視圖。③該配置文件調(diào)用關(guān)系為createAccout-----login------secure。在上述調(diào)用過程中,每個Action所屬的參數(shù)、值棧等數(shù)據(jù)通過攔截器被傳入下一個Action,直到最后一個Action執(zhí)行完成。Login.jspActionChain1_ActionActionChain2_ActionActionChain3_ActionSuccess.jspStream結(jié)果類型示例Stream類型的result一般是指將原始數(shù)據(jù)直接傳遞給HttpServletResponse,這種結(jié)果類型在用戶下載文件(例如PDF文件等)等情況下非常有意義。配置stream類型的result,一般可以指定下面幾個參數(shù):contentType:指定傳遞給瀏覽器的stream類型,默認(rèn)類型為text/plain.contentlength:數(shù)據(jù)流的字節(jié)長度(用于瀏覽器顯示進度條)contentDispostion:指定文件的內(nèi)容規(guī)格,默認(rèn)值為inline.inputName:數(shù)據(jù)流的屬性,默認(rèn)值為inputstreambufferSize:緩沖區(qū)容量,默認(rèn)為1024.示例:<resultname="success"type="stream"><paramname="contentType">image/jpeg</param><paramname="inputName">imageStream</param><paramname="contentDisposition">filename="document.pdf"</param><paramname="bufferSize">1024</param></result>全局結(jié)果(一)上述我們所配置的結(jié)果映射都是在action元素的內(nèi)部,這些結(jié)果只能被它外部的action所使用,這樣的結(jié)果可以看成是局部結(jié)果。在某些場景中,可能有多個action需要訪問同一個結(jié)果,例如在論壇系統(tǒng)中,用戶在發(fā)帖、回帖、搜索帖子時都需要先登錄,那么我們可以配置一個全局的login結(jié)果,這樣在action中就不需要再一一配置login結(jié)果了。全局結(jié)果也是在包中定義的,在這個包中所有的action可以共享全局結(jié)果。全局結(jié)果也是使用result元素來配置,只不過不是在action元素中嵌套,而是在global-results元素中嵌套。全局結(jié)果(二)當(dāng)請求/bbs/addArticle時,ArticleAction的execute方法如果沒有返回login結(jié)果碼,那么框架將首先在addArticle這個action的配置中查找嵌套的局部結(jié)果。如果沒有找到匹配的局部結(jié)果,那么就在全局結(jié)果中查找,找到后,應(yīng)用redirectAction結(jié)果類型將請求重定向到/bbs/login!input.action.如果用戶登錄失敗,或者發(fā)貼失敗,Action返回error結(jié)果碼,那么全局結(jié)果中的error.jsp頁面將呈現(xiàn)給用戶。動態(tài)結(jié)果所謂動態(tài)結(jié)果,就是指在配置時你不知道要執(zhí)行哪一個結(jié)果,在運行時刻才能確定執(zhí)行的結(jié)果。簡單地說,就是在配置結(jié)果時使用了表達式,在運行時刻,框架解析并計算表達式,根據(jù)表達式的值來確定要執(zhí)行的結(jié)果。例如一個公司的內(nèi)部辦公系統(tǒng),它根據(jù)用戶登錄的身份(普通雇員還是經(jīng)理)來決定用戶可瀏覽的資源。用戶登錄由LoginAction來處理,雇員可訪問資源由EmployeeAction來處理,經(jīng)理訪問資源由ManagerAction根據(jù)用戶權(quán)限的不同,將請求重定向到EmployeeAction或ManagerAction.publicclassEmployeeActionextendsActionSupport{…..........}publicclassManagerActionextendsActionSupport{…..........}Action類代碼用于保存請求重定向到的action的名字提供getter方法,在result映射中使用表達式訪問nextAction屬性判斷用戶是否是管理者struts.xml配置文件上述深色部分,我們使用${nextAction}來獲取Action中的nextAction屬性的值,而這個值要在運行時刻才能知道。在運行時刻,計算出${nextAction}的值后,然后由redirectAction結(jié)果類型將請求重定向到指定的action.說明在結(jié)果映射中,使用${nextAction}語法訪問的屬性一定要在Action中存在,這種存在不是簡單地定義一個實例變量就完了,而是要提供對應(yīng)的JavaBean風(fēng)格的getter方法。在JavaBean中,實例變量的名字和屬性(property)名可以是不同的,例如:privateStringname;publicgetUsername(){

returnname;}在上述的代碼中,實例變量名是name,屬性名是username.使用${….}語法訪問的是屬性名。struts2中異常處理(一)Struts2通過攔截器對action拋出的異常進行捕獲,這個攔截器就是:erceptor.ExceptionMappingInterceptor

在try語句中調(diào)用invocation.invoke(),invoke方法在內(nèi)部調(diào)用Action的方法

得到配置的異常映射的列表

在異常映射列表中,查找異常類型對應(yīng)的結(jié)果代碼struts2中異常處理(二)要使用struts2的聲明式異常處理,就需要配置ExceptionMappingInterceptor攔截器。在struts2的默認(rèn)配置文件struts-default.xml中,ExceptionMappingInterceptor已經(jīng)配好<packagename="struts-default"abstract="true">………<interceptorname="exception“class="erceptor.ExceptionMappingInterceptor"/>………………

<interceptor-stackname="defaultStack"><interceptor-refname="exception"/>………………

<default-interceptor-refname="defaultStack"/>從struts-default包繼承的”子”包中的action都將使用默認(rèn)的攔截器棧defaultStack(除非action引用了其他的攔截器),而在這個攔截器棧中引用了exception攔截器(是defaultStack棧中第一個引用的攔截器)。因此,在默認(rèn)情況下,所有的action自然就引用了exception攔截器,而不需要再配置它了。struts2中異常處理(三)既然異常映射攔截器已經(jīng)為我們配置好了,那么剩下的工作就是使用exception-mapping元素來配置異常映射,將異常類型映射到指定的結(jié)果。exception-mapping元素有二個屬性:exception:指定一個異常類型的完整類名,result:指定對該異常進行處理的結(jié)果的名字。Struts2框架提供了二種方式來聲明一個異常映射:全局和局部的(針對一個特定的action).與result映射的查找規(guī)則一樣,當(dāng)一個異常發(fā)生時,exception攔截器將首先查找拋出異常的action中的局部攔截器映射,然后再查找全局的異常映射。只要找到一個匹配的,那么對應(yīng)的結(jié)果就這被處理。struts2中異常處理(四)struts2中異常處理(五)在上述的配置中,定義了三個異常映射,當(dāng)異常發(fā)生時,框架的處理情況如下:Java.sql.SQLException異常將鏈接到/sqlExceptionAction.action;com.ibm.SecurityException異常將重定向到/login.action;其他從java.lang.Exception繼承的異常將向用戶返回/exception.jsp頁面ExceptionMappingInterceptor在捕獲到Action的方法拋出的異常后,除了從異常映射的配置中查找對應(yīng)的結(jié)果名外,還會將下列兩個值放到值棧中,以便在結(jié)果頁面中訪問異常信息。exception:異常對象本身。exceptionStack:保存異常發(fā)生時的棧跟蹤信息。在結(jié)果頁面中??梢允褂胹truts2的標(biāo)簽來訪問異常信息。例如<s:propertyvalue=“exception.message”/>取出異常對象的描述信息。<s:propertyvalue=“exceptionStack”/>取出異常發(fā)生時的棧跟蹤信息。使用注解配置Action注解(Annotation)是J2SE5.0中提供的新特性,目前應(yīng)用已經(jīng)非常廣泛,其中的一個主要應(yīng)用就是代替?zhèn)鹘y(tǒng)的XML配置文件,使用注解來提供配置信息。Struts2也提供了使用注解的方式來配置Action,這樣就不再需要struts.xml文件,以實現(xiàn)零配置。與Action2在org.apache.struts.config包中定義了4個與Action配置相關(guān)的注解類型,如下:Parentpackage:指定action所在的包要繼承的父包。Namespace:指定action所屬的名稱空間。Result:定義一個result映射。Results:定義一組result映射。ParentPackage注解的參數(shù)如果注解中只有一個名為value的參數(shù),或者有其他參數(shù),但其他參數(shù)都有默認(rèn)值,那么在為value參數(shù)設(shè)值時可以忽略value和等號(=),例如: @ParentPackage(value=“st

溫馨提示

  • 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

提交評論