day30_攔截器、國(guó)際化、標(biāo)簽_第1頁(yè)
day30_攔截器、國(guó)際化、標(biāo)簽_第2頁(yè)
day30_攔截器、國(guó)際化、標(biāo)簽_第3頁(yè)
day30_攔截器、國(guó)際化、標(biāo)簽_第4頁(yè)
day30_攔截器、國(guó)際化、標(biāo)簽_第5頁(yè)
已閱讀5頁(yè),還剩18頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、回顧:Struts第二天:Struts配置# 通配符、動(dòng)態(tài)方法調(diào)用# 全局跳轉(zhuǎn)配置、配置的默認(rèn)值、常量配置Struts核心業(yè)務(wù)# 請(qǐng)求數(shù)據(jù)的自動(dòng)封裝 (param 攔截器)# 類(lèi)型轉(zhuǎn)換自動(dòng)類(lèi)型轉(zhuǎn)換(struts提供)類(lèi)型轉(zhuǎn)換器$ 自定義局部- ActionClassNperties$ 自定義全局-perties# 數(shù)據(jù)處理|-ActionContext |- ServletActionContext# 文件上傳與下載Jsp: <input type=file name=file1 >Action: (上傳,

2、攔截器完成的)Privat File file1; / 拿到上傳的文件對(duì)象Private String file1FileName; / 文件名Private String file1ContentType;/類(lèi)型目標(biāo):攔截器(國(guó)際化)Ognl表達(dá)式語(yǔ)言與Struts標(biāo)簽1. 攔截器1.1 概述ü 基本概念I(lǐng)ntercetor, 即為攔截器。1) 在Struts2中,把每一個(gè)功能都用一個(gè)個(gè)的攔截器實(shí)現(xiàn);用戶(hù)想用struts的哪個(gè)功能的時(shí)候,可以自由組裝使用。2)Struts2中,為了方法用戶(hù)對(duì)攔截器的引用,提供了攔截器棧的定義,里面可以包含多個(gè)攔截器。 文件夾(文件, 文件2) 攔截

3、器棧(攔截器,攔截器2)3)Struts2中,如果用戶(hù)沒(méi)有指定執(zhí)行哪些攔截器,struts2有一個(gè)默認(rèn)執(zhí)行的棧,defaultStack; 一旦如果用戶(hù)有指定執(zhí)行哪些攔截器,默認(rèn)的攔截器棧就不會(huì)被執(zhí)行攔截器的設(shè)計(jì),就是基于組件設(shè)計(jì)的應(yīng)用!ü 攔截器配置舉例struts-default.xml文件中,定義了struts提供的所有攔截器!/1. 定義攔截器以及攔截器棧<interceptors> 1.1 攔截器定義 <interceptor name="" class="" /> 1.2 攔截器棧的定義 <interc

4、eptor-stack name="defaultStack">引用了上面攔截器(1.1) </interceptor-stack></interceptors>2. 默認(rèn)執(zhí)行的攔截器(棧)<default-interceptor-ref name="defaultStack"/>ü API|- Interceptor 攔截器接口 |- AbstractInterceptor 攔截器默認(rèn)實(shí)現(xiàn)的抽象類(lèi); 一般用戶(hù)只需要繼承此類(lèi)即可繼續(xù)攔截器開(kāi)發(fā)|- ActionInvocation 攔截器的執(zhí)行狀態(tài),調(diào)用

