Struts2的Stack Context和ValueStack

简介: 1、提到Struts2的传值功能时,经常会见到Stack Context和ValueStack等概念,那么它们到底是什么,有什么作用呢。ValueStack(值栈):Struts2将OGNL上下文设置为Struts2中的ActionContext(内部使用的仍然是OgnlContext),并将值栈设为OGNL的根对象。ActionContext:一次Action调用都会创建一个Acti

1、提到Struts2的传值功能时,经常会见到Stack Context和ValueStack等概念,那么它们到底是什么,有什么作用呢。

ValueStack(值栈):Struts2将OGNL上下文设置为Struts2中的ActionContext(内部使用的仍然是

OgnlContext),并将值栈设为OGNL的根对象。

ActionContext:一次Action调用都会创建一个ActionContext
              如:ActionContext ctx = ActionContext.getContext();

Stack Object:放入stack中的对象,一般是action。

Stack Context(map):stack上下文,它包含一系列对象,包括request、session、attr、application map等。

2、访问Stack Context中的对象的属性时要使用"#对象名.属性名"的方式,使用push标签可以将原来位于Stack Context中的对象放到ValueStack的栈顶。用push标签将对象保存在ValueStack的栈顶后,只需要使用"属性名"就可以直接访问了。如下面的例子:

<body>
 <s:bean name="cg.struts.at.User" id="user">
   <s:param name="username" value="'cg'"/>
   <s:param name="password" value="'p123'"/>
 </s:bean>
 <table border="1" width="80%">
  <tr align="center">
   <td colspan="4">用户信息</td>
  </tr>
  <tr align="center">
   <td>用户名:</td>
   <td><s:property value="#user.username"/></td>
   <td>密码:</td>
   <td><s:property value="#user.password"/></td>
  </tr>  
 </table>
 使用push标签,简化值的访问
 <s:push value="#user">
  <table border="1" width="80%">
   <tr align="center">
    <td colspan="4">用户信息</td>
   </tr>
   <tr align="center">
    <td>用户名:</td>
    <td><s:property value="username"/></td>
    <td>密码:</td>
    <td><s:property value="password"/></td>
   </tr>  
  </table>
 </s:push>
</body>

3、如果ValueStack栈顶是集合对象的话,通常可以用iterator标签取得位于ValueStack的顶端的集合对象,遍历集合并输出,遍历完成后集合对象会被移出ValueStack。

4、在页面输出ValueStack和Stack Context的方法

   只要在<body>标签中加入<s:debug/>,运行时就可以生成相应的链接,点击该链接就可以显示stack相关信息。

 5、在Action中获得ActionContext、request、session、application对象的方法

    5.1 缺省情况下,Struts2的Action类是从ActionSupport类继承过来的,因此,可以用下面的语句获得ActionContext对象。

    ActionContext ctx = ActionContext.getContext();

    ctx.put(("address","上海");

    5.2 如果想要在Action类中使用request对象,最简单的方法就是在定义类的时候实现ServletRequestAware接口。然后就可以直接在execute()方法中使用request对象,例如:

    request.setAttribute("address","上海");

    5.3 如果想要在Action类中使用session对象,就要在定义类的时候实现SessionAware接口。然后就可以直接在execute()方法中使用session对象。例如:

    session.put("address","上海");

    5.4 当需要在Action类中使用application对象时,在定义类的时候要实现ServletContextAware接口。然后可以直接在execute()方法中使用application对象。例如:

    application.setAttribute("address","上海");

6、在jsp中用OGNL表达式获取不同范围的值

    6.1 获取地址后面的参数信息(即上海)(http://localhost:8080/strutslogin/login.action?address=上海)的方法如下:

    <s:property value="parameters.address"/>

    6.2 获取上述request中信息的方法如下:

    <s:property value="#request.address"/>

    6.3 获取上述session中信息的方法如下:

    <s:property value="#session.address"/>

    6.4 获取上述application中信息的方法如下:

    <s:property value="#application.address"/>

    6.5 使用"#attr.参数名"的方法访问各种变量的顺序是:

    request>session>application 

目录
相关文章
|
Java 开发者
ActionContext、ValueStack、OGNL | 学习笔记
快速学习 ActionContext、ValueStack、OGNL 代理,介绍了 ActionContext、ValueStack、OGNL 系统机制, 以及在实际应用过程中如何使用。
35 0
|
存储 Java 对象存储
Struts2【OGNL、ValueStack】
Struts2【OGNL、ValueStack】
88 0
Struts2【OGNL、ValueStack】
Struts2中:值栈(ValueStack)、值栈中的Action实例、Struts2中的其他命名对象 小结
值栈(ValueStack)        Struts2将OGNL上下文设置为Struts2中的ActionContext(内部使用的仍然是OgnlContext),并将值栈设为OGNL的根对象。
1507 0
|
存储 Java
Struts2【OGNL、valueStack】就是这么简单
什么是OGNL表达式? OGNL是Object Graphic Navigation Language 是操作对象属性的开源表达式。 Struts2框架使用OGNL作为默认的表达式语言。 为什么我们学习OGNL 在学习JSP的时候,我们已经学习过了EL表达式。
2055 0
|
Web App开发 存储 Java
struts2之OGNL和struts2标签库和ValueStack对象
OGNL简介:    (1)OGNL是Object Graphic Navigation Language(对象图导航语言)的缩写,它是一个开源项目。      struts2框架默认就支持Ognl表达式语言(所以struts必须引用的包:ognl.
1244 0