為何使用EL表示式能夠訪問valueStack中物件的屬性、採用OGNL表示式建立List/Map集合物件
為何使用EL表示式能夠訪問valueStack中物件的屬性、採用OGNL表示式建立List/Map集合物件
原因是Struts2對HttpServletRequest作了進一步的封裝。簡略程式碼如下:
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:指定變數被放置的範圍,該屬性可以接受application、session、request、 page或action。如果沒有設定該屬性,則預設放置在OGNL Context中。
value:賦給變數的值.如果沒有設定該屬性,則將ValueStack棧頂的值賦給變數。
採用OGNL表示式判斷物件是否存在於集合中
對於集合型別,OGNL表示式可以使用in和not 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表示式的投影功能
除了in和not 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));
}
}