Struts2 OGNL valueStack琐碎总结

总结一:

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

ActionContext中包含requestsessionapplicationparametervalueStack等元素

总结二

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

Struts2 OGNL valueStack琐碎总结_第1张图片

总结三:

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表单中的textFieldtextAreaselectcheckboxlistradioform标签的回显(jsp的标签库是没有这一回显功能的)。所以,有时候Action的作用就是 往值栈valueStack中准备一定的数据,供跳转后的页面回显(如:在编辑用户资料的时候,需要在页面上回显该用户原有的数据)。

总结四:

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

1# :

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

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

.用作投影(不常用);

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

JSP 页面:

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

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

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

结果显示:

不使用%#foobar['foo1']

使用%bar1

3$ {}:

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

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

<action name="AddPhoto" class="addPhoto">

<result type="redirect">

ListPhotos.action?albumId=${albumId}

</result>

</action>

你可能感兴趣的:(Struts2 OGNL valueStack琐碎总结)