删除选定的行 - Struts2

问题描述 投票:0回答:2

我正在尝试创建一个网页,其中包含使用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中的已检查行号填充Action中的列表,或者将<s:param name="rowsIndex">分配给属性,但我仍然需要使用javascript迭代行。 任何帮助表示赞赏,谢谢。

javascript html-table struts2
2个回答
2
投票

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
投票

在不知道您具体情况的其他细节的情况下,我建议您改变实施方式。使用表单标记环绕列表迭代,以便您可以轻松地将其提交给操作,同时传递所有必要的信息,如下所示:

<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>
© www.soinside.com 2019 - 2024. All rights reserved.