5、下一個(gè)攔截器或Action攔截器與過(guò)濾器區(qū)別:.1.2 自定義一個(gè)攔截器案例步驟:1. 寫(xiě)攔截器類(lèi) (看生命周期)2. 配置/* * 自定義攔截器 * author Jie.Yuan * */public class HelloInterceptor implements Interceptor/ 啟動(dòng)時(shí)候執(zhí)行public HelloInterceptor()System.out.println("創(chuàng)建了攔截器對(duì)象");/ 啟動(dòng)時(shí)候執(zhí)行Overridepublic void init() System.out.println("執(zhí)行了攔截器的初始化方法"

6、);/ 攔截器業(yè)務(wù)處理方法 (在訪問(wèn)action時(shí)候執(zhí)行? 在execute之前執(zhí)行?)Overridepublic String intercept(ActionInvocation invocation) throws Exception System.out.println("2. 攔截器,業(yè)務(wù)處理-開(kāi)始");/ 調(diào)用下一個(gè)攔截器或執(zhí)行Action (相當(dāng)于chain.doFilter(.)/ 獲取的是: execute方法的返回值String resultFlag = invocation.invoke();System.out.println("4. 攔

7、截器,業(yè)務(wù)處理-結(jié)束");return resultFlag;Overridepublic void destroy() System.out.println("銷(xiāo)毀.");<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE struts PUBLIC"-/Apache Software Foundation/DTD Struts Configuration 2.3/EN""/dtds/

8、struts-2.3.dtd"><struts><package name="hello" extends="struts-default"><!- 【攔截器配置】 -><interceptors><!- 配置用戶(hù)自定義的攔截器 -><interceptor name="helloInterceptor" class="cn.itcast.a_interceptor.HelloInterceptor"></intercep

9、tor><!- 自定義一個(gè)棧: 要引用默認(rèn)棧、自定義的攔截器 -><interceptor-stack name="helloStack"><!- 引用默認(rèn)棧 (一定要放到第一行)-><interceptor-ref name="defaultStack"></interceptor-ref><!- 引用自定義攔截器 -><interceptor-ref name="helloInterceptor"></interceptor-ref&g

10、t;</interceptor-stack></interceptors><!- 【執(zhí)行攔截器】 -><default-interceptor-ref name="helloStack"></default-interceptor-ref><!- Action配置 -><action name="hello" class="cn.itcast.a_interceptor.HelloAction"><result name="succes

11、s"></result></action></package></struts>1.2 攔截器執(zhí)行流程UML (時(shí)序圖)啟動(dòng):創(chuàng)建所有攔截器、執(zhí)行init()訪問(wèn):先創(chuàng)建Action,再執(zhí)行攔截器,最后:攔截器放行,執(zhí)行execute();1.3 攔截器案例需求:登陸后,顯示列表!案例準(zhǔn)備:Struts jar文件DbUtils組件數(shù)據(jù)庫(kù)連接池/ 驅(qū)動(dòng)包-> login.jsp<body> <form method="post" action="$pageContext.req

12、uest.contextPath /user_login.action"> 用戶(hù)名:<input type="text" name="admin.userName"><br/> 密碼:<input type="text" name="admin.pwd"><br/> <input type="submit" value="登陸"><br/> </form> </body&

13、gt;à UserAction.javapublic class UserAction extends ActionSupport / -1. 封裝請(qǐng)求數(shù)據(jù)-private Admin admin;public Admin getAdmin() return admin;public void setAdmin(Admin admin) this.admin = admin;/ -2. 調(diào)用的Service-private AdminService adminService = new AdminService();/ 登陸public String login() try Admi

14、n userInfo = adminService.login(admin);/ 判斷if (userInfo = null)/ 登陸失敗return "input"/ 登陸成功:數(shù)據(jù)保存在session中ActionContext.getContext().getSession().put("userInfo", userInfo);/ 登陸成功return "loginSuccess" catch (Exception e) return ERROR;/ 列表public String list() try / 查詢(xún)?nèi)縇ist&

15、lt;Admin> list = adminService.getAll();/ 保存到requestActionContext.getContext().getContextMap().put("listAdmin", list);return "list" catch (Exception e) return ERROR;public String add() return null;à list.jsp<body> <h1>歡迎你,$userInfo.userName </h1> <tabl

16、e align="center" border="1"> <tr> <td>序號(hào)</td> <td>編號(hào)</td> <td>用戶(hù)名</td> <td>密碼</td> </tr> <%-taglib uri=" prefix="c" -%> <!- 用struts標(biāo)簽迭代數(shù)據(jù) -> <%taglib uri="/struts-tags" prefix=&

17、quot;s" %> <s:iterator var="admin" value="#request.listAdmin" status="st"> <tr> <td> <s:property value="#st.count"/> </td> <td> <s:property value="#admin.id"/> </td> <td> <s:property va

18、lue="#admin.userName"/> </td> <td> <s:property value="#admin.pwd"/> </td> </tr> </s:iterator> </table> </body>à 自定義攔截器public class UserCheckInterceptor extends AbstractInterceptor/* * 攔截器業(yè)務(wù)處理方法 */public String intercept(Acti

19、onInvocation invocation) throws Exception / 拿到當(dāng)前執(zhí)行的方法名:判斷,只有當(dāng)前方法名不是login,就進(jìn)行驗(yàn)證/ 獲取ActionContext對(duì)象ActionContext ac = invocation.getInvocationContext();/ 獲取action的代理對(duì)象 ActionProxy proxy = invocation.getProxy(); / 獲取當(dāng)前執(zhí)行的方法名 String methodName = proxy.getMethod(); / 判斷 if (!"login".equals(meth

20、odName) / 先獲取當(dāng)前登陸的用戶(hù) Object obj = ac.getSession().get("userInfo"); if (obj = null) / 沒(méi)有登陸 return "input" else / 當(dāng)前用戶(hù)有登陸 return invocation.invoke(); else / 說(shuō)明當(dāng)前用戶(hù)正在登陸 return invocation.invoke(); à 配置攔截器<?xml version="1.0" encoding="UTF-8" ?><!DOCT

21、YPE struts PUBLIC"-/Apache Software Foundation/DTD Struts Configuration 2.3/EN""/dtds/struts-2.3.dtd"><struts><package name="user" extends="struts-default"><!- 【攔截器配置】 -><interceptors><interceptor name="

22、;loginCheck" class="erceptor.UserCheckInterceptor"></interceptor><interceptor-stack name="myStack"><interceptor-ref name="defaultStack"></interceptor-ref><interceptor-ref name="loginCheck"></interceptor-ref

23、></interceptor-stack></interceptors><!- 【執(zhí)行攔截器:第一種寫(xiě)法: 當(dāng)前包下所有的acntion都執(zhí)行myStack?!?lt;default-interceptor-ref name="myStack"></default-interceptor-ref> -><!- 全局配置 -><global-results><result name="error">/error.jsp</result></gl

24、obal-results><action name="user_*" class="cn.itcast.action.UserAction" method="1"><!-第二種寫(xiě)法: 只是在這一個(gè)Action中執(zhí)行myStack棧 <interceptor-ref name="defaultStackt"></interceptor-ref><interceptor-ref name="loginCheck"></intercep

25、tor-ref>-><!- 第三種寫(xiě)法:執(zhí)行用戶(hù)棧(與第二種寫(xiě)法一樣, 只在當(dāng)前aciton中執(zhí)行自定義棧) -><interceptor-ref name="myStack"></interceptor-ref><!- 1. 登陸失敗 -><result name="input">/login.jsp</result><!- 2. 登陸成功 -><result name="loginSuccess" type="redir

26、ectAction">user_list</result><!- 3. 列表展示 -><result name="list">/WEB-INF/list.jsp</result></action></package></struts>2. Struts2中的國(guó)際化回顧:Servlet 中國(guó)際化:1. 寫(xiě)資源文件基礎(chǔ)名.properties 【默認(rèn)的語(yǔ)言環(huán)境的配置】 基礎(chǔ)名_語(yǔ)言簡(jiǎn)稱(chēng)_國(guó)家簡(jiǎn)稱(chēng).properties2. 讀取資源文件,再使用程序:ResourceBundleJs

27、p: jstl提供的格式化與國(guó)際化標(biāo)簽庫(kù)。Struts2中國(guó)際化:1. 寫(xiě)資源文件 (同servlet)2. 讀資源文件程序:ResourceBundle (同servlet)JSP: 1)jstl表親啊 (同servlet)2)struts標(biāo)簽獲取資源文件內(nèi)容區(qū)別:Struts2加載資源文件更加簡(jiǎn)單!通過(guò)常量加載即可!再在jsp頁(yè)面直接使用!à1. 寫(xiě)資源文件Mperties 默認(rèn)的語(yǔ)言環(huán)境; 找不到配置就找它Msg_en_US.properties 美國(guó)-à2. 加載<constant name="struts.custom.i18n.res

