動(dòng)力節(jié)點(diǎn)-及源碼源代碼struts2struts_第1頁
動(dòng)力節(jié)點(diǎn)-及源碼源代碼struts2struts_第2頁
動(dòng)力節(jié)點(diǎn)-及源碼源代碼struts2struts_第3頁
動(dòng)力節(jié)點(diǎn)-及源碼源代碼struts2struts_第4頁
動(dòng)力節(jié)點(diǎn)-及源碼源代碼struts2struts_第5頁
已閱讀5頁,還剩30頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、 Struts2授課:王勇 流行的MVC框架Struts2綱要Struts2概述Struts2與Struts1的差異掌握Struts2體系結(jié)構(gòu)掌握Struts2開發(fā)流程掌握Struts2常用配置 Struts2概述Struts2仍然是一個(gè)基于請(qǐng)求驅(qū)動(dòng)的MVC框架Struts2不是Struts1的升級(jí)Struts2與Struts1的體系結(jié)構(gòu)差距非常大Struts2采用了另一個(gè)MVC框架WebWork的核心設(shè)計(jì)Struts2是WebWork的一個(gè)升級(jí)Struts2更加優(yōu)秀松耦合設(shè)計(jì)以后會(huì)講到Struts2與Struts1的對(duì)比Action類Struts1的Action必須繼承Struts2的Act

2、ion可以不繼承Action的線程安全Struts1是單例的,存在線程安全問題Struts2是多例的,沒有線程安全問題Struts2與Struts1的對(duì)比Servlet API依賴Struts1中的Action需要依賴Servlet APIStruts2中的Action可以不用依賴Servlet API可測試性Struts1的Action測試性不好,因?yàn)樾枰萜髦С?,因?yàn)樵贏ction依賴于Servlet APIStruts2的Action測試性好,可以直接寫一個(gè)單元測試完成,因?yàn)镾truts2的Action是一個(gè)POJO對(duì)象Struts2與Struts1的對(duì)比ActionForm方面Stru

3、ts1收集數(shù)據(jù)通常使用ActionForm,而ActionForm還需要繼承,使ActionForm的復(fù)用率降低,另外項(xiàng)目非常大會(huì)建立很多ActionForm給維護(hù)帶來工作量,但也有好處數(shù)據(jù)的收集和控制進(jìn)行了很好的分離Struts2可以不用使用ActionForm來收集數(shù)據(jù),直接讓Action來收集數(shù)據(jù),但也可以采用類似ActionForm的方式來收集數(shù)據(jù),Struts2采用了ModelDriven的方式來支持類似Struts1的ActionForm方式,所以Struts2更靈活表達(dá)式語言方面Struts1中我們通常使用JSTLStruts2中我們可以使用功能更加強(qiáng)大的表達(dá)式語言O(shè)GNL(Ob

4、ject Graph Notation Language )Struts2與Struts1的對(duì)比類型轉(zhuǎn)換Struts1中對(duì)ActionForm的類型轉(zhuǎn)換采用commons-beanutils工具,而定義完成一個(gè)轉(zhuǎn)換器,將對(duì)所有的ActionForm起作用,而不能針對(duì)某個(gè)一ActionForm來配置是否使用此類型的轉(zhuǎn)換器Struts2使用OGNL進(jìn)行類型轉(zhuǎn)換,功能更加強(qiáng)大,轉(zhuǎn)換過程可以針對(duì)某個(gè)類型進(jìn)行配置校驗(yàn)Struts1采用覆蓋ActionForm中的validate()方法或采用驗(yàn)證框架commons validator來驗(yàn)證Struts2支持使用覆蓋validate()方法來完成驗(yàn)證,也支

5、持驗(yàn)證框架XWork來驗(yàn)證Struts2與Struts1的對(duì)比Action執(zhí)行控制Struts1固定不變的Struts2通過攔截器,可以改變執(zhí)行流程,靈活配置的Struts2架構(gòu)圖Struts2簡單執(zhí)行流程所有請(qǐng)求被Struts2核心控制器FilterDispather攔截根據(jù)ActionMapper提供的信息決定如何進(jìn)行下一步ActionMapper主要依賴Struts2的配置文件struts.xml接下來為每個(gè)Action創(chuàng)建Action代理類ActionProxy執(zhí)行ActionProxy的execute()方法在執(zhí)行execute()方式時(shí)會(huì)逐個(gè)執(zhí)行Struts2中的攔截器執(zhí)行完成攔截

