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

Jsf 从托管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() {

我们希望datatables是可书签的,所以datatable的状态在URL中进行(偏移量、限制、排序器、排序比等)。问题是我需要从托管bean中获取datatable的实际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}">
    ...

...
但是,由于重复,我们需要重构模板,现在我们包括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的方法与计算值时使用常规属性的方法相同