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



在一个JSP表单内有单选框、复选框、输入框等,在servlet获取值,怎么办?。以下的JSP文件大概意思概括如下:从数据库取出所有数据放入Iterator,然后根据每一条数据的类型显示为单选、多选、单选+输入、多选+输入、填空、多行输入。每一个题目的name设为它在数据库的ID。
jsp如下:

Java代码 复制代码 收藏代码
  1. <!–
  2.    显示问卷内的题目
  3.      –>
  4.         <hr />
  5.         <%
  6.             while (it.hasNext()) {
  7.                 Questions questions = (Questions) it.next();
  8.         %>
  9.         <br /><%=questions.getQ_id()%>&nbsp;
  10.         <%=questions.getQ_head()%><br />
  11.         <%
  12.             String body = questions.getQ_body();
  13.                 Vector<String> vector = ParseString.ParseStr(body);//把题目的内容根据换行符分割
  14.                 String qType = questions.getQ_type().getQt_des();
  15.                 if (qType.endsWith(“单选”)) {//若果是单选就依次显示单选选项
  16.                     for (int i = 0; i < vector.size(); i++) {
  17.         %>
  18.                <!–把题目编号作为name传过去  –>
  19.         <input type=”radio” name=”<%=questions.getQ_id()%>” value=”<%=i%>” /><%=vector.get(i)%><br />
  20.         <%
  21.             }
  22.                 } else if (qType.endsWith(“多选”)) {
  23. for(int i=0;i<vector.size();i++){
  24.     %>
  25.     <input type=”checkbox” name=”<%=questions.getQ_id()%>” value=”<%=i%>” /><%=vector.get(i)%><br />
  26.     <%
  27. }
  28.                 }
  29.                 else if (qType.endsWith(“单选+输入”)) {
  30.                     for(int i=0;i<vector.size()-1;i++){
  31.                         %>
  32.                         <input type=”radio” name=”<%=questions.getQ_id()%>” value=”<%=i%>” /><%=vector.get(i)%><br />
  33.                         <%
  34.                     }
  35.                     %>
  36.                     <%=vector.get(vector.size()-1)%><br/>
  37.                     <textarea rows=”2″ cols=”20″ name=”single_in” ></textarea><br />
  38.                     <%
  39.                                     }
  40.                 else if (qType.endsWith(“多选+输入”)) {
  41.                                         for(int i=0;i<vector.size()-1;i++){
  42.                                             %>
  43.                                             <input type=”checkbox” name=”<%=questions.getQ_id()%>” value=”<%=i%>” /><%=vector.get(i)%><br />
  44.                                             <%
  45.                                         }
  46.                                         %>
  47.                                         <%=vector.get(vector.size()-1)%><br/>
  48.                                         <textarea rows=”2″ cols=”30″ name=”chect_in” ></textarea><br />
  49.                                         <%
  50.                                                         }
  51.                 else if (qType.endsWith(“填空”)) {
  52.                     %>
  53.                     <%=body%><br />请填写答案:<input type=”text” name=”<%=questions.getQ_id()%>”/><br />
  54.                     <%
  55.                                     }
  56. else if (qType.endsWith(“多行输入”)) {
  57.                     %>
  58.                     <%=body%><br />请填写答案:<textarea rows=”5″ cols=”30″ name=”<%=questions.getQ_id()%>” ></textarea><br />
  59.                     <%
  60.                                     }
  61.         %>
<!-- 
   显示问卷内的题目
	 -->

		<hr />
		<%
			while (it.hasNext()) {

				Questions questions = (Questions) it.next();
		%>

		<br /><%=questions.getQ_id()%>&nbsp;
		<%=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代码 复制代码 收藏代码
  1. int s_id=Integer.parseInt(request.getParameter(“s_id”));//获得问卷ID
  2.         QuestionsDao qDao = new QuestionsDaoImpl();
  3.         AnswerSheetDao aDao= new AnswerSheetDaoImpl();
  4.         ArrayList<Questions> list = (ArrayList<Questions>) aDao
  5.                 .findAllQueBySurId(s_id);//查询到问卷ID为s_id的所有题目
  6.         int count=aDao.CountQueBySurId(s_id);//获得该问卷内题目的个数
  7.         //System.out.println(count+”*******count”);
  8.         for (int i = 0; i < list.size(); i++) {
  9.             int qID = list.get(i).getQ_id();// 获得题目ID
  10.             int number = list.get(i).getQ_number();// 获得题目选项个数
  11.             String q_id = String.valueOf(qID);// 把ID转换成字符串
  12.             String[][] str = new String[count][];// 定义二维数组,因为复选框的值是多个,所以用request.getParameterValues()
  13.             try { // 这样的话,str[i][j],i表示当前的题目的ID,j就表示题目的value。
  14.                 str[qID] = request.getParameterValues(q_id);
  15.             } catch (Exception e) {
  16.                 System.out.println(“request.getParameter()出错”);
  17.                 e.printStackTrace();
  18.             }
  19.         }
  20.     }
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代码 复制代码 收藏代码
  1. request.getParameter()出错
  2. java.lang.ArrayIndexOutOfBoundsException: 1
  3.     at com.answerSheetServlet.AddAnswerSheetServlet.doPost(AddAnswerSheetServlet.java:46)
  4.     at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
  5.     at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
  6.     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
  7.     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
  8.     at com.util.ChinaFilter.doFilter(ChinaFilter.java:16)
  9.     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
  10.     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
  11.     at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
  12.     at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
  13.     at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
  14.     at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
  15.     at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
  16.     at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
  17.     at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:879)
  18.     at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:600)
  19.     at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1703)
  20.     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

muyexia521muyexia521 2 009
  • Comment添加评论
  • 关注(0)

1个答案      按时间排序按投票排序

10

采纳的答案

Java代码 复制代码 收藏代码
  1. String[][] str = new String[count][];// 定义二维数组,因为复选框的值是多个,所以用request.getParameterValues()
  2.             try { // 这样的话,str[i][j],i表示当前的题目的ID,j就表示题目的value。
  3.                 str[qID] = request.getParameterValues(q_id);
  4.             } catch (Exception e) {
  5.                 System.out.println(“request.getParameter()出错”);
  6.                 e.printStackTrace();
  7.             }
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