28、ources" value="cn.itcast.config.msg"></constant>à3. 使用: 標(biāo)簽name值直接寫(xiě)配置文件中的key<s:text name="title"></s:text>另外一點(diǎn),(推薦)加載資源文件通過(guò)常量加載還可以在頁(yè)面加載, 這樣用:<s:i18n name="cn.itcast.config.msg"><s:text> 標(biāo)簽必須放到標(biāo)簽體中。</s:i18n>3. Ognl表達(dá)式語(yǔ)言概述l

29、OGNL表達(dá)式 OGNL是Object Graphic Navigation Language(對(duì)象圖導(dǎo)航語(yǔ)言)的縮寫(xiě),它是一個(gè)開(kāi)源項(xiàng)目。 Struts2框架使用OGNL作為默認(rèn)的表達(dá)式語(yǔ)言。l OGNL優(yōu)勢(shì) 1、支持對(duì)象方法調(diào)用,如xxx.doSomeSpecial(); 2、支持類(lèi)靜態(tài)的方法調(diào)用和值訪問(wèn),表達(dá)式的格式: 類(lèi)全名(包括包路徑)方法名 |  值名,例如: java.lang.Stringformat('foo %s', 'bar') 或tutorial.MyConstantAPP_NAME; 3、支持賦值操作和表達(dá)式串聯(lián),如price=

