struts2配置詳解_免費(fèi)下載.ppt.ppt 免費(fèi)下載
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、學(xué)習(xí)目標(biāo),掌握struts2的幾個(gè)主要配置文件:perties、struts-default.xml和struts.xml、struts-plugin.xml 掌握struts.xml中各項(xiàng)內(nèi)容的配置 重點(diǎn)掌握Action和Result的配置 掌握使用注解來配置Action,Struts2框架的主要配置文件,web.xml, struts2 org.apache.struts2.dispatcher.FilterDispatcher struts2 /* 說明:準(zhǔn)確的說,web.xml并不是Struts2框架特有的文件。作為部署描述符文件,web.xml是所有Java We
2、b應(yīng)用程序都需要的核心配置文件。 struts2框架需要你在web.xml文件中配置一個(gè)前端控制器-FilterDispatcher ,用于對(duì)struts2框架進(jìn)行初始化,以及處理所有的請(qǐng)求。,perties,struts2.0框架有兩核心的配置文件:struts.xml和perties struts.xml文件主要負(fù)責(zé)管理應(yīng)用中的action映射,以及該Action中包含的result定義等。 perties通常放在WEB應(yīng)用下的WEB-INF/classes路徑下。 其實(shí),perties的內(nèi)容均可在struts
3、.xml中以加載 以下是整合一些資料總結(jié)的詳細(xì)配置參數(shù),perties,perties,perties,perties,perties,perties,struts.xml,struts.xml- Bean設(shè)置,Bean設(shè)置 Struts2框架是一個(gè)高度可擴(kuò)展的框架,框架的大部分核心組件,Struts2并不是直接以硬編碼的方式寫在代碼中的,而是以自己的IOC(控制反轉(zhuǎn)容器)來管理框架的核心組件. Struts2框架以可配置的方式來管理Struts2的核心組件,從而允許開發(fā)者可
4、以非常方便的擴(kuò)展該框架的核心組件.當(dāng)開發(fā)者需要擴(kuò)展,或者替換Struts2的核心組件的時(shí)候,只需要提供自己的組件實(shí)現(xiàn)類,并且將組件實(shí)現(xiàn)類部署在Struts2的IOC容器當(dāng)中就可以了.,打開Struts-core-2.1.6.jar壓縮文件中的struts-default.xml文件,看到在該文件中配置了大量的Bean定義,該配置文件的代碼如下:,上面的配置文件配置了Struts2框架的內(nèi)置Bean,其中有三個(gè)類型檢測(cè)Bean,就是在前面perties文件中允許使用的類型檢測(cè)器.( struts.objectTypeDeterminer:該屬性指定Struts2的類型檢測(cè)機(jī)制
5、,通常支持tiger和notiger兩個(gè)屬性值.). 在struts.xml文件中定義bean時(shí),通常有如下兩個(gè)作用a.創(chuàng)建該bean的實(shí)例,將該實(shí)例作為struts2框架的核心組件使用b.bean包含的靜態(tài)方法需要注入一個(gè)值 。 在第一種用法下,因?yàn)锽ean實(shí)例往往是作為一個(gè)核心組件使用的,因此需要告訴Struts2容器該實(shí)例的作用-就是該實(shí)例實(shí)現(xiàn)了哪個(gè)接口,這個(gè)接口往往定義了該組件所必須遵守的一個(gè)規(guī)范.,struts.xml-常量配置,這里配置有錯(cuò),寫反了,struts.xml -包的配置,下面的struts.xml文件當(dāng)中配置了兩個(gè)包,其中名為default的包,繼承了Struts2框架
6、的默認(rèn)包struts-default,struts.xml-命名空間配置,struts.xml-包含的配置,struts.xml-包攔截器配置,攔截器的定義片段,struts.xml-Action配置詳解,Struts2的核心功能是action,對(duì)于開發(fā)人員來說,使用struts2框架,主要的編碼工作就是編寫action類。Action類通常都要實(shí)現(xiàn)com.opensymphony.xwork2.Action接口,并實(shí)現(xiàn)該接口中的execute()方法,該方法語(yǔ)法格式如下: public String execute() throws Exception 當(dāng)然,struts2并不要求你所編寫的
7、action類一定要實(shí)現(xiàn)Action接口,你也可以編寫一個(gè)普通的Java類作為action,只要該類提供一個(gè)返回類型為String的無(wú)參的public方法,如下所示: public String xxx() 在實(shí)際開發(fā)中,action類很少直接實(shí)現(xiàn)Action接口,通常都是從com.opensymphony.xwork2.ActionSupport類繼承。ActionSupport實(shí)現(xiàn)了Action接口和Validateable, ValidationAware, TextProvider, LocaleProvider, Serializable的接口,提供了輸入驗(yàn)證、錯(cuò)誤信息存取,以及國(guó)際
8、化的支持,選擇從ActionSupport繼承,可以簡(jiǎn)化action的開發(fā)。 開發(fā)action后,就需要配置action映射,以告訴struts2框架,針對(duì)某個(gè)URL的請(qǐng)求應(yīng)該交由哪一個(gè)action進(jìn)行處理。,Action的配置,在struts2框架中每一個(gè)Action是一個(gè)工作單元。Action負(fù)責(zé)將一個(gè)請(qǐng)求對(duì)應(yīng)到一個(gè)Action處理上去,每當(dāng)一個(gè)Action類匹配一個(gè)請(qǐng)求的時(shí)候,這個(gè)Action類就會(huì)被Struts2框架調(diào)用。 Struts.xml中的每一個(gè)action元素就是一個(gè)action映射。action完整的屬性如表所示:,舉例說明, /success.jsp /error.jsp
9、 Action的name屬性是必需的,其他屬性是可選的。在為action取名時(shí),默認(rèn) 情況下在名字中是不允許出現(xiàn)斜杠(/)的。如果想在名字中使用斜杠(/): (例如,),就需 要在struts.xml文件中通過指定 來打開這個(gè)功能。 此外,在為action取名時(shí),名字中盡量不要使用點(diǎn)號(hào)(.)(例如create.user)和連接字符(-)(例如:my-action),否則會(huì)出現(xiàn)一些莫名其妙的問題。 其實(shí)我們不用去記憶名字中不允許出現(xiàn)哪些字符,只要按照通常的命名習(xí)慣去為action取名就可以了,頂多在名字中使用一下下劃線(_)(例如:my_action),這樣是可以保證不會(huì)出現(xiàn)問題。,使用meth
10、od屬性,在軟件開發(fā)中,經(jīng)常會(huì)用到CRUD操作,CRUD即create(創(chuàng)建)、Read/Retrieve(讀取)、Update(更新)和Delete(刪除)的首字母的縮寫。例如:在一個(gè)用戶管理系統(tǒng)中,對(duì)用戶有四種操作:添加用戶、瀏覽用戶、編輯用戶和刪除用戶,分別對(duì)應(yīng)CRUD的四種操作。在具體實(shí)現(xiàn)時(shí),為了節(jié)省action類的數(shù)量,通常是在一個(gè)action類中編寫四個(gè)方法來實(shí)現(xiàn)CRUD操作。 public String loginUser() throws Exception /查詢用戶 public String addUser() throws Exception /添加用戶 public
11、String updateUser() throws Exception /修改用戶 public String deleteUser() throws Exception / 刪除用戶 現(xiàn)在的問題是,我們?nèi)绾尾拍茏尶蚣茉诓煌恼?qǐng)求到來時(shí),去調(diào)用Action中的相應(yīng)方法呢?要知道,在執(zhí)行action時(shí),默認(rèn)調(diào)用方法是execute().,使用method屬性,在配置action時(shí),我們可以通過action元素的method屬性來指定action調(diào)用的方法。所指定的方法必須遵循與execute方法相同的格式。 在struts.xml文件中,我們可以為同一個(gè)action類配置不同的別名,并使用me
12、thod屬性,如下所示: index.jsp reg.jsp index.jsp reg.jsp index.jsp reg.jsp index.jsp reg.jsp ,注意:使用method屬性,使用action的method屬性可以任意指定處理請(qǐng)求的方法(只要該方法和execute方法具有相同的格式),這樣就可以在同一個(gè)類中完成相關(guān)的任務(wù),而不需要去編寫不同的Action類。 Struts2在根據(jù)action元素的method屬性查找方法時(shí)有兩種途徑: 1)查找與method屬性值完全一致的方法 2)查找doMethod()形式的方法。 以上面的例子為例,當(dāng)請(qǐng)求/reg時(shí),struts2
13、首先查找addUser()方法,如果找不到,則繼續(xù)查找名為doAddUser() 的方法。這種特性是從WebWork繼承而來的,而WebWork提供這種特性,一方面是為了兼容舊版本W(wǎng)ebWork遺留的功能,另一方面是因?yàn)橐恍┓椒▌e名的需要,例如,default是Java的關(guān)鍵字,不能作為方法名,你可以使用doDefault作為方法名,在配置時(shí),可以使用method=“default”. 這種特性同樣也適用于下一節(jié)要講述的動(dòng)態(tài)方法調(diào)用,例如,請(qǐng)求/users! addUser.action,struts2會(huì)依次查找addUser()和doAddUser()方法,Action動(dòng)態(tài)方法調(diào)用(一),另
14、一種無(wú)須配置就可以直接調(diào)用Action中的非execute()方法的方式,就是使用struts2的動(dòng)態(tài)方法調(diào)用。 動(dòng)態(tài)方法調(diào)用(Dynamic Method Invocation,DMI)是在action的名字中使用感嘆號(hào)( ! )來標(biāo)識(shí)要調(diào)用的方法名,其語(yǔ)法格式為: actionName!methodName.action 例如 , 我們配置了如下的Action . 當(dāng)請(qǐng)求/users! addUser.action時(shí),將調(diào)用UserAction的addUser()方法; 當(dāng)請(qǐng)求/users! updateUser.action時(shí),將調(diào)用UserAction的updateUser()方法;
15、DMI的實(shí)現(xiàn)本質(zhì)是,其實(shí)現(xiàn)代碼掃描action名字中的“!”字符,如果找到,則“欺騙”框架來調(diào)用“!”字符后的方法,而非execute方法。雖然調(diào)用的是其它方法,但是它使用的仍然是execute方法的配置,包括驗(yàn)證??蚣堋跋嘈拧彼谡{(diào)用的是Action類的execute()方法。,Action動(dòng)態(tài)方法調(diào)用(二),在struts2中使用DMI有兩個(gè)要注意的問題。首先,DMI可能會(huì)帶來安全隱患,由于通過URL可以執(zhí)行action中的任意方法,惡意的用戶會(huì)利用這一特性來執(zhí)行一些敏感的方法,即使你不想這些方法被執(zhí)行。所以在確定使用DMI時(shí),你應(yīng)該確保Action中的方法都是普通、開放的方法;否則,你
16、應(yīng)該加上安全控制。其次,DMI與下一節(jié)要介紹的通配符方法有所重疊。 由于上述兩個(gè)原因,struts2提供了一個(gè)屬性配置,用于禁止DMI。你可以在struts.xml文件中,使用constant元素將struts.enable.DynamicMethodInvocation屬性設(shè)置為false,來關(guān)閉DMI 那么什么時(shí)候使用動(dòng)態(tài)方法調(diào)用,什么時(shí)候使用action元素的mrthod屬性呢?或者二者有什么區(qū)別嗎? 如果同一個(gè)Action的不同方法使用的是相同的配置(同樣的攔截器引用,同樣的result映射),那么可以使用動(dòng)態(tài)方法調(diào)用; 如果不同的方法調(diào)用需要配置不同的攔截器引用、不同的result映
17、射,那么可以使用action元素的method屬性,為同一個(gè)Action配置多個(gè)別名。,Action 通配符映射,一些時(shí)候?qū)ction中方法的調(diào)用滿足一定的規(guī)律,例如edit.Action對(duì)應(yīng)edit方法,delete.Action對(duì)應(yīng) delete方法,這個(gè)時(shí)候我們可以使用方法通配符,例如: 這時(shí),editCrud.Action的引用將調(diào)用edit方法,同理,deleteCrud.Action的引用將調(diào)用delete 方法。 另外一種比較常用的方式是使用下劃線分割,例如:這樣當(dāng)遇到如下調(diào)用的時(shí)候可以找到對(duì)應(yīng)的方法。action=Crud_input=input方法action=Crud_d
18、elete=delete方法通配符和普通的配置具有相同的地位,可以結(jié)合使用框架的所有其他功能。,Action 通配符映射,通配符即星號(hào)(*),用于匹配0個(gè)或多個(gè)字符。在配置action時(shí),可以在action元素的name屬性中使用星號(hào)(*)來匹配任意的字符。 通配符中幾個(gè)特殊的標(biāo)記,如下所述: *:可以匹配0個(gè)或多個(gè)任意字符,但是不包括正斜杠”/”; *:可以匹配0個(gè)或多個(gè)任意字符,包括正斜杠”/”在內(nèi) :反斜杠,轉(zhuǎn)義字符。 因?yàn)?不能匹配正斜杠,所以前面/editSubscription/add不會(huì)被匹配上。 在action mapping中,被通配符所匹配上的值可以用符號(hào)N來訪問,其中N是
19、一個(gè)1到9之間的數(shù),用來表示代替第N個(gè)被匹配上的值,說通俗點(diǎn)就是第N個(gè)*號(hào)所表示的內(nèi)容,比方說通配符表達(dá)式是/edit*/add*/confirm*,它匹配上了/editOrder/addItem/confirmResult,那么1就代表Order,2就代表Item,3就代表Result,依此類推。,配置Result,一個(gè)result代表了一個(gè)可能的輸出。當(dāng)Action類的方法執(zhí)行完成時(shí),它返回一個(gè)字符串類型的結(jié)果碼,框架根據(jù)這個(gè)結(jié)果碼選擇對(duì)應(yīng)的result,向用戶輸出。 在com.opensymphony.xwork2.Action接口中定義了一組標(biāo)準(zhǔn)的結(jié)果代碼,可供開發(fā)人員使用,如下所示:
20、 public interface Action public static final String SUCCESS = “success”; public static final String NONE = “none”; public static final String ERROR = “error”; public static final String INPUT = “input”; public static final String LOGIN = “l(fā)ogin”; 除了這些預(yù)定義的結(jié)果碼外,開發(fā)人員也可以定義其它的結(jié)果碼來滿足自身應(yīng)用程序的需 要。 Result配置由兩
21、部分組成:一部分是result映射,另一部分是result類型。下面我們分別對(duì) 這兩部分進(jìn)行介紹。,結(jié)果映射-result映射,在struts.xml文件中,使用result元素來配置result映射。Result元素有兩個(gè)可選的屬性:如下:,在result元素中,可以使用param子元素來指定這個(gè)結(jié)果對(duì)應(yīng)的實(shí)際資源的位置。param元素有一個(gè)必需的屬性name,用于指定參數(shù)名,param元素的內(nèi)容給出參數(shù)值。如果要指定資源的位置,name屬性的值需要設(shè)置為location.,配置 result映射,看完上面的配置,感覺是否有一點(diǎn)復(fù)雜。為什么我們之前的配置沒有這樣復(fù)雜呢?在上面的例子中我們用r
22、esult元素的 type屬性來指定結(jié)果的類型,同時(shí)還使用param子元素來指定資源的實(shí)際位置,因此就變得復(fù)雜了。,配置 result映射,在struts2中允許你定義一個(gè)默認(rèn)的Result類型,這是通過result-type元素來定義的。在框架的默認(rèn)配置文件struts-default.xml中,在struts-default包中有如下的一個(gè)配置: result-type元素的default屬性指定名為dispatcher的結(jié)果類型為默認(rèn)的結(jié)果類型。dispatcher結(jié)果類型使用Servlet API中的RequestDispatcher將請(qǐng)求導(dǎo)向到目標(biāo)資源,通常是JSP頁(yè)面。如果你在使用
23、result元素配置result映射時(shí),沒有使用type屬性,那么框架將使用默認(rèn)的dispatcher類型。,配置 result映射,由于struts2中的包是可以繼承的,在上面的實(shí)例中我們定義的default包繼承自struts-default包,因此也繼承了默認(rèn)的結(jié)果類型定義(當(dāng)然,你也可以在“子”包中定義自己的默認(rèn)結(jié)果類型)。既然有了默認(rèn)的結(jié)果類型,而你想要使用的也正是這種結(jié)果類型,那么就可以省略result元素的type屬性。 在result的配置中,當(dāng)結(jié)果類型為dispatcher時(shí),如果你使用param子元素為該類型的result設(shè)置location參數(shù)(這是最常用的參數(shù)),那么p
24、aram子元素也是可以省略的。此外如果你沒有指定result元素的name屬性,那么框架將把它命名為“success”.使用框架提供的這些默認(rèn)設(shè)置,我們簡(jiǎn)化配置: /success.jsp /error.jsp ,配置 result映射,在result映射的配置中,在指定實(shí)際資源的位置時(shí),可以使用絕對(duì)路徑,也可以使用相對(duì)路徑。 絕對(duì)路徑以斜杠(/)開頭,相對(duì)于當(dāng)前的Web應(yīng)用程序的上下文路徑; 相對(duì)路徑不以斜杠(/)開頭,相對(duì)于當(dāng)前執(zhí)行的action的路徑。 例如: success.jsp /error.jsp 如果當(dāng)前Web應(yīng)用程序的上下文路徑是/Shop,那么請(qǐng)求/Shop/admin/l
25、ogin.action,執(zhí)行成功后,轉(zhuǎn)向的頁(yè)面路徑為:/Shop/admin/success.jsp;執(zhí)行失敗后,轉(zhuǎn)向的頁(yè)面路徑為/Shop/error.jsp.,result結(jié)果類型,在框架調(diào)用Action對(duì)請(qǐng)求進(jìn)行處理之后,就要向用戶呈現(xiàn)一個(gè)結(jié)果視圖。Struts2支持多種類型的視圖,這些視圖是由不同的結(jié)果類型來管理的。一個(gè)結(jié)果類型就是實(shí)現(xiàn)了com.opensymphony.xwork2.Result接口的類,在struts2中,預(yù)定義了多種結(jié)果類型,如表:,結(jié)果類型在包中使用result-type元素來定義,上面的結(jié)果類型都是在框架的默認(rèn)配置文件struts-default.xml中定義
26、的。,struts-default.xml,dispatcher結(jié)果類型(一),最常用的結(jié)果類型當(dāng)然是dispatcher了,要不然struts2也不會(huì)將它設(shè)為默認(rèn)的結(jié)果類型了。 Struts2在后臺(tái)使用Servlet API 的RequestDispatcher來轉(zhuǎn)發(fā)請(qǐng)求,因此在用戶的整個(gè)請(qǐng)求/響應(yīng)過程中,目標(biāo)Servlet/JSP接收到的request/response對(duì)象,與最初的Servlet/JSP相同。 Dispatcher結(jié)果類型的實(shí)現(xiàn)是org.apache.struts2.dispatcher.ServletDispatcherResult,該類的二個(gè)屬性(property):
27、location和parse,這兩個(gè)屬性可以通過struts.xml配置文件中的result元素的param子元素來設(shè)置。param元素的name屬性指定結(jié)果類型實(shí)現(xiàn)類的屬性名,param元素的內(nèi)容是屬性的值。例如: /success.jsp true 其中l(wèi)ocation參數(shù)用于指定action執(zhí)行完畢后要轉(zhuǎn)向的目標(biāo)資源,parse屬性是一個(gè)布爾類型的值,如果為true,則解析location參數(shù)中的OGNL表達(dá)式;如果為false,則不解析。parse屬性的默認(rèn)值就是true. location參數(shù)是默認(rèn)的參數(shù),在所有的Result實(shí)現(xiàn)類中,都定義了一個(gè)字符串類型的DEFAULT_PARA
28、M靜態(tài)常量,專門用于指定默認(rèn)的參數(shù)名。 DEFAULT_PARAM常量的定義:public static final String DEFAULT_PARAM=“l(fā)ocation”;,dispatcher結(jié)果類型(二),在設(shè)置location參數(shù)時(shí),可以在參數(shù)值中使用OGNL表達(dá)式。 /viewNews.jsp?id=$id true 考慮到默認(rèn)值的使用,上述可以簡(jiǎn)化為: viewNews.jsp?id=$id ,redirect結(jié)果類型(一),Redirect結(jié)果類型在后臺(tái)使用HttpServletResponse的sendRedirect方法將請(qǐng)求重定向到指定的URL,它的實(shí)現(xiàn)類是org.
29、apache.struts2.dispatcher.ServletRedirectResult.在使用redirect結(jié)果類型的場(chǎng)景中,用戶要完成一次與服務(wù)器之間的交互,瀏覽器需要完成兩次請(qǐng)求,如下圖:,redirect結(jié)果類型(二),瀏覽器發(fā)出一個(gè)請(qǐng)求,struts2框架調(diào)用對(duì)應(yīng)的Action實(shí)例對(duì)請(qǐng)求進(jìn)行處理; Action返回”success”結(jié)果碼,框架根據(jù)這個(gè)結(jié)果碼選擇對(duì)應(yīng)的結(jié)果類型,在上圖是redirect結(jié)果類型; ServletRedirectResult在內(nèi)部使用HttpServletResponse的sendRedirect方法將請(qǐng)求重定向到目標(biāo)資源; 瀏覽器重新發(fā)起一個(gè)針
30、對(duì)目標(biāo)資源的新的請(qǐng)求; 目標(biāo)資源作用為響應(yīng)呈現(xiàn)給用戶。 由于在一次用戶交互過程中存在著兩次請(qǐng)求,因此第一次請(qǐng)求中的數(shù)據(jù)在第二次請(qǐng)求中是不可用的,這意味在目標(biāo)資源中是不能訪問action實(shí)例、action錯(cuò)誤以及錯(cuò)誤等。 如果有某些數(shù)據(jù)需要在目標(biāo)資源中訪問, 一種方式是將數(shù)據(jù)保存到Session中, 另一種方式是通過請(qǐng)求參數(shù)來傳遞數(shù)據(jù)。,redirectAction結(jié)果類型(一),redirectAction結(jié)果類型的實(shí)現(xiàn)類是org.apache.struts2.dispatcher.ServletActionRedirectResult,該類是ServletDispatcherResult的子
31、類,因此我們也就可以判斷出redirectAction結(jié)果類型和redirect結(jié)果類型的后臺(tái)工作原理是一樣的,即都是利用HttpServletResponse的sendRedirect方法將請(qǐng)求重定向到指定的URL。 那么redirect與redirectAction有什么區(qū)別呢? 從結(jié)果類型的名字上,我們可以大致判斷出redirectAction結(jié)果類型主要是用于重定向到action。也就是說,在請(qǐng)求處理完成后,如果你需要重定向到另一個(gè)action,那么建議你使用redirectAction結(jié)果類型。 使用redirectAction結(jié)果類型可以簡(jiǎn)化對(duì)那些帶有名稱空間的action URL
32、的設(shè)置,ServletActionRedirectResult類在內(nèi)部使用ActionMapper來構(gòu)建訪問action的URL,這樣你就不需要在struts.xml配置文件中手動(dòng)去編碼訪問action的URL了.,redirectAction結(jié)果類型(二),redirectAction結(jié)果類型有二個(gè)參數(shù): actionName(default):指定重定向的action的名字。該參數(shù)是默認(rèn)參數(shù)。 namespace:指定action所屬的名稱空間,如果沒有使用這個(gè)參數(shù),那么默認(rèn)使用當(dāng)前的名稱空間。,redirectAction結(jié)果類型(三),plainText結(jié)果類型(一),plainTex
33、t結(jié)果類型可能不是很常用,但是它是一個(gè)非常有趣的結(jié)果類型,因?yàn)樗梢杂糜谳敵鯦SP或HTML的源代碼。想一想,你制作一個(gè)在線實(shí)例教程,用戶看完頁(yè)面效果后,想看看你的頁(yè)面如何編寫的,點(diǎn)擊你提供的“查看源代碼鏈接” ,整個(gè)頁(yè)面的源代碼就以頁(yè)面的形式在瀏覽器中顯示出來,這個(gè)功能是不是很貼心呢! 通常情況下,要想在瀏覽器中顯示一個(gè)JSP或HTML頁(yè)面的代碼,你必須對(duì)其中的標(biāo)記使用實(shí)體引用或字符引用的方式來做置換,這樣才能在瀏覽器中顯示頁(yè)面代碼。不過如果這樣做,一方面工作量太大,另一方面你的源文件也被破壞了。所以我們通常是編寫一個(gè)轉(zhuǎn)換程序,在頁(yè)面輸出時(shí),由程序讀取頁(yè)面的內(nèi)容,將其中的特殊字符轉(zhuǎn)換成對(duì)應(yīng)的
34、字符引用,然后再輸出到瀏覽器中。 在struts2中你不需要這樣去編寫這樣的程序了,直接使用plainText結(jié)果類型就可以實(shí)現(xiàn)輸出頁(yè)面源代碼的功能。,plainText結(jié)果類型(二),plainText結(jié)果類型有兩個(gè)參數(shù),如下所示: Location:指定要輸出原始內(nèi)容的頁(yè)面(JSP或HTML)。該參數(shù)是默認(rèn)的。 charSet:指定輸出頁(yè)面內(nèi)容時(shí)使用的字符編碼。這個(gè)字符編碼將被用作設(shè)置響應(yīng)類型(例如:Content-Type=text/plain;charset=GBK),以及使用Reader對(duì)象讀取文件時(shí)的編碼。 /myJspFile GBK 如果你在myJspFile.jsp中使用了中
35、文,那么需要設(shè)置charSet參數(shù)為GBK或者GB2312,否則在瀏覽器中顯示時(shí)會(huì)出現(xiàn)亂碼。,chain結(jié)果類型(一),Struts2框架支持配置多個(gè)Action組成一個(gè)鏈或者工作流來處理用戶的請(qǐng)求,而Action鏈的實(shí)現(xiàn),是通過攔截器ChainingInterceptor完成的。 ChainingInterceptor在源Action執(zhí)行完畢后,將源Action的用戶請(qǐng)求參數(shù)、值棧、session的數(shù)據(jù)賦值給目的Action,就是說,在執(zhí)行多個(gè)Action過程中,參數(shù)都是保留的。,chain結(jié)果類型(二),下面配置中,通過chain結(jié)果類型,將3個(gè)Action組成了一個(gè)鏈,共同完成一個(gè)用戶請(qǐng)
36、求。,chain結(jié)果類型(三),第一個(gè)Action的result定義為chain,并指向名為login的Action;該Action中result同樣指定type為chain,但是增加了actionName屬性和namespace屬性,actionName屬性指定目的Action的名稱,namespace屬性指定了目的Action所在的命名空間名稱,也就是定位該Action所在的package名稱。 第3個(gè)Action存在另外一個(gè)package中,也就是第2個(gè)Action的result中指定的命名空間中,該Action的result沒有指定type屬性,則使用默認(rèn)值dispatcher,即JS
37、P視圖。 該配置文件調(diào)用關(guān)系為createAccout-login-secure。在上述調(diào)用過程中,每個(gè)Action所屬的參數(shù)、值棧等數(shù)據(jù)通過攔截器被傳入下一個(gè)Action,直到最后一個(gè)Action執(zhí)行完成。,Login.jsp,ActionChain1_Action,ActionChain2_Action,ActionChain3_Action,Success.jsp,Stream結(jié)果類型示例,Stream類型的result一般是指將原始數(shù)據(jù)直接傳遞給HttpServletResponse,這種結(jié)果類型在用戶下載文件(例如PDF文件等)等情況下非常有意義。 配置stream類型的result
38、,一般可以指定下面幾個(gè)參數(shù): contentType:指定傳遞給瀏覽器的stream類型,默認(rèn)類型為text/plain. contentlength:數(shù)據(jù)流的字節(jié)長(zhǎng)度(用于瀏覽器顯示進(jìn)度條) contentDispostion:指定文件的內(nèi)容規(guī)格,默認(rèn)值為inline. inputName:數(shù)據(jù)流的屬性,默認(rèn)值為inputstream bufferSize:緩沖區(qū)容量,默認(rèn)為1024. 示例: image/jpeg imageStream filename=document.pdf 1024 ,全局結(jié)果(一),上述我們所配置的結(jié)果映射都是在action元素的內(nèi)部,這些結(jié)果只能被它外部的act
39、ion所使用,這樣的結(jié)果可以看成是局部結(jié)果。 在某些場(chǎng)景中,可能有多個(gè)action需要訪問同一個(gè)結(jié)果,例如在論壇系統(tǒng)中,用戶在發(fā)帖、回帖、搜索帖子時(shí)都需要先登錄,那么我們可以配置一個(gè)全局的login結(jié)果,這樣在action中就不需要再一一配置login結(jié)果了。 全局結(jié)果也是在包中定義的,在這個(gè)包中所有的action可以共享全局結(jié)果。全局結(jié)果也是使用result元素來配置,只不過不是在action元素中嵌套,而是在global-results元素中嵌套。,全局結(jié)果(二),當(dāng)請(qǐng)求/bbs/addArticle時(shí),ArticleAction的execute方法如果沒有返回login結(jié)果碼,那么框架將
40、首先在addArticle這個(gè)action的配置中查找嵌套的局部結(jié)果。 如果沒有找到匹配的局部結(jié)果,那么就在全局結(jié)果中查找,找到后,應(yīng)用redirectAction結(jié)果類型將請(qǐng)求重定向到/bbs/login!input.action.如果用戶登錄失敗,或者發(fā)貼失敗,Action返回error結(jié)果碼,那么全局結(jié)果中的error.jsp頁(yè)面將呈現(xiàn)給用戶。,動(dòng)態(tài)結(jié)果,所謂動(dòng)態(tài)結(jié)果,就是指在配置時(shí)你不知道要執(zhí)行哪一個(gè)結(jié)果,在運(yùn)行時(shí)刻才能確定執(zhí)行的結(jié)果。簡(jiǎn)單地說,就是在配置結(jié)果時(shí)使用了表達(dá)式,在運(yùn)行時(shí)刻,框架解析并計(jì)算表達(dá)式,根據(jù)表達(dá)式的值來確定要執(zhí)行的結(jié)果。 例如一個(gè)公司的內(nèi)部辦公系統(tǒng),它根據(jù)用戶登錄
41、的身份(普通雇員還是經(jīng)理)來決定用戶可瀏覽的資源。用戶登錄由LoginAction來處理,雇員可訪問資源由EmployeeAction來處理,經(jīng)理訪問資源由ManagerAction根據(jù)用戶權(quán)限的不同,將請(qǐng)求重定向到EmployeeAction或ManagerAction. public class EmployeeAction extends ActionSupport. public class ManagerAction extends ActionSupport.,Action類代碼,用于保存請(qǐng)求重定向到的action的名字,提供getter方法,在result映射中使用表達(dá)式訪問ne
42、xtAction屬性,判斷用戶是否是管理者,struts.xml配置文件,上述深色部分,我們使用$nextAction來獲取Action中的nextAction屬性的值,而這個(gè)值要在運(yùn)行時(shí)刻才能知道。在運(yùn)行時(shí)刻,計(jì)算出$nextAction的值后,然后由redirectAction結(jié)果類型將請(qǐng)求重定向到指定的action.,說明,在結(jié)果映射中,使用$nextAction語(yǔ)法訪問的屬性一定要在Action中存在,這種存在不是簡(jiǎn)單地定義一個(gè)實(shí)例變量就完了,而是要提供對(duì)應(yīng)的JavaBean風(fēng)格的getter方法。在JavaBean中,實(shí)例變量的名字和屬性(property)名可以是不同的,例如: p
43、rivate String name; public getUsername() return name; 在上述的代碼中,實(shí)例變量名是name,屬性名是username.使用$.語(yǔ)法訪問的是屬性名。,struts2中異常處理(一),Struts2通過攔截器對(duì)action拋出的異常進(jìn)行捕獲,這個(gè)攔截器就是: erceptor.ExceptionMappingInterceptor,在try語(yǔ)句中調(diào)用invocation.invoke(),invoke方法在內(nèi)部調(diào)用Action的方法,得到配置的異常映射的列表,在異常映射列表中,查找異常類型對(duì)
44、應(yīng)的結(jié)果代碼,struts2中異常處理(二),要使用struts2的聲明式異常處理,就需要配置ExceptionMappingInterceptor攔截器。 在struts2的默認(rèn)配置文件struts-default.xml中,ExceptionMappingInterceptor已經(jīng)配好 從struts-default包繼承的”子”包中的action都將使用默認(rèn)的攔截器棧defaultStack(除非action引用了其他的攔截器),而在這個(gè)攔截器棧中引用了exception攔截器(是defaultStack棧中第一個(gè)引用的攔截器)。因此,在默認(rèn)情況下,所有的action自然就引用了exce
45、ption攔截器,而不需要再配置它了。,struts2中異常處理(三),既然異常映射攔截器已經(jīng)為我們配置好了,那么剩下的工作就是使用exception-mapping元素來配置異常映射,將異常類型映射到指定的結(jié)果。 exception-mapping元素有二個(gè)屬性: exception:指定一個(gè)異常類型的完整類名, result:指定對(duì)該異常進(jìn)行處理的結(jié)果的名字。 Struts2框架提供了二種方式來聲明一個(gè)異常映射: 全局和局部的(針對(duì)一個(gè)特定的action). 與result映射的查找規(guī)則一樣,當(dāng)一個(gè)異常發(fā)生時(shí),exception攔截器將首先查找拋出異常的action中的局部攔截器映射,然后
46、再查找全局的異常映射。只要找到一個(gè)匹配的,那么對(duì)應(yīng)的結(jié)果就這被處理。,struts2中異常處理(四),struts2中異常處理(五),在上述的配置中,定義了三個(gè)異常映射,當(dāng)異常發(fā)生時(shí),框架的處理情況如下: Java.sql.SQLException異常將鏈接到/sqlExceptionAction.action; com.ibm.SecurityException異常將重定向到/login.action; 其他從java.lang.Exception繼承的異常將向用戶返回/exception.jsp頁(yè)面 ExceptionMappingInterceptor在捕獲到Action的方法拋出的異常
47、后,除了從異常映射的配置中查找對(duì)應(yīng)的結(jié)果名外,還會(huì)將下列兩個(gè)值放到值棧中,以便在結(jié)果頁(yè)面中訪問異常信息。 exception:異常對(duì)象本身。 exceptionStack:保存異常發(fā)生時(shí)的棧跟蹤信息。 在結(jié)果頁(yè)面中??梢允褂胹truts2的標(biāo)簽來訪問異常信息。例如 取出異常對(duì)象的描述信息。 取出異常發(fā)生時(shí)的棧跟蹤信息。,使用注解配置Action,注解(Annotation)是J2SE 5.0中提供的新特性,目前應(yīng)用已經(jīng)非常廣泛,其中的一個(gè)主要應(yīng)用就是代替?zhèn)鹘y(tǒng)的XML配置文件,使用注解來提供配置信息。 Struts2也提供了使用注解的方式來配置Action,這樣就不再需要struts.xml文件
48、,以實(shí)現(xiàn)零配置。 與Action2在org.apache.struts.config包中定義了4個(gè)與Action配置相關(guān)的注解類型,如下: Parentpackage:指定action所在的包要繼承的父包。 Namespace:指定action所屬的名稱空間。 Result:定義一個(gè)result映射。 Results:定義一組result映射。,ParentPackage注解的參數(shù),如果注解中只有一個(gè)名為value的參數(shù),或者有其他參數(shù),但其他參數(shù)都有默認(rèn)值,那么在為value參數(shù)設(shè)值時(shí)可以忽略value和等號(hào)(=),例如: ParentPackage(value=“struts-default”)和ParentPackage(“struts-default”)是一樣的,Namespace注解的參數(shù),例如:Namespace(“/secure”) 注意在名稱空間取名時(shí),要以斜杠(/)開頭。,Result注解的參數(shù),例如:Result(“/success.jsp”) 在這個(gè)例子中我們沒有使用n
溫馨提示
- 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年武漢大學(xué)中南醫(yī)院門診部勞務(wù)派遣制導(dǎo)醫(yī)招聘?jìng)淇碱}庫(kù)及完整答案詳解一套
- 2026年普定縣梓涵明德學(xué)校教師招聘?jìng)淇碱}庫(kù)(9名)及參考答案詳解
- 會(huì)議室開會(huì)制度
- 2026年重慶醫(yī)科大學(xué)附屬康復(fù)醫(yī)院關(guān)于黨政辦公室黨建、宣傳干事、醫(yī)保辦工作人員招聘?jìng)淇碱}庫(kù)參考答案詳解
- 2026年深圳市龍華區(qū)第三實(shí)驗(yàn)學(xué)校附屬善德幼兒園招聘?jìng)淇碱}庫(kù)完整參考答案詳解
- 中學(xué)教學(xué)質(zhì)量保證措施制度
- 2026年西安交通大學(xué)附屬小學(xué)招聘?jìng)淇碱}庫(kù)附答案詳解
- 2026年漯河市城鄉(xiāng)一體化示范區(qū)事業(yè)單位人才引進(jìn)備考題庫(kù)及參考答案詳解1套
- 2026年重慶護(hù)理職業(yè)學(xué)院(第一批)公開招聘工作人員備考題庫(kù)及一套完整答案詳解
- 中國(guó)人民銀行所屬企業(yè)網(wǎng)聯(lián)清算有限公司2026年度校園招聘26人備考題庫(kù)及完整答案詳解一套
- 2026天津市津南創(chuàng)騰經(jīng)濟(jì)開發(fā)有限公司招聘8人筆試備考試題及答案解析
- 2026年孝昌縣供水有限公司公開招聘正式員工備考題庫(kù)及一套答案詳解
- 《危險(xiǎn)化學(xué)品安全法》解讀與要點(diǎn)
- 智能家居系統(tǒng)設(shè)計(jì)規(guī)范指南(標(biāo)準(zhǔn)版)
- 2026海南交通投資控股公司秋招面筆試題及答案
- 2025年安徽理工大學(xué)馬克思主義基本原理概論期末考試模擬試卷
- 遼寧2017建設(shè)工程費(fèi)用標(biāo)準(zhǔn)
- DB13-T5385-2021機(jī)器人檢測(cè)混凝土抗壓強(qiáng)度技術(shù)要求
- 安全生產(chǎn)管理辦法與實(shí)施細(xì)則
- 《牛津書蟲系列 綠野仙蹤》電子插畫版英語(yǔ)教學(xué)課外讀物(含翻譯)
- 大學(xué)教材排查報(bào)告
評(píng)論
0/150
提交評(píng)論