ognl表达式和值栈

ognl概述

对象导航图语言(Object Graph Navigation Language),简称OGNL,是应用于Java中的一个开源的表达式语言(Expression Language),它被集成在Struts2等框架中,作用是对数据进行访问,它拥有类型转换、访问对象方法、操作集合对象等功能。

ognl可以调用对象的方法,获取struts2的值栈的数据,类型转换、操作集合对象等功能。ognl是第三方的表达式语言,即就是在不使用struts2这个框架也可以使用ognl这个语言,只不过是这个语言比较强大,struts2将这个ognl表达式引入到了这个框架里面来。所以我们主要学习的是struts2这个框架里的ognl语言

为什么学习ognl,也就是ognl的功能

OGNL(Object-Graph Navigation Language),可以方便地·操作对象属性的开源表达式语言,使页面更简洁;
支持运算符(如±/),比普通的标志具有更高的自由度和更强的功能;
Struts 2默认的表达式语言是OGNL,原因是它相对其它表达式语言具有下面几大优势
支持对象方法调用,如xxx.doSomeSpecial();
支持类静态的方法调用和值访问,表达式的格式为@[类全名(包括包路径)]@[方法名 | 值名],例如:@java.lang.String@format(‘foo %s’, ‘bar’)或@tutorial.MyConstant@APP_NAME;
支持赋值操作和表达式串联,如price=100, discount=0.8, calculatePrice(price
discount),这个表达式会返回80;
访问OGNL上下文(OGNL context)和ActionContext; 主要学习的重点
操作集合对象。
可以直接new一个对象

ognl的使用要素

表达式:从什么地方获取数据,获取会什么样的数据
跟对象:你要操作那个对象
context对象:在哪操作

ognl入门案例

引入ognl包
请添加图片描述

请添加图片描述

访问对象的方法

请添加图片描述

访问对象的静态方法和静态属性,也是这样写的

这里的方法是静态方法是random,且这个值是0-1之间的
请添加图片描述

获取root中的数据

通常情况下会给root里面存放实体对象

创建user类

package com.biyi.pojo;

public class User {

   

    private String username;
    private String password;


    public User(String username, String password) {
        this.username = username;
        this.password = password;
    }


    public User() {
        super();
    }


    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

请添加图片描述

获取ognlcontext中的数据

请添加图片描述

第三节

ognl在struts2里面的使用,ognl在struts2的入门案例

引用的包和上一次的包一样
但是这次需要配置过滤器等配置文件,通常情况下ognl是获取页面的数据

访问对象的方法

访问对象的静态的方法

请添加图片描述

值栈概述

什么是值栈ValueStack

Struts2将XWork对Ognl的扩展这一套机制封装起来,这个对象叫ValueStack。
ValueStack实际上就是一个容器。它由Struts框架创建,当前端页面如jsp发送一个请求时,Struts的默认拦截器会将请求中的数据进行封装,并入ValueStack的栈顶。

ValueStack是struts2的一个接口,ognlValueStack是一个实现类,客户端发起一个请求,struts2框架会创建一个action实例对象,同时,还创建了一个ognlValueStack的一个实例,ognlValueStack会贯穿整个生命周期,struts会将请求action参数封装为对象存储到值栈中,并通过ognl表达式读取值栈中对象的属性的值;

值栈的内部结构

ValueStack氛围两个区域:
root区域:其实就是一些arraylist,通常放置的就是对象,获取root数据是不需要添加#
context区域:其实就是一些map,通常放置的是;web开发中的对象的引用(request,session,application,attr,parameter)获取context数据是需要添加#

通常所说的操作值栈,通常指的是操作ValueStack的root区域

值栈与actioncontext的关系

actioncontext:就是action上下文,就是之前的事和之后的是都知道,创建对象,以及执行某个方法;

通过源码,当请求过来的时候执行dofilter方法,在这个方法中创建actioncontext,在创建actioncontext过程中,
创建ValueStack对象,将ValueStack对象传递给actioncontext对象,所以可以通过actioncontext获取值栈对象
actioncontext对象之所以能够访问servlet的API(访问的是域对象的数据)因为在其内部是值栈的引用

获得值栈对象

通过actioncontext对象获取值栈
在struts2的内部,将值栈存入到request中一份

通过actioncontext对象获取值栈

请添加图片描述

在struts2的内部,将值栈存入到request中一份
这两个的方式创建的对象是同一个,因为ValueStack贯穿了action的生命周期,有一个action实例就只会有一个值栈实例
请添加图片描述

操作值栈—向值栈中存入数据

有两种方法

1.在action中提供属性的get方法

请添加图片描述

请添加图片描述

2.使用ValueStack的本身的方法

请添加图片描述

请添加图片描述

请添加图片描述

获取值栈数据

请添加图片描述

请添加图片描述

请添加图片描述

ognl的特殊字符

1,作用是获取context的数据

请添加图片描述

2,使用#构建map集合

请添加图片描述

请添加图片描述

%

请添加图片描述

$

在配置文件中使用ognl

1,属性文件
1.1国际化的地方(比如某个国家等这种情况)
message_zh_CN.properties
user.key=登陆
user.welcome=欢迎,KaTeX parse error: Expected '}', got '#' at position 2: {#̲session.name} …{#session.name}

上面这种情况是假如是中国登陆则出现登陆字样,假如是英国登陆则出现login

还有一种是变量的时候使用,就比如欢迎谁或者welcome谁,这个人是动态的

2,xml文件

请添加图片描述

综合案例:优化查询

代码实现

将查询到的数据存入到值栈中

在页面中使用ognl表达式

请添加图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值