快捷搜索:

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

编译:Brickhan

邮件:brickhan2003@yahoo.com.cn

网站:http://www.opensymphony.com/webwork/ ,

http://www.javapub.com/

关键词:webwork简称ww

版权申明:容许非盈利性引用,如有转载,请注明滥觞:“编译:brickhan;转载自http://www.javapub.com ”字样, 版权归原作/译者所有。

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 =

? 纯 JSP要领

?

? ...

?

? Number of guesses =

EL 改良了代码的可都性,在上面的例子中WW 调用Action的getGuessBean() 然后调用bean的 getNumGuesses() 。现在来对照这些精简的符号与第二个JSP列表. WW要领是更精简,易于涉猎,表达得更清楚,我们不用担心范围、类、措施等,页面设计者不应该厌烦这些信息。

前提判断典型:

? WW要领

?

? Congratulations! You got it.

? And after justtires.

? Not sure what to do here?

? Care to ">try again?

?

? 通俗JSP 要领

?

? Congratulations! You got it.

? And after justtries.

?

? Not sure what to do here?

? Care to "/>">try again?

?

在这个例子中,我们进行了前提判断. WW 调用Action的 getGuessBean()然后调用 getSuccess() 来返回一个布尔值. 假如success的值为true,那么 前提体将被履行. 同JSP写法比拟. WW要领很轻易涉猎,别的WW支持一个相等的前提运算符。别的要留意WW若何来应用它自己的url tag来处置惩罚url编码。

繁杂数据典型:

? WW 要领

?

? Success

?

? 通俗JSP 要领

?

? Success

?

这个例子中, 我们在处置惩罚一系列的 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.

6.3 表达式类型

EL有两种主要用途:求值表达式和前提表达式. 求值表达式容许你从许多位置、范围、工具类型中抽取数值. 前提表达式容许你应用前提运算符来评价一个或多个操作数,操作数本身也是一个值表达式.

Value Expressions

求值表达式和前提表达式. 求值表达式容许你从许多位置、范围、工具类型中抽取数值. 例如,

? 在JSP页面、Request, Session, 和 Application 范围你可以应用@符号找到属性值. 例如:假设timer在页面范围被定义 i.e. - id="timer". WW 将找到这个属性并调用 getTotal() 来返回值.

?

? 应用$符号,可以获得JSP中ServletRequest参数的值. 本例中,假设参数 footer 被通报给本页. 我们反省并不雅察 if $footer=´jobcode´. 假如为真,则包孕 HTML table.

?

?

?

?

">

?

?

? 应用精确的标示符,可以从Action getters 中获取值.这包孕调用带参数的措施,返回简单或繁杂的工具. 例子中, WW 调用 getSecond(param1, param2).

?

? 应用“/”符号可以在一个层次数据中查找. 例子中,当前值被应用并调用 getPerson()措施. 然后, WW将对前面措施返回的值调用 getName().

?

? 也可以直接造访ValueStack 来找到当前、父、或根工具.例子中, iterator tag 将 next item 压栈,给body应用,以是“.” 是指向这个值.

?

?

?

?

?

前提表达式Conditional Expressions

前提表达式容许你应用前提运算符来谋略一个或多个操作数,这些操作数本身便是值表达式。例如:

? 反省一个工具是否为null. 在例子中假如 @matt 为 null 则Success 被打印出来。

?

? Success

?

? 可以谋略两个操作数的前提表达式You can evaluate conditionally with two operands. 例子中,假如if前提为true,就执if的主体。

?

? Success

?

? 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.

?

? Success

?

总之, WW的表达式说话是一个强大年夜的对象,让你在造访数据时有很大年夜的机动性,让页面设计职员很轻易的将数据拖到视图上来。

您可能还会对下面的文章感兴趣: