struts2 ONGL表達式詳解

轉自:http://blog.csdn.net/jadyer/article/details/6174555html

淺析值棧
ValueStack對象至關於一個,它貫穿整個Action的生命週期,每一個Action類的對象實例都會擁有一個ValueStack對象
當Struts2接收到一個*.action請求後,並非直接調用Action方法,而是先將Action類的相應屬性放到ValueStack對象的頂層節點
值棧也位於內存中,它也是和parameters、request、session、application、attr對象放在一塊兒的
值棧屬於ONGL Context裏面的根對象。也就是說它位於整個內存中最最重要的地方,因此叫根對象
根對象和另外五個對象是有區別的,根對象能夠省寫#號,好比<s:property value="user.username"/>
值棧的生命週期與request請求相關,每次請求產生一個值棧。默認全部的Action會被自動放到值棧裏java

 

服務器跳轉時共用值棧
假設從一個Action11經過服務器跳轉到Action22的話,就意味着這兩個Action是共享一個值棧的,由於一次請求只使用一個值棧
這時內存中狀況是這樣的:首先接收到Action11請求後,會產生一個值棧,在棧頂存放Action11對象以及它全部的屬性
而後通過服務器跳轉到Action22,這時就會把Action22對象壓入值棧的棧頂位置,此時Action11對象以及它的全部屬性就位於棧底了web

 

取值過程
棧的特徵是後進先出。因而首先到棧頂的對象裏查找是否存在這個屬性,若是棧頂的Action22對象中不存在這個屬性的話
它就會繼續向下尋找直至棧底對象,一直查找是否存在這個屬性
若是最後找到該屬性的話,那麼就會在JSP頁面中經過<s:property value="username"/>輸出屬性值
若是在Action22和Action11都有一個同名的同類型的username屬性的話,那麼將輸出Action22中的屬性值
由於它是先從棧頂開始尋找屬性的,值棧的特徵就是後進先出,但有個前提:請求過程是經過服務器跳轉的apache

 

三個語法
假設此時想要獲取Action11中的username屬性的話,就可使用值棧的Top語法或者N語法
使用Top語法獲取值棧中的第二個對象的屬性:<s:property value="[1].top.username"/>
使用 N 語法獲取值棧中的第二個對象的屬性:<s:property value="[1].username"/>
另外值棧還有一個@語法,例如使用@語法調用Action中的靜態方法:<s:property value="@vs@getVOMethod()"/>
@vs@get()等價於@vs1@getVOMethod(),指的是棧頂對象的靜態getVOMethod()方法
同理@vs2@getVOMethod()就是取值棧中第二個對象的靜態getVOMethod()方法數組

 

客戶端跳轉時使用各自的值棧
假如中間某一個步驟中出現了客戶端跳轉的話,那麼兩個Action所使用的就是兩個不一樣的值棧了
因此在Action22中就不能再使用Action11中的屬性了,在最後跳轉到的JSP頁面中也就沒法獲取Action11的屬性了
也即從Action22跳轉到JSP頁面時使用的是redirect的話,那麼最後值棧中是沒有任何的Action對象的
這個時候咱們能夠經過連接傳參,好比<result type="redirect">test.jsp?netname=${username}</result>
意思就是取出Action22中的username屬性做爲參數,經過瀏覽器地址欄傳遞到JSP頁面中
而後使用OGNL中的#號獲取Paraments對象的屬性,即<s:property value="#parameters.netname"/>就能夠取到值了
輔助參考: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放到值棧中了,而後在執行它的execute()方法時,就又往值棧中添加了Student對象服務器

 

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

 

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

 

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請求參數的Map #parameters.id[0]至關於request.getParameter("id")

 

 

獲取Action中的屬性值或者Action中的對象的某某屬性值
利用<s:property/>標籤能夠直接獲取Action中的引用類型user裏面的username屬性
一樣能夠經過user.address.addr獲取user中引用類型address中的addr屬性的值
像這種一層一層往下傳遞的訪問方式,即所謂的導航,也就是一步步的往下調用

 

調用Action的對象裏面的普通方法
默認的會把Action放到值棧裏面,而值棧在訪問的時候,並不須要值棧的名字
當咱們調用<s:property value="user.getVOMethod()"/>的時候
它會自動到值棧裏面查找Action對象裏面有沒有user對象,而後它就發現有user
而後它就再找user裏面有沒有getVOMethod()方法,而後它發現有,因而調用getVOMethod()
實際上調用User中的getVOMethod()方法的過程與獲取表單中的姓名密碼的方式都是相同的
都是到值棧裏面查找,找是否存在user對象,若是存在,接着查找user中是否存在某某屬性或方法

 

調用Action中的靜態方法
一樣咱們也能夠在JSP頁面中寫一個OGNL表達式調用Action中的靜態方法
調用Action中的靜態方法時,與調用user對象的getVOMethod()方法的過程,是大相徑庭的
此時value的寫法是固定的,以@開頭,後面跟上具體的包名,而後@加上靜態方法
好比<s:property value="@com.jadyer.action.LoginAction@getStatic()"/>
另外user對象是LoginAction中的一個屬性,這個屬性會自動的放到值棧裏面
而值棧調用的時候,不用加上@或者包名等等,因此直接user.getVOMethod()就能夠了

 

