从托管bean动态设置datatable sortBy属性

时间:2014-09-04 15:19:48

标签: jsf primefaces datatable facelets

我们希望数据表是可收藏的,因此数据表的状态在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的属性动态设置吗?

1 个答案:

答案 0 :(得分:0)

结果我可以通过调用DataTable.getSortBy()来简单地评估sortBy属性,它使用StateHelper的方式与常规属性在评估值时的方式相同。