数据放在何处
在struts2里,所有的数据都放在ActionContext里。用《struts2技术内幕》里面的话来说,就是ActionContext从它的名字看就可以知道它是用来存储数据的(因为是上下文嘛)。
如何访问数据
ActionContext里面的数据分2种,一种是根对象,一种当然是非根对象。
1、根对象,访问的时候不需要加#。
示例,
<s:property value="对象.属性"/>
2、非根对象,访问的时候需要加#。
示例,
<table width="100%">
<s:iterator status="idz" value="listtask"> <!-- 说明:遍历集合,好比for(String s: 集合):所以,一个属性是集合,一个属性是当前的对象(只不过在strust2标签里,多了其他的用处,比如#对象.index/count)! -->
<s:if test="listtask.get(#idz.index)[1] > 0"> <!-- 说明:1.XXXAction的对象属性(即ActionContext/OGNL上下文里的对象/数据):以深度引用的方式访问,即对象.属性 2.而非ActionContext/OGNL上下文里的对象,以#对象.属性的方式来访问:例如,set标签,设置的数据;迭代标签,集合的当前对象 -->
<tr>
<td colspan="2" bgcolor="#99BBE8"><b> 项目名称:<s:property value="listtask.get(#idz.index)[0]"/> </b></td>
<!--
<td bgcolor="#99BBE8"><b style="color: green"> 已结单:<s:property value="listtask.get(#idz.index)[2]"/> </b></td>
<td bgcolor="#99BBE8"><b style="color: red"> 未结单: <s:property value="listtask.get(#idz.index)[1]"/> </b> </td>
-->
<td bgcolor="#99BBE8"> </td>
</tr>
<tr>
<td colspan="5">
<s:property escape="false" value="@com.XXX.projectmanagerweb.report.count.ReportCountAction@getTaskAllinfo(#session.user.username,listtask.get(#idz.index)[0])" /><!-- 说明:1.HttpServletRequest request/HttpSession session/ServletContext application,都在ActionContext/OGNL上下文里的对象,所以可以以#对象.属性.属性的方式访问 2. #对象.属性,这种方式访问是struts2标签里才可以使用;而刚才的那9个的jsp隐含对象,都可以在.jsp里的脚本代码里直接访问它和它的属性!-->
</td>
</tr>
</s:if>
</s:iterator>
</table>
什么是根对象
1、只有ValueStack里面的数据才是根对象;
Action的属性都属于ValueStack里的数据/对象。
2、其他的对象都不是根对象,
1)请求、会话、应用程序上下文都不是根对象。
2)迭代一个集合时的临时对象(即当前对象)也不是根对象,访问时也需要加#(见上面的例子)。
ValueStack里的所有的数据(或者说对象)