免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
Struts2中的OGNL表達式
分類: Struts2 2011-02-08 14:44 867人閱讀 評論(2) 收藏 舉報

淺析值棧
ValueStack對象相當于一個,它貫穿整個Action的生命周期,每個Action類的對象實例都會擁有一個ValueStack對象
當Struts2接收到一個*.action請求后,并不是直接調用Action方法,而是先將Action類的相應屬性放到ValueStack對象的頂層節(jié)點
值棧也位于內存中,它也是和parameters、request、session、application、attr對象放在一起的
值棧屬于ONGL Context里面的根對象。也就是說它位于整個內存中最最重要的地方,所以叫根對象
根對象和另外五個對象是有區(qū)別的,根對象可以省寫#號,比如
值棧的生命周期與request請求相關,每次請求產生一個值棧。默認所有的Action會被自動放到值棧里


服務器跳轉時共用值棧
假設從一個Action11通過服務器跳轉到Action22的話,就意味著這兩個Action是共享一個值棧的,因為一次請求只使用一個值棧
這時內存中情況是這樣的:首先接收到Action11請求后,會產生一個值棧,在棧頂存放Action11對象以及它所有的屬性
然后經(jīng)過服務器跳轉到Action22,這時就會把Action22對象壓入值棧的棧頂位置,此時Action11對象以及它的所有屬性就位于棧底了


取值過程
棧的特征是后進先出。于是首先到棧頂?shù)膶ο罄锊檎沂欠翊嬖谶@個屬性,如果棧頂?shù)腁ction22對象中不存在這個屬性的話
它就會繼續(xù)向下尋找直至棧底對象,一直查找是否存在這個屬性
如果最后找到該屬性的話,那么就會在JSP頁面中通過輸出屬性值
如果在Action22和Action11都有一個同名的同類型的username屬性的話,那么將輸出Action22中的屬性值
因為它是先從棧頂開始尋找屬性的,值棧的特征就是后進先出,但有個前提:請求過程是通過服務器跳轉的


三個語法
假設此時想要獲取Action11中的username屬性的話,就可以使用值棧的Top語法或者N語法
使用Top語法獲取值棧中的第二個對象的屬性:
使用 N 語法獲取值棧中的第二個對象的屬性:
另外值棧還有一個@語法,例如使用@語法調用Action中的靜態(tài)方法:
@vs@get()等價于@vs1@getVOMethod(),指的是棧頂對象的靜態(tài)getVOMethod()方法
同理@vs2@getVOMethod()就是取值棧中第二個對象的靜態(tài)getVOMethod()方法


客戶端跳轉時使用各自的值棧
假如中間某一個步驟中出現(xiàn)了客戶端跳轉的話,那么兩個Action所使用的就是兩個不同的值棧了
所以在Action22中就不能再使用Action11中的屬性了,在最后跳轉到的JSP頁面中也就無法獲取Action11的屬性了
也即從Action22跳轉到JSP頁面時使用的是redirect的話,那么最后值棧中是沒有任何的Action對象的
這個時候我們可以通過鏈接傳參,比如test.jsp?netname=${username}
意思就是取出Action22中的username屬性作為參數(shù),通過瀏覽器地址欄傳遞到JSP頁面中
然后使用OGNL中的#號獲取Paraments對象的屬性,即就可以取到值了
輔助參考:http://blog.csdn.net/jadyer/archive/2010/09/16/5887509.aspx


手工向值棧中壓入對象
正常情況下值棧保存的是Action對象,而我們也可以直接往值棧中添加其它對象,這時可以在Action中添加如下代碼
向值棧中添加對象:ActionContext.getContext.getValueStack().push(new Student("沈浪",22));
而且我們手工往值棧中添加的Student對象會位于棧頂。這是因為Struts2會首先初始化Action,然后才能調用它的方法
初始化Action的時候,便把Action放到值棧中了,然后在執(zhí)行它的execute()方法時,就又往值棧中添加了Student對象


