OGNL表达式

本文深入探讨了OGNL(Object Graphic Navigation Language)表达式的概念及在MyBatis中的应用。介绍了OGNL如何简化对象属性的访问,特别是在参数类型已知的情况下,如使用QueryVo进行条件查询时,直接使用属性名代替完整的对象路径。

在这里插入图片描述
OGNL表达式:
Object Graphic Navigation Language
对象 图 导航 语言
它是通过对象的取值方法来获取数据。在写法上把get给省略了。
比如:我们获取用户的名称
类中的写法:user.getUsername();
OGNL表达式写法:user.username
mybatis中为什么能直接写username,而不用user.呢:
因为在parameterType中已经提供了属性所属的类,所以此时不需要写对象名

 <!-- 根据queryVo的条件查询用户 -->
    <select id="findUserByVo" parameterType="com.itheima.domain.QueryVo" resultMap="userMap">
        select * from user where username like #{user.username}
    </select>

QueryVo

public class QueryVo {

    private User user;

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }
}

User

public class User implements Serializable {

    private Integer userId;
    private String userName;
    private String userAddress;
    private String userSex;
    private Date userBirthday;

    public Integer getUserId() {
        return userId;
    }

    public void setUserId(Integer userId) {
        this.userId = userId;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getUserAddress() {
        return userAddress;
    }

    public void setUserAddress(String userAddress) {
        this.userAddress = userAddress;
    }

    public String getUserSex() {
        return userSex;
    }

    public void setUserSex(String userSex) {
        this.userSex = userSex;
    }

    public Date getUserBirthday() {
        return userBirthday;
    }

    public void setUserBirthday(Date userBirthday) {
        this.userBirthday = userBirthday;
    }

    @Override
    public String toString() {
        return "User{" +
                "userId=" + userId +
                ", userName='" + userName + '\'' +
                ", userAddress='" + userAddress + '\'' +
                ", userSex='" + userSex + '\'' +
                ", userBirthday=" + userBirthday +
                '}';
    }
}

OGNL(Object-Graph Navigation Language)是一种功能强大的表达式语言,用于访问和操作 Java 对象图。它广泛应用于 Struts2 等框架中,支持对对象属性、方法调用以及集合操作等复杂逻辑的处理。以下是对 OGNL 表达式的使用指南及常见问题的解析。 ### 使用指南 #### 1. 访问对象属性 OGNL 允许直接访问对象的属性。例如,假设有一个 `User` 类,其中包含 `name` 和 `age` 属性,可以通过以下方式访问这些属性: ```java user.name ``` 在 Struts2 中,如果 `user` 是 `ValueStack` 的一部分,则可以直接通过 `<s:property>` 标签显示其属性值: ```jsp <s:property value="user.name" /> ``` #### 2. 方法调用 OGNL 支持调用对象的方法。例如,调用 `user` 对象的 `getFullName()` 方法: ```java user.getFullName() ``` 在某些情况下,可以省略括号以提高可读性: ```java user.fullName ``` 需要注意的是,这种方法调用方式仅适用于无参数的方法。 #### 3. 集合操作 OGNL 提供了丰富的集合操作功能,包括列表、映射和数组的操作。例如,访问一个列表中的元素: ```java list[0] ``` 筛选列表中的特定元素: ```java list.{? #this > 5} ``` 遍历并转换列表中的每个元素: ```java list.{#this * 2} ``` #### 4. 上下文访问 在 Struts2 中,`ActionContext` 包含多个上下文对象,如 `parameters`、`session` 和 `application`。访问这些对象时需要使用“#”标记: ```java #session.user ``` #### 5. 条件表达式 OGNL 支持条件表达式,允许根据条件返回不同的结果。例如: ```java age > 18 ? 'Adult' : 'Minor' ``` ### 常见问题 #### 1. 如何避免安全风险? 由于 OGNL 允许执行任意代码,因此在用户输入中使用 OGNL 表达式可能会带来安全风险。为了避免这些问题,应确保只在受信任的环境中使用 OGNL,并对用户输入进行严格的验证和过滤。此外,可以考虑使用白名单机制限制允许的操作[^2]。 #### 2. 性能优化 虽然 OGNL 功能强大,但在频繁使用的场景下可能会影响性能。为了优化性能,可以缓存常用的表达式解析结果,减少重复解析带来的开销。 #### 3. 调试困难 OGNL 表达式通常嵌入在 JSP 页面或其他模板中,这使得调试变得困难。为了解决这个问题,可以在开发阶段启用详细的日志记录,以便跟踪表达式的执行过程。 #### 4. 版本兼容性 不同版本的 OGNL 可能存在语法差异,因此在升级 OGNL 库时需要特别注意版本兼容性问题。建议查阅官方文档,了解新版本的变化,并进行充分的测试。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值