30、100, discount=0.8, calculatePrice(),這個(gè)表達(dá)式會(huì)返回80; 4、訪問(wèn)OGNL上下文(OGNL context)和ActionContext; 5、操作集合對(duì)象。l 總結(jié) OGNL 有一個(gè)上下文(Context)概念,說(shuō)白了上下文就是一個(gè)MAP結(jié)構(gòu),它實(shí)現(xiàn)了 java.utils.Map 的接口。 OgnlContext對(duì)象分析:ü Struts框架默認(rèn)就支持Ognl表達(dá)式語(yǔ)言。(struts必須引用的包:ognl.jar)ü 作用頁(yè)面取值用。El表達(dá)式語(yǔ)言,用于頁(yè)面取值,jsp頁(yè)面取值的標(biāo)準(zhǔn)。(默認(rèn)直接可以使用) (應(yīng)用范圍更廣。)Ogn

31、l表達(dá)式語(yǔ)言, struts標(biāo)簽?zāi)J(rèn)支持的表達(dá)式語(yǔ)言。 必須配置struts標(biāo)簽用,不能離開(kāi)struts標(biāo)簽直接用。OgnlContext對(duì)象(了解)OgnlContext對(duì)象是ognl表達(dá)式語(yǔ)言的核心。源碼類(lèi):public class OgnlContext extends Object implements Map.硬編碼方式,了解OgnlContext對(duì)象:/ OgnlContext用法public class OgnlDemo1 /* * 1. Ognl表達(dá)式語(yǔ)言語(yǔ)言取值,取非根元素的值,必須用#號(hào) * throws Exception */Testpublic void testOg

