一、关于OGNL
1. Object Graph Navigation Language 对象图导航语言 2. 开源项目,取代页面中Java脚本,简化数据访问 3. 和EL同属于表达式语言,但功能更为强大 4. OGNL表达式的计算围绕OGNL上下文进行,由ognl.OgnlContext类表示,实现了Map接口 5. OGNL上下文中可以以键值对的形式包含多个对象,可以将其中一个指定为根对象。如果在书写OGNL表达式时没有指定访问哪个对象,就是访问根对象。 · 访问根对象,直接书写对象的属性 · 访问其他对象必须使用“#key”前缀 注意:OGNL上下文中只能有一个根对象,但是可以指定具体哪个对象是根对象
二、关于ValueStack值栈
1. Struts2对OGNL提供了支持 · Struts 2将OGNL上下文设置为ActionContext。 · 将值栈作为OGNL上下文的根对象,即值栈的内容可以直接访问,而无需#前缀。 · Action总是位于值栈的栈顶,所以访问Action中的属性无需# 2. Struts2对OGNL进行了扩充 • Struts2使用了值栈作为OGNL的根元素,并且值栈中可以存储多个对象,这不就是变相的实现了OGNL可以有多个根对象吗? • 值栈是Struts2的内容,而不是OGNL的内容,值栈是Struts2对OGNL的扩展,也是Struts2的核心所在 • 值栈通过接口com.opensymphony.xwork2.util.ValueStack来定义,实现类是com. opensymphony. xwork2. ognl.OgnlValueStack • 当Struts2接受一个aciton请求时,就会创建ActionContext、ValueStack、Action,将ValueStack作为ActionContxt的根对象,将Action放在ValueStack的栈顶。 • Struts2会自动查找值栈中的所有对象(从栈顶到栈底),直到找到一个匹配的对象或者查找完毕也没有找到。 • 值栈是根对象,所以任何对象都可以直接访问,而不需要使用#。
三、ActionContext、ValueStack、Action的关系:
ActionContext是Struts2中OGNL的上下文,其中有很多对象,比如application、request、session、用户自定义对象等。
ActionContext下还有一个固定的根对象,这个根对象就是ValueStack。
ValueStack中可以放置多个对象,正常流程下,Struts2会将Action放在值栈的栈顶。