我的表单上有几个复选框(大约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();
}
}
}
答案 0 :(得分: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
(它将是一个String []),因此您将拥有所有复选框参数名称。如果为其中一个复选框获取参数name且value为null,则表示未选中复选框。
已编辑:澄清
好吧,因为请求中没有未选中的复选框,您不知道JSP中的复选框没有被检查,但您需要知道它才能在您的数据文件中写入类似checkbox_name1 = unchecked的内容。
那么,该怎么做?首先,您需要知道请求中存在哪些复选框(取消选中或取消选中)。为此,您可以使用下面的代码并获取JSP中存在的所有复选框的名称:
String[] checkboxNamesList= request.getParameterValues("checkboxNamesList");
然后,让我们寻找未经检查的checbox:
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");
}
答案 1 :(得分: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...
}
}
答案 2 :(得分:0)
未选中的框不会成为请求的一部分:请参阅http://www.w3.org/TR/REC-html40/interact/forms.html#h-17.13.2
答案 3 :(得分:-1)
将隐藏字段创建为
<input type="checkbox" name="checkbox" checked/>
<input type="hidden" name="checkbox" checked />
现在在你的servlet中: String [] names = request.getParameterValues(&#34; checkbox&#34;);
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();