开发者社区> 问答> 正文

JSP表单提交给servlet,获取表单数据

在一个JSP表单内有单选框、复选框、输入框等,在servlet获取值,怎么办?

以下的JSP文件大概意思概括如下:从数据库取出所有数据放入Iterator,然后根据每一条数据的类型显示为单选、多选、单选+输入、多选+输入、填空、多行输入。每一个题目的name设为它在数据库的ID。 jsp如下: Java代码 收藏代码

<!--   
   显示问卷内的题目  
     -->  
  
        <hr />  
        <%  
            while (it.hasNext()) {  
  
                Questions questions = (Questions) it.next();  
        %>  
  
        <br /><%=questions.getQ_id()%>   
        <%=questions.getQ_head()%><br />  
        <%  
            String body = questions.getQ_body();  
                Vector<String> vector = ParseString.ParseStr(body);//把题目的内容根据换行符分割  
                String qType = questions.getQ_type().getQt_des();  
                if (qType.endsWith("单选")) {//若果是单选就依次显示单选选项  
                    for (int i = 0; i < vector.size(); i++) {  
        %>  
               <!--把题目编号作为name传过去  -->  
        <input type="radio" name="<%=questions.getQ_id()%>" value="<%=i%>" /><%=vector.get(i)%><br />  
        <%  
            }  
                } else if (qType.endsWith("多选")) {  
for(int i=0;i<vector.size();i++){  
    %>  
    <input type="checkbox" name="<%=questions.getQ_id()%>" value="<%=i%>" /><%=vector.get(i)%><br />  
    <%  
}  
                }  
                else if (qType.endsWith("单选+输入")) {  
                    for(int i=0;i<vector.size()-1;i++){  
                        %>  
                        <input type="radio" name="<%=questions.getQ_id()%>" value="<%=i%>" /><%=vector.get(i)%><br />  
                        <%  
                    }  
                    %>  
                    <%=vector.get(vector.size()-1)%><br/>  
                    <textarea rows="2" cols="20" name="single_in" ></textarea><br />  
                    <%  
                                    }  
                else if (qType.endsWith("多选+输入")) {  
                                        for(int i=0;i<vector.size()-1;i++){  
                                            %>  
                                            <input type="checkbox" name="<%=questions.getQ_id()%>" value="<%=i%>" /><%=vector.get(i)%><br />  
                                            <%  
                                        }  
                                        %>  
                                        <%=vector.get(vector.size()-1)%><br/>  
                                        <textarea rows="2" cols="30" name="chect_in" ></textarea><br />  
                                        <%  
                                                        }  
                else if (qType.endsWith("填空")) {  
                      
                    %>  
                    <%=body%><br />请填写答案:<input type="text" name="<%=questions.getQ_id()%>"/><br />  
                    <%  
                                    }  
else if (qType.endsWith("多行输入")) {  
                      
                    %>  
                    <%=body%><br />请填写答案:<textarea rows="5" cols="30" name="<%=questions.getQ_id()%>" ></textarea><br />  
                    <%  
                                    }  
                  
        %>

servlet文件要获取JSP的数据,但是因为若果题目类型是单选,值只有一个;若是多选,值有多个。一个一个获得很麻烦,所以我就定义一个二维数组,str[i][j],i表示该题目的ID,j表示它的值。无论是单选还是多选都可以。servlet文件如下: Java代码 收藏代码

int s_id=Integer.parseInt(request.getParameter("s_id"));//获得问卷ID  
        QuestionsDao qDao = new QuestionsDaoImpl();  
        AnswerSheetDao aDao= new AnswerSheetDaoImpl();  
        ArrayList<Questions> list = (ArrayList<Questions>) aDao  
                .findAllQueBySurId(s_id);//查询到问卷ID为s_id的所有题目  
        int count=aDao.CountQueBySurId(s_id);//获得该问卷内题目的个数  
        //System.out.println(count+"*******count");  
        for (int i = 0; i < list.size(); i++) {  
            int qID = list.get(i).getQ_id();// 获得题目ID  
            int number = list.get(i).getQ_number();// 获得题目选项个数  
            String q_id = String.valueOf(qID);// 把ID转换成字符串  
            String[][] str = new String[count][];// 定义二维数组,因为复选框的值是多个,所以用request.getParameterValues()  
            try { // 这样的话,str[i][j],i表示当前的题目的ID,j就表示题目的value。  
                str[qID] = request.getParameterValues(q_id);  
                  
            } catch (Exception e) {  
                System.out.println("request.getParameter()出错");  
                e.printStackTrace();  
            }  
              
  
        }  
  
    }

问题出来啦: Java代码 收藏代码

request.getParameter()出错  
java.lang.ArrayIndexOutOfBoundsException: 1  
    at com.answerSheetServlet.AddAnswerSheetServlet.doPost(AddAnswerSheetServlet.java:46)  
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)  
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)  
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)  
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)  
    at com.util.ChinaFilter.doFilter(ChinaFilter.java:16)  
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)  
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)  
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)  
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)  
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)  
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)  
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)  
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)  
    at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:879)  
    at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:600)  
    at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1703)  
    at java.lang.Thread.run(Thread.java:619)

展开
收起
长安归故里. 2020-01-08 16:06:11 1190 0
1 条回答
写回答
取消 提交回答
  • Java代码  收藏代码
    String[][] str = new String[count][];// 定义二维数组,因为复选框的值是多个,所以用request.getParameterValues()    
                try { // 这样的话,str[i][j],i表示当前的题目的ID,j就表示题目的value。    
                    str[qID] = request.getParameterValues(q_id);    
                        
                } catch (Exception e) {    
                    System.out.println("request.getParameter()出错");    
                    e.printStackTrace();    
                }
    
    

    这里的面count是总个数,而qID却是主键ID,两个不搭边啊。有可能qid是10,而总个数却是3, 这样数组肯定越界了

    感觉楼主可以这样定义数据结构

    Map<String,Object> str = new HashMap<String, Object>(); str的key存放qid,value存放题目的value

    2020-01-08 16:06:30
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载