5.4 使用本地的資源文件
本節(jié)中將介紹另外兩個(gè)接口TextProvider和LocalProvider,它們都是為了使用本地的資源文件而設(shè)計(jì)的。
在Java中用戶語(yǔ)言和地區(qū)的信息被封裝在java.util.Local類中,而action則通過一個(gè)定義與com.opensymphony.xwork.LocaleProvider接口的方法判斷使用哪個(gè)Locale獲取用于顯示的信息文本,這個(gè)接口中只定義了一個(gè)方法:
Public Locale getLocale()
在ActionSupport中,這個(gè)方法的默認(rèn)實(shí)現(xiàn)為:通過調(diào)用AcitonContext.getContext ().getLocale()方法,利用ActionContext獲得locale的值(關(guān)于ActionContext的使用將在后面的章節(jié)詳細(xì)描述)。Struts2通過查詢HttpServletRequest對(duì)象并調(diào)用它的getLocale () 方法將Local與action調(diào)用聯(lián)系起來。
5.5 用ActionContext與Web容器發(fā)生聯(lián)系
在Action的接口定義中,excute()方法并沒有HttpServletRequest和HttpServletResponse參數(shù)也就是說Struts2的Action不用去依賴于任何Web容器(不像Struts 1必須在Web容器中才能運(yùn)行),不用與那些JavaServlet復(fù)雜的請(qǐng)求(Request)、響應(yīng)(Response)關(guān)聯(lián)在一起。但在Web應(yīng)用程序開發(fā)中,往往需要在Action里直接獲取請(qǐng)求(Request)或會(huì)話(Session)的一些信息,甚至需要直接對(duì)JavaServlet Http的請(qǐng)求、響應(yīng)操作。Struts2 提供了一個(gè)工具,用ActionContext對(duì)象來與Web容器發(fā)生聯(lián)系。
ActionContext(com.opensymphony.xwork.ActionContext)是Action執(zhí)行時(shí)的上下文,上下文可以把它看作是一個(gè)Map,它存放是Action在執(zhí)行時(shí)需要用到的對(duì)象,比如:上下文放有請(qǐng)求的參數(shù)(Parameter)、會(huì)話(Session)、Servlet上下文(ServletContext)、本地化(Locale)信息等。在每次執(zhí)行Action之前都會(huì)創(chuàng)建新的ActionContext,ActionContext是線程安全的,也就是說在同一個(gè)線程里ActionContext里的屬性是唯一的,這樣的Action就可以在多線程中使用。
5.6 高級(jí)輸入
應(yīng)用程序經(jīng)常使用JavaBean表示一個(gè)域中的對(duì)象,包括User、Address、Block在內(nèi)陸的類就是這種JavaBean很好的例子。而在Web程序中很大一部工作都是將信息填充到這些對(duì)象中去和從Bean中獲取數(shù)據(jù)信息在網(wǎng)頁(yè)中表現(xiàn)。本節(jié)將以一個(gè)完整的實(shí)例來說明Sturts 2在這些方面提供了那些便利。
5.7 使用Model-Driven
Struts2中,提供了兩種Action驅(qū)動(dòng)模式:Property-Driven(屬性驅(qū)動(dòng)),Model-Driven(模型驅(qū)動(dòng)的)。
模型驅(qū)動(dòng)的Action很像Struts1中的FormBean,在傳遞過程中有一個(gè)單獨(dú)的值對(duì)象來作為參數(shù)的載體,但在Struts2中這個(gè)值對(duì)象不必再繼承任何接口,只要普通JavaBean就可以充當(dāng)模型部分。很多情況下Bean的定義已經(jīng)存在了,而且是不能修改的(如從外部引入的類或者是已經(jīng)被大量代碼引用的類),如果必須實(shí)現(xiàn)某個(gè)接口才能作為FromBean,不得不再新增一個(gè)類,Struts2的這個(gè)改進(jìn)非常及時(shí)。
5.8 使用Property-Driven
Property-Driven 就是Action將直接用自己的字段來充當(dāng)FormBean的功能,在Struts2入門一章中,HelloReader這個(gè)例子就是采用的這種方法,在Action中直接包含了message屬性和它set、get方法。它一般用在頁(yè)面表單比較簡(jiǎn)單的情況使用,而且可以直接把屬性作為Action的字段,這樣就不用在另寫FormBean,減少了重復(fù)代碼。
上一節(jié)的例子如果使用Property-Driven方法,那就是將User與action類合并定義,把User中的屬性值直接轉(zhuǎn)移到action中去,在配置文件中也不必再增加modelDriven這個(gè)過濾器。
6 Result類型介紹
Result是在Action執(zhí)行完,一個(gè)結(jié)果返回后決定發(fā)生什么事的類。開發(fā)者可以自由的根據(jù)他們的應(yīng)用和環(huán)境的需要?jiǎng)?chuàng)建自己的Result類型。例如在Struts2中Servlet和Velocity結(jié)果類型已經(jīng)被創(chuàng)建用來顯示web應(yīng)用程序的畫面。本節(jié)將介紹Struts2 內(nèi)置的幾種Result類型和如何自定義開發(fā)Result。
6.1 內(nèi)置Result類型
所有的Result類型都實(shí)現(xiàn)了com.opensymphony.xwork.Result接口。這個(gè)接口是所有action執(zhí)行結(jié)果的通用接口,不管這個(gè)結(jié)果是用來顯示一個(gè)網(wǎng)頁(yè)還是產(chǎn)生一個(gè)E-mail,發(fā)送一個(gè)JMS消息還是別的。
在struts-default.xml中定義了系統(tǒng)提供的缺省Result類型,把它們映射為action配置中可以引用的名字,在action配置就就不用再使用長(zhǎng)類名直接使用這些別名就可以了。
6.2 默認(rèn)Result
Dispatcher Result是最常用的一種result,它也是Struts2默認(rèn)的result,又稱為通用resut。action執(zhí)行完后,請(qǐng)求會(huì)導(dǎo)向?qū)?yīng)的View,相當(dāng)于<jsp:forword>標(biāo)簽實(shí)現(xiàn)的跳轉(zhuǎn)功能。將同一個(gè)HTTP請(qǐng)求中的內(nèi)容分發(fā)至某一個(gè)頁(yè)面(dispatcher類型的result的使用)只要配置文件包含了struts-default.xml,而且package繼承了struts-default,那么使用dispatcher result并不需要其他設(shè)置。示例:
<result name="success" type="dispatcher">
<param name="location">foo.jsp</param>
</result>
6.3 頁(yè)面跳轉(zhuǎn) Result
Redirect Result與Dispatcher Result作用類似也是實(shí)現(xiàn)頁(yè)面跳轉(zhuǎn)。對(duì)上次的響應(yīng)將重定向到指定的位置,可以理解為在客戶端跳轉(zhuǎn)用戶又重新請(qǐng)求了一個(gè)新的URL。redirect是重新產(chǎn)生一個(gè)新的request,因此原來request保存的東西將不再有效,比如不能通過再requet.getAtrribute()取得對(duì)象,也不能取得action的實(shí)例、errors、field errors等。
Redirect Result與Dispatcher Result的區(qū)別于源于JSP篇中<jsp:forward>標(biāo)簽與response.redeiret()的區(qū)別。
6.4 創(chuàng)建action鏈
Chain Result是一種result 類型,它基于自己的攔截器stack(堆棧)和result調(diào)用一個(gè)action,這樣允許一個(gè)action附帶著原來的狀態(tài)將請(qǐng)求轉(zhuǎn)到目標(biāo)action
Struts2提供把多個(gè)Action按照預(yù)先定義好的順序或者流程鏈接起來的能力。這個(gè)特性通過給指定的Action設(shè)置一個(gè)Chain Result,然后通過一個(gè)ChainingInterceptor攔截目標(biāo)Action來實(shí)現(xiàn)。
6.5 整合各種View技術(shù)
Velocity、Freemarker、JasperReports、xslt這4種result都是為了整合不同的視圖技術(shù)而設(shè)計(jì)的。
1.Velocity Result:Velocity是一個(gè)基于java的模板引擎(template engine)。
2.Freemarker Result:Freemarker也是一個(gè)模板引擎,允許JavaServlet保持圖形設(shè)計(jì)同應(yīng)用程序邏輯的分離,這是通過在模板中密封HTML完成的。模板用servlet提供的數(shù)據(jù)動(dòng)態(tài)地生成 HTML。
3.JasperReports result:JasperReports是一個(gè)基于Java的開源報(bào)表工具,它可以在Java環(huán)境下像其他IDE報(bào)表工具一樣來制作報(bào)表。
4.XSLT Result:XSLT Result用XSLT來轉(zhuǎn)換action對(duì)象到XML。
6.6 自定義result
Struts2也允許用戶自定義自己的result類型,只要實(shí)現(xiàn)com.opensymphony.xwork2.Result接口就可以了。如代碼5-29所示,模擬了一種result作用是根據(jù)處理結(jié)果將給指用戶發(fā)送一份E-mail。這個(gè)result需要4個(gè)參數(shù)to、from、subject和body
7 攔截器(Interceptors)介紹
攔截器(Interceptor)是Struts2的一個(gè)強(qiáng)有力的工具,有許多功能都是構(gòu)建于它之上,如國(guó)際化、轉(zhuǎn)換器,校驗(yàn)等。Interceptor是Struts2的一大特色,在執(zhí)行action之前和之后可以使請(qǐng)求通過一個(gè)或多個(gè)Interceptor。多個(gè)連接器組合在一起實(shí)現(xiàn)某一個(gè)功能稱為interceptor鏈(Interceptor Chain,在Struts2中稱為攔截器棧Interceptor Stack)。interceptor鏈就是將interceptor按一定的順序聯(lián)結(jié)成一條鏈。在訪問被攔截的方法或字段時(shí),interceptor鏈中的interceptor就會(huì)按其之前定義的順序被調(diào)用。
7.1 Interceptor的原理
Struts2的interceptor實(shí)現(xiàn)相對(duì)簡(jiǎn)單。當(dāng)請(qǐng)求到達(dá)Struts2的ServletDispatcher時(shí),Struts2會(huì)查找配置文件,并根據(jù)其配置實(shí)例化相對(duì)的interceptor對(duì)象,然后串成一個(gè)列表(list),最后一個(gè)一個(gè)地調(diào)用列表中的攔截器,
7.2 內(nèi)置攔截器介紹
Struts2包含了許多內(nèi)置的interceptor,它們提供了很多核心功能和可選的高級(jí)特性。interceptor在struts.default.xml文件中被定義,而一些默認(rèn)的interceptor棧及interceptor的命名也被定義其中。框架中提供了很多實(shí)用的Interceptor,可以隨時(shí)使用它們的名字來調(diào)用這些interceptor,
7.3 使用內(nèi)置interceptor
本節(jié)將介紹幾種常用interceptor的用法:
1.使用timer為action即時(shí)
2.使用logger 為aciton提供日志
3.使用校驗(yàn)
4.準(zhǔn)備action
5.實(shí)現(xiàn)ModelDriven
6.token和token-session
7.4 內(nèi)置攔截器棧介紹
除了內(nèi)置的interceptor之外,struts.xml還包含了內(nèi)置的interceptor組合,可以通過具體的命名的interceptor棧來使用它們。
7.5 自定義攔截器
自定義一個(gè)攔截器需要3個(gè)步驟:
(1)自定義一個(gè)實(shí)現(xiàn)Interceptor接口的類。
(2)在strutx.xml中注冊(cè)上一步中定義的攔截器。
(3)在需要使用的Action中引用上述定義的攔截器,為了方便也可將攔截器定義為默認(rèn)的攔截器,這樣在不加特殊聲明的情況下所有的Action都被這個(gè)攔截器攔截。
8 小結(jié)
本文講述的是Struts2的核心構(gòu)成元素及其使用方法,使讀者對(duì)Sturts 2的體系結(jié)構(gòu)有了一個(gè)清晰的認(rèn)識(shí)。Struts2是一個(gè)開放的系統(tǒng),它的很多實(shí)現(xiàn)對(duì)用戶來說都是透明的,它們?cè)?/span>struts-default.xml 中配置,開發(fā)人員配置自己的元素在struts.xml中,這個(gè)文件是可以拆分并按用戶需要組織的。Struts2的核心部分由action、interceptor、result3個(gè)主要部分構(gòu)成,Interceptor是它最大特色。
聯(lián)系客服