Jsf 从托管bean动态设置datatable sortBy属性
我们希望datatables是可书签的,所以datatable的状态在URL中进行(偏移量、限制、排序器、排序比等)。问题是我需要从托管bean中获取datatable的实际sortBy值,并动态地(而不是像实现中那样静态地)设置它 我们扩展了DataTable代码,以便可以计算sortBy的动态值。下面的代码在使用bean名称引用属性时实现了这个技巧: CustomDataTable.javaJsf 从托管bean动态设置datatable sortBy属性,jsf,primefaces,datatable,facelets,Jsf,Primefaces,Datatable,Facelets,我们希望datatables是可书签的,所以datatable的状态在URL中进行(偏移量、限制、排序器、排序比等)。问题是我需要从托管bean中获取datatable的实际sortBy值,并动态地(而不是像实现中那样静态地)设置它 我们扩展了DataTable代码,以便可以计算sortBy的动态值。下面的代码在使用bean名称引用属性时实现了这个技巧: CustomDataTable.java @Override protected String resolveSortField() {
@Override
protected String resolveSortField() {
UIColumn column = this.getSortColumn();
String sortField = null;
ValueExpression sortVE = this.getValueExpression("sortBy");
if(column == null) {
sortField = resolveDynamicField(sortVE);
}
else {
if(column.isDynamic()) {
((DynamicColumn) column).applyStatelessModel();
sortField = resolveDynamicField(sortVE);
} else {
sortField = resolveStaticField(sortVE);
}
}
return sortField;
}
@Override
public String resolveDynamicField(ValueExpression expression) {
if(expression != null) {
String expressionString = expression.getExpressionString();
if (expressionString.startsWith("#{")) {
FacesContext context = getFacesContext();
ELContext eLContext = context.getELContext();
ValueExpression dynaVE = context.getApplication()
.getExpressionFactory().createValueExpression(eLContext, expressionString , String.class);
String result = (String) dynaVE.getValue(eLContext);
if (StringUtils.isNotEmpty(result)) {
return result;
} else {
return resolveStaticField(expression);
}
} else {
return expressionString.substring(expressionString.indexOf(".") + 1);
}
} else {
return null;
}
}
在模板中:
<p:dataTable value="#{concreteBean.dataModel}"
var="obj"
selection="#{concreteBean.selected}"
selectionMode="single"
sortBy="#{concreteBean.sortBy}"
sortOrder="#{concreteBean.sortOrder}"
first="#{concreteBean.first}"
rows="#{concreteBean.rows}"
rowKey="#{obj}">
...
...
但是,由于重复,我们需要重构模板,现在我们包括datatable,并通过ui:param:
...
<ui:param name="bean" value="#{concreteBean}" />
<ui:include src="datatable.xhtml" />
...
...
<p:dataTable value="#{bean.dataModel}"
var="obj"
selection="#{bean.selected}"
selectionMode="single"
sortBy="#{bean.sortBy}"
sortOrder="#{bean.sortOrder}"
first="#{bean.first}"
rows="#{bean.rows}"
rowKey="#{obj}">
...
。。。
...
...
...
但是,本例中的动态值计算为空字符串,而不是引用bean的属性值(sortBy的getter根本不被调用)
任何人都可以帮我做一些魔术,这样就可以从托管bean的属性中动态设置sortBy属性的值了吗?事实证明,我可以通过调用DataTable.getSortBy()来计算sortBy属性,它使用stateheloper的方法与计算值时使用常规属性的方法相同