Struts2 OGNL valueStack

总结一:

ActionContext是Action的资源环境,每一次Action请求都会创建一个新的ActionContext,并且每一个ActionContext都是不同的(一次Action请求完毕,对应的ActionContext即销毁。但是,如果请求是在两个action之间转发而不是重定向,则任然用的是同一个ActionContext对象)。

ActionContext中包含:request,session,application,parameter,valueStack等元素。



总结二:

      OGNL(Object Graph Navigation Language对象图导航语言):在struts2主要用在JSP页面中结合struts2自定义标签库访问OGNLContext中的数据,而在struts2中,OGNL的context即为ActionContext,其中ActionContext中的valueStack是OGNL context的根对象。OGNL context结构示意图如下:


总结三:

      ValueStack中的数据:每一次Action请求后,action的拦截器(比如ModelDriven interceptor 、Parameter Interceptor等)都会根据用户传递的参数在ValueStack的栈顶存放一定的数据。一般情况下,valueStack栈顶存放的是当前Action对象本身,这样就可以在jsp页面中直接访问该Action对象的成员属性了(如user.name)。另外,如果此Action实现了ModelDriven接口,则放置于栈顶的将不再是Action对象本身了,而是此Action中设定的成员变量:model对象(getModel方法中返回的model对象)。然后,在此model对象下面才是action对象。

      ValueStack中(栈顶)的数据一个很重要的作用就是用作struts2自定标签的回显功能,因为struts2的自定义标签可以自动获取valueStack中具有相同name属性的数据,并显示在JSP页面上,主要用在form表单中的textField,textArea,select,checkboxlist,radio等form标签的回显(jsp的标签库是没有这一回显功能的)。所以,有时候Action的作用就是 往值栈valueStack中准备一定的数据,供跳转后的页面回显(如:在编辑用户资料的时候,需要在页面上回显该用户原有的数据)。 

 

总结四:

      几种特殊字符在OGNL表达式中的应用:

 1、# :

 ①. #request.user<=>#user ,等价,可以省略request限定。其他情况(如session,application,parameters等),都不能省略范围限定;

            ②. 构造Map并放置于valueStack栈顶,如#{'foo1':'bar1','foo2':'bar2'};

            ③.用作投影(不常用);

 

2、%{user}

只能用在struts2的自定义标签库的属性中,不能用在其他的地方。在struts2的自定义标签库的属性(如:value属性)中,有些是接受String,有些是接受Object类型,为了能让改属性(如:value属性)的值能通过OGNL获得,就必须用%{},如 :


JSP 页面:

           <s:setname="foobar" value="#{'foo1':'bar1', 'foo2':'bar2'}"/>

不使用%:<s:url value="#foobar['foo1']"/>

使用%:<s:url value="%{#foobar['foo1']}"/>

      结果显示:

           不使用%:#foobar['foo1']

           使用%:bar1



3${}

①. 用于在国际化资源文件中,引用OGNL表达式

 ②. 在Struts 2配置文件中,引用OGNL表达式,如 

<actionname="AddPhoto" class="addPhoto"> 

<result type="redirect">

ListPhotos.action?albumId=${albumId}

</result>

</action>




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值