struct2視頻-struts godyang教學(xué)一、準(zhǔn)備工作及實例_第1頁
struct2視頻-struts godyang教學(xué)一、準(zhǔn)備工作及實例_第2頁
struct2視頻-struts godyang教學(xué)一、準(zhǔn)備工作及實例_第3頁
struct2視頻-struts godyang教學(xué)一、準(zhǔn)備工作及實例_第4頁
struct2視頻-struts godyang教學(xué)一、準(zhǔn)備工作及實例_第5頁
已閱讀5頁,還剩53頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

一、準(zhǔn)備工作及解壓struts-2.1.6-all.zip struts2-core-2.1.6.jar:開發(fā)的類freemarker-2.3.13.jar:struts2的UI的模板使用freemarker編commons-logging-1.0.4.jar:xwork-2.1.2.jar:xwork類庫,struts2特別需要說明的是目前strust2的版本是struts-2.1.6,它作為2.1X的正式版。特別要注意導(dǎo)入commons-fileupload-1.2.1.jarjarReqontextjar包將會(1.web.ml主要完成對StrutsPrepareAndExecuteFilter的配置(在以前的版本中是對FilterDispatcher配置,新版本同樣支持用FilterDispatcher配置),它的實質(zhì)是一個過濾器,它負(fù)責(zé)初始化整個Struts框架并且處理所有的請求。這個過濾器可以包括一些初始化參數(shù),有的參數(shù)指定了要加載哪些額外的xml配置文件,還有的會影響struts框架的行為。除了StrutsPrepareAndExecuteFilter外,Struts還提供了一個ActionContexCleanUp類,它的主要任務(wù)是當(dāng)有其它一些過濾器要一個初始化好了的struts再包括其它一些配置文件。在通常的應(yīng)用開發(fā)中,我們可能想為每個不同的模塊單獨配置一個struts.xml文件,這樣也利于管理和。這也是我們要配置的主要文件。需在pertieskeyvalue即可。屬性文件可以放在任何一個包含在classpath中的路徑上,但是通常我們都把它放在/WEB-INF/classes下面。我們可以在perties此文件是struts2框架默認(rèn)加載的配置文件,它定義了struts2一些bean和器,它會自動包含(includedstruts.xml<packageextends="struts-default">),并為struts2-core.jarMyEclipse提示xml信當(dāng)我們在編寫struts.xml時,發(fā)現(xiàn)eclipse并不會給出幫助提示,那是因為MyEclipse默認(rèn)并不支持struts2[window][referenes][MyElipse][ileslocation文件struts2-core-2.1.6.jar中可以得到KeyType選擇URI,Keystruts-2.0.dtd文件中文檔聲key,ContentAssistalt+/”步驟一,新建myStruts2項目,并導(dǎo)入struts2的六個基本jar包。步驟立LoginAction文件,主要代碼如下:packageimportpublicclassLoginActionimplementsActionprivateStringprivateStringpublicStringexecute()throwsExceptionif(username.equals("struts2"))return}elsereturn}}} <?xmlversion="1.0"encoding="UTF-8"<!DOCTYPEstruts"-//ApacheSoftwareFoundation//DTDStrutsConfiguration2.0//EN"""><packagename="myFirst"namespace="/"extends="struts-<actionname="login"<result<result“l(fā)ogin.action”login.jsp<formaction=...>name戶名:<inputtype="text:<inputtype="password"<inputtype="submit"<%@pagelanguage="java"import="java.util.*"pageEncoding="UTF-<%@tagliburi="/struts-tags"prefix="s"登錄失敗,錯誤的用戶名:<s:property說明:使用了庫,在struts2中使用庫非常簡單,只需要像上面那樣導(dǎo)入庫便可以使用所有的struts2的所有<body<?xmlversion="1.0"encoding="UTF-<web-appid="WebApp_9"version="2.4" xmlns:xsi=" 說明:注釋掉的部分為以前2.1.4版本中用的filter類。StrutsPrepareAndExecuteFilter類簡要分析執(zhí)行流程當(dāng)輸入.../login.jspjsp頁面填寫完相關(guān)信息并提交給login.action時它會首先被在web.xml中配置的過濾器到過濾器會去查找strust.xml文件并結(jié)合namespace查找名為login的action,查找到此action便交給其處理,LoginAction會執(zhí)行execute方法,并返回結(jié)果result(resultstruts.xmlactionresultaction開啟struts2自帶的開發(fā)模式常加如下內(nèi)容:<constantname="struts.configuration.xml.reload"value="true這指定WEB應(yīng)用的編碼集,相當(dāng)于調(diào)用HttpServletRequest.setCharacterEncodint方法,如果使用了velocity或freemarker,它也用于指定輸出的編碼格式--><constantname="struts.i18n.encoding"value="UTF-8"<constantname="struts.action.extension"value="action"<!--設(shè)置瀏覽器是否緩存靜態(tài)內(nèi)容,建議:開發(fā)階段關(guān)閉,運行時開啟<constantname="struts.serve.static.browserCache"value="false"<!--當(dāng)struts.xml配置文件修改后,系統(tǒng)是否重新加載該文件,開發(fā)階段打開此功能<constantname="struts.configuration.xml.reload"value="true"<!--開發(fā)提示:出錯時打印更詳細(xì)的信息<constantname="struts.devMode"value="true"指定請求的后綴可以是.do或.action<constantname="struts.action.extension"value="do,action"注意:在struts2.1.6版本中存在一個bug:即配置了struts.i18n.encoding常量也不能解決中文亂setCharacterEncoding()方法進(jìn)行編碼設(shè)置。解決此bugfilter,并在doFilterrequest.setCharacterEncoding(“UTF-8”);在以后的2.1.8版本中解決了此問題及2.1.6中存在的bug,2.1.8 .asm.vo.User類中,然后在LoginAction中提供User對象及相應(yīng)的get/set方法?,F(xiàn)在需要注意的是在login.jsp中會有如下的修改:戶名:<inputtype="text:<inputtype="password"關(guān)鍵就是改掉name屬性值。其它基本無變動。后話:假如此此User對象并不能和Model層的相應(yīng)對ModelModelCopy上面的myStruts2Vo項目,改名為myStruts2Model項目。重點是修改LoginAction,修改后的主要packageimportimportimportpublicclassLoginActionimplementsAction,ModelDriven<User>privateUseruser=newpublicStringexecute()throwsExceptionif(user.getUsername().equals("struts2"))return}elsereturn}}publicUsergetModel()return}}struts2executeservletAPI,servlet二、struts.xml配置及例,strtus-struts.ml,prtiesstruts.i18n.encoding=UTF-8的配置為例進(jìn)行說明:struts.xml<constantname="struts.i18n.encoding"果我們在表單中輸入中文,其結(jié)果是會出現(xiàn)亂碼。解決此問題參看[一.7的注意]。這是struts2.1.6中bug,2.1.8已解決此問題。是 Namespace否否

