国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

JavaPub系列--webwork開發指南-2

2019-11-18 14:23:38
字體:
來源:轉載
供稿:網友

5 Value Stack
5.1 VS是什么?
Value Stack(VS)是一個非常有用的類,可以用來支持ww的表達式語言(EL),通過它的findValue和test方法,分別用來計算值和條件表達式。VS為EL提供了管道,它具有瀏覽stack和flatten out對象的能力,來得到想要的數據。
5.2 如何使用
下列是客戶如何使用VS來滿足需要的部分范例:
? EL 使用 VS 來找到操作數的值.
? ServletDispatcher 將使用 VS 來將它自己壓棧,假如一個 view 附加到一個Action. 在view顯示之后,這個對象將從棧中移去.
? Tags 使用 VS 來將值壓棧,所以在body的contents中可以訪問這些值。例如: Iterator將next項放到棧內以供body使用,當達到結束的tag,這些值就從棧中移去。
? 對于 UI tags, 他們的父 ComponentTag 將自己壓棧,所以模版可以訪問它的tag的值.
? BeanTag 將它自己壓棧以給body部分來訪問它的值。
? i18nTag 將合適的資源包壓棧來找到正確的國際化的文本。.
? 等等. ...
一旦對象是在堆棧中,你就可以通過EL語法來訪問他們的值,對于EL的細節請察看參考部分.
5.3 基本組成
Object findValue(String query)
這個方法是用來從帶有一個EL查詢的VS中找到一個值。 查詢是分段的,每段依次求值運算each segment in turn is evaluated. 這個求值可能在棧上尋找一個合適的對象,并調用適當的方法,來查找希望的值。結果是一個對象或者為null.
boolean test(String test)
這個方法用來解析一個條件表達式.條件的 tags if 和 elseIf 將調用這個方法來對條件語句進行運算.
ValueHolder (VH)
VH 是一個你可以實現的接口,答應你對對象進行lazy賦值,當VS找到它。例如:你可以創建一個實現了VH的匿名類并將哪個類壓棧,當其他人找到這個對象,VS將調用這個類getValue()并返回值.
ValueStack getStack(PageContext context)
為PageContext 找到 ValueStack.假如找不到,將創建一個。對于每個PageContext只有一個stack,任何tag需要一個VS將調用這個方法.
ValueStack getStack(ServletRequest request)
為ServletRequest 找到ValueStack. 假如找不到,將創建一個,對于每個ServletRequest只有一個stack與之對應。任何一個servlet dispatcher 假如需要一個 VS 將調用這個方法.
Object popValue()
一個對象出棧. 返回一個對象,假如棧為空,則返回null.
void pushValue(Object value)
將對象壓棧.
6 表達式語言EL
6.1 為什么需要EL?
表達式在今天的計算機科學中都可以發現。最聞名的例子是常規表達式,常規表達式是一種迷你型語言,答應你用來描述和解釋文本,這是許多編程語言、編程環境、和程序的核心 。在如此多的領域都有常規表達式,是因為它強大的功能。
常規表達式答應你把握你的數據,它是一種程序語言,讓你能夠控制數據,并讓數據為你工作,讓你用一些簡單的符號來解決一些原本需要復雜和麻煩的編程的問題。
常規表達式是被開發用來解決與文本處理相關的一系列非凡問題的。 EL的設計是為了解決一系列與jsp有關的問題。
所以我們來看一些范例,來強調一下普通的JSP和使用WW增強的JSP代碼的區別。
讀取數據的示例:
? 使用WW方式
? Number of guesses = <webwork:PRoperty value="guessBean/numGuesses"/>

? 純 JSP方式
? <%@ page import="webwork.action.test.NumberGuessBean"%>
? ...
? <jsp:useBean id="numguess" class="webwork.action.test.NumberGuessBean" scope="session"/>
? Number of guesses = <%= numguess.getNumGuesses()%>

EL 改善了代碼的可都性,在上面的例子中WW 調用Action的getGuessBean() 然后調用bean的 getNumGuesses() 。現在來比較這些精簡的符號與第二個JSP列表. WW方式是更精簡,易于閱讀,表達得更清楚,我們不用擔心范圍、類、方法等,頁面設計者不應該厭煩這些信息。
條件判定范例:
? WW方式
? <webwork:if test="guessBean/sUCcess==true"/>
? Congratulations! You got it.
? And after just <webwork:property value="guessBean/numGuesses"/> tires.<p>
? Not sure what to do here?
? Care to <a href="<webwork:url page="numguess.action?begin=true"/>">try again</a>?
? </webwork:if>

? 普通JSP 方式
? <% if (numguess.getSuccess()) { %>
? Congratulations! You got it.
? And after just <%= numguess.getNumGuesses() %> tries. <p>
? <% numguess.reset(); %>
? Not sure what to do here?
? Care to <a href="<%=response.encodeURL(numguess.jsp)%>"/>">try again</a>?
? <% } %>

在這個例子中,我們進行了條件判定. WW 調用Action的 getGuessBean()然后調用 getSuccess() 來返回一個布爾值. 假如success的值為true,那么 條件體將被執行. 同JSP寫法相比. WW方式很輕易閱讀,另外WW支持一個相等的條件運算符。另外要注重WW如何來使用它自己的url tag來處理url編碼。
復雜數據范例:
? WW 方式
? <webwork:if test="bucket[′A1′]/bucket[′A2′]/bucket[′A3′]/empty==true"/>
? Success
? </webwork:if><br>

