1

我正在使用 JSF 2.0,并且我有一个使用延迟加载填充的数据表。@ViewAccessScoped当我使用 CDI/Spring 时,页面的范围是(MyFaces CODI)。

当在 jsf 页面中加载数据表并且第一次选择一行时(单选按钮),我无法获得选定的行,对于后续选择,我能够在 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" />  

托管豆

@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()); 
4

1 回答 1

0

我已经解决了这个问题,问题是cookies。

首次加载 list.jsf 时,未设置 cookie。因此,当用户选择一行时,cookie 会被设置,因此对于后续选择,用户可以获得选定的行值。

为了解决这个问题,我创建了一个 index.jsp 页面并重定向到 list.jsf,因此在用户使用单选按钮选择一行之前设置了 cookie。

谢谢

于 2012-12-31T12:49:06.567 回答