OGNL表达式(StackContext ValueStack Action Context)入门----Struts2 之一
来源:互联网 发布:时尚巴黎淘宝店铺 编辑:程序博客网 时间:2024/04/30 17:38
h1. 一个例子
请看下面的需求,假设有如下用户对象模型:
- public interface User {
- public String getName();
- public Date getRegisterDate();
- public Customer getCustomer();
- }
- public interface Customer {
- public String getId();
- public String getName();
- public boolean isVip();
- }
- public interface EntCustomer extends Customer {
- public String getTrustId(); // 组织机构代码证号
- }
对于给定的用户jack,且该用户所属客户是企业客户,那么我们如何获取该用户的姓名?如何获取用户所属客户的名称?如何判断该用户所属客户是否是VIP客户?如何取jack所属企业的组织机构代码证号?
* 采用java代码的方式,我们可以用如下的API调用得到所需信息:
- jack.getName();
- jack.getCustomer().getName();
- jack.getCustomer().isVip();
- ((EntCustomer)jack.getCustomer()).getTrustId();
* 但我们现在在讲述OGNL,因此通过采用OGNL,我们可以用如下方式取得我们所需要的信息:
- name
细心的你是否会问,这个表达式要取谁的姓名呢?OK,很好!这就是环境,"谁"就存在于环境之中,也就是存在上下文之中。对于不同的环境/上下文,相同的表达式会有不同的结果!而环境/上下文的实质是什么呢?就是一组带名称的对象集合。
h3. OGNL上下文概念详解
我们前面说上下文就是一组名称-对象对的集合,如下图所示就是一个简单的上下文:
- user ---> User(name:"jack", ...)
- request ---> HttpServletRequest(header: ...)
那么在上面的环境中,我们可以有如下的OGNL表达式:
- #user.name // 取用户的姓名
- #user.age // 取用户年龄
- #user.birthday // 取用户生日
- #user.customer.name // 取用户所属客户的名称
- #request.parameters // 取请求参数
请注意上面表达式中的"#user"和"#request"的用法,"#"表示访问环境/上下文中的对象。现在可以很方便地访问环境中的对象了,那么如果你比较懒惰的话(记住:在程序员群体,懒惰是褒义词!),你是否觉得访问用户的姓名,年龄,生日,等等其它属性如果全部要使用"#user"来访问会不会太麻烦了呢?OK,ONGL的设计者早就考虑了这个问题,我们可以指定user为环境中的特权对象,访问该对象可以不需要使用#user的方式,如下所示代码与上面的完全等价,当然,前提是要预先指定user为特权对象。我们上面所说的"特权对象"在OGNL中称为"根对象"(root)。 综上所述,理解OGNL表达式的关键是理解其上下文的概念,因为OGNL的上下文概念中引入了"根对象"的概念,所以初学者往往会在这里迷失方向。
h4. 小结
OGNL的中文全称是对象图导航语言,也就是说OGNL是一门语言,如同java是一门语言一样。你是否会认为OGNL的作者太夸张了,竟敢把表达式谎称为语言?不,OGNL的语法确实非常简洁,OGNL的代码(我没有说表达式,因为代码是和语法相匹配的词语)通常不会换行,这意味着我们不可能把OGNL的代码写得很长,但是,这并不意味着OGNL的表达能力很弱。事实上,OGNL的语法设计非常简洁,但其功能却相当强大,如果你有兴趣,可以深入阅读OGNL参考手册的集合与lambda章节。
慢着,事情还未至此结束!struts2对OGNL中的上下文的概念又定义了新的含义,且听我慢慢道来!
struts2中的OGNL上下文
struts2对OGNL上下文的概念又做了进一步扩充,在struts2中,OGNL上下文通常如下所示:
我们可以使用"#requet"访问HttpServletRequest对象, "#session"访问HttpSession对象,但请注意"根对象"是什么?是ValueStack! 那么ValueStack是什么?值栈。也就是一组对象的堆栈。也就是说,在struts2中,根对象不是我们通常的一个对象,而是一组对象。我们可以push新的对象到值栈中,也可以弹出值栈的栈顶对象。如上图所示,假设我们将user对象push到值栈中,那么如下的表达式将与之前我们见过的表达式一样,具有相同的结果:
- name // 取用户的姓名
- age // 取用户年龄
- birthday // 取用户生日
- customer.name // 取用户所属客户的名称
- #request.parameters // 取请求参数
也就是说,我们使用name这个表达式的时候,ONGL会取"根对象"的name属性,但现在根对象是ValueStack!那么访问ValueStack的name属性意味着什么呢?这意味着: ValueStack会先查看栈顶元素是否有name属性,如果有就返回该属性值,否则取出栈顶下的元素,继续查看,直到栈底为止。
以上就是OGNL表达式的核心概念,你理解了吗?下一步,你需要了进一步了解OGNL的语法,以发掘其更强大的功能!
下面转发一张ValueStack StackContext Action Context 的关系机构图
文章来源:收集整理于Internet
- OGNL表达式(StackContext ValueStack Action Context)入门----Struts2 之一
- Struts2中OGNL,valueStack,stackContext的学习
- [struts2] ognl, valueStack, stackContext 的学习
- Struts2中OGNL,valueStack,stackContext的学习
- Struts2中OGNL,valueStack,stackContext的学习
- Struts2中OGNL,valueStack,stackContext的学习
- Struts2中OGNL,valueStack,stackContext的学习
- Struts2中OGNL,valueStack,stackContext的学习
- Struts2中OGNL,valueStack,stackContext的学习
- Struts2中OGNL,valueStack,stackContext的学习
- Struts2中OGNL,valueStack,stackContext的学习
- Struts2 StackContext ValueStack ActionContext
- Struts2-Ognl表达式与ValueStack
- Ognl,Context,ValueStack详解
- ognl访问ValueStack、Action
- Struts2 ValueStack和StackContext的区别
- 浅谈Struts2中的ValueStack、StackContext、request
- 关于Struts2中的ValueStack,ActionContext,OgnlContext的理解之一:OGNL
- 第一次
- Linux进程间通信的各种方式及其比较
- ARM IMPORT |Image$$RO$$Limit| 的含义
- 在Linux系统上实现虚拟主机的注意事项
- 多线程与多进程问题
- OGNL表达式(StackContext ValueStack Action Context)入门----Struts2 之一
- Linux开机管理:Lilo与Grub
- c++ const和指针复合使用说明
- spring.net 的事物管理
- 常见的链表相关面试题
- CMarkup的改进
- TD8.0的安装使用及下载地址连接
- GridView分页代码
- oracle 10g中表监控与statistics_level