Ошибка в моих стойках Action class - PullRequest
0 голосов
/ 26 августа 2010

У меня есть 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 Ответ

1 голос
/ 27 августа 2010

Проблема в том, как вы настроили свою страницу. У вас есть все флажки с одинаковым именем (стандартная настройка), но у вас также есть поля 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) Кроме того, прочитайте это

...