[h || rich]:dataTable不迭代所有对象

时间:2010-02-08 15:42:07

标签: java jsp jsf richfaces

我有一个java支持bean,它有一个返回getDataList()的方法(称之为ArrayList<MyType>)。

MyType.java我有大量的setter和getter,所有这些都指定了StringString[] s。 示例实例化将4个对象分配给ArrayList,其中包含(以及其他)以下数据:

fid = 1    ftid = 1
fid = 2    ftid = 1
fid = 3    ftid = 1
fid = 3    ftid = 2

在我的jsf代码中,我将结构引用为rich:dataTable。麻烦就是表格如下:

fid        ftid
1          1
2          1
3          2      # should be 3, 1
3          2

正如您所看到的,最后一次迭代不正确。我用h:dataTable尝试了这个,同样的事情发生了所以我知道它可能不是富有的面孔。但我的java控制台通过eclipse(ganymede / tomcat6)显示正确的赋值:

|STDOUT| 2010-02-08 15:23:58,953 | INFO  | [http-8989-5]: adding ftqId 1 feedId 1
|STDOUT| 2010-02-08 15:23:58,984 | INFO  | [http-8989-5]: adding ftqId 1 feedId 2
|STDOUT| 2010-02-08 15:23:59,000 | INFO  | [http-8989-5]: adding ftqId 1 feedId 3
|STDOUT| 2010-02-08 15:23:59,000 | INFO  | [http-8989-5]: adding ftqId 2 feedId 3

谁能告诉我如何正确地从我的ArrayList对象中提取数据?我应该使用散列图吗?

根据要求,这里是相关代码的最小片段(感谢Colin):

这是bean代码:

public ArrayList<MyType> getFDataList() {
    XMLHandler handler = new XMLHandler();
    dataList = new ArrayList<MyType>();
    try {Document doc = handler.XMLDoc("Config.xml");} // catches removed
    String[] fIds = handler.XMLList("//snip/fid/text()");
    for (String fId : fIds) {           
        MyType tld = new MyType();
        String[] ftIds = handler.XMLList("//snip/ftid/text()");
        for (String ftId : ftIds) {
            tld.setFtId(ftId);
            tld.setFId(fId);        
            logger.info("ftId:"+ftId+",fId:"+fId);
            dataList.add(tld);  // each ft
        }
    }
    return dataList;
}

这是支持类代码:

public class MyType {
    private String fId;
    private String ftId;

    public String getFId() {  
        return fId;  
    }  

    public void setFId(String f) {  
        fId = f;  
    } 

    public String getFtId() {  
        return ftId;  
    }  

    public void setFtId(String fi) {  
        ftId = fi;  
    } 
}

我能想到的唯一一件事就是我将完成的工作嵌套到将ArrayList添加到ArrayList中,但我认为这不重要。提前谢谢。

1 个答案:

答案 0 :(得分:3)

每次在内循环中都应该创建一个新的MyType对象。发生的事情是,您只为每个fId创建一个对象实例,但对于每个ftId,您将覆盖该值并将其添加到列表中。最终会有多个对同一对象的引用。

像这样在内循环中移动实例化。

   for (String fId : fIds) {         
        String[] ftIds = handler.XMLList("//snip/ftid/text()");
        for (String ftId : ftIds) {  
            MyType tld = new MyType();
            tld.setFtId(ftId);
            tld.setFId(fId);        
            logger.info("ftId:"+ftId+",fId:"+fId);
            dataList.add(tld);  // each ft
        }
    }