OGNL与值栈

2019-09-29 16:26:16 浏览数 (1)

好的时光

  1. OGNL
    • 什么是OGNL
    • OGNL功能
    • OGNL简单使用
  2. 值栈
    • 什么是值栈
    • 值栈结构

OGNL

什么是OGNL?

OGNL是Object-Graph Navigation Language的缩写,它是一种功能强大的表达式语言,通过它简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现字段类型转化等功能。

对比EL表达式:

OGNL对象图导航语言,比EL表达式强大很多倍的语言

EL表达式只能从域中获取数据

OGNL可以调用对象的方法,获取struts的值栈的数据。

OGNL是第三方的表达式语言,用它来获取struts中值栈的数据

OGNL的功能

支持运算符(如 -*/)

支持对象方法调用,如xxx.doSomeSpecial();

支持类静态的方法调用和值访问

支持赋值操作和表达式串联

访问OGNL上下文

操作集合对象

可以直接new一个对象

OGNL入门

OGNL使用要素三个:

表达式

根区

非根区(context对象)

OGNL核心OgnlContext本质是一个map

java程序中使用ognl:

在context中存取(需要#号)

在根元素中存取(不需要#)

使用对象方法和静态方法

在页面中使用ognl

导入标签库

调用静态方法默认不行,需要开启

值栈

什么是值栈?

ValueStack实际上就是一个容器。是一个接口,实现类为OgnlValueStack

当用户每次访问action对象的业务方法时, 会先创建ActionContext对像里面又包含OgnlValueStack对象、Action对象

它由Struts框架创建,当前端页面如jsp发送一个请求时,Struts的默认拦截器会将请求中的数据进行封装,并入ValueStack的栈顶。

Struts框架中的数据就都保存到了ValueStack中,各种域也是被包含在值栈当中,存到域当中只能在页面中把它取出来存到值栈当中可以在任何地方取出数据

ValueStack贯穿整个action的生命周期, action一旦创建,就会创建一个valuestack对象

ValueStac

值栈的内部结构

当请求过来的时候,执行

StrutsPrepareAndExecuteFilter过滤器当中的doFilter方法

在这个方法当中创建ActionContext

在创建ActionContext过程中,创建ValueStack对象

将valueStack对象传递给ActionContext对象。通过ActionContext获取值栈对象

ActionContext对象之所以能够访问servlet的API(域对象的数据)就是因为内部有值栈的引用,与action相关的存在根区请求完毕后清空,而其他域的数据存在非根区

值栈存数据

通过ActionContext类的静态方法getContext得到ActionContext对象,ActionContext对象调用getValueStack获取到值栈

获取值栈

代码语言:javascript复制
ValueStack valueStack = ActionContext.getContext().getValueStack();

根区

代码语言:javascript复制
// getRoot()可以省略
Student stu = new Student();
valueStack.getRoot().push(stu);
valueStack.getRoot().pop();

非根区

代码语言:javascript复制
ActionContext.getContext().push(数据);
ActionContext.getContext()pop();

从值栈取

用struts标签库的debug在页面展示值栈信息

使用debug需开启

代码语言:javascript复制
 <constant name="struts.devMode" value="true"></constant>

点开debug就是当前值栈信息

从根区当中取(注意它是从栈顶取,若根区中两个或多个Property Name相同取到的是上面的)

成功获取到根区的name

非根区取数据

成功获取到非根区相应信息

0 人点赞