当Action设置了某个属性值后,struts2将这些属性值全部封在一个叫struts.valuestack的请求属性里。在JSP页面中输出需要的信息可以通过如下代码来获取包含全部输出信息的ValueStack对象request.getAttribute("struts.valuestack");可以通过OGNL表达式非常方便的访问该对象封装的信息。从数据结构上看,ValueStack有点类似于Map的结构,但它比Map结构更加强大。Action中所有的属性都被封装到了ValueStack对象中,Action中的属性名可以理解为ValueStack中的value的名字。DONE.JSP页面代码ValueStack vs=(ValueStack)request.getAttribute("struts.valuestack");vs.findValue("blogs");先慢慢往下看,后面有完成的例子struts2的标签为了控制struts2的valuestack中封装的值,struts2提供了大量的标签,常用的有:if(if …else):如果标签里的判断表达式返回值为真,输出标签体内容。(可以用来做样式控制)iterator:用于迭代集合属性的某个元素property:该标签用于输出指定的属性值
<table border="1" bordercolor="red" align="center" width="50%">
<caption><b>${sessionScope.username}</b></caption>
<s:iterator value="blogs" status="index"> <!-- value为在valuestack中的对象名 status是迭代序号-->
<s:if test="#index.odd==true"> <!-- test为判断表达式,这里的意思是index为奇数则输出带样式的tr -->
<tr style="background-color: #cccccc">
</s:if>
<s:else> <!-- 不带样式的tr -->
<tr>
</s:else>
<td align="right"><b>blog</b></td>
<td><s:property/></td> <!-- 这就是要输出的值 会用但是不太明白 -->
</tr>
</s:iterator>
</table>
<table border="1" bordercolor="red" align="center" width="50%">
<caption><b>${sessionScope.username}</b></caption>
<s:iterator value="blogs" status="index"> <!-- value为在valuestack中的对象名 status是迭代序号-->
<s:if test="#index.odd==true"> <!-- test为判断表达式,这里的意思是index为奇数则输出带样式的tr -->
<tr style="background-color: #cccccc">
</s:if>
<s:else> <!-- 不带样式的tr -->
<tr>
</s:else>
<td align="right"><b>blog</b></td>
<td><s:property/></td> <!-- 这就是要输出的值 会用但是不太明白 -->
</tr>
</s:iterator>
</table>
读取有两种方式:1.ValueStack vs1 = ActionContext.getContext().getValueStack();
value1 = (String) vs1.findValue("value");2.ValueStack vs2 = (ValueStack) ServletActionContext.getRequest().getAttribute("struts.valueStack"); value2 = (String) vs2.findValue("value");
Action 中ActionContext.getContext().put("test", "00000");这个就相当于 struts1.x 中的request.setAttribute("test","00000");页面 可以用 jsp 的标签取值
也可以用 (Sring)request.getAttribute("test");