例如往班级里添加学生(姓名,性别),默认只有一行输入框,
在行尾有个加号,点击则用js动态添加一行学生信息文本框,
在多行的情况下,form里怎么定义才能获取到全部填写的学生信息?每个学生姓名的输入框name值该怎样写,name值是一样的,还是不一样?非常感谢。Struts2

解决方案 »

  1.   

    可以参考一下后台获取参数代码:public String updateTicketPlace(){
    try {
    int count = Integer.parseInt(request.getParameter("count"));
    Document doc = DocumentHelper.createDocument();
    Element element = doc.addElement("DOCUMENT");
    for(int i=1;i<=count;i++){
    String ticketPlace = request.getParameter("activity.ticketPlace"+i);
    String ticketTime = request.getParameter("activity.ticketTime"+i);
    element.addElement("ticketPlace").addText(ticketPlace);
    element.addElement("ticketTime").addText(ticketTime);
    }
    activity = actManService.getActivity(activity.getId());
    activity.setTicketPlace(doc.asXML());
    actManService.updateActivity(activity);
    } catch (Exception e) {
    e.printStackTrace();
    request.setAttribute("message", "修改取票地址失败!");
    return "error";
    }
    return SUCCESS;
    }jsp代码:<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
    <%@ page import="java.util.List" %>
    <%@ page import="com.huilian.ticket.module.Activity" %>
    <html> 
    <%
    List<Activity> list = (List<Activity>)request.getAttribute("actList");
    int count = 0;
     %>
    <head >
    <title>修改领票地址</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="This is my page">
    <link rel="stylesheet" type="text/css"
    href="${pageContext.request.contextPath}/publicresource/js/My97DatePicker/skin/WdatePicker.css" />
    <link href="/publicresource/style/css.css" rel="stylesheet"
    type="text/css" />
    <script type="text/javascript"
    src="${pageContext.request.contextPath}/publicresource/js/My97DatePicker/WdatePicker.js"></script>
       <SCRIPT src="${pageContext.request.contextPath}/publicresource/js/cbvalidator.js"></SCRIPT>
       <script type="text/javascript" src="${pageContext.request.contextPath}/backmanage/opinion/fckeditor/fckeditor.js"></script>
      
    </head>
    <style>
     .tab09 tr td{ padding:5px 10px; border:1px solid #f0f1f3;}
     .BLUEbg{ background:#f7f7f7;}
    </style>
    <body bgcolor="" height="100%">
    <br>
    <iframe name="fraSubmit" width=0 height=0></iframe>
    <form action="" method="post" name="fma" target="fraSubmit" >
    <table width="100%"  border="1" cellspacing="0" cellpadding="0" align="center" class="tab09">
    <input type="hidden" value="${activity.id }" name="activity.id" />
    <tr class="BLUEbg">
    <td colspan="3" align="center">修改领票地址</td>
    </tr>
    <tr class="BLUEbg">
    <td width="45%" height="26" class="font1" align="center">领票地址</td>
    <td width="45%" height="26" class="font1" align="center">领票时间</td>
    <td width="10%" height="26" class="font1" align="center"></td>
    </tr>
    </table>
    <table width="100%"  border="1" cellspacing="0" cellpadding="0" align="center" class="tab09" id="ttable">
    <%
    if(list!=null&&list.size()>0){
    for(int i=0;i<list.size();i++){
    Activity act = list.get(i);
    count ++;
    String placename = "activity.ticketPlace"+count;
    String timename = "activity.ticketTime"+count;
    String buttonId = "remove"+count;
    String trId = "tr"+count;
     %>
    <tr id="<%=trId %>">
    <td width="45%" height="26" class="font1" align="right">
    <input name='<%=placename %>' id='<%=placename %>' type="text" size="60" style="width:100%" value='<%=act.getTicketPlace() %>'/>
    <span name="validate" dataId='<%=placename %>' dataType="Empty" msg="第<%=count %>行取票地址不能为空。"></span> 
    </td>
    <td width="45%">
    <input name='<%=timename %>' id='<%=timename %>' type="text" size="60" style="width:100%" value='<%=act.getTicketTime() %>'/>
    <span name="validate" dataId='<%=timename %>' dataType="Empty" msg="第<%=count %>行取票时间不能为空。"></span>
    </td>
    <td>
    <% if(count!=1&&count==list.size()){%>
    <input type="button" value="删除" id='<%=buttonId %>' onclick="removePlace('<%=count %>')"/>
    <%}else{ %>
    <input type="button" value="删除" id='<%=buttonId %>' onclick="removePlace('<%=count %>')" style="display: none" />
    <%} %>
    </td>
    </tr>
    <%
    }
    }else{
     %>
      <tr id="tr1">
    <td width="45%" height="26" class="font1" align="right">
    <input name='activity.ticketPlace1' id='activity.ticketPlace1' type="text" size="60" style="width:100%" value=''/>
    <span name="validate" dataId='activity.ticketPlace1' dataType="Empty" msg="第1行取票地址不能为空。"></span> 
    </td>
    <td width="45%">
    <input name='activity.ticketTime1' id='activity.ticketTime1' type="text" size="60" style="width:100%" value=''/>
    <span name="validate" dataId='activity.ticketTime1' dataType="Empty" msg="第1行取票时间不能为空。"></span>
    </td>
    <td>
    <input type="button" value="删除" id='remove1' onclick="removePlace('1')" style="display: none" />
    </td>
    </tr>
     <%} %>
    </table>
    <table width="100%"  border="1" cellspacing="0" cellpadding="0" align="center" class="tab09" >
    <tr>   
    <td align="center" >
    <input type="button" id='buttonId'  onclick="updatePlace();" value="提交"  />
    <input type="button"  value="增加一行" onclick="addTR()" />
    <input type="button"  onclick="history.go(-1);" value="取消"  />
    </td>
      </tr>
    </table>
    </form>
    <span id="spanCode"  style="display: none; position:absolute; slategray"></span>
    </body>
    <script language="JavaScript">
    var number = <%=count%>;
    function updatePlace(){
    //检查输入框中内容是否合法
    if(cbValidator.Validate("validate",3))
    {
    fma.target="_self";
    fma.action = "updateTicketPlace.action?count="+number;
    fma.submit();
    document.all.buttonId.disabled='true';//保存按钮变灰
    }
    }
    function addTR(){
    /**var ttable = document.getElementById("ttable");
    var row=document.createElement ("tr"); 
    row.id = "tr"+number;
    var cell1=document.createElement ("td"); 
    var cell2=document.createElement ("td"); 
    var cell3=document.createElement ("td"); 
    var input1 = document.createElement("input");
    input1.type="text";
    input1.size="60";
    input1.name="activity.ticketPlace"+number;
    input1.style.width="100%";
    var input2 = document.createElement("input");
    input2.type="text";
    input2.size="60";
    input2.name="activity.ticketTime"+number;
    input2.style.width="100%";
    var input3 = document.createElement("input");
    input3.type="button";
    input3.value="删除";
    input3.onClick="alert(2)";
    cell1.appendChild(input1);
    cell2.appendChild(input2);
    cell3.appendChild(input3);
    row.appendChild(cell1);
    row.appendChild(cell2);
    row.appendChild(cell3);
    ttable.appendChild(row);
    number ++;*/
    number ++;
    var ttable = document.getElementById("ttable");
        var new_row=ttable.insertRow(ttable.rows.length); 
        new_row.setAttribute("id", "tr"+number);   
        var new_col=new_row.insertCell(0); 
        new_col.innerHTML="<input type='text' id='activity.ticketPlace"+number+"' name='activity.ticketPlace"+number+"' size='60' style='width:100%' /><span name='validate' dataId='activity.ticketPlace"+number+"' dataType='Empty' msg='第"+number+"行取票地址不能为空。'></span>"; 
        var new_col=new_row.insertCell(1); 
        new_col.innerHTML="<input type='text' id='activity.ticketTime"+number+"' name='activity.ticketTime"+number+"' size='60' style='width:100%' /><span name='validate' dataId='activity.ticketTime"+number+"' dataType='Empty' msg='第"+number+"行取票时间不能为空。'></span>"; 
        var new_col=new_row.insertCell(2); 
        new_col.innerHTML="<input type='button' value='删除' id='remove"+number+"' style='display:none'  LANGUAGE='javascript' onclick='removePlace("+number+")'>";
        
        var removebutton = document.getElementById("remove"+(number-1));
        if(removebutton!=null){
        removebutton.style.display="none";
        }
        var removebutton = document.getElementById("remove"+number);
        removebutton.style.display="";
        
    }
    function removePlace(value){
    number --;
    var ttable = document.getElementById("ttable");
        ttable.deleteRow(ttable.rows.length-1);
        if(number!=1){
        var removebutton = document.getElementById("remove"+number);
        removebutton.style.display=""; 
        }
    }
    function closeWin(result){
    if(result=='saveOk'){
    alert("添加成功!");
    }else {
    alert(result);
    }
    window.location.href=window.location.href; 
    window.location.reload;
    }
    </script>
    </html> 
      

  2.   

    Action中List<Student> students = new ArrayList<Student>();接收
    前面用第一个<input type="text" name="students [0].name"><br>
          <input type="text" name="students [0].age"><br>
          ...或者加学生的其他信息
          第二个students[1].name 就可以了
      

  3.   

    名字不一样。但是你可以按规律排,,比如说name1,name2,name3。
    这样就是有规律的取了。
      

  4.   

    可以用JS增加name相同的输入框 input text,例如<input type="text" name="studentNames" />,然后后台 String studentNames[]=request.getParameterValues("studentNames");
      

  5.   


    我现在按这个做了,但报:java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
    错误,我的方法如下:请指正。public class AccForm extends ActionForm {
    private int acc_id;
    private String acc_time;
    private List<AccClientForm> acf = new ArrayList<AccClientForm>(); public List<AccClientForm> getAcf() {
    return acf;
    }
    public void setAcf(List<AccClientForm> acf) {
    this.acf = acf;
    }
    public int getAcc_id() {
    return acc_id;
    }
    public void setAcc_id(int acc_id) {
    this.acc_id = acc_id;
    }
    public String getAcc_time() {
    return acc_time;
    }
    public void setAcc_time(String acc_time) {
    this.acc_time = acc_time;
    }}
    public class AccClientForm { private String client_name;
    private String client_plate;//车牌号 public String getClient_name() {
    return client_name;
    }
    public void setClient_name(String client_name) {
    this.client_name = client_name;
    }
    public String getClient_plate() {
    return client_plate;
    }
    public void setClient_plate(String client_plate) {
    this.client_plate = client_plate;
    }
    }
    前台:<td>车牌号:</td>
    <td><input type="text" name="acf[0].client_plate"> </td>
    <td>当事人姓名:</td>
    <td><input type="text" name="acf[0].client_name"> </td>
    现在我把AccForm里的List<AccClientForm> acf 都删掉就可以正常,劳烦指教。
      

  6.   

    完整的错误如下:(我设了一个Filter,我把它去掉还是报错。不是filter的问题)
    javax.servlet.ServletException: BeanUtils.populate
    org.apache.struts.util.RequestUtils.populate(RequestUtils.java:495)
    org.apache.struts.action.RequestProcessor.processPopulate(RequestProcessor.java:805)
    org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:203)
    org.apache.struts.action.ActionServlet.process(ActionServlet.java:1194)
    org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    gs.common.filter.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:104)
    root cause java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
    java.util.ArrayList.RangeCheck(ArrayList.java:546)
    java.util.ArrayList.get(ArrayList.java:321)
    org.apache.commons.beanutils.PropertyUtilsBean.getIndexedProperty(PropertyUtilsBean.java:433)
    org.apache.commons.beanutils.PropertyUtilsBean.getIndexedProperty(PropertyUtilsBean.java:340)
    org.apache.commons.beanutils.PropertyUtilsBean.getNestedProperty(PropertyUtilsBean.java:684)
    org.apache.commons.beanutils.PropertyUtilsBean.getProperty(PropertyUtilsBean.java:715)
    org.apache.commons.beanutils.BeanUtilsBean.setProperty(BeanUtilsBean.java:884)
    org.apache.commons.beanutils.BeanUtilsBean.populate(BeanUtilsBean.java:811)
    org.apache.commons.beanutils.BeanUtils.populate(BeanUtils.java:298)
    org.apache.struts.util.RequestUtils.populate(RequestUtils.java:493)
    org.apache.struts.action.RequestProcessor.processPopulate(RequestProcessor.java:805)
    org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:203)
    org.apache.struts.action.ActionServlet.process(ActionServlet.java:1194)
    org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    gs.common.filter.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:104)
      

  7.   

    我看你有ActionForm额。你用的是struts1吧。
      

  8.   

    看了一下,确实用的struts1 。。以前的搭的后台,忘掉了,不好意思。不知struts1可否实现?
      

  9.   

    name一样就可以了,form里把该name定义成数组形式,然后action里就可以通过form取了
      

  10.   

    只能说
    <input type="text" name="acf[0].client_plate">
    这样传进去时,对应的数组size仍是0,所以java.lang.IndexOutOfBoundsException,这种方式有问题
      

  11.   

    问题解决了。引用:http://blog.csdn.net/virtualjxc/article/details/2527455
    多谢各位。