6、器后才會(huì)真正執(zhí)行目標(biāo)Action目標(biāo)Action需要返會(huì)轉(zhuǎn)向的視圖名稱ActionProxy取得視圖名稱對(duì)象Result完成轉(zhuǎn)向生成resposne對(duì)象完成本次請(qǐng)求Struts2,第一個(gè)示例完成一個(gè)用戶登錄的示例登錄頁面,包含用戶名和密碼輸入域驗(yàn)證用戶名和密碼等于bjpowernode,轉(zhuǎn)向登錄頁面否則轉(zhuǎn)向失敗頁面開發(fā)過程在MyEclipse中創(chuàng)建web項(xiàng)目在apache網(wǎng)站上下載Struts2將struts2中相關(guān)的依賴包拷貝到WEB-INF/lib目錄下,依賴包可以全部拷貝,也可以有選擇的拷貝,如只使用Struts2的基本功能只拷貝如下依賴包即可commons-logging-1.0.4.

7、jarfreemarker-2.3.15.jarognl-2.7.3.jarstruts2-core-.jarxwork-core-2.1.6.jarcommons-fileupload-1.2.1.jarStruts2,第一個(gè)示例在web.xml文件中配置Struts2的核心控制器FilterDispather,可以參見Struts2下的blank項(xiàng)目,配置如下 struts2 org.apache.struts2.dispatcher.FilterDispatcher struts2 /* Struts2,第一個(gè)示例需要?jiǎng)?chuàng)建的文件Jsp登錄頁面login.jsp成功頁面login_succ

8、ess.jsp失敗頁面login_failure.jsp創(chuàng)建一個(gè)ActionLoginAction.javaStruts2不需要ActionForm將Action配置到struts.xml文件中Struts2,第一個(gè)示例login.jspInsert title here用戶:密碼:Struts2,第一個(gè)示例login_success.jspInsert title here $username ,用戶登錄成功Struts2,第一個(gè)示例login_error.jspInsert title here登錄失敗Struts2,第一個(gè)示例LoginAction.javapackage com.bjp

9、owernode.struts2;/* * 登錄Action,提供一個(gè)方法,缺省方法名叫做execute()沒有參數(shù)返回值為字符串 * * 關(guān)于其他方法名的情況以后會(huì)講到 * author Administrator * */public class LoginAction private String username;private String password;public String getUsername() return username;public void setUsername(String username) this.username = username;publ

