Jsf Can';t以编程方式设置DataTable的初始排序顺序

Jsf Can';t以编程方式设置DataTable的初始排序顺序,jsf,jsf-2,primefaces,datatable,Jsf,Jsf 2,Primefaces,Datatable,我需要通过bean以编程方式为DataTable设置sortBy。DataTable具有单一排序模式、静态列和自定义惰性模型,可通过自定义表达式进行排序,如=“#{contractor.companyName-MULTY_LANG}”。我尝试了很多方法来实现这一点,只有一种方法有效(下面的代码),但效果不正确-组件显示时没有突出显示有序字段。有人能回答如何以编程方式为DataTable设置sortBy的正确方法吗 @PostConstruct public void init() {

我需要通过bean以编程方式为DataTable设置sortBy。DataTable具有单一排序模式、静态列和自定义惰性模型,可通过自定义表达式进行排序,如=“#{contractor.companyName-MULTY_LANG}”。我尝试了很多方法来实现这一点,只有一种方法有效(下面的代码),但效果不正确-组件显示时没有突出显示有序字段。有人能回答如何以编程方式为DataTable设置sortBy的正确方法吗

@PostConstruct
    public void init() {    
        final DataTable d = (DataTable) FacesContext.getCurrentInstance().getViewRoot().findComponent(TABLE_COMPONENT_KEY);
        String tableSortByExpression = "#{contractor.companyName-MULTY_LANG}"; // expression from some column
        SortMeta sm1 = new SortMeta();
        for (UIComponent child : d.getChildren()) {
            Column column = (Column)child;
            ValueExpression columnSortByVe = column.getValueExpression("sortBy");
            if (columnSortByVe != null) {
                String columnSortByExpression = columnSortByVe.getExpressionString();
                if (tableSortByExpression != null && tableSortByExpression.equals(columnSortByExpression)) {
                    d.setSortColumn(column);
                    d.setSortOrder("ASCENDING");
                    break;
                }
            }
        }
    }
我将非常感谢您的帮助



第5.1条。Tomcat 7。Mojarra 2.2.8

首先扩展org.primefaces.component.datatable.feature.SortFeature

public class CustomSortFeature extends SortFeature {
    @SuppressWarnings("rawtypes")
    @Override
    public void encode(FacesContext context, DataTableRenderer renderer, DataTable table) throws IOException {
        table.setFirst(0);

        if(table.isLazy()) {
            table.loadLazyData();
            singleSort(context, table);
        }
        else {
            if(table.isMultiSort())
                multiSort(context, table);
            else
                singleSort(context, table);

            if(table.isPaginator()) {
                RequestContext requestContext = RequestContext.getCurrentInstance();

                if(requestContext != null) {
                    requestContext.addCallbackParam("totalRecords", table.getRowCount());
                }
            }

            //save state
            Object filteredValue = table.getFilteredValue();
            if(!table.isLazy() && table.isFilteringEnabled() && filteredValue != null) {
                table.updateFilteredValue(context, (List) filteredValue);
            }
        }

        renderer.encodeTbody(context, table, true);
    }
}
然后尝试扩展org.primefaces.component.datatable.DataTableRenderer

@FacesRenderer(componentFamily = "org.primefaces.component", rendererType = "org.primefaces.component.DataTableRenderer")
public class CustomDataTableRenderer extends DataTableRenderer {
    public List<DataTableFeatureKey> FEATURE = new ArrayList<DataTableFeatureKey>(){/**
         * 
         */
        private static final long serialVersionUID = 1L;

    {
        add(DataTableFeatureKey.DRAGGABLE_COLUMNS);
        add(DataTableFeatureKey.FILTER);
        add(DataTableFeatureKey.PAGE);
        add(DataTableFeatureKey.SORT);
        add(DataTableFeatureKey.RESIZABLE_COLUMNS);
        add(DataTableFeatureKey.SELECT);
        add(DataTableFeatureKey.ROW_EDIT);
        add(DataTableFeatureKey.CELL_EDIT);
        add(DataTableFeatureKey.ROW_EXPAND);
        add(DataTableFeatureKey.SCROLL);
        add(DataTableFeatureKey.DRAGGABLE_ROWS);
    }};
    @Override
    protected void preRender(FacesContext context, DataTable table){
        table.setCaseSensitiveSort(false);
        if(table.isLazy()) {
            if(table.isLiveScroll())
                table.loadLazyScrollData(0, table.getScrollRows());
            else
                table.loadLazyData();
        }

        boolean defaultSorted = (table.getValueExpression("sortBy") != null || table.getSortBy() != null);
        if(defaultSorted && !table.isLazy()) {
            table.setDefaultSortByVE(table.getValueExpression("sortBy"));
            table.setDefaultSortOrder(table.getSortOrder());
            table.setDefaultSortFunction(table.getSortFunction());

            CustomSortFeature sortFeature = (CustomSortFeature) table.getFeature(DataTableFeatureKey.SORT);

            if(table.isMultiSort())
                sortFeature.multiSort(context, table);
            else
                sortFeature.singleSort(context, table);  

            table.setRowIndex(-1);
        }

        if(table.isPaginator()) {
            table.calculateFirst();
        }

        Columns dynamicCols = table.getDynamicColumns();
        if(dynamicCols != null) {
            dynamicCols.setRowIndex(-1);
        }
    }

