struts2基礎探索之OGNL表示式詳解
OGNL概述:
OGNL是一種可以吧UI元素(如table和input等基礎元素)和model object(模型物件)繫結的語言,且通過OGNL的TypeConverter機制可以更容易實現值型別的轉換
.在struts2中使用OGNL表示式實際上是使用實現了ValueStack介面的類OgnlValueStack,他是ValueStack的預設實現類
.ValueStack貫穿整個action的生命週期,每個action例項都擁有一個ValueStack物件{ThreadLocal},其中儲存了當前action物件和其他相關物件。
.struts2把ValueStack物件儲存在名為:strurs.valueStack的request域中,及ValueStack的作用域為request。當action建立的時候,valuestack就建立了,action銷燬時,valuestack隨之銷燬。
OGNL表示式的基礎單元稱為導航鏈
.在struts2的框架中,valuestack就是OGNL的根物件。
.valuestack中的資料分為兩部分存放root(棧結構,CompoundRoot)和context(map形式,OgnlContext)
.valuestack中的root物件是CompoundRoot,CompoundRoot繼承了ArrayList,提供了額外的方法,push()和pop()方法用來對root物件中包含的資料進行存取,所以說CompoundRoot是一個棧結構。
.valuestack中的context物件時ognlcontext,他實現了map介面在OgnlValueStack類中,
如何在頁面檢視valuestack
<s:debug/>
在編碼中獲去ValueSatck的三種方法
ValueSatck = ActionContext.getContext.getValueStack();
//ActionContext為Action的上下文,有重要的6大物件
//valueStack,parameters,request,session,application,attr
//ognl表示式需選擇一個作為根物件root,預設是valuestack因此不用
//新增#,但是使用其他五個物件,就必須新增#字首
ValueStack valueStack = ServletActionContext.getValueStack (ServletActionContext.getRequest());
//SerlvetActionContext繼承了ActionContext,
struts2輸出標籤
匯入s標籤
<%@ taglib uri="相應的標籤版本" prefix="s"%>
property標籤(獲取輸出物件內容)
<s:property value="OGNL表示式,用於獲取需要輸出的資料"
default="當不能獲取資料時顯示的內容" escapeHtml="是否針對html
標籤進行實體化字元處理" />
iterator標籤(進行迭代)
<s:iterator value="OGNL表示式,用於獲取需要顯示的集合資料"
var="迴圈控制變數,每次從value集合中獲取一個元素,賦值給這個變數,預設儲存在page中" status="迴圈狀態變數,包括屬相值index下標序號count輸出資料的序號,first是否為第一行資料,last判斷是否為最後一個元素,even偶數序號,odd奇數序號" begin="起始下標值" end="終止下標值" step="遍歷的步長值"></s:iterator>
<s:checkboxlist list="是一個OGNL表示式獲取選項集合" name="對應提交資料的屬性名稱"label="提示的資訊" value="預設選中值"/>
struts2中的預設3個特殊運算 $ % #
1.%{}用於實現強制OGNL計算;標籤中href預設為固定的字串,不是OGNL表示式計算,如果在href後需要定義OGNL表示式計算,則需要使用%
<s:url var="u1" action="test_load.action">
<s:param name="id" value="id"/>
</s:url>
<s:a href="%{#u1}">修改</s:a>```
•set標籤用於將某個變數設定到指定的範圍中,等同於setAttribute()方法
•<s:set var="變數名稱" scope="儲存範圍" value="儲存的資料"></s:set>
•Struts 2提供了三個標籤用於進行分支流程控制,分別是if標籤、else if標籤、else標籤。其中if標籤、else if標籤提供了一個test屬性用來進行判斷
成績為:<s:property value="#parameters.score"/><br/>
<s:if test="#parameters.score[0]> 85">優秀</s:if>
<s:elseif test="#parameters.score[0]>75">良好</s:elseif>
<s:elseif test="#parameters.score[0]>=60">及格</s:elseif>
<s:else>不及格</s:else>
•Struts 2中提供append標籤用於將多個集合拼接組合成一個集合,採用的是深度優先的合併方法
<s:set var="dd" value="{'1','2','3','4'}"/>
<s:set var="ff" value="{'a','b','c','d'}"/>
<s:append var="list">
<s:param value="dd"/><s:param value="ff"/>
</s:append>
<s:iterator value="#list">
<s:property/>
</s:iterator>
•merge標籤同append標籤類似,也是用來組合集合成一個新集合,採用的是廣度優先的合併方法
<s:set var="dd" value="{'1','2','3','4'}" />
<s:set var="ff" value="{'a','b','c','d'}" />
<s:merge var="list">
<s:param value="dd" />
<s:param value="ff" />
</s:merge>
<s:iterator value="#list">
<s:property />
</s:iterator>
•generator標籤可以將指定的字串分隔成多個子字串,並將這些子字串放置到一個集合中
<s:generator separator="," val="%{'ab,fasdjk,t,dsaf'}" var="ddd">
<s:iterator value="#ddd" var="aa">
<s:property/><br>
</s:iterator>
</s:generator>
•subset標籤用來取得集合的子集
要求在Action中定義一個選擇器
public Decider getMyDecider() {
return new Decider() {
public boolean decide(Object element) throws Exception {
•int i = ((Integer)element).intValue();// 這裡是迭代一個整數集合
return (((i % 2) == 0)?true:false); //當範圍值為true時表示該元素顯示,否則不顯示 } }; }
<s:subset source="myList" decider="myDecider">
<s:iterator>
<s:property />
</s:iterator>
</s:subset>
<s:subset source="myList" decider="myDecider" var="dd" />
<s:iterator value="#attr.dd"><s:property /> </s:iterator>
•Struts 2提供bean標籤允許直接在JSP頁面中建立JavaBean例項,可以使用param標籤在該JavaBean例項傳入屬性值,也可以通過property標籤輸出該JavaBean例項的屬性值
<s:bean name="java.util.Date" var="dd">
<s:param name="year" value="1900"/>
</s:bean>
•會在頁面生成一個 debug 連結,展開能看到ValueStack中的內容,該頁面有顯示用#key能獲取到Stack Context中的值
<s:debug/>
Struts2預設提供四種主題
•Simple主題:最簡單的主題
•XHTML主題:預設主題,使用常用的HTML技巧
•CSS_XHTML主題: 使用CSS實現的XHTML主題
•AJAX主題:基於XHTML主題,但是使用了AJAX功能
允許自定義修改
<s:form action="test_add.action">
<s:textfield name="username" label="使用者名稱稱 " theme="simple" />
<s:fielderror fieldName="username"/>
</s:form>