1. 程式人生 > >為何使用EL表示式能夠訪問valueStack中物件的屬性、採用OGNL表示式建立List/Map集合物件

為何使用EL表示式能夠訪問valueStack中物件的屬性、採用OGNL表示式建立List/Map集合物件

為何使用EL表示式能夠訪問valueStack中物件的屬性、採用OGNL表示式建立List/Map集合物件

原因是Struts2HttpServletRequest作了進一步的封裝。簡略程式碼如下:

 public class StrutsRequestWrapper extends HttpServletRequestWrapper {

       public StrutsRequestWrapper(HttpServletRequest req) {

           super(req);

       }

       public Object getAttribute(String s) {

        ......

        ActionContext ctx = ActionContext.getContext();

        Object attribute = super.getAttribute(s);//先從request範圍獲取屬性值

        if (ctx != null) {

            if (attribute == null) {//如果從request範圍沒有找到屬性值,即從ValueStack中查詢物件的屬性值

               ......

               ValueStack stack = ctx.getValueStack();

               attribute = stack.findValue(s);

               ......

            }

        }

        return attribute;

    }

 }

採用OGNL表示式建立List/Map集合物件

如果需要一個集合元素的時候(例如List物件或者Map物件),可以使用OGNL中同集合相關的表示式。

使用如下程式碼直接生成一個List物件:

 <s:set name="list" value="{'zhangming','xiaoi','liming'}" />

<s:iterator value="#list" id="n">

<s:property value="n"/><br>

</s:iterator>

生成一個Map物件:

<s:set name="foobar" value="#{'foo1':'bar1', 'foo2':'bar2'}" />

<s:iterator value="#foobar" >

<s:property value="key"/>=<s:property value="value"/><br>

</s:iterator>

Set標籤用於將某個值放入指定範圍。

scope:指定變數被放置的範圍,該屬性可以接受applicationsessionrequest、 pageaction。如果沒有設定該屬性,則預設放置在OGNL Context中。

value:賦給變數的值.如果沒有設定該屬性,則將ValueStack棧頂的值賦給變數。

採用OGNL表示式判斷物件是否存在於集合中

對於集合型別,OGNL表示式可以使用innot in兩個元素符號。其中,in表示式用來判斷某個元素是否在指定的集合物件中;not in判斷某個元素是否不在指定的集合物件中,如下所示。

in表示式:

<s:if test="'foo' in {'foo','bar'}">

   在

</s:if>

<s:else>

   不在

</s:else>

not in表示式:

<s:if test="'foo' not in {'foo','bar'}">

   不在

</s:if>

<s:else>

   在

</s:else>

OGNL表示式的投影功能

除了innot in之外,OGNL還允許使用某個規則獲得集合物件的子集,常用的有以下3個相關操作符。

?:獲得所有符合邏輯的元素。

^:獲得符合邏輯的第一個元素。

$:獲得符合邏輯的最後一個元素。

例如程式碼:

<s:iterator value="books.{?#this.price > 35}">

      <s:property value="title" /> - $<s:property value="price" /><br>

</s:iterator>

在上面程式碼中,直接在集合後緊跟.{}運算子表明用於取出該集合的子集,{}內的表示式用於獲取符合條件的元素,this指的是為了從大集合books篩選資料到小集合,需要對大集合books進行迭代,this代表當前迭代的元素。本例的表示式用於獲取集合中價格大於35的書集合。

public class BookAction extends ActionSupport {

private List<Book> books;

....

@Override

     public String execute() {

         books = new LinkedList<Book>();

         books.add(new Book("A735619678", "spring", 67));

books.add(new Book("B435555322", "ejb3.0",15));

}

}