怎么样在验证失败的时候获得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.

浙公网安备 33010602011771号