




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
Struts2一、struts入門Struts2是基于Struts1和Webwork,以Webwork(支持更多表現(xiàn)層)為核心的。Struts1:只支持jsp表現(xiàn)層,不支持Freemarker和velocity;與servletAPI耦合嚴重;屬于侵入式設計。Struts2鼓勵基于M2模式(MVC設計模式)來開發(fā)程序--Web應用程序中通過前端控制器來實現(xiàn)MVC應用程序的模型。它是框架的表現(xiàn)層,是對MVC構架的具體實現(xiàn):1,視圖層(V)2,控制層(C)3,模型層(M):P5原理圖運行環(huán)境:下載Struts2框架,解壓,找到lib文件夾:存放Struts2核心庫和第三方插件庫核心JAR包:struts2-core-2.1.6.jarxwork-2.1.2.jarongl-2.6.11.jarfreemarker-2.3.13.jarcommons-logging-1.0.4.jarcommons-fileupload-1.2.1.jarstruts基本運行機制(Example1):web.xml:配置struts2的核心控制器FilterDispatcher,F(xiàn)ilterDispatcher用來攔截客戶端請求并把請求轉發(fā)到相應的Action類來處理。(只要web應用加載了FilterDispatcher就可以獲得整個struts2框架所提供的服務)。struts.xml:struts2框架的配置文件,主要用于配置業(yè)務邏輯控制器Action以及Action中result的定義、Bean配置、常量配置、包配置和攔截器配置。result的name屬性值與Action的返回值相對應。(也可用perties)login.jsp部分代碼<s:formaction="checkLogin"namespace="/login"><s:textfieldname="username"style="font-size:12px;width:120px;"label="登錄名稱"/><s:passwordname="password"style="font-size:12px;width:120px;"label="登錄密碼"/><s:submitvalue="登錄"/>web.xml代碼如下:<?xmlversion="1.0"encoding="UTF-8"?><web-app> <display-name>firstStruts2Project</display-name><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>注:<filter>元素用來指定要加載struts2框架的核心控制器FilterDispatcher;<filter-class>標簽配置struts2核心Filter的實現(xiàn)類;<filter-mapping>元素用來指定讓struts2框架處理用戶的哪些請求(URL),當它的子元素<url-pattern>的值是*時表示用戶的所有請求都使用此框架來處理。struts.xml配置如下:<struts><includefile="struts-default.xml"/><packagename="struts2_login"extends="struts-default"namespace="/login"> <actionname="checkLogin"class="act.LoginAction"method="checkLogin"> <resultname="success">/index.jsp</result> <resultname="login">/login.jsp</result> </action></package></struts>包含配置:<includefile="XXX.xml"/>避免代碼臃腫<includefile="struts-default.xml"/>是struts2默認的核心配置文件,它配置了struts2自身的攔截器、類型轉換、數(shù)據(jù)校驗。常量配置:它指定struts2框架的屬性,通過constant元素,如:<struts><constantname=”struts.i18n.reload”value=”GBK”/></struts>name:指定常量名字指定其他視圖配置:<resultname="success"type=”freemarker”>/XXX.ftl</result><resultname="success"type=”velocity”>/XXX.vm</result>包配置:對某包中所有Action的統(tǒng)一管理。<packagename=""extends="struts-default"namespace="">name屬性指定包名,extends指定該包繼承其他的包,它的值是另一個包的name;namespace定義了命名空間。二、攔截器攔截器是struts2的基石。原理:攔截器都是通過代理的方式調用的。請求到達servletDispatcher時,struts會查找配置文件并根據(jù)配置文件實例化相對的攔截器對象,將這些對象串成一個List,最后逐個調用列表中的攔截器。每個action請求都包裝在攔截器內部。servletDispatcher是webHttp請求的調度器,所有對Action的請求都將通過servletDispatcher調用。配置:配置攔截器:<interceptor>元素指定攔截器名和攔截器類:<interceptors><interceptorname=”攔截器名”class=”攔截器對應的Java類型”/><paramname=”參數(shù)名”>參數(shù)指</param></interceptors>可參考struts-default.xml中的攔截器配置攔截器棧:<interceptor-stackname=”攔截器棧名”><interceptor-refname=”攔截器名1”/><interceptor-refname=”攔截器名2”/><interceptor-refname=”攔截器棧1”/></interceptor-stack>默認攔截器要放在自定義攔截器之上,否則會將自定義攔截器覆蓋使用攔截器(棧):<interceptor-refname=”攔截器名”/><interceptor-refname=”攔截器棧名”/>如果使用了另外的攔截器(棧),需添加<interceptor-refname=”defaultStack”/>如果Action需要哪種功能,只需要在struts.xml中指定攔截器即可,這種插拔式的動態(tài)插入避免了方法的高度耦合和提高了Action的復用性。在執(zhí)行Action的execute()方法之前,struts會首先執(zhí)行在struts.xml中引用的攔截器。開發(fā)中只需要提供攔截器的實現(xiàn)類,并將其配置在struts.xml中。配置默認攔截器(棧):<default-interceptor-refname=”攔截器(棧)的名字”/>Name必須是屬性必須是存在的攔截器名字自定義攔截器:一個java類繼承AbstractInterceptor類,重寫intercept()方法intercept():是需要實現(xiàn)的攔截動作,返回一個字符串的邏輯視圖;包含一個ActionInvocation對象,它是通過框架傳遞過來的,通過該參數(shù)開發(fā)者可以得到相關聯(lián)的session對象,還有Action對象等。invoke():將控制權交給下一個攔截器,或轉給Action的execute()方法。程序例子用戶登錄攔截器代碼:publicclassLoginInterceptorextendsAbstractInterceptor{publicStringintercept(ActionInvocationai)throwsException{Mapsession=ai.getInvocationContext().getSession();//獲取session對象Stringusername=(String)session.get("user");if(username!=null&&username.length()>0){ returnai.invoke();}else{ ActionContextac=ai.getInvocationContext(); ac.put("popedom","您還沒有登錄,請登錄!"); returnAction.LOGIN;}}}struts.xml中攔截器的配置和使用代碼:使用<interceptor>元素定義攔截器通過<interceptor-ref>元素使用攔截器登錄請求Action部分代碼:publicclassDefaultActionextendsActionSupport{ publicStringexecute(){ returnSUCCESS;}}登錄jsp頁面部分代碼:<s:propertyvalue="popedom"/><s:form><s:textfieldlabel="用戶名"name="username"></s:textfield><s:passwordlabel="密碼"name="password"></s:password><s:submitvalue="提交"></s:submit></s:form>攔截器方法過濾:繼承MethodFiledInterceptor類,重寫doIntercept(ActionInvocationinvocation)在struts.xml中指定方法過濾攔截器:<interceptor-refname=”方法過濾攔截器”><paramname=”excludeMethods”>指定Action中不需被過濾的方法</param><paramname=”includeMethods”>指定Action中需要被過濾的方法</param></interceptor-ref>攔截器攔截順序:在execute()方法執(zhí)行前,配置在前的攔截器先起作用;在execute()方法執(zhí)行之后,后配置的攔截器將先起作用。攔截結果監(jiān)聽:一個類實現(xiàn)PreResultListener接口,并將該類手動注冊到攔截器內。實現(xiàn)PreResultListener接口時必須要實現(xiàn)beforeResult()方法,該方法中有參數(shù)result,這個參數(shù)是被攔截Action中的execute()方法的返回值。程序例子:攔截器監(jiān)聽類代碼:publicclassMyPreResultListenerimplementsPreResultListener{//實現(xiàn)抽象方法,定義處理Result結果之前的行為PublicvoidbeforeResult(ActionInvocationai,Stringresult){ System.out.println("攔截結果監(jiān)聽器執(zhí)行:返回視圖結果:"+result); }}攔截器部分代碼:publicStringintercept(ActionInvocationai)throwsException{ ai.addPreResultListener(newtmq.util.MyPreResultListener());//注冊監(jiān)聽器 System.out.println("execute方法執(zhí)行之前..."); Stringresult=ai.invoke(); System.out.println("execute方法執(zhí)行之后..."); returnresult; }在struts.xml中配置:三、Action和類型轉換Action是應用核心,稱為業(yè)務控制器Http請求參數(shù)通常直接封裝在Action中,把這些請求參數(shù)作為Action的屬性,并實現(xiàn)getXxx()/setXxx()方法。setXxx():Action把Http請求中的參數(shù)值賦給與之同名的屬性;getXxx():將Action中的屬性值輸出。ActionSupport:是一個工具類,實現(xiàn)了Action接口,還實現(xiàn)了Validatable接口。Validatable接口:定義了validata()方法,在Action中重寫該方法,在該方法中若校驗表單輸入域出現(xiàn)錯誤,則將錯誤添加到ActionSupport類的fieldErrors域中,然后通過OGNL表達式輸出錯誤信息。ActionContext:Struts2與ServletAPI完全分離,但是實現(xiàn)業(yè)務邏輯時,經常需要訪問Servlet中的對象如:session、request、application等,Struts2提供一個名為ActionContext的類,在Action中通過該類獲得ServletAPI。Action運行期間所用到的數(shù)據(jù)都保存在ActionContext中。創(chuàng)建和使用ActionContext:ActionContextac=ActionContext.getContext();ActionContext類的常用方法:方法名稱方法描述Objectget(Objectkey)通過參數(shù)key來查找當前ActionContext中的值MapgetApplication()返回一個application級的Map對象StaticActionContextgetContext()獲得當前線程的ActionContext對象MapgetParameters()返回一個包含所有HttpServletRequest參數(shù)信息的Map對象MapgetSession()返回一個Map類型的HttpSession對象voidput(Objectkey,Objectvalue)向當前ActionContext對象中存入名值對信息voidsetApplication(Mapapplication)設置application上下文voidsetSession(Mapsession)設置一個Map類型的session值程序例子:演示ActionContext如何訪問ServletAPIAction的部分代碼:publicclassLoginActionextendsActionSupport{ privateStringname; privateStringpwd; 省略get和set方法 publicStringcheckLogin(){ ActionContextac=ActionContext.getContext();//獲得ActionContext Mapapp=ac.getApplication(); ac.getSession().put("login",);//把登錄名放入session中 ac.getApplication().put("login",);//把登錄名放入application中 returnSUCCESS;}}配置struts.xml登錄頁面和顯示頁面(部分代碼如下):讀取session中的信息:歡迎<s:propertyvalue="#session.login"/>!讀取application中的信息:歡迎<s:propertyvalue="#application.login"/>!以上例子是通過ActionContext來訪問ServletAPI,是Struts2中Action間接訪問ServletAPI的方式,即間接訪問方式。Action直接訪問ServletAPI方式:直接訪問方式(IOC和非IOC)。非IOC方式:struts2提供名為ServletActionContext的輔助類來獲得ServletAPI。其靜態(tài)方法有:getPageContext()、getRequest()、getResponse()、getServletContext()如:HttpServletRequestrequest=ServletActionContext.getRequest();HttpServletResponseresponse=ServletActionContext.getResponse();request.getSession().setAttribute(“username”,”admin”);request.setAttribute(“password”,”1234”);更改上個程序例子:非IOC方式訪問ServletAPIAction部分代碼:publicclassNoIoCActionextendsActionSupport{ privateStringname; privateStringpwd; 省略get和set方法 publicStringcheckLogin(){ HttpServletRequestrequest=ServletActionContext.getRequest(); HttpSessionsession=request.getSession(); session.setAttribute("login",); returnSUCCESS; }}Action配置:全局結果對所有action均有效:<global-results><resultname=””>/XXX.jsp</result></global-results>重定向:<resulttype=”redirect”>/XXX.jsp</result>Struts2類型轉換:Struts2的內建類型轉換器可以自動完成數(shù)據(jù)類型轉換。四、Struts2標簽庫Struts2提供了高擴展性的標簽庫,滿足web頁面復雜性和多變性需求,提供主題和模板支持,支持Ajax。Struts2標簽庫支持JSTL和OGNL(對象導航語言)。jsp中使用標簽庫:在jsp頁面中通過<%@taglibprefix="s"uri="/struts-tags"%>導入標簽庫Struts2標簽庫分類(三大類):非UI標簽:數(shù)據(jù)標簽:進行數(shù)據(jù)存儲和處理action:bean:debug:i18n:include:param:property:set:text:url:data:邏輯控制標簽:用于條件和循環(huán)等流程控制if、elseif、else:通常一起使用,必須指定test屬性,該屬性用來獲得邏輯表達式返回的真假值,并且該屬性要和set標簽的name屬性值保持一致。<s:setname=”dengji”value=”85”/><s:iftest=”#dengji>=90”>優(yōu)秀</s:if><s:elseiftest=”#dengji>=80”>良好</s:elseif><s:else>不合格</else>append:將多個集合合并成一個集合merger:將多個集合合并成一個集合generator:將一個字符串解析成一個集合sort:對集合進行排序subset:用于截取集合的一部分iterator:將集合進行循環(huán)輸出支持Ajax標簽:UI標簽:主要用于生成HTML頁面元素表單標簽:用于生成HTML中的表單非標單標簽:包含一些常用的功能標簽五、Struts2校驗Struts2內建輸入校驗,無須書寫任何輸入代碼即可實現(xiàn)大部分輸入校驗并可實現(xiàn)客戶端校驗和服務器端校驗。Struts2允許重寫validata()方法和自定義校驗器實現(xiàn)對數(shù)據(jù)更有效控制。從客戶端輸入數(shù)據(jù),在服務器端使用數(shù)據(jù)數(shù)據(jù)要經過兩道工序:數(shù)據(jù)轉換數(shù)據(jù)校驗在一切輸入校驗之前進行類型轉換,轉換不成功的情況下再做數(shù)據(jù)校驗也無意義輸入校驗主要用于過濾異常數(shù)據(jù)。校驗分類:客戶端校驗:可以利用JavaScript腳本對用戶輸入進行基本校驗,但是以這種形式被發(fā)送到客戶端,說到底就是一些靜態(tài)代碼,可以查看更改源碼,容易繞過客戶端校驗。服務器端校驗:例如可以在Action的execute()方法中添加數(shù)據(jù)校驗代碼:publicStringexecute(){if(telephone.length!=8){returnINPUT;}else{returnSUCCESS;}}execute()方法是專門用于調用業(yè)務組件和返回邏輯視圖的,不建議用來進行數(shù)據(jù)校驗類型轉換也是基本的服務器端校驗,但通過類型轉換的數(shù)據(jù)不一定是合法數(shù)據(jù)如:age為200不符合常理。重寫validata()方法:在struts中專門用于校驗數(shù)據(jù)的方法是validata()方法。Validata():在execute()前執(zhí)行,validata()方法中發(fā)現(xiàn)有不合法輸入時,會調用其父類的addFieldError()方法記錄一個fieldError錯誤。開發(fā)者可以通過繼承ActionSupport類,重寫validata()方法來完成輸入校驗。例子如下:publicclassValidateActionextendsActionSupport{privateStringname;privateStringpass;省略get、set方法publicStringexecute(){returnSUCCESS;}publicvoidvalidate(){ if(getName()==null||getName().length()<6||getName().length()>15){ addFieldError("name","用戶姓名的長度不符合要求");} if(getPass()==null||getPass().length()<8||getPass().length()>20){ addFieldError("pass","密碼長度不符合要求");}} }重寫validataXxx()方法:Struts2框架還提供一個validataXxx()方法,專門校驗Action中Xxx()這個處理邏輯。例如邏輯為regist()的方法,就可以使用validataRegist()方法來校驗這個處理邏輯。注:用validataXxx()必須在struts.xml中指定method方法,否則默認執(zhí)行execute()。Struts2輸入校驗流程:Struts2內置校驗器:提高了系統(tǒng)靈活性,使校驗代碼可在多處被重復使用。Struts2提供了大量的校驗器,使用時只需對這些校驗器進行配置。如果要更復雜校驗,可以自定義校驗器。內置校驗器需要在一個校驗文件中配置,該配置文件命名<ActionName>-validation.xml校驗器配置風格:字段校驗器配置風格(以字段優(yōu)先)<validators><fieldname=”被校驗的字段”><field-validatortype=”校驗器類型名”><paramname=”參數(shù)名”>參數(shù)值</param>//可以有0到多個<messagekey=”I18Nkey”>校驗失敗時提示的消息</message></field></validators>非字段校驗器配置風格(以校驗器優(yōu)先)<validatortype=”校驗器類型名”><paramname=”fieldname>被校驗的字段</param><paramname=”參數(shù)名”>參數(shù)值</param>//可以有0到多個<messagekey=”I18Nkey”>校驗失敗時提示的消息</message></validator>常用內置校驗器:必填校驗器required必填字符串校驗器requiredstring字符串長度校驗器stringlengthparam:maxLength、minLength${a}到$范圍整數(shù)校驗器int日期校驗器dataparam:max、min表達式校驗器expression本身是一個非字段校驗器字段表達式校驗器fieldexpressionparam:expression郵件地址表達式email網(wǎng)址表達式url轉換校驗器conversion正則表達式校驗器regex自定義校驗器:繼承FieldValidatorSupport類,重寫validata()方法。注冊校驗器,配置校驗器P138國際化以K-V形式存儲國際化消息。命名規(guī)則:resourceName_language_perties(放在WEB-INF/classes)如:globalMessages_en_US.propertiesglobalMessage_GBK.propertiesnative2asii命令globalMessage_zh_CN.properties配置國際化(struts.xml):<constantname=”struts.custom.i18n.resources”value=”globalMessage”>輸出國際化消息:在頁面上:<s:text>標簽如<h1><s:textname=””/></h1>在表單的label:<s:textfieldname=”name”key=”loginName”/>在Action中:使用getText()方法在校驗配置文件中:通過message標簽的key屬性來實現(xiàn)帶占位符的國際化消息:如:login.success=歡迎{0},登錄成功Xxx.jsp:<s:textname=”login.success”><s:param><s:propertyvalue=”loginName”/></s:param></s:text>Struts2異常處理機制:傳統(tǒng)的異常處理方式需要編寫大量try…catch塊
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 貴州國企招聘2024貴州省水利水電工程咨詢有限責任公司招聘16人筆試參考題庫附帶答案詳解
- 軟件開發(fā)就業(yè)報告范文
- IC產業(yè)現(xiàn)況與趨勢
- 二零二五年度高端個人專利授權合同
- 二零二五年度汽車租賃合伙人入股協(xié)議
- 2025年度電力線路維修維保合同
- 農村宅基地互換與農業(yè)科技推廣協(xié)議書
- 二零二五年家庭房產析產分配與財產繼承合同
- 2025年度礦山股權轉讓及礦山礦產資源開發(fā)與環(huán)境保護合同
- 二零二五年度木質防火門市場拓展與品牌建設合同
- 2025年黑龍江林業(yè)職業(yè)技術學院單招職業(yè)適應性測試題庫審定版
- 中國家用通風電器具制造行業(yè)分析報告
- 生物-天一大聯(lián)考2025屆高三四省聯(lián)考(陜晉青寧)試題和解析
- 天津2025年天津市住房公積金管理中心招聘9人筆試歷年參考題庫附帶答案詳解-1
- 2025成人禮暨高三百日誓師校長演講稿-追夢不覺天涯遠 奮斗深感百日短
- 區(qū)間價格突破策略(TB版)
- 川教版六年級《生命.生態(tài).安全》下冊第1課《我們的閑暇時光》課件
- 汽車坡道玻璃雨棚施工方案
- 跨文化商務交際導論 課件 Unit 1 Culture
- 高效空調制冷機房智能控制系統(tǒng)技術規(guī)程
- 新高考英語讀后續(xù)寫——人物描寫高級表達素材
評論
0/150
提交評論