調用JDK類中的靜態方法
可使用<s:property value="@@floor(46.58)"/>輸出floor()的執行結果
這就意味着若是不在@@中指定類的話,默認的就表示java.lang.Math類
當前大多數狀況下,咱們都不會省略這個類,都會寫全了的,而後在後面加上靜態方法

 

集合的僞屬性
OGNL可以引用集合的一些特殊的屬性,這些屬性並非JavaBean模式,例如size()、length()
當表達式引用這些屬性時,OGNL會調用相應的方法,這就是僞屬性
好比獲取List的大小:<s:property value="testList.size"/>
      List的僞屬性:size、isEmpty、iterator
       Set的僞屬性:size、isEmpty、iterator
       Map的僞屬性:size、isEmpty、keys、values
  Iterator的僞屬性:next、hasNext
Enumeration僞屬性:next、hasNext、nextElement、hasMoreElements

 

獲取集合中元素的實質就是調用它的toString()方法
它還能夠直接獲取集合中的元素,事實上是在調用集合的toString()方法
因此咱們能夠根據實際狀況經過重寫集合的toString()方法來實現個性化輸出
甚至它還能夠像訪問數組那樣,直接testList[2]獲取集合中的元素
但這種方法只適用於List,不適用於Map。由於Map的索引是key,不是數值
另外,因爲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
將這個頁面右側的下拉條拖放到最下面,就會看到它的說明了,它舉的例子以下所示
<s:property value="#fib =:[#this==0 ? 0 : #this==1 ? 1 : #fib(#this-2)+#fib(#this-1)], #fib(11)" />
Lambda表達式的語法是:[...] ,中括號前面有一個冒號,全部東西都在中括號裏面寫
也就是說咱們只要看到一個冒號跟着一箇中括號,就表示這裏使用的是Lambda表達式
#this指的是表達式的參數
因此這個例子能夠這樣理解:先判斷這個參數是否等於零,若是等於零,那麼它的值最後就是零
若是參數不等於零,就再判斷它是否等於壹。若是參數等於壹,那麼它的值最後就是壹
若是參數不等於壹,就繼續調用#fib。注意這裏已經用中括號將總體的值賦給了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..<s:property value="[0]"/>返回的是ValueStack中從上至下的全部的Object
    <s:property value="[1]"/>返回的是ValueStack中從上至下的第二個Object
3..<s:property value="[0].username"/>返回的是成員變量username的值
    假設ValueStack中存在兩個Action的話,若是第一個Action若是沒有username變量
    那麼它會繼續找第二個Action。那麼在什麼狀況下ValueStack中會存在兩個Action呢
    答案是在struts.xml中配置的是從一個Action經過<result type="chain">跳轉到另外一個Action
4..<constant name="struts.ognl.allowStaticMethodAccess" value="true"/>
    在Struts2.1.6中必須設置struts.ognl.allowStaticMethodAccess爲true以後
    才容許使用OGNL訪問靜態方法。而在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</filter-name>  
  9.         <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>  
  10.     </filter>  
  11.     <filter-mapping>  
  12.         <filter-name>struts2</filter-name>  
  13.         <url-pattern>/*</url-pattern>  
  14.     </filter-mapping>  
  15.     <welcome-file-list>  
  16.         <welcome-file>login.jsp</welcome-file>  
  17.     </welcome-file-list>    
  18. </web-app>  

 

而後是用於輸入用戶名和密碼等信息的測試頁面login.jsp

 

[xhtml] view plaincopyprint?
 
  1. <%@ page language="java" pageEncoding="UTF-8"%>  
  2. <h1>這是測試OGNL使用的登陸頁面</h1>  
  3. <h3><font color="red">提示:</font>程序設定的用戶名和密碼各爲<font color="blue"><strong>admin</strong></font><font color="blue"><strong>jadyer</strong></font></h3>  
  4. <h3><font color="red">注意:</font>用戶名和密碼不正確時將停留在頁面不動</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. </form>  

 

而後是用於顯示OGNL處理結果的loginSuc.jsp頁面

 

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

 

而後是struts.xml文件

 

[xhtml] view plaincopyprint?
 
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE struts PUBLIC  
  3.     "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"  
  4.     "http://struts.apache.org/dtds/struts-2.0.dtd">  
  5. <struts>  
  6.     <package name="ognl" extends="struts-default">  
  7.         <action name="login" class="com.jadyer.action.LoginAction">  
  8.             <result name="input">/login.jsp</result>  
  9.             <result name="success">/loginSuc.jsp?netname=hongyu</result>  
  10.             <!--  
  11.             <result name="success" type="redirect">/loginSuc.jsp?netname=hongyu</result>  
  12.             <result name="success" type="redirect">/loginSuc.jsp?netname=${user.username}</result>   
  13.              -->  
  14.         </action>  
  15.     </package>  
  16. </struts>  

 

接着是用到的三個VO類

 

  1. package com.jadyer.vo;  
  2. public class User {  
  3.     private String username;  
  4.     private String password;  
  5.     private Address address;  
  6.     /* 三個屬性的setter和getter略 */  
  7.     public String getVOMethod(){  
  8.         return "這是User類中的一個普通方法";  
  9.     }  
  10. }  
  11.   
  12.   
  13. package com.jadyer.vo;  
  14. public class Address {  
  15.     //若是將TIPS設爲private的話,loginSuc.jsp中就沒法獲取它的屬性值了  
  16.     //事實上將一個靜態的final屬性設爲private是毫無心義的  
  17.     //由於既然設置成了靜態,那麼就是供他人調用的,若是再設成private的話,別的地方根本就沒法調用了  
  18.     //即便OGNL再怎麼強大,它也不可能違反Java的規則,因此不要將靜態的屬性設爲私有  
  19.     public static final String TIPS = "玄玉加油!!";  
  20.     //addr屬性的setter和getter略  
  21.     private String addr;  
  22. }  
  23.   
  24.   
  25. package com.jadyer.vo;  
  26. public class Student {  
  27.     private String username;  
  28.     private int grade;  
  29.     /* 兩個屬性的setter和getter略 */  
  30.       
  31.     //只要是重寫一個類的構造方法,就必需要爲這個類保留空的構造方法  
  32.     //由於框架默認的都會去調用無參的空的構造方法  
  33.     public Student(){};  
  34.     public Student(String username,int grade){  
  35.         this.username = username;  
  36.         this.grade = grade;  
  37.     }  
  38.     @Override  
  39.     public String toString() {  
  40.         //若是不重寫它的toString()方法的話,默認調用toString()將輸出【類型+@+內存地址的哈希值】  
  41.         return "{學生姓名:" + username + ",成績:" + grade + "}";  
  42.     }  
  43. }  

 

