【问题标题】:how to submit a form that will have dynamically (unknown) number of fields如何提交具有动态(未知)字段数的表单
【发布时间】:2009-05-21 02:24:46
【问题描述】:

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

【问题讨论】:

    标签: java html


    【解决方案1】:

    您可以使用 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..
    }
    

    【讨论】:

      【解决方案2】:

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

      "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));
        }
      

      这是我想到的第一件事

      【讨论】:

        【解决方案3】:

        我不建议任何变通方法。 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
            }
        }
        

        我希望它会有所帮助。

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            【解决方案5】:

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2016-01-20
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2019-07-07
              • 2019-07-15
              • 1970-01-01
              相关资源
              最近更新 更多