淺析OGNL
OGNL是Object-Graph Navigation Language的縮寫,是一種功能強大的表達式語言
通過它簡單一致的表達式語法,可以存取對象的任意屬性,調用對象的方法,遍歷整個對象的結構圖,實現(xiàn)字段類型轉化等功能
OGNL用得最多的地方就是和Struts2的標簽綁定,也可以在配置文件中通過${}使用OGNL表達式


OGNL中$號的使用
1..在國際化資源文件中,引用OGNL表達式
2..在struts.xml文件中,引用OGNL表達式


OGNL中%號的使用
1..使用%{}可以取出保存在值堆棧中的Action對象,直接調用它的方法
2..如果Action繼承了ActionSupport,那么在頁面標簽中可以使用%{getText('key')}獲取國際化信息
輔助參考:http://blog.csdn.net/jadyer/archive/2010/09/16/5887545.aspx


OGNL中#號的使用
OGNL中的#號可以取出堆棧上下文中存放的對象

名稱作用例子
attr用于按request>>session>>application順序訪問其屬性#attr.userName相當于按順序從三個范圍讀取userName屬性直到找到為止
request包含當前HttpServletRequest的屬性的Map#request.userName相當于request.getAttribute("userName")
session包含當前HttpSession的屬性的Map#session.userName相當于session.getAttribute("userName")
application包含當前應用的ServletContext的屬性的Map#application.userName相當于application.getAttribute("userName")
parameters包含當前HTTP請求參數(shù)的Map#parameters.id[0]相當于request.getParameter("id")


獲取Action中的屬性值或者Action中的對象的某某屬性值
利用標簽可以直接獲取Action中的引用類型user里面的username屬性
同樣可以通過user.address.addr獲取user中引用類型address中的addr屬性的值
像這種一層一層往下傳遞的訪問方式,即所謂的導航,也就是一步步的往下調用


調用Action的對象里面的普通方法
默認的會把Action放到值棧里面,而值棧在訪問的時候,并不需要值棧的名字
當我們調用的時候
它會自動到值棧里面查找Action對象里面有沒有user對象,然后它就發(fā)現(xiàn)有user
然后它就再找user里面有沒有getVOMethod()方法,然后它發(fā)現(xiàn)有,于是調用getVOMethod()
實際上調用User中的getVOMethod()方法的過程與獲取表單中的姓名密碼的方式都是相同的
都是到值棧里面查找,找是否存在user對象,如果存在,接著查找user中是否存在某某屬性或方法


調用Action中的靜態(tài)方法
同樣我們也可以在JSP頁面中寫一個OGNL表達式調用Action中的靜態(tài)方法
調用Action中的靜態(tài)方法時,與調用user對象的getVOMethod()方法的過程,是截然不同的
此時value的寫法是固定的,以@開頭,后面跟上具體的包名,然后@加上靜態(tài)方法
比如
另外user對象是LoginAction中的一個屬性,這個屬性會自動的放到值棧里面
而值棧調用的時候,不用加上@或者包名等等,所以直接user.getVOMethod()就可以了


調用JDK類中的靜態(tài)方法
可以使用輸出floor()的執(zhí)行結果
這就意味著如果不在@@中指定類的話,默認的就表示java.lang.Math類
當前大多數(shù)情況下,我們都不會省略這個類,都會寫全了的,然后在后面加上靜態(tài)方法


集合的偽屬性
OGNL能夠引用集合的一些特殊的屬性,這些屬性并不是JavaBean模式,例如size()、length()
當表達式引用這些屬性時,OGNL會調用相應的方法,這就是偽屬性
比如獲取List的大小:
      List的偽屬性:size、isEmpty、iterator
       Set的偽屬性:size、isEmpty、iterator
       Map的偽屬性:size、isEmpty、keys、values
  Iterator的偽屬性:next、hasNext
Enumeration偽屬性:next、hasNext、nextElement、hasMoreElements


