嘿大家我试图存储当前对arraylist“pl”的引用。的 e.g。 pl.add(本); 出于某种原因,我只得到对最后一项的引用而没有以前的项。 Loop确实经历了所有这三个项目。
以下是我得到的代码和输出。任何人都可以告诉我我做错了什么,谢谢你提前帮助。
// 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
}
%>
答案 0 :(得分:3)
这是问题所在:
pl.add(this);
您一次又一次地添加相同的引用(this
)。 this
的值只是对“当前”对象的引用 - 您正在循环中修改该对象的内容。
在循环的每次迭代中,您应该创建一个新的独立对象,在 对象上设置属性,然后将该对象的引用添加到列表中。
你要将this
添加到列表中有点奇怪,说实话 - 通常这样的方法会在某个知道如何解析XML的类中,而不是一个实例。数据项本身。目前尚不清楚pl
的声明位置,但您应该考虑程序的结构。
答案 1 :(得分:2)
您继续将相同的对象(this)添加到列表中。虽然您更改了成员,但列表中的所有引用都会引用相同的对象。
您应该创建一个新对象并添加它。
查看我的其他帖子
答案 2 :(得分:1)
尝试
ProductList obj=new ProductList();
// some work on this object and then store it in List
pl.add(obj);
它应该有用,因为它会给你新鲜的对象
答案 3 :(得分:1)
我试图从这里发布的内容猜测ProductList和Product的整体结构。问题是列表元素的列表和字段看起来是在单个类的上下文中,即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());
}
}
}
注意:如果ProductList和Product的构造位于带有工厂方法makeProductList和makeProduct的Factory类中,那么一切都会更清晰,更清晰。 ProductList应该有一个方法addProduct将add添加到其pl成员。如何从XML获取产品列表的知识应该在构造函数中那里和不,并且类似地,获得产品的字段值的方式来自“item”元素不属于Product或ProductList的代码。