Top
首页 > 老文章 > 正文

JavaPub系列--webwork开发指南(2)

JavaPub系列--webwork开发指南(2)

JavaPub系列--webwork开发指南(2)
发布时间:2006-04-25 18:48        来源:        作者:
JavaPub系列--Webwork开发指南(2)

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.actionbegin=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的表达式语言是一个强大的工具,让你在访问数据时有很大的灵活性,让页面设计人员很容易的将数据拖到视图上来。

编译:Brickhan
邮件:brickhan2003@yahoo.com.cn
网站:http://www.opensymphony.com/webwork/ ,
http://www.javapub.com/
关键词:webwork简称ww
版权申明:允许非盈利性引用,如有转载,请注明来源:“编译:brickhan;转载自http://www.javapub.com ”字样, 版权归原作/译者所有。

(全文完)
加载更多

专题访谈

合作站点
stat