? 普通JSP 方式
? <% Map m = bucket.getbucket();
? Bucket A1 = (Bucket)m.get("A1");

? m = A1.getBucket();
? Bucket A2 = (Bucket)m.get("A2");

? m = A2.getBucket();
? Bucket A3 = (Bucket)m.get("A3");

? if (A3.isEmpty()) { %>
? Success
? <% } %><br>

這個例子中, 我們在處理一系列的 Map. 在用WW的方式中, bucket A1 被找到 retrieved, 然后在A1中找到 bucket A2 , 然后從A2中找到 bucket A3 ,最后調用 isEmpty(). 這種比JSP的例子中簡潔得多.我們不用寫java代碼來展開這些數據. EL 給與了我們展開一系列Maps的能力并查找到我們需要的數據. 另外, 頁面設計人員不用擔心設計時寫java代碼或察看這些內容.
我們學習了一些例子來明確典型JSP與WW的區別。WW的亮點在于讀取數據、條件測試、用EL來掌管數據。但這些只是一些簡單的提示。.
6.2 在什么地方使用EL?
EL 可以使用在任何的WW tag的屬性中,除開id tag外. id 應該是一個沒有省略符號的字符串. 條件表達式僅用于for if 和elseif tag的test屬性.
例如: 我們來看 subset tag. EL 在它的所有屬性中使用. Subset 有3個屬性: source, count, 和 start.
In this example, we specify 10 and 5 for subset attributes start and count respectively. EL will evaluate these and turn them into Integers.
<iterator:subset start="10" count="5">
<webwork:iterator>
<webwork:property/><br>
</webwork:iterator>
</iterator:subset>
6.3 表達式類型
EL有兩種主要用途:求值表達式和條件表達式. 求值表達式答應你從許多位置、范圍、對象類型中抽取數值. 條件表達式答應你使用條件運算符來評價一個或多個操作數,操作數本身也是一個值表達式.
Value EXPressions
求值表達式和條件表達式. 求值表達式答應你從許多位置、范圍、對象類型中抽取數值. 例如,
? 在JSP頁面、Request, Session, 和 application 范圍你可以使用@符號找到屬性值. 例如:假設timer在頁面范圍被定義 i.e. - id="timer". WW 將找到這個屬性并調用 getTotal() 來返回值.
? <webwork:property value="@timer/total"/>

? 使用$符號,可以得到JSP中ServletRequest參數的值. 本例中,假設參數 footer 被傳遞給本頁. 我們檢查并察看 if $footer=′jobcode′. 假如為真,則包含 Html table.
? <webwork:if test="$footer==′jobcode′">
? <table border="0" cellpadding="0" cellspacing="3" width="100%" align="center">
? <tr>
? <td><input type="Submit" name="Submit" value="<webwork:text name="′addJobcode.text′"/>"></td></tr>
? </table>
? </webwork:if>

? 使用正確的標示符,可以從Action getters 中獲取值.這包含調用帶參數的方法,返回簡單或復雜的對象. 例子中, WW 調用 getSecond(param1, param2).
? <webwork:property value="second(′one′, ′two′)"/>

? 使用“/”符號可以在一個層次數據中查找. 例子中,當前值被使用并調用 getPerson()方法. 然后, WW將對前面方法返回的值調用 getName().
? <webwork:property value="person/name"/>

? 也可以直接訪問ValueStack 來找到當前、父、或根對象.例子中, iterator tag 將 next item 壓棧,給body使用,所以“.” 是指向這個值.
? <ol>
? <webwork:iterator value="times">
? <li><webwork:text name="{}" value0="."/>
? </webwork:iterator>
? </ol>

條件表達式Conditional Expressions
條件表達式答應你使用條件運算符來計算一個或多個操作數,這些操作數本身就是值表達式。例如:
? 檢查一個對象是否為null. 在例子中假如 @matt 為 null 則Success 被打印出來。
? <webwork:if test="!@matt">
? <b>Success</b>
? </webwork:if>

? 可以計算兩個操作數的條件表達式You can evaluate conditionally with two Operands. 例子中,假如if條件為true,就執if的主體。
? <webwork:if test="′hello′ == ′hello′">
? <b>Success</b>
? </webwork:if>

? You can set precedence when evaluating conditional expressions with (). In this example, we group conditional expressions together. Note that the operands are themselves value expressions.
? <webwork:if test="bool(′true′) == true && (bool(′false′) == true settings[′foo′] == ′bar′)">
? <b>Success</b>
? </webwork:if>

總之, WW的表達式語言是一個強大的工具,讓你在訪問數據時有很大的靈活性,讓頁面設計人員很輕易的將數據拖到視圖上來。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 枝江市| 温泉县| 饶河县| 长岭县| 丹东市| 乌苏市| 长葛市| 宝山区| 资兴市| 明溪县| 茶陵县| 宽城| 高尔夫| 昌图县| 博罗县| 梅州市| 神池县| 岳普湖县| 辽阳县| 秀山| 云阳县| 汶上县| 庄河市| 临夏市| 杭锦后旗| 独山县| 平陆县| 顺昌县| 建水县| 乾安县| 宣化县| 林西县| 郎溪县| 宝山区| 宁河县| 泾川县| 津市市| 桦甸市| 遂宁市| 巴彦淖尔市| 新巴尔虎右旗|