獲取集合中元素的實質就是調用它的toString()方法
它還可以直接獲取集合中的元素,事實上是在調用集合的toString()方法
所以我們可以根據(jù)實際情況通過重寫集合的toString()方法來實現(xiàn)個性化輸出
甚至它還可以像訪問數(shù)組那樣,直接testList[2]獲取集合中的元素
但這種方法只適用于List,不適用于Map。因為Map的索引是key,不是數(shù)值
另外,由于HashSet中的元素是沒有順序的,所以也不能用下標獲取單個元素


Lambda表達式
補充一下:使用Lambda表達式可以在OGNL中書寫遞歸式子,在幫助中對它有很詳細的說明
打開幫助中的//struts-2.0.14-all//struts-2.0.14//docs//index.html頁面
在左側的Documentation下面點擊Guides鏈接,然后在這個頁面中點擊OGNL
最后跳轉到//struts-2.0.14-all//struts-2.0.14//docs//docs//ognl.html
將這個頁面右側的下拉條拖放到最下面,就會看到它的說明了,它舉的例子如下所示

Lambda表達式的語法是:[...] ,中括號前面有一個冒號,所有東西都在中括號里面寫
也就是說我們只要看到一個冒號跟著一個中括號,就表示這里使用的是Lambda表達式
#this指的是表達式的參數(shù)
所以這個例子可以這樣理解:先判斷這個參數(shù)是否等于零,如果等于零,那么它的值最后就是零
如果參數(shù)不等于零,就再判斷它是否等于壹。如果參數(shù)等于壹,那么它的值最后就是壹
如果參數(shù)不等于壹,就繼續(xù)調用#fib。注意這里已經(jīng)用中括號將整體的值賦給了fib
實際上很少能夠用得到Lambda表達式


利用投影獲取屬性
利用投影獲取List中對象的username屬性時,其中{}表示的是一個集合
stus.{username}就表示將suts中所有的username屬性取出組成一個新的列表


