Ошибка в моих стойках Action class
У меня есть JSP, где я показываю дату и описание из базы данных. Каждая запись имеет уникальный идентификатор, но я не показываю на странице (показывает флажок). Эти записи создаются с использованием "logic:iterate", поэтому количество строк всегда меняется в зависимости от записей. Теперь эти поля отображаются в виде текстового поля, так что пользователь также может обновить дату или описание. Флажок слева, чтобы пользователь мог выбрать все значения, которые он хочет обновить. Запомните логику: итерируйте выше, флажок должен быть определен с использованием имени и не может иметь идентификатора.
...
...
<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 ответ
Проблема в том, как вы настроили свою страницу. У вас есть все флажки с тем же именем (стандартная настройка), но у вас также есть upDate
а также upDesc
поля также установлены с тем же именем.
Это означает, что при отправке формы на сервере вы получите (учитывая ваш пример) список из 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, потому что только выбранный флажок отправляется на сервер. Но поля ввода всегда отправляются в 3 upDesc
и 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) Также прочитайте это