gpt4 book ai didi

java - 在 JSF/RichFaces `dataTable` 中有一个 boolean 复选框的正确方法是什么?

转载 作者:行者123 更新时间:2023-12-04 07:03:24 25 4
gpt4 key购买 nike

在 JSF/RichFaces dataTable 的每一行中都有一个 boolean 复选框的正确方法是什么? ?我尝试了以下代码段:

<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 绑定(bind)?

最佳答案

如果您只想处理刷新,请查看 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>

该演示代码使用了一个简单的 session bean,但希望您可以清楚地了解如何将其调整为更合理的东西。这不是您唯一可以做的事情 - 例如,您可以执行更一般的重复表单提交。像 Seam 这样的第 3 方框架也增加了对这类事情的处理。

关于java - 在 JSF/RichFaces `dataTable` 中有一个 boolean 复选框的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1486236/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com