Ошибка в моих стойках 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) Также прочитайте это

Другие вопросы по тегам