从Servlet获取复选框的值(s)

6

我有一个带有MySQL数据库的servlet,它看起来像这样:enter image description here

以下是相关代码片段:

out.println("<table id = \"main_section\" cellspacing=\"1\" bgcolor=\"red\" > ");
out.println ("<tr> ");
out.println("<td >NUMBER</td>");
out.println("<td >PAYMENT</td>");
out.println("<td >RECEIVER</td>");
out.println("<td >VALUE </td>");
out.println("<td >CHECKBOX</td>");
out.println("</tr>");
out.println("<tr>");
for (int i = 0; i < ex.getExpenses().size(); i++) {
    out.println("<td > " + ex.getExpenses().get(i) + "</td>");

    if (i>0 && (i+1)%4==0) {
        out.println("<td><input type=\"checkbox\" name=\"checkbox\"></td>");
        out.println("</tr><tr>");

    }     
}
out.println("</tr>");

我需要做的是创建一个提交按钮,计算所选复选框的VALUE值之和。例如,如果选择了NUMBER 1和2,则提交按钮应给出5577.0的结果(VALUE 22.0 + 5555.0)。 请问有人能帮我吗?

我尝试将复选框的值指定为VALUE的值:double value = Double.parseDouble(request.getParameter("VALUE")); out.println("<td><input type=\"checkbox\" name=\"checkboxname\" value = \"" + value +" \"></td>"); 然后通过类似于 request.getParameterValues("checkboxname") 的方式获取结果。但是它没有起作用 : ( - Gipsy
3个回答

26

首先,你应该学习关于JSP并从JSP中生成HTML标记,而不是从servlet中生成。

现在来看你的问题。每一行都来自数据库表。因此,每一行都应该有一个ID(主键)。将行的ID分配给复选框的值。当你提交表单时,servlet将接收所有被选中的复选框的ID。从数据库中获取这些ID对应的值,并将它们求和(或执行一个直接计算总和的查询):

<input type="checkbox" name="checkedRows" value="${idOfCurrentRow}">

在处理表单提交的servlet中:

String[] checkedIds = request.getParameterValues("checkedRows");

1

您可以通过以下方式获取它:

String[] values = req.getParameterValues("checkbox");

然后呢?你怎么获取行的值,使用神秘的魔法或类似的东西吗? - Luiggi Mendoza
1
你可以通过从数组中获取值来获得它。 - Bhavik Ambani
你可以通过仅仅将日志或某些东西放置在String []中来管理它们。 - Bhavik Ambani
不要争论了,我必须使用Servlet来完成它,所以JSP不是出路 :) - Gipsy
你是否曾经编写过JSP或Servlet程序? - Bhavik Ambani
显示剩余2条评论

1

更改此行:

out.println("<td><input type=\"checkbox\" name=\"checkbox\"></td>");

阅读:

out.println("<td><input type=\"checkbox\" name=\"selected\" value=\""+ex.getExpenses().get(i-1)+"\"></td>");

这将创建复选框,您可以通过值标签来识别它们。我希望“number”字段是主键或类似的东西。

然后在下一次运行时,您可以通过以下方式获取所有选中的值:

String[] selected = request.getParameters("selected");

现在,您只需将数字相加即可。我不太了解您的代码中的“Expenses-list”是什么样子。这里只是一个示例,不能正常工作,但可以让您了解如何操作:
int sum = 0;
for (int i = 0; i < ex.getExpenses().size(); i++)
  for(int selectedIndex = 0; selectedIndex < selected.length; ++selectedIndex)
    if (ex.getExpenses().get(i) == Integer.parseInt(selected[selectedIndex]))
      sum += ex.getExpenses().get(i-1);

我尝试过类似的东西(我在上面的评论中写了),但我遇到的问题是我将getExpenses.get(i)存储为对象,每当我到达点:if (ex.getExpenses().get(i) == Integer.parseInt(selected[selectedIndex])) ,它不会编译,因为不兼容的操作数类型Object和int。添加强制转换也没有帮助。然后我该如何将它们全部传递给提交按钮,以便我可以得到总计结果?谢谢。 - Gipsy
好的,现在我已经将getExpenses从Object类型更改为String,并执行了以下操作:if (Integer.parseInt(ex.getExpenses().get(j)) == Integer.parseInt(selected[selectedIndex])) sum += Integer.parseInt(ex.getExpenses().get(j-1));但是我该如何将sum传递给提交按钮? - Gipsy
我已经创建了一个带有提交按钮的表单,其中包含到Servlet的操作,我在其中编写了对所选框进行求和的代码。每当我选择并按下提交时,它会在for(int selectedIndex = 0; selectedIndex < selected.length; ++selectedIndex)处抛出NullPointerExcetion异常。 - Gipsy
@Gibsy:空指针异常可能是因为没有选中复选框(当您第一次加载页面时就是这种情况)。在上面的循环周围加上 if (selected != null) - yankee
这是我完成的(在您的帮助下:)):Dao ex = ExpensesDao.getDao(); String[] selected = request.getParameterValues("selected");int sum = 0; for (int j = 0; j < ex.getExpenses().size(); j++) { if (selected != null) { for (int selectedIndex = 0; selectedIndex < selected.length; ++selectedIndex) { if (Integer.parseInt(ex.getExpenses().get(j)) == Integer.parseInt(selected[selectedIndex])) { sum += Integer.parseInt(ex.getExpenses().get(j - 1)); } } } } out.println(sum); - Gipsy
但是我得到的输出是0。if (Integer.parseInt(ex.getExpenses().get(j)) == Integer.parseInt(selected[selectedIndex]))有问题。编译器找不到公平性。我已经将值分配给复选框=ex.getExpenses().get(j-1),我的主键是Number,我做错了什么? - Gipsy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接