现在的位置: 首页 > 综合 > 正文

关于值栈和OGNL语法的知识梳理

2018年02月21日 ⁄ 综合 ⁄ 共 2123字 ⁄ 字号 评论关闭

EL(Expression Language) 目的:为了使JSP写起来更加简单。
EL表达式:
>>单纯在jsp页面中出现,是在四个作用域中取值,page,request,session,application.
>如果在struts环境中,它除了有在上面的四个作用域的取值功能外,还能从值栈(valuestack)中取值.
>>特点1:${name},name在值栈中的查找顺序是:先从对象栈中取,取到终止,否则,向map中取。
>>特点2:在对象栈的查找顺序是,先从model中找是否有name这个属性,找到终止,否则,找action中是否有name这个全局变量。
>>特点3:${#name},里面的是不带#号的。
>>特点4:如果放在对象栈中的是一个自定义的对象,那么${property}里面可以直接去该对象的属性值,不用这样${object.property}

OGNL表达式:
1:读取从后台传递的值
%{#name}:表示从值栈的map中取值
%{name}:表示从值栈的对象栈中取值
%{#request.name}:表示从request域中取值

2:自己构建数据
  a,构建Map<s:iterator var="map" value="#{'key1':'value1','key2':'value2'}"/>
  b,构建List<s:iterator var="list" value="{'one','two','three'}">

参考:http://ln512213519.blog.163.com/blog/static/65458527201291595020588/

OGNL:Object Graph Navigation Language(对象图导航语言)
1,访问Action值栈中的普通属性:
<s:property value="attrName"/>
2,访问Action值栈中的对象属性(要有get set方法):
<s:property value="obj.attrName"/>
<s:property value="obj1.obj2.attrName"/>
3,访问值栈中对象属性的方法
<s:property value="obj.methodName()"/>
4,访问值栈中action的普通方法:
<s:property value="methodName()"/>
5,访问静态方法:
<s:property value="@com.softeem.LoginAction@methodName()"/>
6,访问静态属性:
配置属性文件,允许ognl访问静态方法struts.ognl.allow...=true
<s:property value="@com.softeem.LoginAction@attrName"/>
7,访问Math类的静态方法:
<s:property value="@@min(9,7)"/>
8,访问普通类的构造方法:
<s:property value="new com.softeem.User(2)"/>

参考:http://blog.csdn.net/lfp0202/article/details/6188484

ActionContext依赖于OgnlContext对象,在Struts2中可以把ActionContext就看成OgnlContext
OGNL上下文(OgnlContext也称为StackContext)本身就是一个对象的集合,OGNL将多个对象放在OgnlContext中进行统一管理,并且多个对象中只有一个会被指定为根对象,在struts2OGNL的根对象就是值栈(ValueStack),值栈是有一组对象组成的堆栈。在struts2中,值栈非常重要,它贯穿于Aciton的整个生命周期,每个Action类的对象都会拥有一个值栈对象。也可以理解为Action类的对象是存储在值栈中的,故Struts2中对Action对象的设置和操作都要依赖于值栈。

OgnlContext作为OGNL内部维护的上下文对象,为其他的类进行数据访问提供了接口。
在struts2中访问值栈可以有很多方法,其中最常用的就是使用标签来访问值栈,例如可以使用表单标签访问值栈中对象的属性或使用数据标签如(push)来控制值栈本身。

值栈中的对象构成及排列顺序如下所示:
临时对象:在执行过程中,临时被创建出来并放到值栈中的对象,例如JSP标签所遍历的对象容器中当前访问到的值
就是临时对象。
模型对象:如果模型对象正在使用,那么也会放在值栈中。
action对象:正在被执行的Action对象
在使用值栈获取某一属性时,无须关心目标对象的作用域。如果要使用名为“name”的属性,可以直接从值栈中进行查询。值栈中的每一个对象,都会按照排列顺序依次检查是否拥有该属性。如果有的话,就返回对应的值,然后查询结束。如果没有的话,那么下一个元素就会被访问,直到到达值栈的末尾。这个功能非常强大,不需要直到所需要的值是存在于Action、模型还是HTTP请求中,只要这个值存在,它就会被返回。
注意:有时从值栈返回的值并不是想要的值,因为值栈总是返回第一个满足条件的值。

 

抱歉!评论已关闭.