利用選擇獲取屬性
OGNL表達式是很靈活的,可以同時使用選擇技術投影技術獲取屬性
使用選擇技術時,#this代表當前元素,問號?是把所有滿足條件的元素都取出來
上箭頭^是開始的意思,所以stus.{^#this.grade>=60}.{username}輸出的是[張三]
注意,此時輸出文本中包含中括號,這表示它是一個列表
stus.{?#this.grade>=60}.{username}[0]輸出的是張三,是字符串,二者是不同的
美元符號$是結束的意思,所以stus.{$#this.grade>=60}.{username}輸出的是[王五]
這三個符合:問號、上箭頭、美元符所返回的都是List


補充
1..當OGNL取不到值的時候,它不會報錯,而是什么都不顯示
2..返回的是ValueStack中從上至下的所有的Object
    返回的是ValueStack中從上至下的第二個Object
3..返回的是成員變量username的值
    假設ValueStack中存在兩個Action的話,如果第一個Action如果沒有username變量
    那么它會繼續(xù)找第二個Action。那么在什么情況下ValueStack中會存在兩個Action呢
    答案是在struts.xml中配置的是從一個Action通過跳轉到另一個Action
4..
    在Struts2.1.6中必須設置struts.ognl.allowStaticMethodAccess為true之后
    才允許使用OGNL訪問靜態(tài)方法。而在Struts2.0.11則無需設置,即可直接訪問


下面是OGNL測試的工程代碼,這是一個Struts2.0.11應用

首先是web.xml文件

  1. <>xml version="1.0" encoding="UTF-8"?>  
  2. <web-app version="2.5"   
  3.     xmlns="http://java.sun.com/xml/ns/javaee"   
  4.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   
  5.     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee   
  6.     http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">  
  7.     <filter>  
  8.         <filter-name>struts2< span="">filter-name>  
  9.         <filter-class>org.apache.struts2.dispatcher.FilterDispatcher< span="">filter-class>  
  10.     < span="">filter>  
  11.     <filter-mapping>  
  12.         <filter-name>struts2< span="">filter-name>  
  13.         <url-pattern>/*< span="">url-pattern>  
  14.     < span="">filter-mapping>  
  15.     <welcome-file-list>  
  16.         <welcome-file>login.jsp< span="">welcome-file>  
  17.     < span="">welcome-file-list>    
  18. < span="">web-app>  
  1. <>xml version="1.0" encoding="UTF-8"?>  
  2. <web-app version="2.5"   
  3.     xmlns="http://java.sun.com/xml/ns/javaee"   
  4.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   
  5.     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee   
  6.     http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">  
  7.     <filter>  
  8.         <filter-name>struts2< span="">filter-name>  
  9.         <filter-class>org.apache.struts2.dispatcher.FilterDispatcher< span="">filter-class>  
  10.     < span="">filter>  
  11.     <filter-mapping>  
  12.         <filter-name>struts2< span="">filter-name>  
  13.         <url-pattern>/*< span="">url-pattern>  
  14.     < span="">filter-mapping>  
  15.     <welcome-file-list>  
  16.         <welcome-file>login.jsp< span="">welcome-file>  
  17.     < span="">welcome-file-list>    
  18. < span="">web-app>  

然后是用于輸入用戶名和密碼等信息的測試頁面login.jsp

  1. <%@ page language="java" pageEncoding="UTF-8"%>  
  2. <h1>這是測試OGNL使用的登錄頁面< span="">h1>  
  3. <h3><font color="red">提示:< span="">font>程序設定的用戶名和密碼各為<font color="blue"><strong>admin< span="">strong>< span="">font><font color="blue"><strong>jadyer< span="">strong>< span="">font>< span="">h3>  
  4. <h3><font color="red">注意:< span="">font>用戶名和密碼不正確時將停留在頁面不動< span="">h3>  
  5. <form action="<%=request.getContextPath()%>/login.action" method="POST">  
  6.     <%--這里user.username匹配的是LoginAction中的引用類型user里面的username屬性--%>  
  7.     <%--查看標簽庫說明的話,就知道name中指定的是對象。這里它不是字符串,而是OGNL表達式--%>  
  8.     姓名:<input type="text" name="user.username"><br>  
  9.     密碼:<input type="text" name="user.password"><br>  
  10.     地址:<input type="text" name="user.address.addr"><br>  
  11.     <input type="submit" value="測試OGNL的輸出">  
  12. < span="">form>  
  1. <%@ page language="java" pageEncoding="UTF-8"%>  
  2. <h1>這是測試OGNL使用的登錄頁面< span="">h1>  
  3. <h3><font color="red">提示:< span="">font>程序設定的用戶名和密碼各為<font color="blue"><strong>admin< span="">strong>< span="">font><font color="blue"><strong>jadyer< span="">strong>< span="">font>< span="">h3>  
  4. <h3><font color="red">注意:< span="">font>用戶名和密碼不正確時將停留在頁面不動< span="">h3>  
  5. <form action="<%=request.getContextPath()%>/login.action" method="POST">  
  6.     <%--這里user.username匹配的是LoginAction中的引用類型user里面的username屬性--%>  
  7.     <%--查看標簽庫說明的話,就知道name中指定的是對象。這里它不是字符串,而是OGNL表達式--%>  
  8.     姓名:<input type="text" name="user.username"><br>  
  9.     密碼:<input type="text" name="user.password"><br>  
  10.     地址:<input type="text" name="user.address.addr"><br>  
  11.     <input type="submit" value="測試OGNL的輸出">  
  12. < span="">form>  

然后是用于顯示OGNL處理結果的loginSuc.jsp頁面

  1. <%@ page language="java" pageEncoding="UTF-8"%>  
  2. <%@ taglib prefix="s" uri="/struts-tags"%>  
  3. <h1>這是使用OGNL輸出的結果頁面< span="">h1>  
  4. <table border="9">  
  5.     <tr>  
  6.         <td align="right">獲取姓名屬性:< span="">td>  
  7.         <td align="left"><s:property value="user.username"/>< span="">td>  
  8.         <%-- 另外還有兩種寫法也是可以正常輸出值棧中對象的普通屬性的 --%>  
  9.         <%-- <s:property value="user['username']"/> --%>  
  10.         <%-- <s:property value="user[/"username/"]"/> --%>  
  11.         <%-- 但是如果寫成下面這種形式的話,就什么都不會輸出了 --%>  
  12.         <%-- <s:property value="user[username]"/> --%>  
  13.     < span="">tr>  
  14.     <tr>  
  15.         <td align="right">獲取地址屬性:< span="">td>  
  16.         <td align="left"><s:property value="user.address.addr"/>< span="">td>  
  17.     < span="">tr>  
  18.     <tr>  
  19.         <td align="right">調用值棧中的對象的普通方法:< span="">td>  
  20.         <td align="left"><s:property value="user.getVOMethod()"/>< span="">td>  
  21.     < span="">tr>  
  22.     <tr>  
  23.         <td align="right">調用值棧中Action的普通方法:< span="">td>  
  24.         <td align="left"><s:property value="getCommon()"/>< span="">td>  
  25.     < span="">tr>  
  26. < span="">table>  
  27. <hr/>  
  28. <table border="9">  
  29.     <tr>  
  30.         <td align="right">獲取普通類的靜態(tài)屬性:< span="">td>  
  31.         <td align="left"><s:property value="@com.jadyer.vo.Address@TIPS"/>< span="">td>  
  32.     < span="">tr>  
  33.     <tr>  
  34.         <td align="right">訪問普通類的構造方法:< span="">td>  
  35.         <td align="left"><s:property value="new com.jadyer.vo.Student('張小三',22).username"/>< span="">td>  
  36.     < span="">tr>  
  37.     <tr>  
  38.         <td align="right">調用Action中的靜態(tài)方法:< span="">td>  
  39.         <td align="left"><s:property value="@com.jadyer.action.LoginAction@getStatic()"/>< span="">td>  
  40.     < span="">tr>  
  41.     <tr>  
  42.         <td align="right">調用JDK中的類的靜態(tài)方法:< span="">td>  
  43.         <td align="left"><s:property value="@java.util.Calendar@getInstance().time"/>< span="">td>  
  44.     < span="">tr>  
  45.     <tr>  
  46.         <td align="right">調用JDK中的類的靜態(tài)方法:< span="">td>  
  47.         <td align="left"><s:property value="@java.lang.Math@floor(46.58)"/>< span="">td>  
  48.     < span="">tr>  
  49.     <tr>  
  50.         <td align="right">調用JDK中的類的靜態(tài)方法:< span="">td>  
  51.         <td align="left"><s:property value="@@floor(46.58)"/>< span="">td>  
  52.     < span="">tr>  
  53. < span="">table>  
  54. <hr/>  
  55. <table border="9">  
  56.     <tr>  
  57.         <td align="right">獲取List中的所有元素:< span="">td>  
  58.         <td align="left"><s:property value="testList"/>< span="">td>  
  59.     < span="">tr>  
  60.     <tr>  
  61.         <td align="right">獲取Set中的所有元素:< span="">td>  
  62.         <td align="left"><s:property value="testSet"/>< span="">td>  
  63.     < span="">tr>  
  64.     <tr>  
  65.         <td align="right">獲取Map中的所有元素:< span="">td>  
  66.         <td align="left"><s:property value="testMap"/>< span="">td>  
  67.     < span="">tr>  
  68.     <tr>  
  69.         <td align="right">獲取Map中的某個元素:< span="">td>  
  70.         <td align="left"><s:property value="testMap['m22']"/>< span="">td>  
  71.         <%-- 另外還有兩種寫法也是可以正常獲取Map中的某個具體元素的 --%>  
  72.         <%-- <s:property value="testMap.m22"/> --%>  
  73.         <%-- <s:property value="testMap[/"m22/"]"/> --%>  
  74.     < span="">tr>  
  75.     <tr>  
  76.         <td align="right">獲取Set中的某個元素:< span="">td>  
  77.         <%-- 由于Set中的元素是無順序的,所以不能使用下標獲取數(shù)據(jù),所以這里什么也得不到 --%>  
  78.         <td align="left"><s:property value="testSet[2]"/>< span="">td>  
  79.     < span="">tr>  
  80.     <tr>  
  81.         <td align="right">獲取List中的某個元素:< span="">td>  
  82.         <td align="left"><s:property value="testList[2]"/>< span="">td>  
  83.     < span="">tr>  
  84. < span="">table>  
  85. <hr/>  
  86. <table border="9">  
  87.     <tr>  
  88.         <td align="right">獲取List的大?。?/span>< span="">td>  
  89.         <td align="left"><s:property value="testList.size"/>< span="">td>  
  90.     < span="">tr>  
  91.     <tr>  
  92.         <td align="right">獲取Set的大小:< span="">td>  
  93.         <td align="left"><s:property value="testSet.size"/>< span="">td>  
  94.     < span="">tr>  
  95.     <tr>  
  96.         <td align="right">獲取Map的大?。?/span>< span="">td>  
  97.         <td align="left"><s:property value="testMap.size"/>< span="">td>  
  98.     < span="">tr>  
  99.     <tr>  
  100.         <td align="right">獲取Map中所有的鍵:< span="">td>  
  101.         <td align="left"><s:property value="testMap.keys"/>< span="">td>  
  102.     < span="">tr>  
  103.     <tr>  
  104.         <td align="right">獲取Map中所有的值:< span="">td>  
  105.         <td align="left"><s:property value="testMap.values"/>< span="">td>  
  106.     < span="">tr>  
  107.     <tr>  
  108.         <td align="right">Lambda計算4的階乘:< span="">td>  
  109.         <td align="left"><s:property value="#f= :[#this==1?1 : #this*#f(#this-1)],#f(4)"/>< span="">td>  
  110.     < span="">tr>  
  111. < span="">table>  
  112. <hr/>  
  113. <table border="9">  
  114.     <tr>  
  115.         <td align="right">獲取List中的所有對象:< span="">td>  
  116.         <td align="left"><s:property value="stus"/>< span="">td>  
  117.     < span="">tr>  
  118.     <tr>  
  119.         <td align="right">利用投影獲取List中對象的名字:< span="">td>  
  120.         <td align="left"><s:property value="stus.{username}"/>< span="">td>  
  121.     < span="">tr>  
  122.     <tr>  
  123.         <td align="right">利用投影獲取List中第二個對象的名字:< span="">td>  
  124.         <%-- 使用<s:property value="stus[1].{username}"/>獲取到的值為:[李四] --%>  
  125.         <%-- 二者的區(qū)別在于:后者比前者多了一個中括號 --%>  
  126.         <td align="left">  
  127.             <s:property value="stus.{username}[1]"/>        
  128.             <s:property value="stus[1].{username}"/>  
  129.         < span="">td>  
  130.     < span="">tr>  
  131.     <tr>  
  132.         <td align="right">利用選擇獲取List中成績及格的所有對象:< span="">td>  
  133.         <td align="left"><s:property value="stus.{?#this.grade>=60}"/>< span="">td>  
  134.     < span="">tr>  
  135.     <tr>  
  136.         <td align="right">利用選擇獲取List中成績及格的第一個對象:< span="">td>  
  137.         <td align="left"><s:property value="stus.{^#this.grade>=60}"/>< span="">td>  
  138.     < span="">tr>  
  139.     <tr>  
  140.         <td align="right">利用選擇獲取List中成績及格的最后一個對象:< span="">td>  
  141.         <td align="left"><s:property value="stus.{$#this.grade>=60}"/>< span="">td>  
  142.     < span="">tr>  
  143. < span="">table>  
  144. <hr/>  
  145. <table border="9">  
  146.     <tr>  
  147.         <td align="right">利用選擇獲取List中成績及格的所有對象的名字:< span="">td>  
  148.         <td align="left"><s:property value="stus.{?#this.grade>=60}.{username}"/>< span="">td>  
  149.     < span="">tr>  
  150.     <tr>  
  151.         <td align="right">利用選擇獲取List中成績及格的第二個對象的名字:< span="">td>  
  152.         <td align="left"><s:property value="stus.{?#this.grade>=60}.{username}[1]"/>< span="">td>  
  153.     < span="">tr>  
  154.     <tr>  
  155.         <td align="right">利用選擇獲取List中成績及格的第一個對象的名字:< span="">td>  
  156.         <td align="left"><s:property value="stus.{^#this.grade>=60}.{username}"/>< span="">td>  
  157.     < span="">tr>  
  158.     <tr>  
  159.         <td align="right">利用選擇獲取List中成績及格的最后一個對象的名字:< span="">td>  
  160.         <td align="left"><s:property value="stus.{$#this.grade>=60}.{username}"/>< span="">td>  
  161.     < span="">tr>  
  162.     <tr>  
  163.         <td align="right">利用選擇獲取List中成績及格的第一個對象然后求大小:< span="">td>  
  164.         <td align="left"><s:property value="stus.{^#this.grade>=60}.{username}.size"/>< span="">td>  
  165.     < span="">tr>  
  166. < span="">table>  
  167. <hr/>  
  168. <table border="9">  
  169.     <tr>  
  170.         <td align="right">利用OGNL中的#號獲取attr中的屬性:< span="">td>  
  171.         <td align="left"><s:property value="#attr.BB"/>< span="">td>  
  172.     < span="">tr>  
  173.     <tr>  
  174.         <td align="right">利用OGNL中的#號獲取request范圍中的屬性:< span="">td>  
  175.         <td align="left"><s:property value="#request.req"/>< span="">td>  
  176.     < span="">tr>  
  177.     <tr>  
  178.         <td align="right">利用OGNL中的#號獲取session范圍中的屬性:< span="">td>  
  179.         <td align="left"><s:property value="#session.ses"/>< span="">td>  
  180.     < span="">tr>  
  181.     <tr>  
  182.         <td align="right">利用OGNL中的#號獲取Paraments對象的屬性:< span="">td>  
  183.         <td align="left"><s:property value="#parameters.netname"/>< span="">td>  
  184.     < span="">tr>  
  185.     <tr>  
  186.         <td align="right">使用<%=request.getParameter("")%>或者${param.name}獲取鏈接參數(shù)值:< span="">td>  
  187.         <td align="left">  
  188.             ${param.netname}        
  189.             <%=request.getParameter("netname")%>  
  190.         < span="">td>  
  191.     < span="">tr>  
  192.     <tr>  
  193.         <td align="right">查看值棧中的信息:< span="">td>  
  194.         <td align="left"><s:debug/>< span="">td>  
  195.     < span="">tr>  
  196. < span="">table>  

然后是struts.xml文件

  1. <>xml version="1.0" encoding="UTF-8"?>  
  2.     "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"  
  3.     "http://struts.apache.org/dtds/struts-2.0.dtd">  
  4. <struts>  
  5.     <package name="ognl" extends="struts-default">  
  6.         <action name="login" class="com.jadyer.action.LoginAction">  
  7.             <result name="input">/login.jsp< span="">result>  
  8.             <result name="success">/loginSuc.jsp?netname=hongyu< span="">result>  
  9.             
本站僅提供存儲服務,所有內容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權內容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
[大數(shù)據(jù)]JavaBean的應用
Struts 2中的OGNL
Struts中OGNL與EL表達式
Java程序員從笨鳥到菜鳥之(四十九)細談struts2(十一)OGNL表達式的基本語法和...
struts2 OGNL詳解
OGNL表達式struts2標簽“%,#,$”
更多類似文章 >>
生活服務
分享 收藏 導長圖 關注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服