我正在使用JSF 2.0,并且我有一个数据表,使用延迟load来填充。当我使用CDI / Spring时,该页面的页面是@ViewAccessScoped
(MyFaces CODI)。
当在jsf页面中加载datatable时,当我第一次选择一行(radiobutton)时,我无法获得选定的行,对于后续选择,我可以在ManagedBean的onRowSelect方法中获得选定的行。如果我使用会话范围,那么当我第一次选择行时,我能够获得所选行。
JSF Code
<p:dataTable id="dataTable" var="req" lazy="true" value="#{emp.lazyModel}"
rowKey="#{req.empNo}"
paginator="true" rows="10"
selection="#{emp.selectedRequest}">
<p:ajax event="rowSelectRadio" listener="#{emp.onRowSelect}" />
<p:column selectionMode="single" style="width:18px" />
ManagedBean
@Named("emp")
@ViewAccessScoped
public class EmployeeManagedBean implements Serializable {
private Employee selectedRequest = new Employee();
@PostConstruct
public void init() {
initTable();
}
private void initTable() {
lazyModel = new LazyEmployeeDataModel(requestList, requestService);
}
public LazyDataModel<Employee> getLazyModel() {
return lazyModel;
}
和 onRowSelect 方法
public void onRowSelect(SelectEvent event) {
try {
setSelectedRequest((Employee) event.getObject());
System.out.println("row "
+ getSelectedRequest());
答案 0 :(得分:0)
我已经解决了这个问题,问题是cookies。
第一次加载list.jsf时,未设置cookie。因此,当用户选择行时,cookie被设置,因此对于后续选择,用户可以获得选定的行值。
要解决此问题,我创建了一个index.jsp页面并重定向到list.jsf,因此在用户使用单选按钮选择行之前会设置cookie。
由于