最後是用來提供OGNL測試的數據的LoginAction.java

 

  1. package com.jadyer.action;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.HashMap;  
  5. import java.util.HashSet;  
  6. import java.util.List;  
  7. import java.util.Map;  
  8. import java.util.Set;  
  9.   
  10. import org.apache.struts2.interceptor.RequestAware;  
  11. import org.apache.struts2.interceptor.SessionAware;  
  12.   
  13. import com.jadyer.vo.Student;  
  14. import com.jadyer.vo.User;  
  15. import com.opensymphony.xwork2.ActionSupport;  
  16.   
  17. @SuppressWarnings({"serial""unchecked"})  
  18. public class LoginAction extends ActionSupport implements RequestAware,SessionAware {  
  19.     private User user;  
  20.     private List testList = new ArrayList();  
  21.     private Set testSet = new HashSet();  
  22.     private Map testMap = new HashMap();  
  23.     private List stus = new ArrayList();  
  24.       
  25.     /* 以上五個屬性的setter和getter略 */  
  26.       
  27.     private Map request;  
  28.     private Map session;  
  29.     public void setRequest(Map request) {  
  30.         this.request = request;  
  31.     }  
  32.     public void setSession(Map session) {  
  33.         this.session = session;  
  34.     }  
  35.       
  36.     public static String getStatic(){  
  37.         return "這是LoginAction中的一個靜態方法";  
  38.     }  
  39.     public String getCommon(){  
  40.         return "這是LoginAction中的一個普通方法";  
  41.     }  
  42.       
  43.     @Override  
  44.     public String execute() throws Exception {  
  45.         if(user.getUsername().trim().equalsIgnoreCase("admin") && user.getPassword().equals("jadyer")){  
  46.             testList.add("list11");  
  47.             testList.add("list22");  
  48.             testList.add("list33");  
  49.             testList.add("list44");  
  50.             testList.add("list55");  
  51.               
  52.             testSet.add("set11");  
  53.             testSet.add("set22");  
  54.             testSet.add("set33");  
  55.             testSet.add("set22");  
  56.             testSet.add("set11");  
  57.               
  58.             testMap.put("m11""map11");  
  59.             testMap.put("m22""map22");  
  60.             testMap.put("m33""map33");  
  61.             testMap.put("m44""map44");  
  62.             testMap.put("m55""map55");  
  63.               
  64.             stus.add(new Student("張三",88));  
  65.             stus.add(new Student("李四",77));  
  66.             stus.add(new Student("王五",66));  
  67.             stus.add(new Student("馬六",55));  
  68.               
  69.             request.put("req""這是經過OGNL中的#號獲取的request屬性範圍的值");  
  70.             session.put("ses""這是經過OGNL中的#號獲取的session屬性範圍的值");  
  71.             request.put("BB""這是經過OGNL中的#號獲取的request屬性範圍的BB");  
  72.             session.put("BB""這是經過OGNL中的#號獲取的session屬性範圍的BB");  
  73.             return SUCCESS;  
  74.         }else{  
  75.             return INPUT;  
  76.         }  
  77.     }  
  78. }  
相關文章
相關標籤/搜索