2014-01-25 75 views
0

嗨,大家好,我试图将当前引用存储到数组列表“pl”。 例如pl.add(本); 由于某种原因,我只得到最后一个项目的参考,没有以前的项目。循环确实经历了所有三个项目。在ArrayList中存储对象的引用

下面是我得到的代码和输出。任何人都可以告诉我我做错了什么,谢谢你提前帮忙。

 // variables 
private String productType; 
private String hyperLinkParam; 
private ArrayList <ProductList> pl = new ArrayList<ProductList>(); 

public ProductList() { 

    try { 

     DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
     DocumentBuilder db = dbf.newDocumentBuilder(); 

     InputStream url = null; 
     url = getClass().getResourceAsStream("inventory.xml"); 


     Document doc = db.parse(url); 
     doc.getDocumentElement().normalize(); 

     // loop through each item 
     NodeList items = doc.getElementsByTagName("item"); //Returns a list of elements with the given tag name item 
     for (int i = 0; i < items.getLength(); i++) 
     { 

       Element e = (Element) items.item(i); 
       setHyperLinkParam(e.getAttribute("name").toString()); 
       setProductType(getTextValue(e,"productType")); 
       System.out.print(e.getAttribute("name").toString()); 
       System.out.println(getTextValue(e,"productType")); 

       pl.add(this); 


     } 

      for(int j=0; j < pl.size(); j++){ 
      System.out.print("getHyperLinkParam: " + pl.get(j).getHyperLinkParam()); 
      System.out.println("getProductType: " + pl.get(j).getProductType()); 
      } 

Manufacture.java

@WebMethod(operationName = "getProductList") 
public ProductList getProductList() { 
    try { 
     ProductList productlist = new ProductList(); 
     if(productlist == null){ 
      return null; 
     }else{ 
      return productlist; 
     } 
    } catch(Exception e){ 
     System.out.println("error: " + e.getMessage()); 
     return null; 
    } 
} 

的index.jsp

<% 
try { 
org.soen487.supplychain.manufacturer.Manufacture_Service service = new org.soen487.supplychain.manufacturer.Manufacture_Service(); 
org.soen487.supplychain.manufacturer.Manufacture port = service.getManufacturePort(); 
// TODO process result here 
org.soen487.supplychain.manufacturer.ProductList result = port.getProductList(); 
out.println("Result = "+result); 

} catch (Exception ex) { 
// TODO handle custom exceptions here 
} 
%> 

回答

1

我试图猜测产品列表的整体结构和来自这里发布的产品。问题在于列表元素的列表和字段似乎在单个类(即ProductList)的上下文中。这不会做 - 两个班是必需的。

// stores the data coming from a single Element ("item") of the document 
class Product { 
    private String productType; 
    private String hyperLinkParam; 
    public setHyperLinkParam(String hlp){ 
     hyperLinkParam = hlp; 
    } 
    public setProductType(String pt){ 
     productType = pt; 
    } 
} 

// Container for a list of products from an inventory 
class ProductList { 
    private ArrayList <Product> pl = new ArrayList<Product>(); 
    public ProductList() { 
     DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
     DocumentBuilder db = dbf.newDocumentBuilder(); 
     InputStream url = getClass().getResourceAsStream("inventory.xml"); 
     Document doc = db.parse(url); 
     doc.getDocumentElement().normalize(); 

     // loop through each item 
     NodeList items = doc.getElementsByTagName("item"); 
     for (int i = 0; i < items.getLength(); i++){ 
      Element e = (Element) items.item(i); 
      // create the single product from the current item 
      Product prod = new Product(); 
      prod.setHyperLinkParam(e.getAttribute("name").toString()); 
      prod.setProductType(getTextValue(e, "productType")); 
      // add it to the list 
      pl.add(prod); 
     } 
    } 

    void showList(){ 
     for(Product prod: pl){ 
     System.out.print("getHyperLinkParam: " + prod.getHyperLinkParam()); 
      System.out.println("getProductType: " + prod.getProductType()); 
     } 
    } 
} 

注:一切都将是更清洁,更清晰,如果产品列表和产品的建设将是一个工厂类与工厂方法makeProductList和makeProduct。一个ProductList应该有一个方法addProduct委托添加到它的pl成员。关于如何从XML中获取产品列表的知识应该是那里而不是在构造函数中,以及类似地,从“item”元素获取产品的字段值的方式不属于在Product或ProductList的代码中。

+0

我会试试这个谢谢你! – KSM

+0

上面的代码确实显示了Productlist类中的不同项目,但是无法访问JSP内的代码我假设我不能返回标题为Manufacture.java和index的代码中上述两个新子部分的正确对象。 JSP。你能帮我修正 – KSM

+0

不应该我能够作为productlist.product.getMethod()访问它? – KSM

3

这就是问题所在:

pl.add(this); 

要添加相同的参考(this)再次然后再次。 this的值是只是对“当前”对象的引用 - 并且您正在修改该对象在循环中的内容。

在您应该创建一个新的,独立的对象每次循环,设置对象的属性,然后添加一个引用该对象到列表中。

有点奇怪的是,你根本不会将this添加到列表中,说实话 - 通常这样的方法会出现在某些知道如何解析XML的类中,而不是数据项本身的一个实例。目前尚不清楚pl在哪里申报,但你应该真正考虑你的程序结构。

+0

我明白,但事情是我如何去在上面的代码中创建一个新的对象?我修改了我的代码以显示我声明变量的位置。我想每次创建一个新的pl对象吗?感谢您的帮助 – KSM

+0

@KSM:您可以调用构造函数。 'pl'不是一个对象,它是一个变量 - 它的值是对列表的引用,而不是你试图存储在其中的对象。我期望看到(在循环内)像'Foo foo = new Foo(); foo.setFirstValue(...); foo.setSecondValue(...); pl.add(foo);' –

2

您不断向列表中添加相同的对象(this)。尽管您更改了成员,但列表中的所有引用都会引用相同的对象。

您应该创建一个新对象并添加该对象。

看到我的其他职位

1

尝试

ProductList obj=new ProductList(); 
// some work on this object and then store it in List 
pl.add(obj); 

它应该工作,因为它会给你新的对象

+0

谢谢,我会尝试 – KSM

+0

接受答案,如果可以的话。谢谢:) –

+0

我添加了上面提到的新编码,但它似乎并没有工作,我得到这个输出在org.soen487.supplychain.manufacturer.ProductList。 (ProductList.java:47)第47行是我创建新的obj对象 – KSM