0

我有一个 JSP,我在其中显示数据库中的日期和描述。每个条目都有一个唯一的 id,但我没有在页面上显示(显示复选框)这些条目是使用“逻辑:迭代”抛出的,因此行数总是根据条目而变化。现在这些字段显示为文本字段,以便用户还可以更新日期或描述。左侧有一个复选框,因此用户可以选择他们想要更新的所有值。记住上面的逻辑:迭代,复选框必须使用名称定义,不能有 id。

 ...
 ...
 <logic:notEmpty name="specialResult" scope="request">
    <logic:iterate name="specialResult" id="specialResult" indexId="index">
        <tr align="center">
            <td width="15%">
            <input type="checkbox" name="upisActive" property="upisActive"
                                value="<bean:write name="specialResult" property="upId"/>"></input></td>
            <td width="15%"><input type="text" name="upDate" value="<bean:write name="specialResult" property="upDate"/>"
                                property="upDate" size="20" class="Date" id="Date"></input></td>
            <td width="15%"><input type="text" name="upDesc" value="<bean:write name="specialResult" property="upDesc"/>"
                                property="upDesc" size="20" id="Desc"/></td>
        </tr>
    </logic:iterate>

...

我的错误是,如果我有三行并且我想更新第三行并选择第三个复选框。我的 Action 类正在检索第一行日期和 desc。如何编辑我的操作类以根据选中的复选框检索值?

 public ActionForward class(ActionMapping mapping, ActionForm theForm,
        HttpServletRequest request, HttpServletResponse response) throws IOException,
        SQLException, ServletException
{
    Connection conn = null;
    Service Serv = new Service();
    List updList = new ArrayList();
    Form upForm = (Form) theForm;
    String[] values = request.getParameterValues("upisActive");
    try
    {
        conn = getConnection(request, false);
        for (int i=0;i<values.length;i++){
            VO hdvo = new VO(); //Vo class with getters and setters
            val = values[i];
            hdvo.setDate(upForm.upDate[i]);
            hdvo.setDesc(upForm.upDesc[i]);
            updList.add(hdvo);

        }
        hdServ.updTest(updList, conn);
        ...
4

1 回答 1

1

问题在于您如何设置页面。您拥有所有具有相同名称的复选框(标准设置),但您也拥有相同名称的upDateupDesc字段。

这意味着当您提交表单时,您将在服务器上(考虑您的示例)获得 3 个upDate值的列表、3 个upDesc值的列表和 3 个upisActive复选框的列表。嗯……不完全是!

问题在于您的复选框和用于读取要更新的值的代码。

首先,如果未选中复选框,则不会在请求中发送复选框。这意味着,根据您的选择,在服务器上您将获得upisActive长度为 0、1、2 或 3 的值列表。

其次,您在服务器上拥有以下代码:

String[] values = request.getParameterValues("upisActive");
...
for (int i = 0; i < values.length; i++) {
  ...
  val = values[i];
  hdvo.setDate(upForm.upDate[i]);
  hdvo.setDesc(upForm.upDesc[i]);
  ...
}

在您的示例中,您选中第三个复选框并提交表单。这意味着它String[] values的长度为 1,因为只有选中的复选框被发送到服务器。但是输入字段总是在 3upDesc和 3中发送upDate

然后你循环它(一次)并提取upForm.upDate[0]upForm.upDesc[0]. 这样,您可以通过选中第三个复选框来更新第一行。

其他问题:

1)您在以下代码中使用了相同的标识符(这是自找麻烦):

<logic:iterate name="specialResult" id="specialResult"...

2)您正在使用经典输入并property为其添加了属性:

<input type="text" ... property="upDate" />" property="upDate" ...

3)不确定浏览器是否保证每次都会以完全匹配的顺序发送字段,所以我猜使用单个计数器只是“希望”相同的顺序。

4)另外,阅读这个

于 2010-08-26T20:26:36.567 回答