OGNL表达式

Posted 敲出一个世界

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OGNL表达式相关的知识,希望对你有一定的参考价值。

1.ognl表达式和el表达式的区别

  1)el/jstl 是sun公司的标准,而ognl不是(所有更加推荐使用el/jstl)

  2)ognl一定要配合Struts2的标签一起使用

2.ognl表达式的作用(前提是配合struts2的标签)

  1)取值

  2)创建List和Map对象:创建List对象"{\'list0\',\'list2\',\'list3\'}"创建Map对象:"#{"key1":value1,"key2":value2}";

  3)判断元素在不在集合中: 关键字in、not int 比如 "\'list0\' in {\'list0\',\'list2\',\'list3\'}"

  4)投影(过滤、筛选):Books.{?#this.price>60} 整个表示从Books集合中根据条件一个筛选出来的子集合,用来遍历即可

 

3.ognl表达式注意的地方

 

 

 

  1)ValueStack(值栈):将一次请求涉及到的数据进行了封装;值栈是线程安全的,每一次请求都会创建一个

  2)ValueStack 将servlet api对象对数据的操作进行了封装。就像Spring MVC中的Model类一样

  3)OGNL Context在struts2 中就是ActionContext(Map数据类型)。

  4)ValueStack是OGNLContext的根元素。用ognl表达式访问根元素时不需要加上#。访问非根元素是需要加上#,比如request:#request.属性名

  5)一个访问过来,先创建ActionContext对象,再创建ValueStack对象,再创建Action类对象,再将Action对象放入ValueStack对象中。也就是说,Action对象以及该对象的属性都是存放在OGNLContext的根对象中,用ognl表达式访问的时候不需要加上#。

  6)ognl表达式查找的顺序:

      ValueStack中有个root变量,存放了很多对象,root中存放的第一个对象叫做栈顶对象。ognl表达式查找的顺序就是先从栈顶对象开始找,找不到就再往后找。所以当栈顶对象和后面的对象有相同的属性时,页面的ognl表达式仅为属性名时,这就导致页面显示的是栈顶对象的属性值,而不是后面对象的属性值。

      这个查找顺序也导致,用ognl表达式查找ValueStack中对象的属性的时候直接写属性名就行。但是查找非ValueStack对象里的对象的属性的时候,就需要加上对象名以及属性比如:#session.item.address。。。。对应的El表达式为:${item.address},el表达式也并不是直接写属性。这和访问ValueStack中对象的属性是有区别的,那么el表达式要指定去什么范围找应该显式的加上范围而不是按照它默认的顺序,例如 ${sessionScope.item.address},这就能解决同名属性放在不同域中,界面根据需要显示指定域中的属性值。

  7)el表达式在strtus中除了能访问原来能访问 的域(page,request,session,application)之外,还能访问ValueStack里的数据,这个功能是有struts框架扩展的

  8)OGNL和EL表达式都能够按照正确的语法方法访问 Struts包装的request,session等对象和Servlet API 中的request,session等对象。且访问这俩套api时的语法规则一样

  9)ValueStack存值和request(原生的和包装的都行)存值可以混合使用

更多细节参考链接:http://blog.csdn.net/resigshy/article/details/7560573

 

以上是关于OGNL表达式的主要内容,如果未能解决你的问题,请参考以下文章

ognl表达式和s标签儿

Struts2学习笔记三:OGNL表达式学习Struts2与Ognl表达式的结合原理

OGNL与值栈

Ognl表达式语言

Ognl表达式基本原理和使用方法

Struts2高级开发之OGNL