怎么样在验证失败的时候获得datatable 的 selection对象 Primefaces 2.2

问题:

最近项目组了有个特殊的需求。要在验证失败的时候获得datatable 的 selection对象。而在 Primefaces 2.2 只有当你提交这个datatable成功的时候(通过验证和转换之后),才能得到这个selection。

所以如果要在datatable验证失败情况下获得selection需要自己另寻奇径。

 1 <p:dataTable  id="dataTable" var="car"
 2         binding="#{dataTableBinding}" value="#{tableBean.cars}"
 3         selection="#{tableBean.selectedCars}">
 4         <p:column selectionMode="multiple" />
 5         <p:column style="width:200px" id="Model">
 6             <f:facet name="header">
 7                 Model
 8                     </f:facet>
 9             <h:outputText value="#{car.model}" />
10         </p:column>
11 
12         <p:column style="width:200px" id="year">
13             <f:facet name="header">
14                 Year( shoud > 2000 )
15                     </f:facet>
16             <h:outputText value="#{car.year}" />
17             <p:inputText value="#{car.year}">
18                 <f:attribute name="datatableClientId" value="form:dataTable" />
19                 <f:attribute name="datatable" value="#{dataTableBinding}" />
20                 <f:validator validatorId="dataTableRequiredValidator" />
21             </p:inputText>
22         </p:column>
23     </p:dataTable>

 

解决方案:

通过看源码,发现decode这个datatable时,primefaces会调自己写的一个datahelper 来 初始化selection,所以我就是直接参照这个hepler去掉cellselction,得到下面的util类

View Code
 1 import java.lang.reflect.Array;
 2 import java.util.Map;
 3 
 4 import javax.faces.context.FacesContext;
 5 
 6 import org.primefaces.component.datatable.DataTable;
 7 
 8 public class DataTableUtil {
 9 
10 
11 
12     public Object getDataTableSelection(FacesContext context, DataTable table, String dataTableclientId) {
13         String clientId = dataTableclientId != null ? dataTableclientId : table.getClientId(context);
14         Map<String, String> params = context.getExternalContext().getRequestParameterMap();
15 
16         String selection = params.get(clientId + "_selection");
17         Object data = null;
18         if (table.isSingleSelectionMode()) {
19             data = decodeSingleSelection(table, selection);
20         } else {
21             data = decodeMultipleSelection(table, selection);
22         }
23         table.setRowIndex(-1); // clean
24         return data;
25     }
26 
27     
28     private Object decodeSingleSelection(DataTable table, String selection) {
29         Object data = null;
30         if (isValueBlank(selection)) {
31             table.setSelection(null);
32             table.setEmptySelected(true);
33 
34         } else {
35             int selectedRowIndex = Integer.parseInt(selection);
36             int first = table.getFirst();
37             int rows = table.getRows();
38             int last = rows == 0 ? table.getRowCount() : rows;
39 
40             if (first <= selectedRowIndex && (first + last) > selectedRowIndex) {
41                 table.setRowIndex(selectedRowIndex);
42                 data = table.getRowData();
43                 table.setSelection(table.getRowData());
44             }
45         }
46         return data;
47     }
48 
49     private boolean isValueBlank(String value) {
50         if (value == null)
51             return true;
52 
53         return value.trim().equals("");
54     }
55 
56     private Object decodeMultipleSelection(DataTable table, String selection) {
57         Class<?> clazz =
58             table.getValueExpression("selection").getType(FacesContext.getCurrentInstance().getELContext());
59         Object data = null;
60         if (isValueBlank(selection)) {
61             data = Array.newInstance(clazz.getComponentType(), 0);
62             table.setSelection(data);
63 
64         } else {
65             if (!table.isCellSelection()) {
66                 String[] rowSelectValues = selection.split(",");
67                 data = Array.newInstance(clazz.getComponentType(), rowSelectValues.length);
68 
69                 for (int i = 0; i < rowSelectValues.length; i++) {
70                     table.setRowIndex(Integer.parseInt(rowSelectValues[i]));
71 
72                     Array.set(data, i, table.getRowData());
73                 }
74                 table.setSelection(data);
75             }
76         }
77         return data;
78     }
79 }

 

只要调 getDataTableSelection(current facescontext instance, datatable instance, datatable clientId) 方法就会得到当前checkbox选择的结果。返回到Object是个Array。

注意: 之所以要传datatable clientId作为第三个参数,是因为当这个validator在一个column里面时,datatable.getClientId()会错误的把row nubmer append上。所以要传clientId.

posted on 2013-02-27 17:03  鱼冻  阅读(535)  评论(0)    收藏  举报

导航