我先简单描述下问题.我下了一个backbean.并在faces-config.xml中配置好了.在JSF页面取得该bean中的list的时候为什么会创建多个list对象...
代码如下:
UserVO.javapublic class UserVO {
private int id;
private String typename; public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getTypename() {
return typename;
}
public void setTypename(String typename) {
this.typename = typename;
}
}TestBackBean.javapublic class TestBackBean{ private List movDic;
        public List getMovDic() {
System.out.println("eee"); List test = new ArrayList();
UserVO mv1 = new UserVO();
mv1.setId(1);
mv1.setTypename("wori");
test.add(mv1); return test;
}
}faces-config.xml
.....
         <managed-bean>
<managed-bean-name>dic</managed-bean-name>
<managed-bean-class>
com.test.TestBackBean
</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>
......test.jsf
.....
<table>
<c:forEach items="#{dic.movDic}" var="item">
<tr>
<td>
#{item.typeno}
</td>
<td>
#{item.typename}
</td>
</tr>
</c:forEach>
</table>
....
问题出现了!!!! 系统打印出来的信息"eee" 出现了多次!!!也就是说调用get方法调用了多次.我想不明白是怎么回事.
按道理只应该返回唯一的一个list啊.望高手指点,谢谢了...

解决方案 »

  1.   

    忘记补充说明了.JSF是1.2的 JSTL也是1.2的.
    由于数据最终是从数据库去取的,如果多次调用get的话,将是很可怕的事情.望高手帮帮小弟...第一次用JSF做项目.
      

  2.   

    #{item.typeno} 
    ====?
    是从哪里来的?
      

  3.   

    不是#{item.typeno}是#{item.id}.
    但问题不在这里.由于VO的东西比较多,VO我是改了发上来的.由于项目要求对表格操作比较复杂,用JSF的dataTable没有办法处理.所以想用JSTL来生成表格,这样就能灵活控制了.但没想到却出现这个问题...救命啊.555
      

  4.   

    设置断点,用debug,单步调试,看看是在哪里进去调用输出eee 的.
    目前的代码看不出来什么.
      

  5.   

    CSDN没人了吗? 难道就没人遇到和我一样的问题吗? 
      

  6.   

    具体原因我也搞不清楚,可能是你其它的地方也用到了吧.解决方法如下:
    TestBackBean.javapublic   class   TestBackBean{private   List   movDic;
                    public   List   getMovDic()   {
    if(null==movDic){
    System.out.println("eee");List   test   =   new   ArrayList();
    UserVO   mv1   =   new   UserVO();
    mv1.setId(1);
    mv1.setTypename("wori");
    test.add(mv1);
    movDic=test;
    }
    return   movDic;
    }

    最好增加setMovDic方法
      

  7.   

    还有,最好使用dataTable,使用foreach失去了jsf的意思.再复杂的问题,dataTable也能搞定的,呵呵,如果你觉得dataTable不够用,可以用myfaces的<t:dataTable>
      

  8.   

    非常谢谢mxm_1123的解决办法.象你说的加一个判断就只去取一次了.但是有一点,这个backbean的scope必须放到request中,不然该get方法不会再执行,也就是说不会再去取值.我在网上也查了下,好象这个和JSF的生命周期有关,不过都没说太清楚,或我还没完全理解.以前受误导,不用去关心JSF生命周期,结果这次就被它泼了盆冷水.呵呵.散分教学费了!!!!
      

  9.   

    是不是出现了3次??
    出现错误我猜是这样的,你的getMovDic()方法并不是返回movDic这个List
    而是new了一个ArrayList 并且在这过程中 System.out.println("eee");
    也就是说,只要调用一次这个getMovDic()方法就打印一次eee那你再看看你的jsp文件 在执行foreach这一行时执行了一次getMovDic()方法来获得一个List;
    然后在#{item.typeno}和#{item.typeName}的时候里获得item时,jstl内部的方法是不是又调用了2次getMovDic()方法呢?另外要说的一点相当重要:由于你的get方法里 每次都是List test = new ArrayList();
    就产生一个新的引用 即使其值和原来的movDic是一样的,但是引用不同,也就是说你每次get方法调用得到的movDic的List都是一个不同的对象,不知道我这样说你明白了吗??希望对你解决问题有帮助。建议你这样写get方法:
    public List getMovDic() {
    movDic.removeAll();UserVO mv1 = new UserVO();
    mv1.setId(1);
    mv1.setTypename("wori");movDic.add(mv1);
    return movDic;
    }