zoukankan      html  css  js  c++  java
  • Struts2的Stack Context和ValueStack

     

     (2012-06-25 17:18:11)
    标签: 

    it

    分类: Web应用开发

    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 

    参考链接:

    http://blog.csdn.net/djx123456/article/details/6794581

    http://www.blogjava.net/freeman1984/archive/2011/02/16/344447.html

  • 相关阅读:
    uva 10369 Arctic Network
    uvalive 5834 Genghis Khan The Conqueror
    uvalive 4848 Tour Belt
    uvalive 4960 Sensor Network
    codeforces 798c Mike And Gcd Problem
    codeforces 796c Bank Hacking
    codeforces 768c Jon Snow And His Favourite Number
    hdu 1114 Piggy-Bank
    poj 1276 Cash Machine
    bzoj 2423 最长公共子序列
  • 原文地址:https://www.cnblogs.com/li-print/p/3536252.html
Copyright © 2011-2022 走看看