木叶下521 2013-08-21 10:32
浏览 935
已采纳

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

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

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

jsp如下:
[code="java"]<!--
显示问卷内的题目
-->

    <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 %>


<%
}
else if (qType.endsWith("多选+输入")) {
for(int i=0;i %>


<%
}
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 />
                <%
                                }

    %>[/code]

servlet文件要获取JSP的数据,但是因为若果题目类型是单选,值只有一个;若是多选,值有多个。一个一个获得很麻烦,所以我就定义一个二维数组,str[i][j],i表示该题目的ID,j表示它的值。无论是单选还是多选都可以。servlet文件如下:
[code="java"]int s_id=Integer.parseInt(request.getParameter("s_id"));//获得问卷ID
QuestionsDao qDao = new QuestionsDaoImpl();
AnswerSheetDao aDao= new AnswerSheetDaoImpl();
ArrayList list = (ArrayList) 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();
        }


    }

}[/code]

问题出来啦:
[code="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)
[/code]

  • 写回答

1条回答 默认 最新

  • suziwen 2013-08-21 10:54
    关注

    [code="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();  
            }  [/code]
    

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

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

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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 求差集那个函数有问题,有无佬可以解决
  • ¥15 【提问】基于Invest的水源涵养
  • ¥20 微信网友居然可以通过vx号找到我绑的手机号
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名
  • ¥65 汇编语言除法溢出问题