struts2_ognl和valueStack简介

来源:互联网 发布:php软件公司源码 编辑:程序博客网 时间:2024/06/06 02:18

1. ognl是什么?有何作用?
 OGNL(Object-Graph Navigation Language)叫做对象导航图语言,是一种强大的表达式语言,比EL表达式功能更加强大。struts2将ognl表达式语言,集成当struts2框架中,作为它的默认表达式语言。

2. OGNL的功能有哪些?
 <1>支持对象方法调用,如xxx.dosomeSpecial();
 <2>支持类静态的方法调用和值访问
 <3>访问OGNL上下文(OGNL context)和ActionContext; (重点 操作ValueStack值栈 )
 <4>支持赋值操作和表达式串联
 <5>操作集合对象。

//在struts2中应用演示ognl表达式//需要结合struts2的标签使用<s:property value="ognl表达式"><s:property value="'abc'.length()"/>  演示对象调用方法<s:property value="@java.lang.Math@max(10,20)"/> 演示静态成员访问注意:在struts2中使用静态成员访问,必须设置一个常量:struts.ognl.allowStaticMethodAccess=false

3. valueStack是什么?有什么用?
 valueStack是值栈。
从技术角度来讲,valueStack就是一个接口com.opensymphony.xwork2.util.ValueStack。
从使用角度来讲,valueStack就是一个容器。
 我们使用valueStack最大的作用就是将action相关的数据以及web相关对象,携带到页面上。简单讲,我们在使用struts2框架就是通过valueStack将action中的数据携带到jsp页面上进行展示。

我们来看下valueStack的一些特点:
<1>valueStack有一个实现类叫OgnlValueStack。
<2>每一个action都有一个valueStack。(一个请求,一个request,一个action,一个valueStack)valueStack的生命周期就是request的生命周期。
<3>valueStack中存储了当前action对象以及其他常用web对象(request、session、application、parameters)。
<4>struts2框架将valueStack以“struts.valueStack”为名存储到request域中。

4. valueStack的结构

//valueStack中存在 存在root属性 (CompoundRoot) 、 context 属性 (OgnlContext )* CompoundRoot 就是ArrayList* OgnlContext 就是 Maplist集合中存储的是action相关信息map集合中存储的是相关映射信息,包含paramters,request,session,application attr等。我们想要从list中获取数据,可以不使用#号.(暗指它就是ognl的root)如果从map中获取数据,需要使用#. (其实在struts2中的map--context其实就是ognlContext)结论:        ValueStack它有两部分 List  Map        在struts2中List就是root   Map就是ognlContext.                 默认情况下,在struts2中从valueStack获取数据从root中获取。

5. 值栈对象的创建,valueStack和ActionContext是什么关系?

 ActionContext ctx = ActionContext.getContext(); if (ctx != null) {      stack = ctx.getValueStack(); }        valueStack是每一次请求时,都会创建.        在ActionContext中持有了valueStack的引用。

6. 如何获取值栈对象?
对于valueStack获取有两种方式:
<1>通过 request获取
ValueStack vs=(ValueStack) ServletActionContext.getRequest().getAttribute(
ServletActionContext.STRUTS_VALUESTACK_KEY);

<2>通过ActionContext获取.
ValueStack vs=ActionContext.getContext().getValueStack();

7. 针对于root,怎样向值栈中保存数据?
 主要有两个方法:
<1>push(Object obj)——->底层就是 root.add(0,obj) 将数据存储到栈顶。
<2>set(String name,Object obj);—–>底层是将数据封装到HashMap中,在将这个HashMap通过push存储。

在JS[页面中可以通过<s:debug>来查看值栈的内容。

8. 如何在JSP页面中获取值栈的内容?
 root中数据不需要#,而context中数据需要#

 <1>.如果栈顶是一个Map集合,获取时,可以直接通过Map集合的key来获取value <s:property  value="username"/> <2>如果栈顶数据不是一个Map,没有key值,可以使用序号来获取。 <s:property value="[0]">  从0的位置向下查找所有。 <s:property value="[0].top"> 只查找0位置上数据。如果获取OgnlContext中数据:            1.request数据    request.setAttribute()             2.session数据    session.setAttribute()            3.application数据  application.setAttribute()            4.attr   依次从request,session.application中查找            5.parameters 获取请求参数