




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、l 建立一個(gè)Struts2 工程Ø 1在MyEclipse中新建web工程Ø 2在解壓struts2-blank.war( 最基礎(chǔ)的示例程序 )Ø 3進(jìn)入struts-appsstruts2-blankWEB-INFclasses下把struts.xml拷到web工程的src下面,因?yàn)楣こ叹幾g完它默認(rèn)就把src下的文件放到class文件下面。、Ø 4.拷類庫,在這個(gè)項(xiàng)目的lib文件下面拷把jar放入lib后看不見jar文件,是因?yàn)镸yEclipse默認(rèn)視圖是package Explorer,如果要看硬盤上對(duì)應(yīng)的視圖,應(yīng)該打開windows-
2、Show View-other-navigatior4.配置web.xml,參考struts自帶的web.xml,把filter的配置拷過來<filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filterNg:next generation下一代的filter,用的是2.1的;跟2.0有區(qū)別,2.0用的filter用的是:org.apache.struts2.dispatcher.FilterDispatcher.St
3、rutsPrepareAndExecuteFilter通過這個(gè)名字可以看出跟2.0的區(qū)別,這里調(diào)用了兩個(gè)filter,一個(gè)是prepare一個(gè)是execute filter.</filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern></filter-mapping>l 第一個(gè)示例程序Hello Struts<struts><co
4、nstant name="struts.devMode" value="true" />Struts常量的配置,struts.devMode開發(fā)模式,開發(fā)模式改為true之后,修改配置文件可以馬上生效,不用重啟服務(wù)器。<package name="default" namespace="/" extends="struts-default"> <action name="hello"> <result>/hello.jsp</r
5、esult> </action> </package></struts>http:/localhost:8080/strust2_0100_Introduction/這里的“/”對(duì)應(yīng)namespace的“/”,因?yàn)閍ction 的name屬性為hello,所以敲 http:/localhost:8080/strust2_0100_Introduction/hello 或者h(yuǎn)ttp:/localhost:8080/strust2_0100_Introduction/hello.action默認(rèn)的aciton是可以省略的跳轉(zhuǎn)到hello.jsp,第一個(gè)示例
6、程序成功!l Struts2讀源碼配置文件中的 <filter-class></filter-class>一看就應(yīng)該知道它是對(duì)應(yīng)一個(gè)類,在jar文件中找到對(duì)應(yīng)的源碼編譯完的class文件,查看源碼: jar文件點(diǎn)右鍵-àproperties-àJava Source AttachmentàExternal Folder (外部文件)à 點(diǎn)擊class文件可以查看源碼了,假如想看它的doc文檔,同樣的方法jar文件點(diǎn)右鍵-àproperties-àJavadoc Location-à導(dǎo)入doc就可以在源
7、碼中右鍵或者F1觀察對(duì)應(yīng)的文檔了。l 敲尖括號(hào)不提示的問題Struts.xml文件頭定義了<!DOCTYPE struts PUBLIC "-/Apache Software Foundation/DTD Struts Configuration 2.0/EN""在這個(gè)url這里定義了當(dāng)前這篇xml語法的位置??梢赃@個(gè)位置每次它要去網(wǎng)上拿,所以不一定能生效。">配置:windows-preferences-catalog-。xmlxml CatalogAddAdd入本地定義當(dāng)前xml的dtd文件:找到struts2-co解壓開找到這就是我們寫
8、xml要參考的那個(gè)文件完成,驗(yàn)證代碼提示成功!l Struts2的運(yùn)行機(jī)制當(dāng)你在客戶端敲http:/localhost:8080/strust2_0100_Introduction/hello首先找到:strust2_0100_Introduction這個(gè)web application,找到后去執(zhí)行這個(gè)web application下的web.xmlTomcat接收到請(qǐng)求之后,會(huì)發(fā)現(xiàn)這個(gè)web.xml下面,配了一個(gè)filter,而這個(gè)filter過濾所有的url地址,所以當(dāng)我們?cè)诘刂窓谇胔ttp:/localhost:8080/strust2_0100_Introduction/hello后,
9、會(huì)被StrutsPrepareAndExecuteFilter接收到<filter> <filter-name>struts2</filter-name> <filter-class></filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern></filter-mapping>StrutsPrepar
10、eAndExecuteFilter接收到后url情求后,它首先看namespaceStruts.xml<package name="default" namespace="/" extends="struts-default"> <action name="hello" > <result>/hello.jsp</result> </action></package>查到“/”后面的hello,它就會(huì)去package下面查是否有name屬性叫“
11、hello”的action,有的話,找里面對(duì)應(yīng)的result是誰-àhello.jspStruts的好處就是:我可以把“請(qǐng)求”和“視圖展現(xiàn)”分開,而不是寫死。分開的好處就是:如果要換成其他視圖,配一下就好了,所以更加靈活。Struts核心的本質(zhì)就是解決了:把你的請(qǐng)求和最后的結(jié)果分開。Important!面試!l Struts的namespace示例工程Struts2_0200_NamespaceStruts.xml<struts> <constant name="struts.devMode" value="true" /&g
12、t; <package Java的package給我們的類打包,避免類重名,java的package作用也是一樣。比如我們有兩個(gè)action都叫index,一個(gè)前臺(tái)一個(gè)后臺(tái),就用package name=”front” package name=”backgroud”name="front" extends="struts-default" namespacenamespace是什么,你想訪問的action前面就應(yīng)該加上什么。比如這里就是/front/index.action=Namespace是可以不寫的,默認(rèn)為空!"/front&qu
13、ot;> <action name="index"> <result>/Namespace.jsp</result> </action> </package> <package name="main" extends="struts-default" namespace=""Namespace不寫等于Namespace為空,Namespace等于空,意味著:只要你在url敲index.action不管你在哪里敲,路勁多么深,只有最后是“inde
14、x.action”就可以訪問這個(gè)action。> <action name="index"> <result>/Namespace.jsp</result> </action> </package></struts>所以namespace為空意味著:只要找到一個(gè)index.action,沒有找到精確的對(duì)應(yīng)的namespace,全部都交給namespace為空的這個(gè)package去處理,所以這個(gè)package囊括了其他所有package處理不了的action。l Struts自定義具體視圖的返回示例
15、工程Struts2_0300_Actionl 修改jsp模板字符編碼:windows-preferences- JSP 修改編碼為UTF-8即可IndexAction1.javapublic class IndexAction1 public String execute() return "success"IndexAction2.javapublic class IndexAction2 implements Action public String execute() return "success"真正企業(yè)開發(fā)只用這第三種!另外兩種忘記!Inde
16、xAction3.javapublic class IndexAction3 extends ActionSupport public String execute() return "success"<struts> <constant name="struts.devMode" value="true" /> <package name="front" extends="struts-default" namespace="/"> &l
17、t;action name="index" class=假如沒有配class這個(gè)屬性,默認(rèn)執(zhí)行的是Struts2自帶的action:ActionSupport,在struts2里面沒有ActionSupport這個(gè)類的源碼,因?yàn)閟truts2用到了xwork這個(gè)框架,所以想看到ActionSupport的話,必須下載xwork的源碼"Class屬性表示,當(dāng)你訪問index這個(gè)action的時(shí)候,它會(huì)去執(zhí)行IndexAction1這個(gè)類里面的execute()方法.> <result name="success">/Action
18、Introduction.jsp</result> </action> </package></struts>具體視圖的返回可以由用戶自己定義的Action來決定具體的手段是根據(jù)返回的字符串找到對(duì)應(yīng)的配置項(xiàng),來決定視圖的內(nèi)容具體Action的實(shí)現(xiàn)可以是一個(gè)普通的java類,里面有public String execute方法即可或者實(shí)現(xiàn)Action接口不過最常用的是從ActionSupport繼承,好處在于可以直接使用Struts2封裝好的方法如果不配置class屬性,默認(rèn)執(zhí)行xwork框架的ActionSupport這個(gè)action,這個(gè)act
19、ion就有execute這個(gè)方法,return success。l Struts路徑問題示例工程:Struts2_0400_Pathstruts2中的路徑問題是根據(jù)action的路徑而不是jsp路徑來確定,所以盡量不要使用相對(duì)路徑。雖然可以用redirect方式解決,但redirect方式并非必要。 解決辦法非常簡(jiǎn)單,統(tǒng)一使用絕對(duì)路徑。(在jsp中用request.getContextRoot方式來拿到webapp的路徑) 或者使用myeclipse經(jīng)常用的,指定basePath先點(diǎn)擊鏈接http:/localhost:8080/Struts2_0400_Path/path/path.acti
20、on 跳轉(zhuǎn)到path.jsp 頁面在path.jsp頁面上有鏈接<a href="index.jsp">index.jsp</a>雖然在webRoot上面index.jsp和path.jsp同級(jí),但是點(diǎn)擊index.jsp卻跳到http:/localhost:8080/Struts2_0400_Path/path/index.jsp如果改成<a href="/index.jsp">index.jsp</a>跳到http:/localhost:8080/index.jsp 因?yàn)镴SP中“/”代表整個(gè)站點(diǎn)的根路
21、徑而不是應(yīng)用的根路徑。解決方案是:永遠(yuǎn)使用絕對(duì)路徑。 <%String path = request.getContextPath();String basePath = request.getScheme()+":/"+request.getServerName()+":"+request.getServerPort()+path+"/"%><base Base標(biāo)簽的意思是當(dāng)前所有url鏈接前面都會(huì)自動(dòng)加上base標(biāo)簽配置的href路徑href="<%=basePath%>" /&g
22、t;request.getContextPath()會(huì)拿到webapplication的名稱:Struts2_0400_Pathrequest.getScheme()拿到“http”字符串request.getServerName()拿到“l(fā)ocalhost”request.getServerPort()拿到“8080”l 動(dòng)態(tài)方法調(diào)用<body>Action執(zhí)行的時(shí)候并不一定要執(zhí)行execute方法可以在配置文件中配置Action的時(shí)候用method=來指定執(zhí)行哪個(gè)方法也可以在url地址中動(dòng)態(tài)指定(動(dòng)態(tài)方法調(diào)用DMI)(推薦)<a href="<%=cont
23、ext %>/user/userAdd">添加用戶</a><a href="<%=context %>/user/user!add重點(diǎn)只用這一種,叫做動(dòng)態(tài)方法調(diào)用DMI.">添加用戶</a>前者會(huì)產(chǎn)生太多的action,所以不推薦使用</body><struts> <constant name="struts.devMode" value="true" /> <package name="user" ex
24、tends="struts-default" namespace="/user"> <action name="userAdd" class="com.bjsxt.struts2.user.action.UserAction" method="add用method參數(shù)指定執(zhí)行的方法。默認(rèn)是execute(),通過method參數(shù)可以改變,不過不推薦用,因?yàn)樗鼤?huì)產(chǎn)生太多的action,可以忘記。"> <result>/user_add_success.jsp</
25、result> </action> <action name="user" class="com.bjsxt.struts2.user.action.UserAction"> <result>/user_add_success.jsp</result> </action> </package></struts> l Action接收參數(shù)的方式Action有三種接收參數(shù)的方式1. 屬性接收參數(shù)2. 用DomainModel(實(shí)體模型)接收參數(shù)3. 用ModelDriv
26、en接收參數(shù)( 不常用 )l 用Action的屬性接收參數(shù)Struts2_0700_ActionAttrParamInputIndex.jsp<head><base href="<%=basePath %>"/> </head>使用action屬性接收參數(shù)<a href="user/user!add?name=a&age=8">添加用戶</a></body> </html>鏈接的意思是:執(zhí)行user下面的user.action下面的add方法怎么接受參
27、數(shù)的呢?第一種方式.在自己的action下面定義兩個(gè)屬性,寫好get,set方法,當(dāng)new 完action的時(shí)候,會(huì)自動(dòng)把這兩個(gè)屬性從參數(shù)里面拿過來,幫你設(shè)置好。參數(shù)跟我們的成員變量一一對(duì)應(yīng),這時(shí)候它就會(huì)自動(dòng)把我們的參數(shù)傳遞到我們成員變量里。這時(shí)候當(dāng)我們調(diào)用add()方法時(shí),它直接可以用了。UserAction.javapublic class UserAction extends ActionSupport private String name;private int age;public String add() System.out.println("name="
28、+ name);System.out.println("age=" + age);return SUCCESS;public String getName() return name;public void setName(String name) = name;public int getAge() return age;public void setAge(int age) this.age = age;Struts.xml<struts> <package name="user" extends="s
29、truts-default" namespace="/user"> <action name="user" class=tion"> <result>/user_add_success.jsp</result> </action> </package></struts>l 使用Domain Model (實(shí)體模型) 接收參數(shù)Struts2_0800_DomainModelParamInput<html><body> 使用Domain
30、Model接收參數(shù)<a href="user/user!add?=a&user.age=8">添加用戶</a></body></html>public class UserAction extends ActionSupport private User user;/private UserDTO userDTO;public String add() System.out.println("name=" + user.getName();System.out.println(&q
31、uot;age=" + user.getAge();return SUCCESS;public User getUser() return user;public void setUser(User user) this.user = user;public class User private String name;private int age;public String getName() return name;public void setName(String name) = name;public int getAge() return age;p
32、ublic void setAge(int age) this.age = age;一般來說,我們輸入?yún)?shù)不一定剛好跟我們的域模型一致,比如說:用戶有name跟password兩個(gè)屬性,但是你輸入進(jìn)來的應(yīng)該還有個(gè)密碼確認(rèn)passwordconfiguration這時(shí)候我們要么使用屬性接收,要么用DTO,或者VO l Struts2_版本的中文問題根據(jù)Struts文檔的規(guī)定:只要在Struts.xml中配置這段話就可以解決中文亂碼問題 <constant name="struts.i18n.encoding" value="GBK" />但是2
33、.1.6版本中這是一個(gè)Bug,沒法解決中文亂碼問題解決辦法是:一:升級(jí)到之后的版本;二是:使用spring的filter,在web.xml中配置過濾三:在web.xml中配置2.0版本的filter<filter> <filter-name>struts2</filter-name> <!-<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>-><filter-class&g
34、t;2.0版本的filter</filter-class></filter>Struts2文檔的位置:struts-.1-allstruts-docsdocs 要知道Strust.xml中有哪些常量可以配置,可以進(jìn)文檔里面查看例子:struts.i18n.encoding=UTF-8 /表示默認(rèn)字符集是UTF-8struts.action.extension=action, /后綴名可以是“action”,或者是“”空也行。l Struts模塊包含Struts.xml中:配<include file=”login.xml”/>相當(dāng)于把文件log
35、in.xm內(nèi)容l復(fù)制過來l Struts簡(jiǎn)單數(shù)據(jù)驗(yàn)證示例程序:Struts2_1100_SimpleDataValiationUserAction.javapublic class UserAction extends ActionSupport private String name;public String add() if(name = null | !name.equals("admin") this.addFieldError("name", "name is error");this.addFieldError(&quo
36、t;name", "name is too long");可以對(duì)同一個(gè)名字加多個(gè)錯(cuò)誤。return ERROR;如果校驗(yàn)出錯(cuò),return ERROR,跳到user_add_error.jsp return SUCCESS;public String getName() return name;public void setName(String name) = name;Struts.xml<struts> <constant name="struts.devMode" value="true&
37、quot; /> <package name="user" extends="struts-default" namespace="/user"> <action name="user" class="com.bjsxt.struts2.user.action.UserAction"> <result>/user_add_success.jsp</result> <result name="error">/us
38、er_add_error.jsp</result> </action> </package></struts>登陸不成功的時(shí)候,該怎么樣向前臺(tái)傳遞信息呢? 這時(shí)候其實(shí)是個(gè)麻煩事,因?yàn)槲覀兊膗serAction實(shí)際上是沒有跟我們的Request, response屬性綁在一起的;userAction訪問不到我們的Request, response,ServletContext,這些都沒有,在Struts2里面是采用另外一種機(jī)制。This.addFieldError(“name”,”name is error”);添加對(duì)于屬性校驗(yàn)的錯(cuò)誤信息的,錯(cuò)誤信
39、息的名字一般也是我們的屬性名字叫做name,那么這個(gè)屬性出錯(cuò),后面是這個(gè)錯(cuò)誤的具體信息:name is error!user_add_error.jsp<body>User Add Error!<s:fielderror fieldName="name這個(gè)name對(duì)應(yīng)于this.addFieldError("name", "name is error");的name" theme="simple"/><br /><s:property value="errors.
40、name0"/><s:debug></s:debug></body>這里調(diào)用addFieldError()之后在前面如何把它拿出來?在這里我們用到struts2的標(biāo)簽<s:fielderror:fielderror實(shí)際上就是說你可以把userAction里面addField()加進(jìn)去的內(nèi)容給取出來。 fieldname=”name” theme=”simple”>調(diào)用標(biāo)簽庫的時(shí)候,必須這么寫:<%taglib uri=”/struts-tags” Uri實(shí)際是在jar包里,META-INF下面的struts-tags.tld
41、文件里面的<uri>struts-tags</uri>這部分內(nèi)容prefix=”s”%>Struts的標(biāo)簽定義是位于如果我們?nèi)タ丛创a的話會(huì)看到它把我們的錯(cuò)誤信息封裝成:<url class=”errorMassage”><li><span>name is error!</span></li></url>指定成CSS修飾,這樣就給我們帶來不便,這是Struts2設(shè)計(jì)不太好的地方。所以Struts2展現(xiàn)的標(biāo)簽在企業(yè)開發(fā)中應(yīng)用得不多,因?yàn)樗际菑?qiáng)制要求你必須按照它的命名規(guī)則來去定義它的各種各樣的展現(xiàn)
42、。那我們應(yīng)該怎么樣把我們的字符串拿出來?引出下一個(gè)標(biāo)簽,這個(gè)標(biāo)簽以后會(huì)很常用:<s:debug></s:debug>當(dāng)你寫了這個(gè)標(biāo)簽之后在頁面就會(huì)默認(rèn)顯示這個(gè)標(biāo)簽 Debug點(diǎn)開Debugl Struts ValueStack(值棧) DebugValue Stack Value Stack,中文翻譯過來叫做”值?!?首先它是一個(gè)棧,棧就是一個(gè)容器,棧有個(gè)特點(diǎn)就是”后進(jìn)先出”,”值?!本褪俏矣幸粋€(gè)棧,里面放的是一系列的值。ContentsObjectProperty NameProperty ValuectextsnullactionErrorserrorsname=n
43、ame is error, name is too long因?yàn)槎x了兩個(gè),所以這里name有兩個(gè)值這里去的時(shí)候0=name is 1=name is too longfieldErrorsname=name is error, name is too longerrorMessagesnamealocalezh_CNactionMessagestextsnull首先:Struts2會(huì)把Action里面的屬性挨著排給你放進(jìn)Value Stack 來專門有這個(gè)標(biāo)簽很常用s:property<s:propertys:property 就是
44、請(qǐng)你取屬性展現(xiàn)在這里,這個(gè)標(biāo)簽專門取Value Stack以及下面的ActionContext,取Value Stack的值直接寫它的名字就可以。 value="0"/><s:property value="errors"/>取到errors實(shí)際上是一個(gè)map:name=name is error, name is too long那么我想取到map里面某一個(gè)key的內(nèi)容:<s:property value=""/>name is error, name is
45、too long而這時(shí)候?qū)嶋H上value是一個(gè)數(shù)組,所以我要想去數(shù)組的第一項(xiàng)<s:property value="0"/>這就是OGNL了name is errorl Struts2_訪問Web元素后臺(tái)的Action跟我們前臺(tái)的頁面來通訊的時(shí)候,由于它拿不到request,session,servletContext比如當(dāng)我們有人登陸了,我們要在session中設(shè)一個(gè)值,表示它登陸了,但是如果你Action訪問不到session,你如何把相關(guān)的數(shù)據(jù)設(shè)到session里面,response不用訪問它,因?yàn)槲覀兊慕Y(jié)果是通過result返回的。&
46、lt;body>取得Map類型request,session,application,真實(shí)類型 HttpServletRequest, HttpSession, ServletContext的引用:<li>前三者:依賴于容器</li><li>前三者:IOC</li> (只用這種)<li>后三者:依賴于容器</li><li>后三者:IOC</li><form name="f" action="" method="post">
47、用戶名:<input type="text" name="name"/>密碼:<input type="text" name="password"/><input type="button" value="submit1" onclick="javascript:document.f.action='login/login1'document.f.submit();document.f就取到form了,.action=&
48、#39;login/login1'也就是把它的action用JavaScript動(dòng)態(tài)地指定,然后當(dāng)你按完這個(gè)按鈕之后用document.f.submit()動(dòng)態(tài)submint。" /><input type="button" value="submit2" onclick="javascript:document.f.action='login/login2'document.f.submit();" /><input type="button" value
49、="submit3" onclick="javascript:document.f.action='login/login3'document.f.submit();" /><input type="button" value="submit4" onclick="javascript:document.f.action='login/login4'document.f.submit();" /></form></body>
50、;Strust.xml<struts> <constant name="struts.devMode" value="true" /> <package name="login" extends="struts-default" namespace="/login"> <action name="login*Login1,2,3er.action.LoginAction1對(duì)應(yīng)loginAction1,LoginAction2,LoginActi
51、on3"> <result>/user_login_success.jsp</result> </action> </package></struts>第一種方式:(忘記)取值的方法:可以在構(gòu)造方法LoginAction1里面取值,也可以在execute方法取值。就是說:下面三行“取值”代碼可以寫在任意兩個(gè)方法里面!request = (Map)ActionContext.getContext().get("request");session = ActionContext.getContext()
52、.getSession();application = ActionContext.getContext().getApplication();public class LoginAction1 extends ActionSupport private Map request;private Map session;private Map application;public LoginAction1() /取值request = (Map)ActionContext.getContext().get("request")get("request")找
53、到request這個(gè)key對(duì)應(yīng)的值,而這個(gè)值是個(gè)map;session = ActionContext.getContext().getSession();application = ActionContext.getContext().getApplication();public String execute() request.put("r1", "r1");/這里就不能用setAttribute()了,因?yàn)檫@里是Map類型的。用putsession.put("s1", "s1");application.p
54、ut("a1", "a1");return SUCCESS; request = (Map)ActionContext.getContext().get("request");ActionContext.getContext()Context直接翻譯過來是:”上下文”,在西方人寫的程序特別多,但是中國(guó)人很少用,因?yàn)椴焕斫馑鞘裁礀|西;Context就是當(dāng)前執(zhí)行的環(huán)境,就比如同學(xué)們?cè)谶@里學(xué)習(xí),實(shí)際上是有一個(gè)Context,代表了你周圍的情況,機(jī)器的情況,空調(diào)的情況,等等,它會(huì)把周圍環(huán)境幫你封轉(zhuǎn)到Context這個(gè)對(duì)象里面,當(dāng)你想訪問這些
55、東西的時(shí)候,通過Context去取。原來學(xué)習(xí)過得ServletContext代表的就是servlet的運(yùn)行環(huán)境,原來我們寫程序就用ServletContext拿到各種各樣的配置,ActionContext也就是Action周邊運(yùn)行的情況,Action運(yùn)行的時(shí)候,首先接收到請(qǐng)求接收到request,response等等后面再接著調(diào)你的處理過程,Action處理的過程中,比如說那些配置怎么配的,執(zhí)行環(huán)境怎么樣等等都要通過ActionContext來拿。原先我們?cè)陧撁嬷卸际峭ㄟ^HttpResquest,HttpResponse拿到我們的值,現(xiàn)在我們通過request = (Map)ActionCon
56、text.getContext().get("request");session = ActionContext.getContext().getSession();application = ActionContext.getContext().getApplication();拿到我們的request,response,application。User_login_success.jsp<body>User Login Success!u<s:property value="#request.r1"/> | <%=req
57、uest.getAttribute("r1") %> <s:property value="#session.s1"/> | <%=session.getAttribute("s1") %> <s:property value="#application.a1"/> | <%=application.getAttribute("a1") %> 兩種在前臺(tái)頁面取值的方法。等同于jsp的request.getParameter<s:prop
58、erty value="#attr.a1"/>“#attr.a1”,把屬性a1拿出來,這種方法很少用!忘記即可<s:property value="#attr.s1"/><s:property value="#attr.r1"/><s:debug></s:debug></body>我們的后臺(tái)放了request,session,application但是這三個(gè)東西都是map,但是它反饋到前臺(tái)之后居然用request,session,application可以拿到,所以st
59、ruts2一定幫我們?cè)贛ap和HttpRequest之間建立某種聯(lián)系,對(duì)于我們自己設(shè)定的map類型的request這里面的屬性在處理的過程中會(huì)全都復(fù)制到Http對(duì)象里邊去。第一種訪問request里面的值:<%=request.getAttribute("r1") /原始的方式第二種訪問request里面的值:<s:property value="#request.r1"/>第二種是用標(biāo)簽的方式取值,查看debug模式,Stack ContextThese items are available using the #key notat
60、ion 。略These items are available using the #key notation :下面的items是供你使用的,只要你用#key訪問它,所以你用#request 就可以訪問到request了上面的Value Stack是可以直接拿的ActionContext要拿的話加#就能拿。第二種方式(這種方式是最常用的,其他的都可以忘記)其實(shí)request我們也很少去拿它,因?yàn)槲覀傾ction的成員變量默認(rèn)會(huì)起到request的作用,它自己會(huì)放到valueStack里面, valueStack本身就是放到request里面,所以根本不用去拿request.import or
61、erceptor.ApplicationAware;import erceptor.RequestAware;importssionAware;public class LoginAction2 extends ActionSupport implements RequestAware,SessionAware, ApplicationAware 第二種方式實(shí)現(xiàn)了三個(gè)接口,這三個(gè)接口分別要求你一定要實(shí)現(xiàn)三個(gè)對(duì)應(yīng)的方法。”aware”是”知道,得知”的意思,所以實(shí)現(xiàn)了這幾個(gè)接口之后,你就應(yīng)該知道request的存
62、在了,既然知道存在了,就應(yīng)該把它保存起來了。所以一定有人傳遞給你了,這里就體現(xiàn)了IOC依賴注入的設(shè)計(jì)模式。/第二種方式區(qū)別于第一種方式的不同點(diǎn)是:第一種方式還要在構(gòu)造函數(shù)中進(jìn)行“取值”,第二種方式直接就能用了!這個(gè)就是IOC(控制反轉(zhuǎn))的設(shè)計(jì)思想,依賴注入DIprivate Map<String, Object> request;private Map<String, Object> session;private Map<String, Object> application;public String execute() request.put(&quo
63、t;r1", "r1");session.put("s1", "s1");application.put("a1", "a1");return SUCCESS; public void setRequest(Map<String, Object> request) this.request = request;public void setSession(Map<String, Object> session) this.session = session;public void setApplication(Map<String, Object> app
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年消防設(shè)施操作員之消防設(shè)備基礎(chǔ)知識(shí)押題練習(xí)試題A卷含答案
- 小學(xué)重點(diǎn)考試試題及答案
- AI智慧城市建設(shè)與城市管理優(yōu)化研究
- 辦公系統(tǒng)使用簡(jiǎn)明教程與操作手冊(cè)
- 個(gè)人辦公用品采購合同規(guī)范
- 現(xiàn)代物理學(xué)理論前沿探討閱讀題集
- 數(shù)字化圖書館建設(shè)協(xié)議
- 中醫(yī)藥兒童知識(shí)培訓(xùn)課件
- 馬匹買賣合同
- 物理光學(xué)及量子力學(xué)考點(diǎn)復(fù)習(xí)題集
- 2025年皖西衛(wèi)生職業(yè)學(xué)院?jiǎn)握新殬I(yè)適應(yīng)性測(cè)試題庫一套
- 踝關(guān)節(jié)骨折中醫(yī)護(hù)理方案
- 2025年黑龍江省伊春市單招職業(yè)適應(yīng)性測(cè)試題庫含答案
- 8.3 摩擦力(課件)2024-2025學(xué)年人教版八年級(jí)物理下冊(cè)
- 2025年黑龍江職業(yè)學(xué)院?jiǎn)握新殬I(yè)適應(yīng)性測(cè)試題庫帶答案
- 第五章產(chǎn)前檢查及高危妊娠監(jiān)測(cè)課件
- 環(huán)水保培訓(xùn)資料
- 2025中智集團(tuán)招聘重要崗位高頻重點(diǎn)模擬試卷提升(共500題附帶答案詳解)
- 2025年第六屆美麗中國(guó)全國(guó)國(guó)家版圖知識(shí)競(jìng)賽題庫及答案
- 華菱漣鋼薄板冷軋項(xiàng)目酸軋線介紹
- 駱駝祥子(老舍著,人民文學(xué)出版社)
評(píng)論
0/150
提交評(píng)論