代码之家  ›  专栏  ›  技术社区  ›  Hosam Aly

在jsf/richfaces的“datatable”中使用布尔复选框的正确方法是什么?

  •  2
  • Hosam Aly  · 技术社区  · 16 年前

    在JSF/RichFaces的每一行中使用布尔复选框的正确方法是什么? dataTable ?我尝试了以下片段:

    <rich:dataTable id="customerList"
                   var="_customer"
                 value="#{customerList.resultList}"
              rendered="#{not empty customerList.resultList}" >
        <h:column>
            <h:selectBooleanCheckbox
                value="#{customerList.selectedCustomers[_customer.id]}" />
        </h:column>
    ...
    </rich:dataTable>
    

    我设置我的 customerList 有一个 Map<Integer, Boolean> selectedCustomers . 东西 似乎 很好地工作,除了复选框显然是由一个排序索引映射的,而不是由ID映射的,这就给我带来了一个问题。

    例如,当我打开上面的页面并选中第一行中的复选框并按“删除”按钮时,一切都正常,页面将在没有选定客户的情况下重新加载。但是,如果我按“刷新”或“重新加载”,(并接受浏览器重新发送数据的警告),则是 现在 第一行被删除!

    我该怎么做才能使复选框仅绑定到所选ID?

    1 回复  |  直到 16 年前
        1
  •  3
  •   McDowell rahul gupta    16 年前

    如果只想处理刷新,请查看 redirect 导航规则中的选项。

      <navigation-rule>
        <display-name>navBack</display-name>
        <from-view-id>/navBack.jsp</from-view-id>
        <navigation-case>
          <from-outcome>navTo</from-outcome>
          <to-view-id>/navTo.jsp</to-view-id>
          <redirect />
        </navigation-case>
      </navigation-rule>
    

    如果你还想处理后退按钮和多个窗口案例,请继续阅读。

    您可以使用隐藏字段和行级别的工件来检测这一点。基本上,您将根据提交表单时收到的ID检查发送给客户机的ID。

    public class SafeRow {
      private final String rowId;
      private String rowIdClient;
      private String name;
      private boolean delete;
    
      public SafeRow(String name) {
        this();
        this.name = name;
      }
    
      public SafeRow() {
        rowId = UUID.randomUUID().toString();
      }
    
      public String getRowId() { return rowId; }    
      public void setRowId(String rowIdClient) { this.rowIdClient = rowIdClient; }
    
      public boolean isStateConsistent() {
        return rowId.equals(rowIdClient);
      }
    
      public String getName() { return name; }
      public void setName(String name) { this.name = name; }
    
      public boolean isDelete() { return delete; }
      public void setDelete(boolean delete) { this.delete = delete; }
    }
    

    表格数据:

    public class SafeUpdateBean {
      private final List<SafeRow> data = new ArrayList<SafeRow>();
    
      public SafeUpdateBean() {
        data.add(new SafeRow("Bill"));
        data.add(new SafeRow("Ben"));
        data.add(new SafeRow("Sue"));
      }
    
      public List<SafeRow> getData() { return data; }
    
      public String deleteSelected() {
        Iterator<SafeRow> all = data.iterator();
        while (all.hasNext()) {
          SafeRow row = all.next();
          if (!row.isStateConsistent()) {
            System.err.println("Caught inconsistency on " + row.getRowId());
          } else if (row.isDelete()) {
            all.remove();
          }
        }
        return null;
      }
    }
    

    观点:

    <h:form>
      <h:dataTable value="#{safeUpdateBean.data}" var="row">
        <h:column>
          <h:inputHidden value="#{row.rowId}" />
          <h:selectBooleanCheckbox value="#{row.delete}" />
          <h:outputText value="#{row.name}" />
        </h:column>
      </h:dataTable>
      <h:commandButton value="delete selected"
        action="#{safeUpdateBean.deleteSelected}" />
    </h:form>
    

    这个演示代码使用了一个简单的会话bean,但希望您能清楚地了解如何使它适应更合理的情况。这不是你唯一能做的事情——例如,你可以执行一个更一般的重复表单提交。像Seam这样的第三方框架也为这类事情添加了处理。

    推荐文章