3

我的表单上有几个复选框(大约 15 个),我遇到的问题是复选框的名称仅出现在枚举中,如果它们被选中,但我希望它们都被返回,以便当我打印数据时它将具有复选框的名称并说“已选中”或“未选中”。我想到了一种方法,我可以手动设置标志以查看存在的内容和不存在的内容,但这似乎并不高效。

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
 {

        try
        {
            FileWriter writer = new FileWriter("OrderFormData.csv");
            writer.append("FieldName");
            writer.append(',');
            writer.append("Value");
            writer.append('\n');
            @SuppressWarnings("unchecked")
            Enumeration <String> paramNames = request.getParameterNames();
            while(paramNames.hasMoreElements()) 
            {
                String paramName = (String)paramNames.nextElement();
                writer.append(paramName);
                writer.append(',');
                String[] paramValues = request.getParameterValues(paramName);
                if (paramValues.length == 1)
                {
                    String paramValue = paramValues[0];
                    if (paramValue.length() == 0)
                    {
                        writer.append("No Value");
                        writer.append('\n');
                    }
                    else
                    {
                        writer.append(paramValue);
                        writer.append('\n');
                    }
                }
                else
                {
                    for(int i = 0; i<paramValues.length; i++)
                    {
                        writer.append(paramValues[i]);
                        writer.append(',');
                    }
                    writer.append('\n');
                }


            }
            writer.flush();
            writer.close();
        }
        catch(IOException e)
        {
             e.printStackTrace();
        }

    }
}
4

4 回答 4

6

您应该考虑一种解决方法,因为正如@Alex 告诉您的那样,未选中的复选框不是请求的一部分。

这只是一个想法,但例如:

<input type="hidden" name="checkboxNamesList" value="nameCheckbox1" />
<input type="hidden" name="checkboxNamesList" value="nameCheckbox2" />
<input type="hidden" name="checkboxNamesList" value="nameCheckbox3" />
<input type="hidden" name="checkboxNamesList" value="nameCheckbox4" />

然后,您可以checkboxNamesList从请求中获取(它将是一个字符串 []),因此您将拥有所有复选框参数名称。如果您获得其中一个复选框名称的参数并且值为 null,则表示未选中该复选框。

编辑:澄清

好吧,由于请求中不存在未选中的复选框,因此您不知道 JSP 中谁的复选框未选中,但您需要知道它才能在数据文件中写入诸如 checkbox_name1=unchecked 之类的内容。

那么,该怎么做呢?首先,您需要知道请求中存在哪些复选框(取消选中或不选中)。为此,您可以使用下面的代码并获取 JSP 中存在的所有复选框的名称:

String[] checkboxNamesList= request.getParameterValues("checkboxNamesList");

然后,让我们寻找未选中的复选框:

for (int i = 0; i < checkboxNamesList.length; i++) {

    String myCheckBoxValue = request.getParameterValues(checkboxNamesList[i]);

    // if null, it means checkbox is not in request, so unchecked 
    if (myCheckBoxValue == null)
        writer.append(checkboxNamesList[i] + "=unchecked");

    // if is there, it means checkbox checked
    else
        writer.append(checkboxNamesList[i] + "=checked");

}
于 2012-07-30T21:30:01.243 回答
1

您可以将隐藏字段与复选​​框一起使用。遍历它们并检查复选框选择的存在。

<input type="checkbox" name="fruit" value="Apple" />
<input type="hidden" name="fruit_option" value="Apple" />
<input type="checkbox" name="fruit" value="Orange" />
<input type="hidden" name="fruit_option" value="Orange" />

在服务器端做这样的事情:

Enumeration<String> paramNames = req.getParameterNames();
while(paramNames.hasMoreElements()) {
    String paramName = paramNames.nextElement();

    if (!paramName.endsWith("_option")) continue; // Skip checkboxes. Only process hidden fields

    String [] options = req.getParameterValues(paramName); // All options
    String [] selections = req.getParameterValues(paramName.replace("_option", "")); // Real checkboxes

    List <String> selectionList = Arrays.asList(selections); // Easier to work with

    // Iterate through checkbox group options
    for (String o : options) {
        boolean contains = selectionList.contains(o);
        // Do something with it. Write yes/no to file for example...
    }
}
于 2012-07-30T21:24:33.413 回答
0

未选中的框不会成为请求的一部分:请参阅http://www.w3.org/TR/REC-html40/interact/forms.html#h-17.13.2

于 2012-07-30T21:10:29.043 回答
-1

创建隐藏字段为

<input type="checkbox" name="checkbox" checked/> <input type="hidden" name="checkbox" checked />

现在在您的 servlet 中为: String[] names = request.getParameterValues("checkbox");

    PrintWriter pw = new PrintWriter(new File("/Desktop/sticker.txt"));
    for(int i=0; i < names.length; i++) {
        if(i + 1 < names.length && names[i].equals(names[i+1])) {
            pw.write(names[i] + ",true\n");
            ++i;
        } else {
            pw.write(names[i]+",false\n");
        }

    }
    pw.close();
于 2016-04-27T17:06:41.783 回答