32、nl() throws Exception / 創(chuàng)建一個(gè)Ognl上下文對(duì)象OgnlContext context = new OgnlContext();/ 放入數(shù)據(jù)User user = new User();user.setId(100);user.setName("Jack");/ 【往非根元素放入數(shù)據(jù), 取值的時(shí)候表達(dá)式要用"#"】context.put("user", user);/ 獲取數(shù)據(jù)(map)/ 先構(gòu)建一個(gè)Ognl表達(dá)式, 再解析表達(dá)式Object ognl = Ognl.parseExpression("

33、;#");Object value = Ognl.getValue(ognl, context, context.getRoot();System.out.println(value);/* * 2. Ognl表達(dá)式語(yǔ)言語(yǔ)言取值,取根元素的值,不用帶#號(hào) * throws Exception */Testpublic void testOgn2() throws Exception / 創(chuàng)建一個(gè)Ognl上下文對(duì)象OgnlContext context = new OgnlContext();/ 放入數(shù)據(jù)User user = new User();user.setI

34、d(100);user.setName("Jack");/ 【往根元素放入數(shù)據(jù)】context.setRoot(user);/ 獲取數(shù)據(jù)(map)/ 先構(gòu)建一個(gè)Ognl表達(dá)式, 再解析表達(dá)式Object ognl = Ognl.parseExpression("vince");Object value = Ognl.getValue(ognl, context, context.getRoot();System.out.println(value);/* * 3.Ognl對(duì) 靜態(tài)方法調(diào)用的支持 * throws Exception

35、*/Testpublic void testOgn3() throws Exception / 創(chuàng)建一個(gè)Ognl上下文對(duì)象OgnlContext context = new OgnlContext();/ Ognl表單式語(yǔ)言,調(diào)用類(lèi)的靜態(tài)方法/Object ognl = Ognl.parseExpression("Mathfloor(10.9)");/ 由于Math類(lèi)在開(kāi)發(fā)中比較常用,所以也可以這樣寫(xiě)Object ognl = Ognl.parseExpression("floor(10.9)");Object value = Ognl.getValue

36、(ognl, context, context.getRoot();System.out.println(value);ValueStack對(duì)象ValueStack, 即值棧對(duì)象。值棧對(duì)象:是整個(gè)struts數(shù)據(jù)存儲(chǔ)的核心,或者叫中轉(zhuǎn)站。用戶(hù)每次訪問(wèn)struts的action,都會(huì)創(chuàng)建一個(gè)Action對(duì)象、值棧對(duì)象、ActionContext對(duì)象; 然后把Action對(duì)象放入值棧中; 最后再把值棧對(duì)象放入request中,傳入jsp頁(yè)面。(key: struts.valueStack); 開(kāi)發(fā)者只需要通過(guò)ActionContext對(duì)象就可以訪問(wèn)struts的其他的關(guān)鍵對(duì)象。 (ActionCo

37、ntext是給開(kāi)發(fā)者用的,便于學(xué)習(xí)與使用。)ActionRequest|-ValueStack|-ActionActionContextValueStack只要記住值棧中有List 和Map兩個(gè)東西,Map是存放request,session,application等域?qū)ο蟮牡胤?,而list是存放各種常量,變量|-ObjectStack(把動(dòng)作和相關(guān)對(duì)象壓入ObjectStack)是一個(gè)List|-ContextMap(把各種各樣的映射關(guān)系壓入ContextMap中)問(wèn)題:OgnlContext與ValueStack對(duì)象的關(guān)系?值棧中包含有OgnlContext對(duì)象Ognl是一個(gè)Map結(jié)構(gòu)的數(shù)

38、據(jù)存儲(chǔ)中心Struts標(biāo)簽Struts標(biāo)簽取值,就使用了Ognl表達(dá)式語(yǔ)言。對(duì)ValueStack的深入理解ValueStack是一個(gè)接口,而OgnlValueStack是strtus2中的缺省實(shí)現(xiàn)。ValueStack中的數(shù)據(jù),分兩個(gè)部分存放:root(CompoundRoot)和context(OgnlContext)(這與OGNL中的概念一致),同時(shí)ValueStack暴露相關(guān)的接口:void setValue(String expr, Object value);Object findValue(String expr);用來(lái)通過(guò)OGNL表達(dá)式對(duì)ValueStack中的數(shù)據(jù)進(jìn)行操作!V

39、alueStack中的root對(duì)象是CompoundRoot,CompoundRoot繼承了ArraryList,提供了額外的方法:push()和pop()方法,用來(lái)對(duì)root對(duì)象中所包含的數(shù)據(jù)進(jìn)行存?。≡赟truts2中,一個(gè)請(qǐng)求在最終到達(dá)Action的方法之前,Action對(duì)象本身會(huì)被壓入ValueStack(實(shí)際上就是放到ValueStack的CompoundRoot中),所以Action對(duì)象是CompoundRoot中的一個(gè)元素。看圖看下面的代碼:public class UserAction     private String username;

40、60;   private Integer age;    private boolean valid;    /查看用戶(hù)的詳細(xì)信息    public String detail()        username = "張三"       age = 18;     

41、0; valid = true;       return "detail"    不加#號(hào)取根元素值在Action中,給Action的username/age/valid賦值。Detail頁(yè)面如下:username:<s:property value="username"/> <br/>valid:<s:property value="valid"/> <br/>age:<s:propert

42、y value="age"/> <br/> 上述JSP頁(yè)面將能正確將它們的值取出。<s:property value=”ognl表達(dá)式”/>。在s:property標(biāo)簽中的OGNL表達(dá)式,最終會(huì)交給ValueStack來(lái)解釋。username就是一個(gè)OGNL表達(dá)式,意思是調(diào)用root對(duì)象的getUsername()方法。Struts2將自動(dòng)搜索CompoundRoot中有哪些元素(從第0個(gè)元素開(kāi)始搜索),檢測(cè)這些元素是否有g(shù)etUsername()方法,如果第0個(gè)元素沒(méi)有g(shù)etUsername()方法,將繼續(xù)搜索第1、2、3個(gè)元素是否

43、有g(shù)etUsername()方法。再看下面的例子:public class UserAction     private String username;    private String name;    /查看用戶(hù)的詳細(xì)信息    public String detail()       username = "張三"      

44、name = "王五"       User u = new User();       u.setUsername("趙毅");       ActionContext.getContext().getValueStack().push(u);       return "detail" 

45、;    這個(gè)例子通過(guò)ValueStack的接口方法push(object)往ValueStack中推入U(xiǎn)ser的實(shí)例對(duì)象。在上面這個(gè)UserAction的代碼中,我們直接調(diào)用ActionContext.getContext().getValueStack().push()方法,把一個(gè)User對(duì)象(這個(gè)對(duì)象擁有g(shù)etUsername()和setUsername()方法)直接壓入到ValueStack中,這時(shí)候,在ValueStack的CompoundRoot中將有兩個(gè)元素:第0個(gè)元素是剛剛壓入的user對(duì)象趙毅,而第1個(gè)元素是userAction對(duì)象張三,如果在J

46、SP中使用下面的表達(dá)式來(lái)取值:<s:property value=”username”/> ,那么輸出的值將是“趙毅”!道理上面已經(jīng)講過(guò)了,struts2將會(huì)從第0個(gè)元素開(kāi)始搜索CompoundRoot中的對(duì)象,第0個(gè)元素正是剛剛壓入的那個(gè)user對(duì)象!如果在JSP中使用<s:property value=”name”/>來(lái)取值,將取出“王五”,因?yàn)榈?個(gè)元素user對(duì)象沒(méi)有name屬性,所以,會(huì)繼續(xù)搜索第1個(gè)元素userAction對(duì)象,在這個(gè)對(duì)象中就有name屬性了!存儲(chǔ)的自定義字段即通過(guò)ValueStack的Set方法設(shè)置的東西,都會(huì)放到棧的HashMap<

47、K,V>中深入理解ActionContextActionContext.getContext().getValueStack();我們知道ActionContext有一個(gè)getContext方法用來(lái)獲取OgnlContext對(duì)象,OgnlContext中有g(shù)etValueStack方法,可以通過(guò)該方法獲得值棧對(duì)象(ValueStack)OgneContext.getValueStack();獲得值棧,但是這個(gè)方法只是方便調(diào)試用;實(shí)際上,我們獲得ValueStack,只能用request.getAttribute(“struts.valueStack”);再來(lái)重點(diǎn)觀察OgnlContext

48、這個(gè)非常重要的容器:OgnlContext實(shí)現(xiàn)了Map接口,這里_values私有屬性存放的是Map的鍵值對(duì)信息,我們展開(kāi)里面的table節(jié)點(diǎn)觀察里面存放了什么秘密:6、我只是展開(kāi)了部分,從中我們可以看出Struts2放置請(qǐng)求表單參數(shù)、請(qǐng)求對(duì)象本身、session對(duì)象、application對(duì)象和application對(duì)象屬性等等到OGNL棧(事實(shí)上放在OgnlContex).Struts 2 places request parameters and request, session, and application attributes on the OGNL stack (in fact

49、 the OGNL context).   小結(jié): 1、Struts2數(shù)據(jù)傳輸DataTransfer的核心對(duì)象是OgnlValueStack、OgnlContext,OgnlValueStack持有OgnlContext和root對(duì)象,注意:OgnlContext和root對(duì)象是ognl的核心要素【參考我的轉(zhuǎn)載 2、OgnlContext這個(gè)容器存放了所有本次Web請(qǐng)求響應(yīng)的所有相關(guān)信息對(duì)象,root的存放的多個(gè)根對(duì)象。 3、Struts2 Ognl表達(dá)式的解析主要依賴(lài)OgnlValueStack去完成。表達(dá)式中如果沒(méi)有帶#,如:“

50、”,那么OgnlValueStack將去根對(duì)象中去遍歷每個(gè)對(duì)象看是否某個(gè)對(duì)象的方法是否匹配"emp.getName()",匹配則執(zhí)行,否則跑出OgnlExcpetion異常。如果帶有#,則去Ognl上下文中去尋找是否有滿(mǎn)足屬性的key,有責(zé)返回。 4、Struts2的ActionContext類(lèi)只是為了訪問(wèn)ValueStack而提供的一個(gè)Facade【門(mén)面設(shè)計(jì)模式】,為程序員訪問(wèn)各種信息提供一個(gè)一致的界面。 5、使用Ognl表達(dá)式從OgnlValueStack中取出值: 代碼:深入理解Struts遍歷在Actio

51、n中定義,直接在棧頂?shù)脑匾?,獲取Map中的對(duì)象不同屬性studentMap=new HashMap<String,Student>();studentMap.put("student1",new Student(new Long(1),"20034140201","張三1","男",25);studentMap.put("student2",new Student(new Long(2),"20034140202"

52、;,"張三2","女",26);studentMap.put("student3",new Student(new Long(3),"20034140202","張三3","男",27);    用法:(這是遍歷對(duì)象的,實(shí)例后.屬性值)·     <s:iterator value="studentMap" id="column"&

53、gt;   ·     <tr>   ·      <td><s:property value="#column"/></td>   ·      <td><s:property value="value.id"/></td>

54、   ·      <td><s:property value="value.num"/></td>   ·      <td><s:property value=""/></td>   ·      <

55、;td><s:property value="value.sex"/></td>   ·      <td><s:property value="value.age"/></td>   ·     </tr>   ·     </s:i

56、terator> 二獲取Map中數(shù)組的值·         arrayMap=new HashMap<String,String>();   ·         arrayMap.put("arr1", new String"1","2003401","leejie&qu

57、ot;,"male","20");   ·         arrayMap.put("arr2", new String"2","2003402","huanglie","male","25");   ·       

58、  arrayMap.put("arr3", new String"3","2003403","lixiaoning","male","21");   用法·     <s:iterator value="arrayMap" id="column">   ·  

59、60;  <tr>   ·      <td><s:property value="#column"/></td>   ·      <td><s:property value="value0"/></td>   ·   &#

60、160;  <td><s:property value="value1"/></td>   ·      <td><s:property value="value2"/></td>   ·      <td><s:property value="va

61、lue3"/></td>   ·      <td><s:property value="value4"/></td>   ·     </tr>   ·     </s:iterator>  三迭代Map中含有List·   li

62、stMap=new HashMap<String,List<Student>>();     /定義一個(gè)Map,存放List數(shù)據(jù)       ·         List<Student> list1=new ArrayList<Student>();   /定義一個(gè)list,存放Student對(duì)象· 

63、0;       list1.add(new Student(new Long(1),"20034140201","張三1","男",25);   ·         list1.add(new Student(new Long(2),"20034140202","張三2",&q

64、uot;男",25);   ·         list1.add(new Student(new Long(3),"20034140203","張三3","男",25);   ·         listMap.put("class1", list1); &

65、#160; ·            ·         List<Student> list2=new ArrayList<Student>();   ·         list2.add(new Student(new Long(1),"20034140301","李四1","男",20);   ·         list2.add(new Student(new Long(2),"20034140302","李四2","男",21);   ·         li

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論