2

我确实有一个采购申请表,它动态地为ItemNamequantityspecificationunitof创建行measurement

我确实有一个名为“添加项目”的按钮,它可以动态创建新行。

当我提交此表单时,如何将其放入 Struts2 中的 Action 类中。

JSP:

    <table id="itemDetails" width="100%">
    <tr  width="100%" cellpadding="0" cellspacing="0" border="1" >
    <th ><center>+</center></th>
    <th >Item</th>
    <th >Specification</th>
    <th >Quantity</th>
    <th >Unit Of Measurement</th>
    <th >Operations</th>
    </tr>

    <s:iterator value="id" status="ctr" >
     <tr>
      <td  width="5%"><input type="checkbox"  name="rdel"  ><br><br></td>
      <td  width="30%" ><input  type="text" name="id[%{#ctr.index}].itemname" /></td>
      <td  width="30%"><input type="text" name="id[%{#ctr.index}].specification"  ></td>                      
      <td  width="20%"><input type="text" name="id[%{#ctr.index}].quantity" ></td>
      <td  width="5%"><input type="text"  name="id[%{#ctr.index}].uom" ></td>
      <td  width="10%"><a href="#" >Delete</a></td>
     </tr>
    </s:iterator>
    </table>

用于动态行创建的 Javascript:

<SCRIPT language="javascript">
function addRow(itemDetails) {

    var table = document.getElementById(itemDetails);

    var rowCount = table.rows.length;

    var row = table.insertRow(rowCount);
    var counts=rowCount-1;


    var cell1 = row.insertCell(0);
    var check = document.createElement("input");
    check.type = "checkbox";
    check.name="rdel";
    cell1.appendChild(check);

    var cell2 = row.insertCell(1);
    var item = document.createElement("input");
    item.type = "text";
    item.name="id.item";
    cell2.appendChild(item);

    var cell3 = row.insertCell(2);
    var specification = document.createElement("input");
    specification.type = "text";
    specification.name="id.specification";
    cell3.appendChild(specification);

    var cell4 = row.insertCell(3);
    var quantity = document.createElement("input");
    quantity.type = "text";
    quantity.name="id.quantity";
    cell4.appendChild(quantity);

    var cell5 = row.insertCell(4);
    var uom = document.createElement("input");
    uom.type = "text";
    uom.name="id.uom";
    cell5.appendChild(uom);

    var cell6 = row.insertCell(5);
    var operations = document.createElement("a");
    operations.setAttribute("href","#");
    operations.innerText="Delete";
    cell6.appendChild(operations);


}

</SCRIPT>

动作类方法:

 private List<ItemDetails> id;
 public List<ItemDetails> getId(){

    return this.id;
 }

 public void setId(List<ItemDetails> id) {
    this.id = id;
 }

 public String savePurchaseRequest(){
  try{

      setId(getId());   

   for(ItemDetails itemdetails:id ) {
       System.out.println( itemdetails.getItemname() + ":" + itemdetails.getSpecification() +":"+ itemdetails.getQuantity()+ ":"+ itemdetails.getUom() );
    }

    }catch(Exception e){
      System.out.println("Exception:"+e);
    }

  return SUCCESS;
 }

ItemDetails类:

public class ItemDetails implements java.io.Serializable {

private String itemname;

private String specification;

private String quantity;

private String uom;



public ItemDetails() {

}



public ItemDetails(String itemname, String specification, String quantity, String uom) {

this.itemname = itemname;

this.specification = specification;

this.quantity = quantity;

this.uom = uom;

}




}



public String getItemname() {

return this.itemname;

}



public void setItemname(String itemname) {

this.itemname = itemname;

}



public String getSpecification() {

return this.specification;

}



public void setSpecification(String specification) {

this.specification = specification;

}



public String getQuantity() {

return this.quantity;

}



public void setQuantity(String quantity) {

this.quantity = quantity;

}



public String getUom() {

return this.uom;

}



public void setUom(String uom) {

this.uom = uom;

}




}
4

3 回答 3

2

你快到了。

只需更改您分配name属性的 Javascript 部分,包括与您在迭代中所做的完全相同的索引:

item.name="id.item";
specification.name="id.specification";
// ecc...

必须成为

item.name="id["+counts+"].itemname";
specification.name="id["+counts+"].specification";

你会很好的。

于 2013-03-07T09:40:17.083 回答
0
  1. 看起来您从另一个页面设置模型项。尝试将它们设置为 id 之外的另一个变量,例如 idOutput 左右,我之前在尝试通过 getter 访问字段时遇到了问题,但我不知道为什么会这样。

  2. 模型对象 (ItemDetails) 需要公共 getter (like getItemname()),因此 JSP 可以读取它们。

于 2013-03-07T08:59:22.267 回答
0

您需要在 JavaScript 中输入正确的名称,以便 OGNL 能够正确处理它们并在您提交表单时应用值。

要提交新添加的行,您只需在已提交的行上使用这些名称。

于 2013-03-07T09:41:51.203 回答