我的struts Action类出错

时间:2010-08-26 14:37:04

标签: java jsp struts checkbox struts-action

我有一个JSP,我从数据库中显示日期和描述。每个条目都有一个唯一的ID,但我没有在页面上显示(显示复选框) 使用“logic:iterate”抛出这些条目,因此行数总是根据条目而变化。 现在,这些字段显示为文本字段,以便用户也可以更新日期或说明。左边是一个复选框,所以 用户可以选择他们想要更新的所有值。记住逻辑:迭代上面,复选框必须使用name和 不能有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);
        ...

1 个答案:

答案 0 :(得分:1)

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

这意味着当您提交表单时,在服务器上,您将获得(考虑您的示例)3个upDate值列表,3个upDesc值列表和3个列表{ {1}}复选框。嗯......不太好!

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

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

其次,您可以在服务器上使用此代码:

upisActive

在您的示例中,您选中第三个复选框并提交表单。这意味着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]); ... } 的长度为1,因为只有选中的复选框才会发送到服务器。但输入字段始终以3 String[] values和3 upDesc发送。

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

其他问题:

1)您在以下代码中使用了相同的标识符(它要求麻烦):

upForm.upDesc[0]

2)您正在使用经典输入并为其添加了<logic:iterate name="specialResult" id="specialResult"... 属性:

property

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

4)另外,请阅读this