Struts2的Stack Context和ValueStack
1、提到Struts2的传值功能时,经常会见到Stack Context和Value Stack,不理解的话很容易晕掉。
- ValueStack(值栈):Struts2将OGNL上下文设置为Struts2中的ActionContext(内部使用的仍然是
OgnlContext),并将值栈设为OGNL的根对象。
- StackContext(map):stack上下文,它包含一系列对象,包括request、session、attr、applicationmap等。
2、访问Stack Context中的对象的属性时要使用"#对象名.属性名"的方式,
使用push标签可以将原来位于StackContext中的对象放到ValueStack的栈顶。
用push标签将对象保存在ValueStack的栈顶后,只需要使用"属性名"就可以直接访问了。
如下面的例子:
1 <body> 2 <s:bean name="cg.struts.at.User"id="user"> 3 <s:param name="username" value="'cg'"/> 4 <s:param name="password" value="'p123'"/> 5 </s:bean> 6 <table border="1" width="80%"> 7 <tr align="center"> 8 <td colspan="4">用户信息</td> 9 </tr> 10 <tr align="center"> 11 <td>用户名:</td> 12 <td><s:property value="#user.username"/></td> 13 <td>密码:</td> 14 <td><s:property value="#user.password"/></td> 15 </tr> 16 </table>
使用push标签,简化值的访问
1 <s:push value="#user"> 2 <table border="1" width="80%"> 3 <tr align="center"> 4 <td colspan="4">用户信息</td> 5 </tr> 6 <tr align="center"> 7 <td>用户名:</td> 8 <td><s:property value="username"/></td> 9 <td>密码:</td> 10 <td><s:property value="password"/></td> 11 </tr> 12 </table> 13 </s:push> 14 </body>
3、如果ValueStack栈顶是集合对象的话,通常可以用iterator标签取得位于ValueStack的顶端的集合对象,
遍历集合并输出,遍历完成后集合对象会被移出ValueStack。
4、在页面输出ValueStack和Stack Context的方法
只要在<body>标签中加入<s:debug/>,运行时就可以生成相应的链接,点击该链接就可以显示stack相关信息。
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