1. 程式人生 > >struts2基礎探索之OGNL表示式詳解

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,

valuestack記憶體圖

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>