我目前正在将旧项目从JSF 1(使用RichFaces 3)迁移到JSF 2(使用RichFaces 4)。该项目有几个丰富的:dataTables,项目旁边有复选框。在页面底部,有一些操作按钮可以显示所有选定项目(添加到收藏夹,导出为PDF,...)。
复选框是rich:dataTables绑定到相应UI bean的原因。但是大多数UI bean都是会话范围的。在这两者之间,我已经了解到与会话范围结合使用并不是一个好主意。事实上,我有很多重复的ID"如果我将范围更改为"请求"则会消失的错误。但事情并非如此简单。这些已经存在一些需要在请求和详细的状态初始化和清理逻辑之间保留的状态。
我想我有两个选择:
将bean更改为请求范围,通过将状态提取到一些新的" stateObjects"来进行一些大规模的重构。保存在新的" sessionBean"中,并完全重写状态逻辑
删除绑定,但如何确定rich:dataTable的哪些条目选中了复选框?
好奇的是,会话范围和绑定与JSF 1很好地协同工作。在我接管项目之前,做出bean会话范围的决定已经花了很长时间。
答案 0 :(得分:1)
您可以删除绑定和更改操作(不需要更改bean范围)。
1)简单案例:显示所选项目的项目列表和行选择详细信息的数据表
以下示例使用 Javascript (在bean中存储项ID并调用操作以显示与此ID相关的数据):
<a4j:jsFunction name="selectRow" action="#{locationAction.showSelectedLocation}">
<a4j:param name="locationId" assignTo="#{locationAction.selectedLocationId}" />
</a4j:jsFunction>
<rich:dataTable id="locationTable"
value="#{locationAction.locationList}" var="location"
rows="#{referenceData.recordsPerPage}"
onrowclick="selectRow('#{location.locationId}')">
...
</rich:dataTable>
2)具有多个复选框的案例和操作按钮:
<rich:dataTable id="productTable" var="res"
value="#{productPicker.pickerList}">
...
<rich:column>
<h:selectBooleanCheckbox id="selectChck" value="#{res.selected}" />
</rich:column>
...
</rich:dataTable>
<a4j:commandButton value="#{msg.detachSelected}"
action="#{productPicker.deleteSelectedFromPickerList}"
render="picker" />
其中项目列表为private List<PickerItem> pickerList;
,项目来自
public class PickerItem {
private Long id; // with getter and setter
// private Record item; // with getter and setter
private boolean selected; // with getter and setter
}
在我的代码中,有equals
和hashCode
方法作为PickerItem类的pat,但它也应该没有它。