Удаление выбранных строк - Struts2 - PullRequest
0 голосов
/ 06 июля 2011


Я пытаюсь создать веб-страницу с историей того, что я делаю, используя Struts 2. После отправки в мою таблицу истории добавляется строка, содержащая параметры предыдущей страницы.
Что я хочуразрешить пользователю удалять записи из этой таблицы, проверив одну или несколько строк и нажав кнопку «Удалить выбранное».
Изменить: таблица создается динамически с объектом списка, поэтому я не хочу удалятьhtml строк, но мне нужно удалить запись из списка.

Таблица создается следующим образом:

<table>
    <tr>
        <th></th>
        ...
    </tr>
    <s:iterator value="myList">
        <tr>
            <td>
                <input type="checkbox" />
            </td>
            <td>
                <!-- other stuff -->
            </td>
        </tr>
    </s:iterator>
</table>

Таким образом, используя то, что я знаю, я могу перебирать флажкитолько используя Javascript.

Чтобы получить номер строки, я использую Javascript

 function checkRows() {
     var rowsIndex;
     var rows = document.getElementById('historyTable').getElementsByTagName('tbody')[0].getElementsByTagName('tr');
     for (i = 1; i < rows.length; i++) {
         if(rows[i].getElementsByTagName('td')[0].getElementsByTagName('input')[0].checked) {
             // here "i" is the row number if checked
         }
     }
 }

Это кнопка

   <s:url id="urlRemove" action="myAction">
       <s:param name="rowsIndex">
           <!-- List of index of selected rows -->
       </s:param>
   </s:url>
   <s:a href="%{urlRemove}">
       <input type="button" value="Remove Selected" />
   </s:a>

Я знаю, что после отправки того, что было изменено с помощью Javascriptпотерян, поэтому я думаю, что мне нужно заполнить список в действии проверенными номерами строк из Javascript или назначить <s:param name="rowsIndex"> свойство, но мне все еще приходится перебирать строки с помощью javascript.
Любая помощь приветствуется, спасибо.

Ответы [ 2 ]

2 голосов
/ 06 июля 2011

Ответ NMC указывает на стандартный путь. Полагаться на Javascript здесь не нужно, и IMO здесь безобразно. НО у решения nmc также есть проблема: ОЧЕНЬ опасно идентифицировать удаляемый элемент по позиции, которую он занимает в динамическом листинге. (Что если в то же время кто-то добавляет / удаляет некоторые элементы? Что если пользователь дважды отправляет или возвращается и повторно отправляет?)

Вы должны идентифицировать каждый предмет по какому-то уникальному стабильному ключу, об этом может позаботиться ваше действие. Например, допустим, ваше действие предоставляет элементы на карте с защищенным ключом:

public class CheckBoxSampleAction extends ActionSupport
  private Map<Integer, DataWrapper> mymap; // data to show, with "secure stable" keys

  public Map<Integer, DataWrapper> getDataAsMap() {
       // fill lazyly mymap and return it
  } 

  public Set<Integer> getMapKeys(){
        return getDataAsMap().keySet();
  }

  private class DataWrapper {
    private String myvalue;
    private boolean selected; // for checkbox
        ... // more properties, getters, setters...
  }
 }

А в вашем jsp:

<s2:form theme="simple">
<table>
<s2:iterator value="mapKeys"><tr>
<td><s2:property value="dataAsMap[top].mivalue"/></td>
<td><s2:checkbox name="dataAsMap[%{top}].selected" theme="simple"/></td>
...
</tr></s2:iterator>
</table>
<s2:submit value="Remove selected" method="remove"/>
</s2:form>
1 голос
/ 06 июля 2011

Не зная других подробностей вашей конкретной ситуации, я бы предложил изменить вашу реализацию.Окружите итерацию списка тегом формы, чтобы вы могли легко отправить его в действие, одновременно передавая всю необходимую информацию, например:

<s:form id="urlRemove" action="myAction">
  <s:iterator value="historyList" status="rowStatus">
    <s:checkbox name="rowsIndexToRemove" value="#rowStatus.index"/>
    <!-- output row details -->
  </s:iterator>
  <s:submit value="Remove Selected" />
</s:form>
...