我们希望数据表是可收藏的,因此数据表的状态在URL(offset,limit,sortOrder,sortBy等)中携带。问题是我需要从托管bean获取数据表的实际sortBy值并动态设置它(不像实现中那样静态地设置)。
我们扩展了DataTable代码,以便sortBy的动态值可以评估。当使用bean名称引用属性时,下面的代码可以解决这个问题:
CustomDataTable.java
@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}">
...
然而,由于重复,我们需要重构模板,现在我们包含数据表并通过ui:param给它托管bean:
...
<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根本不会被调用)。
任何人都可以帮忙做一些魔术,所以sortBy属性的值可以从托管bean的属性动态设置吗?
答案 0 :(得分:0)
结果我可以通过调用DataTable.getSortBy()来简单地评估sortBy属性,它使用StateHelper的方式与常规属性在评估值时的方式相同。