我有一个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);
...
答案 0 :(得分:1)
问题在于您如何设置页面。您拥有相同名称的所有复选框(标准设置),但您也可以使用相同的名称设置upDate
和upDesc
字段。
这意味着当您提交表单时,在服务器上,您将获得(考虑您的示例)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
发送。
然后你循环(一次)并提取upDate
和upForm.upDate[0]
。这样,您可以通过选中第三个复选框来更新第一行。
其他问题:
1)您在以下代码中使用了相同的标识符(它要求麻烦):
upForm.upDesc[0]
2)您正在使用经典输入并为其添加了<logic:iterate name="specialResult" id="specialResult"...
属性:
property
3)不确定浏览器是否保证每次都会以完全匹配的顺序发送字段,因此,我想,使用单个计数器只是“希望”同一个订单。
4)另外,请阅读this