    @Override
    public void encodeEnd(FacesContext context, UIComponent component) throws IOException{
        DataTable table = (DataTable) component;
        if(table.shouldEncodeFeature(context)) {
            for(Iterator<DataTableFeatureKey> it = FEATURE.iterator(); it.hasNext();) {
                DataTableFeature feature = table.getFeature(it.next());

                if(feature.shouldEncode(context, table)) {
                    feature.encode(context, this, table);
                }
            }
        }
        else {  
            preRender(context, table);

            encodeMarkup(context, table);
            encodeScript(context, table);
        }
    }
}
@facesrender(componentFamily=“org.primefaces.component”,rendertype=“org.primefaces.component.DataTableRenderer”)
公共类CustomDataTableRenderer扩展了DataTableRenderer{
公共列表功能=新建ArrayList(){/**
* 
*/
私有静态最终长serialVersionUID=1L;
{
添加(DataTableFeatureKey.DRAGGABLE_列);
添加(DataTableFeatureKey.FILTER);
添加(DataTableFeatureKey.PAGE);
添加(DataTableFeatureKey.SORT);
添加(DataTableFeatureKey.可调整大小的_列);
添加(DataTableFeatureKey.SELECT);
添加(DataTableFeatureKey.ROW\u编辑);
添加(DataTableFeatureKey.CELL\u编辑);
添加(DataTableFeatureKey.ROW\u展开);
添加(DataTableFeatureKey.SCROLL);
添加(DataTableFeatureKey.DRAGGABLE_行);
}};
@凌驾
受保护的void预呈现(FacesContext上下文,DataTable){
表.setCaseSensitiveSort(假);
if(table.isLazy()){
if(table.isLiveScroll())
loadLazyScrollData(0,table.getScrollRows());
其他的
table.loadLazyData();
}
布尔值defaultSorted=(table.getValueExpression(“sortBy”)!=null | | table.getSortBy()!=null);
if(defaultSorted&&!table.isLazy()){
table.setDefaultSortByVE(table.getValueExpression(“sortBy”);
table.setDefaultSortOrder(table.getSortOrder());
table.setDefaultSortFunction(table.getSortFunction());
CustomSortFeature sortFeature=(CustomSortFeature)table.getFeature(DataTableFeatureKey.SORT);
if(table.isMultiSort())
sortFeature.multiSort(上下文,表);
其他的
singleSort(上下文,表);
表1.setRowIndex(-1);
}
if(table.isPaginator()){
table.calculateFirst();
}
Columns dynamicCols=table.getDynamicColumns();
if(dynamicCols!=null){
dynamicCols.setRowIndex(-1);
}
}
@凌驾
public void encodeEnd(FacesContext上下文,UIComponent)引发IOException{
DataTable=(DataTable)组件;
if(表.shouldenocure(上下文)){
for(Iterator it=FEATURE.Iterator();it.hasNext();){
DataTableFeature=table.getFeature(it.next());
if(feature.shouldEncode(上下文、表)){
编码(上下文、此、表);
}
}
}
否则{
预呈现(上下文、表);
编码标记(上下文、表);
编码脚本(上下文、表);
}
}
}
此外,将渲染类添加到faces配置中

<faces-config
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
    http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd"
    version="2.0">
        <render-kit>
            <renderer>
                <component-family>org.primefaces.component</component-family>
                <renderer-type>org.primefaces.component.DataTableRenderer</renderer-type>
                <renderer-class>com.edtoktay.CustomDataTableRenderer</renderer-class>
            </renderer>
        </render-kit>
</faces-config>

org.primefaces.component
org.primefaces.component.DataTableRenderer
com.edtoktay.CustomDataTableRenderer

希望这有帮助

您不能按首选默认顺序从数据库中读取它吗?它不会突出显示该列,但我认为它可以很好地工作,并且可以直观地操作PF 6.1(您实际上需要以编程方式完成它?您不能使用xhtml吗?@Kukeltje>您不能使用xhtml吗?=>我们做了一个
dataTable.reset();
要清除所有字段筛选器和其他人员@Kukeltje>请先尝试PF 6.1=>我们正在使用此版本。我看不到“我们执行了dataTable.reset();要清除所有字段筛选器和其他人员”与“您不能使用xhtml吗?”相关的地方。除了现在的排序问题之外,您还想实现什么使用xhtml无法做到这一点?事实上,
sortOrder=“#{bean.sortOrder}”有什么问题吗
在XHTML?中,这是哪个PF版本的?5.1?我使用的版本也是PF 5.1。通过使用此扩展类并重写LazyDataModel的load函数,您可以编辑和操作数据表和数据模型的所有属性。我使用上述类不仅用于排序,还用于修改datatable prog的其他属性按语法