OGNL(Object-Graph Navigation Language 对象图形导航语言),它是一个功能强大的表达式语言,用来获取和设置Java对象的属性,它旨在提供一个更高的更抽象的层次来对Java对象图进行导航。
首先通过一个具体的例子来体验下ONGL
背景:
SSH架构的web项目,其中用到了struts2的vaildate来验证画面数据,其中有这样一个场景:
<field name="A.b">
<field-validator type="fieldexpression" short-circuit="true">
<param name="expression">((!@XXXXXXXX@FLG_A.equals(A.a)) or (A.b.matches("^[0-9]$")))</param>
<message>""</message>
</field-validator>
</field>
项目A.b的check前提条件是Aa的值为FLG_A的场合此处用到了struts2的FieldExpressionValidator(sturus2中使用ognl的静态方法需要在struts.xml中添加‘<constant name="struts.ognl.allowStaticMethodAccess" value="true" />’)
fieldexpression方法的源代码在
com.opensymphony.xwork2.validator.validators.FieldExpressionValidator.class
public class FieldExpressionValidator extends FieldValidatorSupport {
private String expression;
public void setExpression(String expression) {
this.expression = expression;
}
public String getExpression() {
return expression;
}
public void validate(Object object) throws ValidationException {
String fieldName = getFieldName();
Boolean answer = Boolean.FALSE;
Object obj = null;
try {
obj = getFieldValue(expression, object);
} catch (ValidationException e) {
throw e;
} catch (Exception e) {
// let this pass, but it will be logged right below
}
if ((obj != null) && (obj instanceof Boolean)) {
answer = (Boolean) obj;
} else {
log.warn("Got result of " + obj + " when trying to get Boolean.");
}
if (!answer.booleanValue()) {
addFieldError(fieldName, object);
}
}
}
1.在ognl中可以直接使用对象的java方法
2..如何将对象解释为布尔型
在需要布尔值的位置, 可以使用任意对象. OGNL按以下方式将对象解释为布尔值:
-
如果对象是一个 Boolean 实例, 则返回它的值.
-
如果对象是一个 Number 实例, 将它的双精度浮点值与 0 进行比较;非 0 值被认为是 true, 0 被认为是 false.
-
如果对象是一个 Character 实例, 当且仅当它的字符值为非 0时, 布尔值被认为是 true .
-
其他情况下, 当且仅当它是非null时, 布尔值被认为是 true .
例子2:
<!-- 開閉器動作カウント入力フレーム -->
<field name="A.b">
<field-validator type="fieldexpression" short-circuit="true">
<param name="expression">((!@XXXXXXX@FLG_A.equals(A.a)) or (A.bb.matches("^[0-9]$")))</param>
<message>""</message>
</field-validator>
</field>