如何提交具有动态(未知)字段数的表单

时间:2009-05-21 02:24:46

标签: java html

我正在尝试将表单提交给servlet(java)。表单有一堆问题,每个问题有4个单选按钮,用户选择其中一个。我不知道表格中的问题数量。它可能是10,15,12 ......取决于其他一些标准。我的问题是,检索用户为表单上的问题所做的选择列表的最佳方法是什么。

5 个答案:

答案 0 :(得分:2)

您可以使用HttpServletRequest.getParameterNames()来检索请求中所有表单元素的名称枚举。然后,您可以使用HttpServletRequest.getParameter(name)迭代枚举并为每个元素请求单个值。

如果您的HTML包含除选项单选按钮以外的其他FORM元素,请使用这些单选按钮的聪明命名约定,以便在枚举参数名称时,您知道要请求的内容。

一个例子。

如果您的表单包含以下选项的两个问题:

Question 1: 
<input type="radio" name="question1" value="option1">
<input type="radio" name="question1" value="option2">
<input type="radio" name="question1" value="option3"> 

Question 2:
<input type="radio" name="question2" value="option1">
<input type="radio" name="question2" value="option2">
<input type="radio" name="question2" value="option3"> 

在您的servlet中,

Enumeration e = request.getParameterValues();
while(e.hasMoreElements()){
     String name = (String)e.nextElement();
     if(name.startsWith("question"){
        String value = request.getParameter(name);
        //your logic here
     }

}

另一个做同样的事情是:

在您的servlet中,

int maxQuestionNumber = Integer.parseInt(request.getParameter(“maxQuestionNumber”)); //这应该是HTML表单中隐藏的变量,代表表单中的最大问题。

for(int i=1;i<=maxQuestionNumber;i++){
     String value = request.getParameter("question"+i);
     //your logic here..
}

答案 1 :(得分:1)

我想到的一个快速技巧是将所有字段命名为

"question_"+n

并且隐藏了值为n的输入类型。如果表单有办法知道要呈现多少问题,它应该有办法设置n的值。

稍后您只需检索该值并...

 n = new Integer( request.getParameter("number_of_question"));
 for( int i = 0 ; i < n ; i++ ) { 
      list.add( request.getParameter("question_"+i));
  }

这是我想到的第一件事

答案 2 :(得分:1)

我建议没有解决方法。 ServletRequest.getParameterMap()在这个场景中会派上用场。映射的键的类型为String,值的类型为String []。

因此,您可以使用类似这样的foreach循环轻松遍历地图,

for(Map.Entry<K, V> entry : map.entrySet()){
    ..
    if(entry.getValue().length > 1){
       //means the choices not the question
    }else{
       //means the question not the choices
    }
}

我希望它会有所帮助。

答案 3 :(得分:0)

一种典型的技术是使用公共前缀命名字段,然后遍历它们:q000,q001,q002等,直到找到不存在的字段。

答案 4 :(得分:0)

您可以使用JSON,因此将字符串传递给servlet,如果您使用POST,它可以处理非常长的字符串。这样你就可以传递你想要的任何东西,即使参数很复杂。