在一个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 />
- <%
- }
- %>
<!-- 显示问卷内的题目 --> <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();
- }
- }
- }
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)
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)
JSP
2013年8月21日 10:32
添加评论
关注(0)
1个答案 按时间排序按投票排序
-
10
-
采纳的答案
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();
- }
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