- <span style="font-size: large;"><span style="font-size: large;"><%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
- <%@ taglib uri="/struts-tags" prefix="s" %>
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
- <html>
- <head>
- <title>OGNL的使用</title>
- </head>
- <body>
- <h3>OGNL的使用</h3><hr/>
- 訪問Action中的普通屬性: <s:property value="loginname"/><br/>
- 訪問Action中的對象屬性: <s:property value="user.birthday"/><br/>
- 訪問Action中的Set屬性: <s:property value="courseSet.toArray()[0]"/><br/>
- 訪問Action中的List屬性: <s:property value="list[0]"/><br/>
- 訪問Action中的Map屬性的鍵: <s:property value="map.keys.toArray()[1]"/><br/>
- 訪問Action中的Map屬性的值: <s:property value="map.values.toArray()[1]"/><br/>
- 訪問Action中的Map屬性的指定鍵對應的值: <s:property value="map['z']"/><br/>
- 訪問Action中的Map屬性的大小: <s:property value="map.size"/><br/>
- <hr/>
- 訪問ActionContext中的普通屬性:<s:property value="#inte"/><br/>
- 訪問ActionContext中的對象屬性:<s:property value="#user2.loginname"/><br/>
- <hr/>
- 訪問Action中的普通方法:<s:property value="getAppName()"/><br/>
- 訪問ActionContext中的某個對象上的普通方法:<s:property value="#user2.info()"/><br/>
- <hr/>
- 訪問靜態(tài)屬性:<s:property value="@java.lang.Math@PI"/><br/>
- 訪問靜態(tài)方法:<s:property value="@java.lang.Math@floor(44.56)"/><br/>
- 訪問Math類中的靜態(tài)方法:<s:property value="@@floor(44.56)"/><br/>
- <hr/>
- 調(diào)用java.util.Date的構造方法:<s:date name="new java.util.Date()" format="yyyy-MM-dd HH:mm:ss"/><br/>
- 調(diào)用java.util.Date的構造方法創(chuàng)建對象,再調(diào)用它的方法:<s:property value="new java.util.Date().getTime()"/><br/>
- <hr/>
- 投影查詢:獲取userList中所有l(wèi)oginname的列表:<s:property value="userList.{loginname}"/><br/>
- 選擇查詢:獲取userList中所有score大于60的loginname列表:<s:property value="userList.{?#this.score>60.0}.{loginname}"/><br/>
- 選擇查詢:獲取userList中所有score大于60并且gender為true的loginname列表:<s:property value="userList.{?(#this.score>60.0 && #this.gender)}.{loginname}"/><br/>
- 選擇查詢:獲取userList中所有score大于60并且gender為true的第一個元素的loginname:<s:property value="userList.{^(#this.score>60.0 && #this.gender)}.{loginname}"/><br/>
- 選擇查詢:獲取userList中所有score大于60并且gender為true的最后一個元素的loginname:<s:property value="userList.{$(#this.score>60.0 && #this.gender)}.{loginname}"/><br/>
- <hr/>
- 訪問名為xxx的請求參數(shù)對應的第一個值:<s:property value="#parameters.xxx[0]"/><br/>
- 訪問通過ActionContext中放入Request中的屬性:<s:property value="#request.reqAtt"/><br/>
- 訪問通過ServletActionContext中放入Request中的屬性:<s:property value="#request.reqAtt2"/><br/>
-
- 訪問通過ActionContext中放入Session中的屬性:<s:property value="#session.sesAtt"/><br/>
- 訪問通過ServletActionContext中放入Session中的屬性:<s:property value="#session.sesAtt2"/><br/>
- 訪問通過ActionContext中放入ServletContext中的屬性:<s:property value="#application.appAtt"/><br/>
- 訪問通過ServletActionContext中放入ServletContext中的屬性:<s:property value="#application.appAtt2"/><br/>
-
- 直接訪問屬性域中指定名稱的屬性對應的值:<s:property value="#attr.sesAtt2"/><br/>
- <br/><br/><hr/>
- <s:iterator value="userList" status="vs">
- <s:if test="%{#vs.odd}">
- <span style="color: red">
- <s:property value="#vs.count"/>: <s:property value="loginname"/>,<s:date name="birthday" format="yyyy-MM-dd HH:mm:ss"/><br/>
- </span>
- </s:if>
- <s:else>
- <span style="color: blue">
- <s:property value="#vs.count"/>: <s:property value="loginname"/>,<s:date name="birthday" format="yyyy-MM-dd HH:mm:ss"/><br/>
- </span>
- </s:else>
- </s:iterator>
-
- <hr/><s:debug/>
- </body>
- </html></span></span>
總結(jié): 在上邊大家都好奇為什么都用struts的S標簽,,因為OGNL是通常要結(jié)合Struts 2的標志一起使用,,如<s:property value="xx" />等
Action類與JSP頁面之間的數(shù)據(jù)傳遞 1) 通過HttpServletRequest,HttpSession,ServletContext來傳遞數(shù)據(jù)。 a) Action中傳數(shù)據(jù):在Action類的請求處理方法中先獲取各個作用域?qū)ο?/span> ServletActionContext.getRequest(); ServletActionContext.getRequest().getSession(); ServletActionContext.getServletContext(); 然后調(diào)用相應的setAttribute(String "鍵", Object 值); b) 在JSP頁面中取數(shù)據(jù):可以使用EL表達式或代碼片段來取出對應作用域中屬性值,。 c) 頁面中的請求參數(shù)傳遞到Action中時,,Action中直接定義對應名稱的屬性,并提供setter方法即可封裝此數(shù)據(jù),。 2) 通過ActionContext實例來傳遞數(shù)據(jù),。 ActionContext針對每個正在執(zhí)行Action的線程中綁定一份。 a) Action中通過ActionContext傳遞數(shù)據(jù),。 ActionContext提供了put(String "鍵", Object 值); //數(shù)據(jù)不會映射到HttpServletRequest中,。 ActionContext提供的getSession().put(String "鍵", Object 值); //數(shù)據(jù)會自動映射到HttpSession中。 ActionContext提供的getApplication().put(String "鍵", Object 值); //數(shù)據(jù)會自動映射到ServletContext中。 b) 在JSP頁面取數(shù)據(jù):struts2推薦使用OGNL來取ActionContext中的數(shù)據(jù),。
1. Struts2中的OGNL的使用,。
2. OGNL:對象圖導航語言。通過OGNL表達式可以獲取對象的屬性,,調(diào)用對象的方法,,或構造出對象。 1) OGNL上下文中有一個根對象,。這個根對象可以直接獲取,。不需要#。 2)支持常量: 字符串常量,、字符常量,、 數(shù)值常量:int、long,、float,、double 布爾常量:true、false Null常量 : null 支持操作符:支持Java的所有操作符,,還支持特有的操作符: ,,、 {}、in,、not in;
Struts2中的OGNL: 1) Struts2將ActionContext設置為OGNL上下文,,并將值棧(ValueStack)作為OGNL的根對象放置到ActionContext中。 2) Struts2總是把當前Action實例放置在值棧的棧頂,。所以,,在OGNL中引用Action中的屬性也可以省略“#”。 常用標簽 1) <s:property value="OGNL"/> 2) <s:date name="OGNL" format=""/> 3) <s:if test="OGNL"></s:if><s:elseif test="OGNL"></s:elseif><s:else></s:else> ★4) <s:iterator value="OGNL" status="vs">...</s:iterator> 5) <s:debug/>
struts2中#,、%和$這三個符號的使用方法【摘自max struts2教程】 一,、"#"的用法 1、 訪問OGNL上下文和Action上下文,,#相當于ActionContext.getContext(),;下表有幾個ActionContext中有用的屬性: parameters 包含當前HTTP請求參數(shù)的Map #parameters.id[0]作用相當于request.getParameter("id") request 包含當前HttpServletRequest的屬性(attribute)的Map #request.userName相當于request.getAttribute("userName") session 包含當前HttpSession的屬性(attribute)的Map #session.userName相當于session.getAttribute("userName") application 包含當前應用的ServletContext的屬性(attribute)的Map #application.userName相當于application.getAttribute("userName") attr 用于按request > session > application順序訪問其屬性(attribute) #attr.userName相當于按順序在以上三個范圍(scope)內(nèi)讀取userName屬性,直到找到為止 2,、用于過濾和投影(projecting)集合,,如books.{?#this.price<100}; 3,、構造Map,,如#{'foo1':'bar1', 'foo2':'bar2'}。
二,、"%"的用法 “%”符號的用途是在標志的屬性為字符串類型時,,計算OGNL表達式的值。例如在Ognl.jsp中加入以下代碼: <h3>%的用途</h3> <p><s:url value="#foobar['foo1']" /></p> <p><s:url value="%{#foobar['foo1']}" /></p>
三、"$"的用法 1,、用于在國際化資源文件中,,引用OGNL表達式 2、在Struts 2配置文件中,,引用OGNL表達式 例如: <action name="AddPhoto" class="addPhoto"> <interceptor-ref name="fileUploadStack" /> <result type="redirect">ListPhotos.action? albumId=${albumId}</result> </action>
|