Struts2中的值栈

前言

 

    上篇讲述OGNL表达式的博客提到了,OGNL表达式的根对象其实是值栈,那么值栈到底是个什么结构呢?这篇博客就简单介绍一下。

 

值栈

 

    什么是值栈?值栈顾名思义是堆放值的栈,值栈可以说是一个轻量级的数据存储中心,为每一个Action存储需要的数据,所以值栈和Action是一一对应的。当一个Action启动时,Struts2会相应的启动一个值栈,用来存储这个Action中所用到的数据,比如request、session、parameter等等;另外对Action中所产生的用户数据,同样会存储在值栈中,比如相应的实体,或者表单属性之类的。

 

     狭义的值栈是ValueStack,广义上的值栈也可以理解为OGNL的根对象ActionContext。值栈是由com.opensymphony.xwork2.ognl.OgnlValueStack对象实现的,所以值栈是支持OGNL表达式的。

 

值栈的结构

 

    正如它名字的叫法,值栈的结构中有一个栈结构,用来存储实体数据和action的实例。除了栈结构外,值栈还有一个结构是Map,是用来存储request、session、attr、parameter等,采用的是(key,value)方式。

 

    狭义的值栈是ValueStack,使用栈的方式存储有action的实例和实体驱动。因为栈结构的特点是先入后出,类似于一个U形的存储容器,所以一般后放入的数据都位于栈顶,搜索数据时也会从栈顶开始。其次是Map,存储request、session、parameters、application等实例。

 

    广义的值栈是ActionContext,除了包括ValueStack,还存储Request的Parameters、Request的Attributes、Application的Attributes、attr等,分别是请求的参数、请求的属性、应用的属性和可以在所有范围中获取值的attr。

 

值栈的使用

 

    对于ActionContext来说,就是我们常见的ActionContext.getContext(),通过它来获取session、parameters等,比如ActionContext.getContext().getSession()、ActionContext.getContext().getParameters()。

 

    对于ValueStack来说,针对它的结构来说,有findValue()、setValue()、pop()、push()等。在ValueStack中findValue()时,是先从栈顶查找,如果栈顶没有,就依次查找栈顶一下的各个元素。如果在栈中能找到,则直接返回;如果在栈中没有找到,那么就在Map中查找(key,value)对,如果能找到则直接返回。

 

    因为ActionContext是OGNL表达式的根对象,所以在JSP页面中,可以直接采用OGNL表达式来访问值栈中的对象,OGNL表达式在访问根对象值栈时,是不需要任何符号的,但是访问非值栈内的对象时,需要使用#。

 

 

 

总结

 

    在开发过程中,我们并不需要担心值栈是什么,也不用关心值栈里面到底有什么,其实这就是隐式调用,虽然我们并没有看到调用了值栈,但是它还是工作了的。当然,这只是限定在使用Struts2规定的Result类型,如果要使用自定义的Result或者拦截器,那么则需要显式的调用值栈了。

评论 22
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值