下面我們建立struts2package項目來進(jìn)行package相關(guān)測試:<astruts.xml<packagename="tt1"namespace="/test1"extends="struts-<actionname="test1"<result<packagename="tt2"namespace="/test2"extends="struts-<actionname="test2"<result<a 址和action的對應(yīng)關(guān)系,所以當(dāng)我們要想一個action所關(guān)聯(lián)到的jsp文件時,應(yīng)該用namespace+action的name關(guān)于它的內(nèi)容測試可以參考struts2package項目。<constantname="stru able.SlashesInActionNamesvalue="true"/這樣配置后就<packagename="tt3"extends="struts-<actionname="test3/test3"<result然后輸入<ahref="<%=path%>/test3/test3.action">test3</a><br>地址就可以了namespacetest/test/test.actionnamespaceaction的name不能找到也之完全對應(yīng)的action,它會再到依次追溯到中查找,即是說它會仍找不到,它就會到namespace="/"對應(yīng)的包下查找名為test的action,如果仍找不到,它就會去默認(rèn)的namespace下查找名為test的action,如果找到則執(zhí)行此action。另外,namespace也可以追溯到查找、"/"下查找、默認(rèn)namespace下查找。人所寫的action中可能出現(xiàn)重名的現(xiàn)象,這樣當(dāng)項目合并時就會出現(xiàn)。而有了namespace可以在項目開發(fā)時由項目經(jīng)理給每一個人分不同的namespace,這樣每個開發(fā)只需要保證自己所寫的action,namespace的問題:當(dāng)我們?yōu)閍ction配置了namespace時此action的形式總會是如下形式:.../webappname/xxx/yyy/ActionName.actionactionjsp如想在此jsp頁面寫,一定要寫絕對路徑,因為相對路徑是相對.../webappname/xxx/yyy/,而如果以后我們修改了action的namespace時,相對路徑又要變,所以不能寫成相對路徑。以下介紹myeclipsejsp,Stringpath=request.getContextPath();StringbasePath=我們寫絕對路徑可以參此內(nèi)容。還可以參<head>下的<basehref="<%=basePath%>"來完成絕對<packagename="jack"namespace="/jack"extends="struts-<actionname="test4"<result:<ahref="<%=path%>/jack/test4.action">test4</a>這樣便可以到了開發(fā)的東西所關(guān)聯(lián)到的頁面需限才能被。由于多為tomcat中的內(nèi)容,下面只列出步驟。 <?xmlversion='1.0'encoding='utf-<role<role<userusername="jack"password="jack"<userusername="tom"password="tom"<realm-name>inputauthenticationmessage</realm-這樣配置完成后,當(dāng)我們.../jack中的任何內(nèi)容都會要求輸入認(rèn)證信息,認(rèn)證時輸6.初識是在器的幫助下實現(xiàn)的。每一個器都是獨立裝載的(pluggable),我們可以根據(jù)實際的需要為每一個action配置它所需要的器。<packagename="myFirst"namespace="/"extends="struts-<interceptorname="timer"class="erceptor.TimerInterceptor"/><interceptorname="params"class="erceptor.ParametersInterceptor"/><actionname="login"<result<result首先在package中定義了兩個器,然后在loginaction中了這兩個器,需要說明的是這里使用的器都是系統(tǒng)自帶的extends所繼承的struts-default中就包含了很多也包括我們這里所用的器但如果在此action中不使用params器將會報空指針錯因為params空指針錯雖然extends繼承的strust-default自帶有params器,但是當(dāng)我們自己了器時,<interceptor-refname="defaultStack"/>來繼續(xù)使用struts-defalut的器。補(bǔ)充:由于上<interceptor-stack<interceptor-refname="timer"<interceptor-refname="params"然后再在action<interceptor-refname="timer_param"/>”,效果和分別兩個是一interceptor-stack方式。packageimportpublicclassCRUDActionextendsActionSupportpublicStringadd()return}publicStringdel()return}publicStringupdate()return}publicStringquery()return}}<packagename="crud"extends="struts-default"<actionname="add"class="com.asm.CRUDAction"<result<actionname="del"class="com.asm.CRUDAction"<result<actionname="update"class="com.asm.CRUDAction"<result<actionname="query"class="com.asm.CRUDAction"<result<includeString<ahref="<%=path%>/crud/add.action">添加數(shù)據(jù)<ahref="<%=path%>/crud/del.action">刪除數(shù)據(jù)<ahref="<%=path%>/crud/query.action">查詢數(shù)據(jù)<ahref="<%=path%>/crud/update.action">修改數(shù)據(jù)<actionname="op"<result<ahref="<%=path%>/crud/op!add.action">添加數(shù)據(jù)<ahref="<%=path%>/crud/op!del.action">刪除數(shù)據(jù)<ahref="<%=path%>/crud/op!query.action">查詢數(shù)據(jù)<ahref="<%=path%>/crud/op!update.action">修改數(shù)據(jù)最后再寫上.action即可以到統(tǒng)一頁面op.jsp這樣做雖然能減少頁面,但是由于它們實質(zhì)用到的是同一個Action,所以這就意味著我們要使用的器相同,相同的跳轉(zhuǎn)result。實際中這種方式很struts.xml<constant able.DynamicMethodInvocation"擴(kuò)展2:在CRUDAction中使用do。舉例:我們在CRUDAction中增加一個新的方法,內(nèi)容如下public return}<actionname="main"class="com.asm.CRUDAction"<result注意:配置中method屬性值是中去掉do后M小寫。然后再在crud.jsp中增加如下<ahref="<%=path%>/crud/main.action">main頁面我們在jsp頁面之間寫總會是.../xxx.jsp,而如果我們想掉具體的jsp,只需要所jsp頁面配ForwardAction即可實現(xiàn)。示例如下:在根下有一個index.jspstrtus.xml<packagename="def"extends="struts-<action<result說明:如果沒有未action指定class,默認(rèn)就是ActionSupport類,如果沒有為action指定method屬性,則默認(rèn)執(zhí)行execute方法,如果沒有指定result的name屬性,默認(rèn)值為success。知道了這些ActionSupport隨后再面第7點擴(kuò)展中用到的op.jsp中增加如下代碼<a跳到index頁面是進(jìn)行的服務(wù)器跳轉(zhuǎn)如果我們在上面的配置中的result增加type屬性變成<resulttype="redirect">/index.jsp</result>補(bǔ)充forward形式的action實質(zhì)是執(zhí)行的ActionSupport這個Action。因此配置它的result可以參看此類的apiresultnamesuccess、login、inputdefault-action-ref,當(dāng)沒有找到對應(yīng)的action時,默認(rèn)就會調(diào)用default-action-ref指定<actionmyStruts2/luanFangWen.action這樣的形式,它就會去這個默認(rèn)的<default-action-ref>,通常我們會為它配置一個錯誤頁面,以提示用戶通過此配置,只要是一個不存在的action便會轉(zhuǎn)向到.../other下的error.jsp頁面。但是如果這樣配置后,錯誤頁面將跳到.../other/404error.jsp頁面中去。補(bǔ)充說明:如果我們用ie失效,因為找不到資源時會報HTTP404錯誤,而ie截取到此錯誤進(jìn)行了它自身的友好處理,所以我們struts1.xstruts2個Action被請求時都會new出這個Action對象,所以Action本身不存程安全的問題。struts2wildcard7<actionname="addUser"class="com.asm.UserAction"<result<actionname="delUser"class="com.asm.UserAction"<result<actionname="queryUser"class="com.asm.UserAction"<result<actionname="updateUser"class="com.asm.UserAction"<result<actionname="*User"class="com.asm.UserAction"<result../addUer.actinaddUeAcon*此時代指的內(nèi)容是add,再來看method恰恰是第一個*的內(nèi)容,所以它的method此時的完整名為編程命名,所有的Action我們都只需要進(jìn)行一次配置。舉例:規(guī)定所有的Action類都用XXXAction<actionname="*_*"class="com.asm.{2}Action"<resultName中第 CRUD操作的名二類的名字。所以地址舉例如下 到User類的del方法成功后跳到del_User.jsp頁面補(bǔ)充說明{0}是代表0:ZERO說明:面的許多案例中我們所用到的Action基本都繼承自ActionSupport這個類,而在這個類中<resultname="success"<paramtype:TypeFreeMarkerInputSream對象,通常用來處理文件,AJAX數(shù)據(jù)。XML/XLST步驟立兩個Action:TestAction、<packagename="resultTest"extends="struts-<actionname="test"<resultname="success"<param<actionname="test2"<result于此處是轉(zhuǎn)到Action位于同一個namespace下,而namesapace的默認(rèn)值thecurrentnamespace,所以actionaespace以用:actioation的nam值)。Metodactio的eecuteSkiActionscai所對應(yīng)類的pi幫助??梢栽趓esult指向的jsp頁面中附加參數(shù)即可,我們可以在test2action的result中寫成:<resultname="success"<actionname="test"<resultname="success"<paramcontext <result<actionname="test"<resultname="success"<paramcontext <resultname="success"contextcontextmapresulttyep:resulttype:步驟三,編寫頁面index.jsp。發(fā)布測試:result:如果我們所有的action均有可能跳到相同的頁面,則不防使用全局result。為了方便我們專門建立packageresultpackage即可。<packagename="pubResult"extends="struts- <result由于它下面沒的action配置,所以我們可以像默認(rèn)的struts-default包一樣,=true,這樣聲packgageactionpackage繼承。隨后再在要用到全局result中package。代碼如下:<packagename="testGlobal"extends="pubResult"<actionname="error"<actionname="error2"</package>resultpackage下的所有action中去。Result:了解packagepublicclassDynaActionextendsActionSupportprivateStringprivateStringpublicStringexecute()throwsExceptionif(username.equals("admin")){nextAction="admin";}elseif(username.equals("user")){nextAction="user";}elsenextAction=}return}}步驟立jsp頁面dyna.jsp,主要是為了向DynaAction中傳遞username參數(shù)。<packagename="dynaTest"<actionname="dyna"<resultname="success"<actionname="admin"<action的值adn(用在strutsognladncon(admi.actinrarAcon:admin.actin和useractions頁面。dyn.conconconAconDynAcouera步驟立struts2exception項目下,在該項目下建立登錄頁面login.jsp。主要代碼如下<formaction="<%=request.getContextPath()%>/login.action">username:<inputtype="username"<inputtype="submit"packagepublicclassLoginActionextendsActionSupportprivateStringpublicStringexecute()throwsExceptionif(username.equals("exception"))thrownewClassNotFoundException("類未被找到}elseif(username.equals("global"))thrownewException("全局異常}elsereturn}}}<packagename="ex"<actionname="login"<exception-mapresult="myException"<result<result<packagename="def"extends="struts- <result 分析“excetioLogiActionnbla”,Eceptio包中我們繼承了局異常在的包提示:p中的resul屬性的來源于元素中的nam三、在Action獲取Scope對象引言面的Action操作中關(guān)鍵就是Action中的exectue方法但是此方法并沒有requestsessionpackagepublicclassLoginActionextendsActionSupportprivateStringusername;ActionContextcontext;Maprequest;Mapsession;Mapapplication;publicStringexecute()throwsException{request=(Map)context.get("request");request.put("req","requst屬性");session.put("ses","sesion屬性");application.put("app""application屬性");returnSUCCESS;}}<packagename="scope"extends="struts-<actionname="login"login.jsp<formaction="<%=request.getContextPath()用戶名:<inputtype="text<inputtype="submit"request:<%=request.getAttribute("req")%><br>session:<%=session.getAttribute("ses")%><br>application:<%=application.getAttribute("app")%><br>分析ActionContextgetContextActionContextActionContext對象調(diào)用get方法來獲取一個在request范圍中的對象我們使用el或通過request.getAttribute這樣的方式均可以獲取對象值,這說明了這些Maprequest對象實際是在request范圍內(nèi)的對象。packagepublicclassLogin2ActionextendsActionSupportprivateStringusername;Maprequest;Mapsession;Mapapplication;publicStringexecute()throwsException{request.put("req","requst屬性");session.put("ses","sesion屬性");application.put("app""application屬性");returnSUCCESS;}publicvoidsetRequest(Map<String,Object>request)}publicvoidsetSession(Map<String,Object>session)}publicvoidsetApplication(Map<String,Object>application)}}法其實和方式一很相似,只是在方式一中我們需要手動的為Maprequest賦值,但是在方式二中它是通強(qiáng)調(diào):方式二是開發(fā)中主要用的packagecom.asm;publicclassLogin3ActionextendsActionSupportprivateStringusername;HttpServletRequestrequest;HttpSessionsession;ServletContextapplication;publicStringexecute()throwsException{request=ServletActionContext.getRequest();session=request.getSession();application=request.setAttribute("req","requst屬性");session.setAttribute("ses","sesion屬性");application.setAttribute("app""application屬性");returnSUCCESS;}}并修改登錄頁面便可進(jìn)試。packagecom.asm;publicclassLogin4ActionextendsActionSupportprivateStringusername;ActionContextcontext;HttpServletRequestrequest;HttpSessionsession;ServletContextpublicStringexecute()throwsException{,,,return}publicvoidsetServletRequest(HttpServletRequestrequest}publicvoidsetServletContext(ServletContextapplication}}四、OGNL下面我們建立struts2ognl項目來練習(xí)ognl的使用。packagepublicclassLoginActionextendsprivateUserpublicStringexecute()throwsExceptionreturn}}<constantname="struts.devMode"<packagename="ognl"extends="struts-<actionname="login"<formaction="<%=request.getContextPath()%>/login.action"用戶名:<inputtype="text密碼:<inputtype="password<inputtype="submit"username屬性:<s:propertyvalue="user.username"/session屬性:<s:propertyvalue="session.ses"/}logSuc.jsp(2).struts2到客戶端的login.action請求,按配置文件要求,把此請求交給LoginAction處其它contextmap中的對象時會要求加#。(3).當(dāng)newLoginAction時,表示它也會初始化此類中的對象,比如這里會去初始化User對象,但是要注意的是如果我們在用戶名和什么都不輸,再來用debug來看值棧中的user是,發(fā)現(xiàn)它仍會new此對象,因為盡管我們沒用輸入值,但是的set方法還是要被調(diào)用,所以會new出此對象,但是如果我們直接輸入.../struts2ognl/login.actionloginSuc.jsp總結(jié):1.Action會在請求時被創(chuàng)建,且會把創(chuàng)建的對象放到值棧中。Actionnew的形式初始化,而且這些對象字段必須提供默認(rèn)的ValueStackAction(ActionValueStack對象Struts2.actionActionActionActionValueStack(vs)。補(bǔ)充:值棧(根)對象也可以直接使用EL表達(dá)式,比如這里可以直接通過${user.username}來獲對象呢?原因是struts2對HttpServletRequet進(jìn)行了一次封裝,封裝的代碼主要是重寫了getAttribute方法,簡述重寫此方法的代碼:首先在原始的HttpServletRequest對象中查找elActionContextelOGNLaddres;城市:<inputtype="text獲取城市屬性:<s:property這種類的字段進(jìn)行關(guān)聯(lián),或者說是依靠字段屬性進(jìn)行導(dǎo)航,這也就是OGNL的定義:ObjectGraphNavigationLanguage:對象圖導(dǎo)航圖語言,它是建立在值棧技術(shù)之上的一種全新語言。調(diào)用值棧對象中的方法:<s:propertypublicStringreturn"這是User中的get方法}publicStringreturn"這是User中的get方法}調(diào)用值棧對象中的普通方法(2):<s:property調(diào)用值棧對象中的普通方法(1):<s:propertyLoginAction中的普通方法:<s:propertypublicstaticStringgetSta()return"這是LoginAction中的靜態(tài)方法}調(diào)用Action中的靜態(tài)方法:<s:property<constantname="struts.ognl.allowStaticMethodAccess"再來時便可以到調(diào)用Math類中的靜態(tài)方法:<s:propertyMath類中的字段:<s:property調(diào)用普通類中的構(gòu)造方法<s:propertyvalue="new調(diào)用普通類中的構(gòu)造方法并其字段<s:propertyvalue="new istmyList=newArrayList();privateSetmySet=newHashSet();privateMapmyMap=newHashMap();myMap.put("m1",myMap.put("m3",myMap.put("m2",獲取List:<s:property獲取List中的第一個元素:<s:property獲取Set:<s:property獲取Map:<s:property方式一:<s:property方式二:<s:property<s:propertyvalue="myList.size"/>|<s:property獲取Map中所有鍵:<s:propertyMap中所有值:<s:property iststudentList=newstudentList.add(newStudent("jack"2086.0f));studentList.add(newStudent("lily"2296.5f));studentList.add(newStudent("tom",23,56.5f));獲取List中的Student對象:<s:property或者<s:property<s:property<s:property<s:property<s:property<s:property說明:這里重點是說明?#的使用,結(jié)合此例來看,studentList中有許多Stutdent對象,我們可以用條件來 哪些對象,這些條件必須以?#開始,并且條件要用{}括起。而this是指在判NtopN語法[0]:<s:propertyvalue="[0]"/><br>N語法[1]:<s:propertyN語法[0].top:<s:propertyvalue="[0].top"/><br>N語法[1].top:<s:propertyvalue="[1].top"/><br>N語法top:<s:propertyvalue="top"/><br>N語法取值:<s:propertyvalue="[0].user.username"/><br>N語法取值:<s:property說明:規(guī)定棧頂?shù)膶ο鬄閇0],而我們只使用[0]的意思是從值棧中第一個對象取,一直取至棧底。Ntop為什么要提出N語法,當(dāng)我們通過chain鏈時,值棧中可能有兩個以上的Action對象,如果這些從上面的N語法取值實例中,我們知道[N]top語法的一個重要作用就是能通過它們值棧對象中的屬性。結(jié)合前面的五種[N]top補(bǔ)充:在此實例中,我們用<s:debug>調(diào)試會發(fā)現(xiàn),值棧中還有一個DefaultTextProvider對象(因為此Action繼承自ActionSupport),它的作用是獲取資源文件中的內(nèi)容(其實本質(zhì)是ActionSupport重寫了getText()方法這也就是在問題中我們能直接調(diào)用它的getText()方法的原因。StackContextMapmyRequest;MapmyRequest.put("req","Req屬性");mySession.put("ses""Ses屬性獲取Request屬性:<s:propertyvalue="#request.req"/><br>獲取Session屬性:<s:propertyvalue="#session.ses"/><br>獲取parameters屬性:<s:propertyvalue="#parameters.mes"/>說明:我們獲取這些對象都用了#,因為這些對象都是存在一般的ContextMap中,而不是存在值棧<inputtype="hidden"name="mes"value="themessageistransferby包含當(dāng)前用于按requestsession總結(jié)$$i18nstrutsOGNLObjectGraphicNavigationLanguage(對象圖導(dǎo)航語言)的縮寫,它是一個開源項目。Struts2OGNLEL表達(dá)式,它提供了平時我們需要的一些功能,如:支持對象方法調(diào)用,支持各類靜態(tài)方法調(diào)用和值,支持操作集合對象。OGNL有一個上下文的概念,這個上下文件實質(zhì)就是一個Map結(jié)構(gòu),OgnlValueStack的[ListrootOGNLstruts2ActionContext,ValueStack,actionaction進(jìn)ValueStack,所以action的實例變量可以接受OGNL。上下文中的對象需要使用#號標(biāo)注命名空間,如#application、#session。另外OGNL會設(shè)定一個根對象,在struts2中根對象就是ValueStack值棧對象,如果要根對象中對象的屬性,則可以省略# 該對象的屬性即可。在struts2中,根對象的實現(xiàn)類為OgnlValueStack,該對象 只存放單個值,而是存放一組對象,在OgnlValueStack類里有一個List類型的變量,通常我們在Ognl表達(dá)式里直接寫上屬性的名稱即可root變量里對象的屬性搜索順序是從棧頂對依次往下尋找。注意:struts2中,OGNL表達(dá)式需要配合struts的才可以使用。五、器是Struts2框架的,它主要完成解析請求參數(shù)、將請求參數(shù)賦值給Action屬性、執(zhí)行數(shù)據(jù)校驗、文件上傳等工作。Struts2設(shè)計的靈巧性,器起了關(guān)鍵性的作用,當(dāng)需要擴(kuò)展Struts2功能時,只需要提供對應(yīng)器,并將它配置在Struts2容器中即可;如果不需要該功能時,也只需要取消該攔name是器的名字,就是以后我們使用該器的唯一標(biāo)識;class則指定了該器的實現(xiàn)類,如自定義自定義器需要特別注意的是記引入struts2默認(rèn)的器。為了實現(xiàn)某些操作,我們可以自定義器,自定義器有三種方式定義。分別為實現(xiàn)Interceptor接口,繼承抽象類Interceptor,繼承MethodFilterInteceptor類。了方便,這里不進(jìn)行驗證。即在link.jsp頁面中寫如下:<ahref="<%=request.getContextPath()%>/login.action">登錄</a>然后,我們點擊此便<packagename="interceptor"extends="struts-<actionname="login"<resultpackageimportimportpublicclassMyInterceptorimplementsInterceptorpublicvoiddestroy()}publicvoidinit()}publicStringintercept(ActionInvocationinvocationthrowsExceptionSystem.out.println("開始");Stringresultinvocation.invoke();System.out.println("結(jié)束");returnresult;}},為了使用此器須將此器進(jìn)行,隨后再在要使用此器的Action中。即首先在<package>中,內(nèi)容如下:,<interceptorname="myIpt"截器攔住,然后執(zhí)行System.out.println("開始"),隨后我們調(diào)用invocation.invoke()方方式二、繼承Interceptor創(chuàng)建器類 packageimportimport publicclass Interceptor InterceptorpublicStringintercept(ActionInvocationinvocation)throwsExceptionSystem.out.println("Abs開始");Stringresultinvocation.invoke();System.out.println("Abs結(jié)束");returnresult;}}<interceptorname="myAbs" 隨后再在LoginAction中此器,即在<actionname="login"...>配置如下內(nèi)容方式三、繼承MethodFilterInteceptorpackageimportimportpublicclassMyMethodFilterInterceptorextendsprotectedString ntercept(ActionInvocationinvocationthrowsExceptionSystem.out.println("method開始");Stringresult=invocation.invoke();System.out.println("method結(jié)束");returnresult;}}<interceptorname="myMet"隨后再在LoginAction中此器,即在<actionname="login"...>配置如下內(nèi)容分析:當(dāng)配置到此,實質(zhì)便為LoginAction配置了三個器,當(dāng)我們點擊登錄時會在控制臺打印出如開始Abs開始method開始--先執(zhí)行器,再執(zhí)行此Actionmethod結(jié)束Abs結(jié)束結(jié)束后續(xù)操作(這里為打印本器 結(jié)束后再把 器個器,它會把請求轉(zhuǎn)交到LoginAction處LoginAction處理完成后會面)給上一個器后續(xù)操作(這里為打印本器 結(jié)束后再把 器個器,它會把請求轉(zhuǎn)交到LoginAction處LoginAction處理完成后會面)給上一個器 Login.action時, 回處理結(jié)果給客器器結(jié)合現(xiàn)實理解:比如我們要去某樓層找(LoginAction)取一個資源(LoginAction處理后返回的success.jsp(1器(2)檢查通過后再進(jìn)電梯時會被電梯保安員檢查(第二個器:MyInterceptor器(3)檢查通過后再上到某樓層會被樓層保安員檢查(第三個器:MethodAction器其 其 注意我們在LoginAcion配器,都沒用默認(rèn)的器,原因這的測試以不用但是以后在們使用定義的器是一定要上認(rèn)的,否則導(dǎo)致許不可預(yù)的結(jié)果。補(bǔ)充從上面圖并結(jié)代碼我們可看出的過應(yīng)該是n這些攔om.asm.ntercepor.imulationinvoke補(bǔ)充2:上面分別使用了三種方式來創(chuàng)建自定義的器,第式是最原始的實現(xiàn)方式,第二種方步驟立MethodAction,代碼如下:packagecom.asm;importpublicclassMethodActionextendspublicStringreturn}publicStringreturn}publicStringreturn}}<actionname="*_*"class="com.asm.MethodAction"<result<interceptor-ref<a<a<a當(dāng)點m1時會到m1Suc.jsp頁面,點m2、m3會分別到m2Suc.jsp、m3Suc.jsp頁面?,F(xiàn)在假如我們想m2、m3時不被,我們只需修改MyMethodFilterInterceptor:修改內(nèi)容為:<interceptor <param它的作用和增加<paramname="includeMethods">m1</param>等價。上面是指定m2,m3方法調(diào)用時不被,這里是指定只m1。除了這種在器時指定外,還可以在器時指定,<interceptor-ref<param<param要被。配置和配置時,以配置為準(zhǔn)。當(dāng)我們進(jìn)行數(shù)據(jù)庫查詢等相關(guān)的操作時,如果服務(wù)器負(fù)荷過重可能不把數(shù)據(jù)查詢出來,進(jìn)而會在不愿使用的所有服務(wù)。對此我們可以在客戶提交時,馬上轉(zhuǎn)到一個頁面,并在該頁面顯示“您的請struts2可以輕松幫我們完成。下面新建struts2wait項目演示此實例。packagepublicclassLoginActionextendsActionSupportpublicStringexecute()throwsException{return}}Action,配置的主要內(nèi)容如下:<actionname="login"<result<result為“Ontheinitialrequestoranysubsequentrequests(beforetheactionhascompleted),thewaitresultwillbereturned.Thewaitresultisresponsibleforissuingasubsequentrequestbacktotheaction,givingtheeffectofaself-updatingprogressmeter”,大概意思就是當(dāng)我們請求的Action在未執(zhí)行完,就是未返回結(jié)果時,會首先把waitresult返回,而在waitresult所指定的頁面中通常會再次發(fā)送請求給原始的<metahttp-equiv="refresh" 查詢請求已提交,正在查詢數(shù)據(jù),請等待...或是否配置檢查Action是否返回的器或是否配置檢查Action是否返回的器<%@pagelanguage="java"pageEncoding="UTF-<%@tagliburi="/struts-tags"prefix="s"<formaction="<%=request.getContextPath()%>/login.action">:<inputtype="text"name="username"><br>:<inputtype="password"<inputtype="submitvalue="登錄用戶此頁面時會生成一個sessionId,在提交時會服務(wù)器會據(jù)此驗證表單是否已提交“Tosetatokeninyourform,youshouldusethetokentag.Thistagisrequiredandmustbeusedintheformsthatsubmittoactionsprotectedbythisinterceptor,這句話的大概意思就是須要在提交的表單中使用這個tokenpackagepublicclassLoginActionextendsActionSupportpublicStringexecute()throwsException{returnSUCCESS;}}<packagename="tokenTest"extends="struts-<actionname="login"<result<result說明在此Action下我們配置了token器另注意到在此Action下我們還配置了一“invalid.token”resultThisinterceptorusesafairlyprimitivetechniqueforwhenaninvalidtokenisfound:itreturnstheresultinvalid.token,whichcanbemappedinyouractionconfiguration器如果根據(jù)token產(chǎn)生的sessionId判斷出表單已提交,它則返回invalid.token指向的視圖。比如這里,如果重復(fù)提交則會轉(zhuǎn)到.../subError.jsp中去。另記了引入默認(rèn)的器棧。補(bǔ)充:關(guān)于token器細(xì)節(jié)可以erceptor.TokenInterceptor類的api說明。步驟五、發(fā)布測試,請注意login.jsp頁面時,查看源文件時會發(fā)現(xiàn)增加了兩個隱藏域信息。步驟六、更換器:我們還可以使用tokenSession器,它的功能比上面的增強(qiáng),它能保證持name="tokenSession"></interceptor-ref>即可。隨后便可以測試,測試時會發(fā)現(xiàn)如果我們重后返回(我們System.out.print語句在重復(fù)提交時并未打印出來),而是此器判斷出是重復(fù)后直接為了說明此問題,我們建立struts2auth項目,流程圖如下 試 login直接登錄到main.jsp判斷登錄則可以,否則會跳到登錄頁面。如果我們從登錄頁面直接到main.jsp頁面,再來note.action時,同樣被但是由于登錄過,所以可以到此action對應(yīng)的內(nèi)容。由這里的分析可<formaction="<%=request.getContextPath()%>/login.action"method="post">:<inputtype="text"name="username"><br>:<inputtype="password"<inputtype="submitvalue="登錄packagepublicclassLoginActionextendsActionSupportprivateStringusername;Mapsession;publicStringexecute()throwsExceptionsession=ActionContext.getContext().getSession();session.put("loginSign","loginSuccess");returnreturn}}} packagepublicclassAuthInterceptor InterceptorpublicStringintercept(ActionInvocationinvocation)throwsException{Mapsession=invocation.getInvocationContext().getSession();//if(session.get("loginSign")==null)return}elseStringresult=return}}}<packagename="tokenTest"extends="struts-<interceptorname="auth"<interceptor-stack<actionname="login"<result<result<action<result說明:結(jié)前面的些代碼看,當(dāng)們?yōu)閚ot.acion配置了面寫所的r器時,如果們要ote.acton,器會先斷是否登,如果錄則繼把請求遞下去如,7.器中的注步驟立struts2annotationInt項目,并建立LoginAction類,代碼如下:packagepublicclassLoginActionextendsActionSupportprivateStringusername;publicStringmyBefore(){returnLOGIN;}publicvoidmyAfter()throwsInterruptedException{ }publicvoidmyBeforeResult() }publicStringexecute(throwsExceptionreturnSUCCESS;}publicStringgetUsername()return}publicvoidsetUsername(Stringusername){System.out.println("調(diào)用set方法username);this.username=username;}}<packagename="ano"extends="struts-<interceptorname="anno"<interceptor-stack<actionname="login"<result<result加wlenvoedbfoeeconehod.feeuredauesotnu,tsreunedaseconesutcoecon的eue但是此方法如果返回不eunLONognresu這里為lgin.js頁面)wlbevokdferheaonehodbutefreeesutxcuoncg)rernON注釋掉,od跳轉(zhuǎn)到success.jsp頁面。@After:willbeinvokedaftertheactionmethodandresultexecution。意為在在進(jìn)行本實例前請前復(fù)習(xí)五.2自定義 器因為PreResultListener對象一般是綁定在器上使用。下面我們新建struts2PreResultListener項目進(jìn) packageimportimportpublicclassMyPreResultListenerimplementsPreResultListenerpublicvoidbeforeResult(ActionInvocationinvocation,Stringres)////LoginActionlg=(LoginAction)invocation.getAction();trylg.execute();}catch(Exceptione){e.printStackTrace();}}publicStringintercept(ActionInvocationinvocationthrowsExceptioninvocation.addPreResultListener(newMyPreResultListener());System.out.println("開始");Stringresultinvocation.invoke();System.out.println("結(jié)束");returnresult;} <packagename="interceptor"extends="struts-<interceptorname="myIpt"<interceptorname="myAbs" <interceptorname="myMet"<actionname="login"<result說明reesuLieer強(qiáng)調(diào)reesuLinr對象在返回果前執(zhí)行請注意合器行的順來看此例目前為了解。六、使1.準(zhǔn)備工作:建立struts2tag項目,搭建好struts2的開發(fā)環(huán)境。在html我們常用的基礎(chǔ)表單主要有文本域、域、提交、重置四種。它們在strust2中可以通過來生成。下面建立login.jsp頁面,與這四種相關(guān)的內(nèi)容如下:<%@pagelanguage="java"pageEncoding="utf-<%@tagliburi="/struts-tags"prefix="s"<s:formaction="login"method="post"<s:textfieldlabel="用戶名name="user.usernamerequired="true"<s:passwordlabel=""name="user.password"required="true"<s:resetvalue="重置<s:submitvalue=""說明:labelrequiredtrue,表示此表單項為必填內(nèi)容。<s:radiolist="#{1:'男',0:'女'}"value="1"label=""<s:checkboxlistlist="#{1:'足球',2:'排球',3:'藍(lán)球',4:'網(wǎng)球name="user.love"<s:beanid="p"<s:beanname="com.asm.NativePlaceMapFormAction"<s:beanname="com.asm.NativePlaceProFormAction"<s:selectlist="#p.placelabel="籍貫<s:selectlist="#pMap.placelabel="籍貫2<s:selectlist="#pp.place"listKey="pId"listValue="pName"label=籍貫3"name="user.place"headerKey="-1"headerValue="省"emptyOption="true"/>packagepublicclassNativePlaceFormActionextendsActionSupport ist<String>publicNativePlaceFormAction(){place=newArrayList<String>();}}packagepublicclassNativePlaceMapFormActionextendsActionSupportprivateMap<Integer,String>publicNativePlaceMapFormAction()place=newHashMap<Integer,place.put(1山東省place.put(2山西省place.put(3,"省place.put(4河北省place.put(5,"省place.put(6云南省}}packagepublicclassNativePlaceProFormActionextendsActionSupport ist<Object>publicNativePlaceProFormAction(){place=newArrayList<Object>();newProvince(1,"山東省","濟(jì)南");place.add(newProvince(3,"省","place.add(newProvince(5,"","place.add(newProvince(6,"云南","}}loin.js頁<s:ban><s:beaactiostrutsxml<actionname="npf"<s:selectlist="placelabel="籍貫<s:beanname="com.asm.TwoSelectAction"listKey="pId"listValue="pName"doubleListKey="cId"doubleListValue="cName"packagepublicclassTwoSelectActionextendsActionSupport ist<Province>privateMap<Province,List<City>>publicplace=newArrayList<Province>();citys=newHashMap<Province,List<City>>Provincep1=newProvince(1,"山東省","濟(jì)南");Provincep2=newProvince(2,"山西省","太原");Provincep3=newProvince(3,"省","");Provincep4=newProvince(4,"河北","石家莊");Provincep5=newProvince(5,"","");Provincep6=newProvince(6,"云南","");Cityc1=newCity(1,"濟(jì)南");Cityc2=newCity(2,"招遠(yuǎn)市");Cityc3=newCity(2,"壽光市");Listp1City=newCityc4=newCity(4,"太原市");Cityc5=newCity(5,"大同市");Cityc6=newCity(6,"晉中市Listp2City=newArrayList();//省的市Cityc7=newCity(7,"鄭州市");Cityc8=newCity(8,"衛(wèi)輝市");Cityc9=newCity(8,"信陽市");Listp3City=newCityc10=newCity(10,"石家莊");Cityc11=newCity(11,"晉州市");Cityc12=newCity(12,"鹿泉市");Listp4City=newArrayList();Cityc13=newCity(13,"");Cityc14=newCity(14,"南充");Cityc15=newCity(15,"綿陽");Listp5City=newArrayList();Cityc16=newCity(16,"市");Cityc17=newCity(17,"安寧市");Cityc18=newCity(18,"曲靖市");Listp6City=newArrayList();citys.put(p1,p1City);citys.put(p2,p2City);citys.put(p3,p3City);citys.put(p4,p4City);citys.put(p5,p5City);citys.put(p6,p6City}}(List,Map,List<s:selectname="singer"list="{}label="歌星headerKey="0headerValue="--歌手--"emptyOption="true"><s:optgrouplist="#{1:'',2:'',3:''}"label="男歌手<s:optgrouplist="#{1:'',2:'',3:'she'}"label="女歌手 list="{'聽歌','看','編程','玩游戲','chat'}" <s:checkboxlabel="接受服務(wù)條款value="false補(bǔ)充:使用struts2生成的表單會在內(nèi)嵌套一些特殊的格式,在使用了struts2生成的所在struts.xml中配置如下內(nèi)容:<!--struts2生成的表單使用默認(rèn)的,即不附加格式化--<constantname="struts.ui.theme"Scope:指定變量被設(shè)置的范圍,該屬性可以接受application、session、request、page

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論