添加学生名单jsp页面(我暂时设了有3条学生信息,要求一起插入表内):<form action="stuInfo.do" method="post" >
<input type="hidden" name="operate" value="doAdd" /><table id="testTbl" border=1>
<tr><td>学号</td><td>姓名</td><td>性别</td></tr>
            <tr>
            
                <td ><input type="text" name="sno" id="sno" /></td>
                <td ><input type="text" name="sname" id="sname" /></td>
                <td><input type="text" name="sex" id="sex" /></td>
            </tr>
            <tr>
             
                <td ><input type="text" name="sno" id="sno" /></td>
                <td ><input type="text" name="sname" id="sname" /></td>
                <td><input type="text" name="sex" id="sex" /></td>
            </tr>
            <tr>
               
                <td ><input type="text" name="sno" id="sno" /></td>
                <td ><input type="text" name="sname" id="sname" /></td>
                <td><input type="text" name="sex" id="sex" /></td>
           </tr>
        </table>  
        <input type="submit" value="提交" />
</form>action的内容是(这个action单独插入一条是可行的,就是不知道怎么改让他可以插入3条,现在只能插入第一条):public ActionForward doAdd(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {

StuInfoForm stuInfoForm = (StuInfoForm) form;// TODO Auto-generated method stub
Student student = new Student(); student.setDepartment(stuInfoForm.getDepartment());
student.setClasses(stuInfoForm.getClasses());
student.setSno(stuInfoForm.getSno());
student.setSname(stuInfoForm.getSname());
student.setSex(stuInfoForm.getSex()); if (biz.add(student)) {
return mapping.findForward("add_success");
} else {
return mapping.findForward("add_fail");
}

}
dao里的内容是:public boolean add(Student student){
Connection conn = null;
PreparedStatement ps = null;
try {
conn = DBGet.getConn();
String sql = "insert into student(sno,sname,sex,department,classes) values(?,?,?,?,?)";
ps = conn.prepareStatement(sql);


ps.setString(1, student.getSno());
ps.setString(2, student.getSname());
ps.setString(3, student.getSex());
ps.setString(4, student.getDepartment());
ps.setString(5, student.getClasses());


int num = ps.executeUpdate();
if (num > 0) {
return true;
}
} catch (Exception e) {
e.printStackTrace();
} finally {
DBGet.closePreparedStatement(ps);
DBGet.closeConnection(conn);
}
return false;
}就是要求可以同时向表里添加多条学生信息,而不是一条一条的添加。是应该用arrylist还是循环?在action里还是dao里?具体怎么写呢?请教大家

解决方案 »

  1.   

    在逻辑层里处理吧, 可以组成一条语句以分号分开,这样应该是可以的, 或者是在逻辑层里把其组成SQL语句存放到ARRAYLIST里,调用DAO的时候,遍历该LIST插入数据也是可以的
      

  2.   


    action只能取到表格里第一行数据的值,后面的取不到。怎么办?
      

  3.   

     PreparedStatement pst = conn.prepareStatement(sql);
     for(int i=100;i<1101;i++)...{
      pst.setInt(1,i);
      ...
      pst.addBatch();
     }
     pst.executeBatch();
     ...
      

  4.   


    这是处理插入语句时用的吧?问题是我现在action里貌似只能取到第一条数据,后面的取不到是怎么回事?
      

  5.   

    public   boolean   add(Student   student)直接收一个Student  的对象,肯定就能插入一条,传入student的list 对象吧public   boolean   add(List<Student>   student) PreparedStatement pst = conn.prepareStatement(sql); 
    for(Student studentCondition : student)...{ 
      pst.setString(1,studentCondition.getDepartment()); 
      ... 
      pst.addBatch(); 

    pst.executeBatch(); 
     
      

  6.   

    我把dao里照你的改,然后把action改成这样:
    public ActionForward doAdd(ActionMapping mapping, ActionForm form,
    HttpServletRequest request, HttpServletResponse response) {


    StuInfoForm stuInfoForm = (StuInfoForm) form    
                    ArrayList<Student> list = new ArrayList<Student>();
    Student student = null;
    for(int i=0;i<2;i++){
    student = new Student();
    student.setDepartment(stuInfoForm.getDepartment());
    student.setClasses(stuInfoForm.getClasses());
    student.setSno(stuInfoForm.getSno());
    student.setSname(stuInfoForm.getSname());
    student.setSex(stuInfoForm.getSex());
    list.add(student);
    }
    if (biz.add(list)) {
    return mapping.findForward("add_success");
    } else {
    return mapping.findForward("add_fail");
    }

    }它就连着把第一条数据插了2遍,第二条还是没进去,怎么回事?是for循环括号里写错了吗?
      

  7.   

     可能是页面上三个学生用的txet名字相同的原因吧,<td   > <input   type= "text "   name= "sno "   id= "sno "   /> </td> 
    <td   > <input   type= "text "   name= "sname "   id= "sname "   /> </td> 
    <td> <input   type= "text "   name= "sex "   id= "sex "   /> </td>3个student不用一样的名字和Id,就行了
     <td   > <input   type= "text "   name= "sno1 "   id= "sno 1"   /> </td> 
    <td   > <input   type= "text "   name= "sname1 "   id= "sname1 "   /> </td> 
    <td> <input   type= "text "   name= "sex 1"   id= "sex1 "   /> </td>
    Student student = new Student(); 
    student.setDepartment(stuInfoForm.getDepartment()); 
    student.setClasses(stuInfoForm.getClasses()); 
    student.setSno(stuInfoForm.getSno()); 
    student.setSname(stuInfoForm.getSname()); 
    student.setSex(stuInfoForm.getSex()); 
    list.add(student); Student student1 = new Student(); 
    student.setSno(stuInfoForm.getSno1()); 
    student.setSname(stuInfoForm.getSname1()); 
    student.setSex(stuInfoForm.getSex1()); 
    list.add(student1); 如果想用同样的名字的话,我认为只能拼串用js提交了。
      

  8.   

    input的name及id取不同的名,这样既能实现楼主所说的,又避免了在Servlet里面从表单获取的值只有一组。
      

  9.   


    我只是举个例子有3个学生,真正添加肯定不止3个,这样就太麻烦了啊。我是用的js自动添加行的:function addRow(obj)
            {
            var i=0;
            i=i+1;
            //添加一行
            var newTr = testTbl.insertRow();
            //添加四列     
            var newTd1 = newTr.insertCell();
            var newTd2 = newTr.insertCell();
            var newTd3 = newTr.insertCell();
    var newTd4 = newTr.insertCell();
            //设置列内容和属性
            newTd1.innerHTML = '<input type="text" name="sno" id="sno" />'; 
            newTd2.innerHTML= '<input type="text" name="sname" id="sname" />';
            newTd3.innerHTML= '<input type="text" name="sex" id="sex" />';
            newTd4.innerHTML= '<a href="javascript:void(0);" onclick="del();">删除</a>';
            }
    这样添加的name和id肯定一样啊,怎么把它改成不一样的?或者照你说的js提交又怎么用呢?
      

  10.   

    哦,这样啊
    那 你 看看 student.getSno() 是不是个字符串 大概应该是 1,2,3 这样的
    如果是这样的话, 在action 中 用,号把 student.getSno() 获得的字符串分成 三个就行了,80%是这样的,我没试如果不是的话 就用js提交吧
    var son =  document.getElementsByName("sno");
    var form = document.getElementById("formId");
    var path = "action.do?son=" + son ........
    form.action = path;
    form.submit();
    acton 中得到的就是 像 1,2,3这样的字符串了