这个问题昨晚发过一个帖子,起初以为是service或者action里的错误,没有从数据库取到值。
后来经论坛里朋友指点,用size()发现可以获得service里的取值...然后怀疑是往request里放出来问题。今早起来把练习demo从新做一遍,同样问题,但是发现是前台输出的问题了,下面跟code: public String execute() throws Exception{
Map request = (Map)ActionContext.getContext().get("request");
request.put("list", this.service.findAllUser());
System.out.println("检验数据:"+this.service.findAllUser().size());
System.out.println("检验数据:"+request.size());
return SUCCESS;控制台结果是:检验数据:4
              检验数据:2于是又在jsp检验:验证数据是否已传送到jsp页面:
<s:property value="#request.list.get(3).userName"/>
<s:property value="#request.list.get(3).userPassword"/>
<hr>
          <table border="1">
<tr>
<td>
ID:
</td>
<td>Name:</td>
<td>Password:</td>
</tr>
<s:iterator value="#request.list" id="us">
<tr>
<td>
<s:property value="#us.userId"/>
<br></td>
<td>
<s:property value="#us.userName"/>
<br></td>
<td>
<s:property value="#us.userPassword"/>
</td>
</tr>
</s:iterator>
</table>结果是(就不上图了,直接拉内容,其中‘空’是页面上出了表格框架但是内容为空的):验证数据是否已传送到jsp页面: travis 123 
--------------------------------------------------------------------------------
ID:  Name: Password: 空   空     空
空   空     空
空   空     空
空   空     空
由此可见用iterator迭代此集合时是可以知道集合内有4个迭代对象,并以此压到栈顶做输出了。
但是输出值为空,说明:<s:property value="#us.userName"/> 此句有错误。可是我不认为此句有错误诶...
求指点,在线等...
 
   
   
   
  

解决方案 »

  1.   

    public String execute() throws Exception{
            List list = this.service.findAllUser()
            System.out.println("检验数据:"+this.service.findAllUser().size());
            System.out.println("检验数据:"+request.size());
            return SUCCESS;
    }private List list;public List getList(){return list;
    }public void setList(List list){
    this.list = list;
    } <s:iterator value="list" >
        //..........
    </s:iterator>
      

  2.   

    <s:iterator value="#request.list" var="us">再不行就去掉"#us.userName"的#试试
      

  3.   

    我改了一下,发现iterator迭代里是有对象的:   验证数据是否已传送到jsp页面:
    <s:property value="#request.list.get(3).userName"/>
    <s:property value="#request.list.get(3).userPassword"/>
    <hr>
              <table border="1">
    <tr>
    <td>
    当前迭代是否有对象:
    </td>
    <td>
    ID:
    </td>
    <td>Name:</td>
    <td>Password:</td>
    <td>count:</td>
    </tr> <s:iterator value="#request.list" id="us">
    <tr>
    <td>
    <s:property/>
    <br>
    </td>
    <td>
    <s:property value="#us.userId" />
    <br>
    </td>
    <td>
    <s:property value="#us.userName" />
    <br>
    </td>
    <td>
    <s:property value="#us.userPassword" />
    </td>
    <td>
    <s:property value="#us.count" />
    </td>
    </tr>
    </s:iterator>
    </table>
    输出是:
    验证数据是否已传送到jsp页面: travis 123 
    --------------------------------------------------------------------------------
    当前迭代是否有对象:  ID:  Name: Password: count: 
    com.travis.hibernate.User@1584be7    空  空  空  空  
    com.travis.hibernate.User@1df3082    空  空  空  空 
    com.travis.hibernate.User@1e9d0cc    空  空  空  空 
    com.travis.hibernate.User@18b0b4a    空  空  空  空 
     看来还是<s:property value="#us.userName" />无法输出,跟别的无关。
    而且调用iterator内部方法也无法输出<s:property value="#us.count" />,根本不输出当前迭代元素的总数..这是为什么?
     
       
      

  4.   

    哦哦,解决了,找到问题所在了。要如下这样写:   验证数据是否已传送到jsp页面:
    <s:property value="#request.list.get(3).userName"/>
    <s:property value="#request.list.get(3).userPassword"/>
    <hr>
              <table border="1">
    <tr>
    <td>
    当前迭代是否有对象:
    </td>
    <td>
    ID:
    </td>
    <td>Name:</td>
    <td>Password:</td>
    <td>count:</td>
    </tr> <s:iterator value="#request.list" status="sys">
    <tr>
    <td>
    <s:property/>
    <br>
    </td>
    <td>
    <s:property value="userId" />
    <br>
    </td>
    <td>
    <s:property value="userName" />
    <br>
    </td>
    <td>
    <s:property value="userPassword" />
    </td>
    <td>
    <s:property value="#sys.count" />
    </td>
    </tr>
    </s:iterator>
    </table>
    输出就是:
    验证数据是否已传送到jsp页面: travis 123 
    --------------------------------------------------------------------------------
    当前迭代是否有对象:  ID:  Name: Password: count: 
    com.travis.hibernate.User@98f9c2   4  aaaa    123  1  
    com.travis.hibernate.User@135707c  3  cicada  123  2  
    com.travis.hibernate.User@16c14e7  2  slog    123  3  
    com.travis.hibernate.User@d0726d   1  travis  123  4  
    搞忘记,iteretor是把迭代集合的每一个对象压入值栈顶层,值栈也就是root吧,可以直接取用,不需要用ognl表达式的来取,直接用POJO内的属性即可。
    当第一个迭代对象取完之后会删除,然后压入第二个几何元素到值栈顶层,以此继续..
    因为count是iterator内部方法,并不会被压入值栈,属于依附在值栈root旁边(至于哪就不知道了,没学好,这还是临时查struts2深入详解手册来的),所以需要#取。
    希望对都来这有帮助。
    同时谢谢楼上各位热情的好人们~!
      

  5.   

    <s:iterator value="list" list="us">
      <s:property value="userName" />
    </s:iterator>
    直接这样就可以的!