项目中采用struts2.0时,常常使用计算表单式的处理源码原理解析:
例如:
<s:set var="hasDeductAmount" value =" %{bill.supplier.moneyPool>#amount?#amount:bill.supplier.moneyPool}"> </s:set>
上面的绿色为:value中值的表达式表示的值栈表达式为:去除%{}的表达式
bill.supplier.moneyPool>#amount?#amount:bill.supplier.moneyPool
备注: (1)原理看下面的源代码即可理解:
(2)#表示OGNL的表达式
<input name="billCon.amount" type="text" class="inputbg" value="<s:property value='#hasDeductAmount'/>" />
Struts2.0中的每一个标签的都是以组件形式展示:
Component源代码如下:
/**
* Finds a value from the OGNL stack based on the given expression.
* Will always evaluate <code>expr</code> against stack except when <code>expr</code>
* is null. If altsyntax (%{...}) is applied, simply strip it off.
*
* @param expr the expression. Returns <tt>null</tt> if expr is null.
* @return the value, <tt>null</tt> if not found.
*/
protected Object findValue(String expr) {
if (expr == null) {
return null;
}
//获取OGNL的表达式
expr = stripExpressionIfAltSyntax(expr);
//从值栈获取表达式的数据对象
return getStack().findValue(expr, throwExceptionOnELFailure);
}
/**
* If altsyntax (%{...}) is applied, simply strip the "%{" and "}" off.
* @param expr the expression (must be not null)
* @return the stripped expression if altSyntax is enabled. Otherwise
* the parameter expression is returned as is.
*/
protected String stripExpressionIfAltSyntax(String expr) {
return stripExpressionIfAltSyntax(stack, expr);
}
/**
* If altsyntax (%{...}) is applied, simply strip the "%{" and "}" off.
* @param stack the ValueStack where the context value is searched for.
* @param expr the expression (must be not null)
* @return the stripped expression if altSyntax is enabled. Otherwise
* the parameter expression is returned as is.
*/
public static String stripExpressionIfAltSyntax(ValueStack stack, String expr) {
if (altSyntax(stack)) {
// does the expression start with %{ and end with }? if so, just cut it off!
if (expr.startsWith("%{") && expr.endsWith("}")) {
return expr.substring(2, expr.length() - 1);
}
}
return expr;
}
转自:http://topmanopensource.iteye.com/blog/570022
HTML标签的属性可以被赋值为一个静态的值或一个OGNL表达式。如果你在赋值时使用了一个OGNL表达式并把它用"%{"和"}"括了起来,这个表达式将会被求值。
比如,
1、下面的label属性将被赋值字符串“useName”:
label="useName"
2、而下面这个表达式使用了一个OGNL表达式userName,label属性的值将等于某一个动作类中的userName属性值:
label="%{useName}"
3、下面这个表达式将把label属性赋值为会话属性userName的值:
label="%{#session.userName}"
4、这个value属性将被赋值为6:
value="%{1 + 5}"