10、ic String getPassword() return password;public void setPassword(String password) this.password = password; public String execute() throws Exception if (bjpowernode.equals(username) & bjpowernode.equals(password) return “success; else return “error; Struts2,第一個(gè)示例struts.xml/login_success.jsp/login_err

11、or.jspStrut2攔截器Struts2引入了攔截器攔截器是AOP的一種體現(xiàn)方式使用攔截器對(duì)代碼沒有侵入性使用攔截器可以動(dòng)態(tài)的增加或減少功能使用攔截器使軟件設(shè)計(jì)耦合度更加松散Struts2中Action的生命周期如下:Struts2主要攔截器攔截器所在包erceptor攔截器名稱對(duì)應(yīng)的類作用autowiringActionAutowiringInterceptor與spring集成時(shí),Struts2可以自動(dòng)訪問Spring IoC中的BeanconversionErrorStrutsConversionErrorInterceptor負(fù)責(zé)類型轉(zhuǎn)換錯(cuò)誤cookieCookieIntercep

12、tor負(fù)責(zé)cookie處理createSessionCreateSessionInterceptor創(chuàng)建HttpSession對(duì)象debuggingDebuggingInterceptor在開發(fā)模式下該攔截器會(huì)提供更多的調(diào)試信息exceptionExceptionMappingInterceptor負(fù)責(zé)異常的處理fileUploadFileUploadInterceptor負(fù)責(zé)文件上傳i18nI18nInterceptor負(fù)責(zé)國際化loggerLoggingInterceptor負(fù)責(zé)Action的日志記錄Struts2主要攔截器攔截器名稱對(duì)應(yīng)的類作用modelDrivenModelDriven

13、Interceptor用于模型驅(qū)動(dòng)的攔截器paramsParametersInterceptor將表單中的參數(shù)設(shè)置到Action屬性上scopeScopeInterceptor將Action的狀態(tài)設(shè)置到HttpSession或ServletContextservletConfigServletConfigInterceptor通過此攔截器讓Action可以直接訪問Serlet APItimerTimerInterceptor輸出Action的執(zhí)行時(shí)間tokenTokenInterceptor檢查Action中的Token,防止重復(fù)提交workflowDefaultWorkflowInterce

14、ptor負(fù)責(zé)調(diào)用Action中的validate方法自定義攔截器的實(shí)現(xiàn)Struts2提供了非常多的攔截器,通常情況下可以滿足我們的項(xiàng)目需求Struts2的攔截器提供了相應(yīng)的擴(kuò)展機(jī)制,我們可以實(shí)現(xiàn)自己的攔截器在Action執(zhí)行前記錄日志、在Action執(zhí)行前進(jìn)行安全性檢查等主要開發(fā)步驟實(shí)現(xiàn)Intercepter接口或繼承AbstractInterceptor抽象類將實(shí)現(xiàn)的攔截器配置到struts.xml文件中日志記錄攔截器MyLogInterceptor權(quán)限檢查攔截器MySecurityInterceptor攔截器棧,是多個(gè)攔截器的集合如果為某個(gè)Action指定了攔截器,那么Struts2的默認(rèn)

15、攔截器將會(huì)失效,必須顯示的再次調(diào)用系統(tǒng)默認(rèn)的攔截器如果所有Action都需要使用相同的攔截器,那么如何做呢?定義默認(rèn)攔截器package和namespaceStruts2采用package來管理Action和攔截器,每個(gè)package中可以放多個(gè)Action和攔截器,struts配置文件中的package可以理解為java中的package,主要為了統(tǒng)一管理package標(biāo)簽主要涉及的屬性name,包的名字,必填項(xiàng),可以是任何合法的名稱extends,此屬性可選,指可以繼承其他包,這個(gè)繼承和java中的繼承是一樣的,指繼承其他包相關(guān)的定義(Action定義、攔截器定義)被繼承的為父packag

16、e,父package的定義必須在子package的前面namespace,此屬性可選,默認(rèn)為“”,定義包的命名空間,命名空間相當(dāng)目錄,如果有相同的Action就可以放到不同的目錄里,如果一個(gè)Action沒有命名空間那么它的訪問方式直接就是action的名稱,如登錄示例訪問方式為login.action,如加入了命名空間,訪問方式為命名空間+action,如命名空間為user,那么訪問url為user/login.action常用配置項(xiàng)介紹Struts2包含兩個(gè)配置文件一個(gè)是struts.xml,這是我們用到的,另外struts2還有一個(gè)perties配置文件,該配置文件中包含了struts2框

17、架中常用的屬性,我們可以通過將屬性配置到perties文件來滿足我們開發(fā)的需求,最后將perties文件拷貝到classpath路徑下即可,perties具體屬性可以參見struts2的幫助文檔docstrutsproperties.html常用配置項(xiàng)介紹struts.devMode,此配置項(xiàng)可以取值為true和false,默認(rèn)為false,在開發(fā)階段建議設(shè)置為true,這樣struts2會(huì)給出更加全面友好的提示,但系統(tǒng)運(yùn)行階段最好設(shè)置為falsestruts.configuration.xml.reload,此配置項(xiàng)可以取值為true和false,默認(rèn)為false,建議開發(fā)階段設(shè)置為true

18、,這樣當(dāng)修改了struts.xml配置文件struts2會(huì)立即加載,會(huì)給開發(fā)帶來便利性,但系統(tǒng)運(yùn)行階段最好設(shè)置為false常用配置項(xiàng)介紹常用配置項(xiàng)介紹struts.i18n.reload,此配置項(xiàng)可以取值為true和false,默認(rèn)為false,建議開發(fā)階段設(shè)置為true,這樣在修改了國際化資源文件后會(huì)馬上加載,但系統(tǒng)運(yùn)行階段最好設(shè)置為falsestruts.i18n.encoding,此配置項(xiàng)主要設(shè)置編碼集,默認(rèn)為UTF-8,可以改變此配置為GB18030、GBK或GB2312,相當(dāng)在請(qǐng)求時(shí)調(diào)用了HttpServletRequest的setCharacterEncoding方法另外:如果不喜

19、歡使用perties文件,也可以將配置項(xiàng)放到struts.xml文件中,采用標(biāo)簽,如:,perties配置文件主要是為了和WebWork兼容,所以一般建議配置項(xiàng)都放到struts.xml文件中Struts2對(duì)團(tuán)隊(duì)開發(fā)的支持、 Action和ModelDriven接口Struts2支持多個(gè)配置文件在團(tuán)隊(duì)開發(fā)過程中如果同時(shí)修改一個(gè)配置文件,勢必造成一些修改沖突Struts2可以使用多個(gè)配置文件來解決團(tuán)多來發(fā)的修改沖突,因?yàn)榉纸鉃槎鄠€(gè)配置文件給維護(hù)也帶來了方便性Action接口Struts2為了規(guī)范開發(fā)提供了一個(gè)Action接口,此接口中定義了一些常量,這樣會(huì)使開發(fā)更加規(guī)范,見示例ModelDriv

20、en接口在Struts1中有ActionForm的概念,采用ActionForm收集頁面的數(shù)據(jù),在Struts2中也提供了類似的功能,使用此功能必須實(shí)現(xiàn)ModelDriven接口,使用Struts2開發(fā)很少會(huì)使用此功能,也就是模型驅(qū)動(dòng)方式,因?yàn)榇朔绞叫枰⒍嘤嗟念悾@樣會(huì)增加維護(hù)量,通常采用在Action中提供getter和setter方法,也就是屬性驅(qū)動(dòng)方式來收集數(shù)據(jù),見示例Struts2中的Action如何訪問Servlet API因?yàn)镾truts2的Action沒有和Servlet API緊密耦合,這樣會(huì)提高可測試性,使Struts2中Action成為了一個(gè)真正的POJO但如何來訪問S

21、ervlet API呢?可以通過ActionContext,常用方法Object get(Object key),相當(dāng)于request.getAttribute(String key)Map getApplication(),模擬ServletContext對(duì)象Map getParameters(),取得所有的請(qǐng)求參數(shù),同request.getParameterMap()Map getSession(),模擬HttpSession對(duì)象Action getContext(),返會(huì)ActionContext實(shí)例Struts2中的Action如何訪問Servlet API可以通過如下接口訪問Serv

22、letContextAware,實(shí)現(xiàn)此接口可訪問ServletContextServletRequestAware,實(shí)現(xiàn)此接口可訪問HttpServletRequestServletResponseAware,實(shí)現(xiàn)此接口可訪問HttpServletResponse也可以直接使用ServletActionContext直接訪問Servlet API可以不用接口,ServletActionContext提供了一些靜態(tài)方法static PageContext getPageContext(),得到PageContextstatic HttpServletRequest getRequest(),得到

23、HttpServletRequeststatic HttpServletResposne getResponse(),得到HttpServletResponsestatic ServletContext getServletContext(),得到ServletContext處理結(jié)果類型Struts2支持的處理結(jié)果類型chaindispatcherfreemarkerhttpheaderredirectredirect-actionstreamvelocityxsltplaintext參見:docsresult-types.html處理結(jié)果類型局部結(jié)果類型,局部結(jié)果類型只能被當(dāng)前的Action

24、訪問全局結(jié)果類型,全局結(jié)果類型可以被所有的Action訪問注:和Strut1中的局部ActonForward全局ActionForward是一個(gè)意思默認(rèn)ActionStruts2的類型轉(zhuǎn)換器為什么需要類型轉(zhuǎn)換器,因?yàn)閺谋韱翁峤贿^去的數(shù)據(jù)都是字符串,而Java是強(qiáng)類型的,所以需要提供相應(yīng)的機(jī)制將字符串轉(zhuǎn)換成相應(yīng)的類型,這樣會(huì)給開發(fā)帶來方便性Struts2的類型轉(zhuǎn)換器不同Struts1Struts1的類型轉(zhuǎn)換器采用commons-beanUtils工具包Struts2的類型轉(zhuǎn)換器采用OGNL實(shí)現(xiàn)所有的MVC框架通常都會(huì)提供類型轉(zhuǎn)換機(jī)制Struts2的類型轉(zhuǎn)換器我們?cè)撊绾螌?shí)現(xiàn)呢?繼承StrutsTypeConverter抽象類重寫convertFromString和convertToString方法注冊(cè)轉(zhuǎn)換器局部類型轉(zhuǎn)換器(MyActionNperties)全局類型轉(zhuǎn)換器(perties)采用JDK1.5注解Struts2對(duì)文件上傳的支持Struts2上傳默認(rèn)采用commons-fileu

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論