求救JSF和JSTL forEach标签问题!!!!

mx1029 2008-01-22 05:33:24
我先简单描述下问题.我下了一个backbean.并在faces-config.xml中配置好了.在JSF页面取得该bean中的list的时候为什么会创建多个list对象...
代码如下:
UserVO.java

public 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.java

public 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啊.望高手指点,谢谢了...
...全文
473 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
wangcfxbg 2010-06-03
  • 打赏
  • 举报
回复
是不是出现了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;
}

mx1029 2008-01-24
  • 打赏
  • 举报
回复
非常谢谢mxm_1123的解决办法.象你说的加一个判断就只去取一次了.但是有一点,这个backbean的scope必须放到request中,不然该get方法不会再执行,也就是说不会再去取值.我在网上也查了下,好象这个和JSF的生命周期有关,不过都没说太清楚,或我还没完全理解.

以前受误导,不用去关心JSF生命周期,结果这次就被它泼了盆冷水.呵呵.散分教学费了!!!!
skytaoo 2008-01-23
  • 打赏
  • 举报
回复
设置断点,用debug,单步调试,看看是在哪里进去调用输出eee 的.
目前的代码看不出来什么.
mx1029 2008-01-23
  • 打赏
  • 举报
回复
不信没有解决的办法,继续等高手.
mx1029 2008-01-23
  • 打赏
  • 举报
回复
不是#{item.typeno}是#{item.id}.
但问题不在这里.由于VO的东西比较多,VO我是改了发上来的.

由于项目要求对表格操作比较复杂,用JSF的dataTable没有办法处理.所以想用JSTL来生成表格,这样就能灵活控制了.但没想到却出现这个问题...救命啊.555
  • 打赏
  • 举报
回复
#{item.typeno}
====?
是从哪里来的?
  • 打赏
  • 举报
回复
关注中,帮顶
我从现在的代码里也看不出问题来!
mxm_1123 2008-01-23
  • 打赏
  • 举报
回复
还有,最好使用dataTable,使用foreach失去了jsf的意思.再复杂的问题,dataTable也能搞定的,呵呵,如果你觉得dataTable不够用,可以用myfaces的<t:dataTable>
mxm_1123 2008-01-23
  • 打赏
  • 举报
回复
具体原因我也搞不清楚,可能是你其它的地方也用到了吧.解决方法如下:
TestBackBean.java

public 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方法
mx1029 2008-01-23
  • 打赏
  • 举报
回复
难道没有人知道吗...分不够我再加
mx1029 2008-01-23
  • 打赏
  • 举报
回复
我再顶!!!!
mx1029 2008-01-23
  • 打赏
  • 举报
回复
CSDN没人了吗? 难道就没人遇到和我一样的问题吗?
mx1029 2008-01-23
  • 打赏
  • 举报
回复
哎.难道就没人能帮我吗?
mx1029 2008-01-22
  • 打赏
  • 举报
回复
忘记补充说明了.JSF是1.2的 JSTL也是1.2的.
由于数据最终是从数据库去取的,如果多次调用get的话,将是很可怕的事情.望高手帮帮小弟...第一次用JSF做项目.

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