实现SelectableDataModel

mer*_*esi 2 jsf primefaces

XHTML方面:

<p:dataTable id="selectProductTable" var="product"  value="#{manageFormsView.productModel}" selection="#{manageFormsView.product}" >
Run Code Online (Sandbox Code Playgroud)

豆边:

  private SelectableDataModel<Product>  productModel=new SelectableDataModel<Product>() {


                @Override  
                public Product getRowData(String rowKey) {  
                    //In a real app, a more efficient way like a query by rowKey should be implemented to deal with huge data  


                    for(Product product : productList) {  
                        if(product.getModel().equals(rowKey))  
                            return product;  
                    }  

                    return null;  
                }  

                @Override  
                public Object getRowKey(Product p) {  
                    return p.getModel();  
                }  
        };
Run Code Online (Sandbox Code Playgroud)

我不想生成一个实现SDM的新类,我不能像上面那样进行内联实现吗?

我得到例外:

javax.faces.FacesException: DataModel must implement org.primefaces.model.SelectableDataModel when selection is enabled.
Run Code Online (Sandbox Code Playgroud)

Bal*_*usC 8

异常消息具有误导性.仅实现SelectableDataModel接口是不够的.您还需要扩展一个DataModel实现,如ListDataModel.这无法在匿名类的风格中完成.你真的需要创建另一个类.

public class ProductDataModel extends ListDataModel<Product> implements SelectableDataModel<Product> {

    // ...

}
Run Code Online (Sandbox Code Playgroud)

如果您有共同的基本权利(getId()等等),您可以根据需要进行整合,这样您就不需要为每个实体创建另一个.

public class BaseEntityDataModel<E extends BaseEntity> extends ListDataModel<E> implements SelectableDataModel<E> {

    // ...

}
Run Code Online (Sandbox Code Playgroud)

作为一个完全不同的替代方案,你也可以使用它的rowKey属性,<p:dataTable>并让它指的是完全相同的值SelectableDataModel#getRowKey().这样您就不再需要整个SelectableDataModel界面了.

<p:dataTable ... rowKey="#{product.model}">
Run Code Online (Sandbox Code Playgroud)

也可以看看:


Mr.*_*mes 6

既然你似乎不具备任何特殊的功能getRowDatagetRowKey,我觉得你不需要做这样复杂的事情.<p:dataTable>具有单一选择模式selectionrowKey属性,应该充分地完成工作.你的桌子应该是这样的:

<p:dataTable var="p" value="#{mrBean.products}" rowKey="#{p.model}"
             selection="#{mrBean.selectedProduct}"  selectionMode="single">
   ... // Your columns
</p:dataTable>
Run Code Online (Sandbox Code Playgroud)

您可以在以下selectedProduct属性中获取所选行ManagedBean:

@ManagedBean
@ViewScoped
public class MrBean {
   private List<Product> products;
   private Product       selectedProduct;

   // Getters and Setters
}
Run Code Online (Sandbox Code Playgroud)