【项目学习】ONGL表达式学习

本文介绍了OGNL(对象图形导航语言)在Struts2框架中的具体应用案例,特别是如何利用OGNL进行数据验证,包括直接调用Java对象的方法及如何将不同类型的对象解释为布尔值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值