Jsf 扩展素数面';s列的数据表处理

Jsf 扩展素数面';s列的数据表处理,jsf,datatable,primefaces,custom-component,Jsf,Datatable,Primefaces,Custom Component,我试图在dataTable中扩展PrimeFaces的列组件——主要是创建标题,并根据键值自动插入对象的字段,而不必手动插入列标记及其关联的面 我的自定义组件覆盖DataTableRenderer中包含以下内容: @Override public void encodeEnd(FacesContext context, UIComponent component) throws java.io.IOException { Object columnOrder = comp

我试图在dataTable中扩展PrimeFaces的列组件——主要是创建标题,并根据键值自动插入对象的字段,而不必手动插入列标记及其关联的面

我的自定义组件覆盖DataTableRenderer中包含以下内容:

@Override
public void encodeEnd(FacesContext context, UIComponent component)
        throws java.io.IOException {
    Object columnOrder = component.getAttributes().get("columnOrder");
    if (columnOrder != null) {

        component.getChildren().clear();

        Application application = context.getApplication();
        ExpressionFactory expressionFactory = application.getExpressionFactory();

        Column column = new Column();

        Object var = component.getAttributes().get("var");
        String varKey = columnOrder.toString();

        UIOutput header = (UIOutput) application.createComponent(HtmlOutputText.COMPONENT_TYPE);
        header.setValue(varKey);
        column.getFacets().put("header", header);

        ValueExpression valExpr = expressionFactory.createValueExpression("#{" + var + "." + varKey + "}", String.class);
        UIOutput cell = (UIOutput) application.createComponent(HtmlOutputText.COMPONENT_TYPE);
        cell.setValueExpression("value", valExpr);


        column.setStyleClass(varKey);
        column.getChildren().add(cell);
        component.getChildren().add(column);

        component.getAttributes().remove("columnOrder");
    }
    super.encodeEnd(context, component);
}
我这么说

<my:dataTable var="item" value="#{myBean.collection}" columnOrder="field" />

标头设置正确,但单元格按字面意思输出#{item.field},而不是计算表达式

列组件上的setStyleClass也无法达到预期效果

我猜我抓错了方向,走错了方向


注意。在这个简化的示例中,我假设columnOrder是一个字符串,标题只使用键值,而不是在一个包中查找的键值列表。

@maple\u shaft击中了头部的钉子

通过将代码移动到重写DataTable而不是DataTableRenderer的类,所有这些都可以工作。嗯,就是说,在我加入了ElContext之后

更新代码如下:

@Override
public List<Column> getColumns() {
    if (columns == null) {
        columns = new ArrayList<Column>();

        for (UIComponent child : this.getChildren()) {
            if (child.isRendered() && child instanceof Column) {
                columns.add((Column) child);
            }
        }

        Object columnOrder = this.getAttributes().get("columnOrder");
        if (columnOrder != null) {

            FacesContext context = FacesContext.getCurrentInstance();

            Application application = context.getApplication();
            ExpressionFactory expressionFactory = application.getExpressionFactory();
            ELContext elContext = context.getELContext();

            Column column = new Column();

            Object var = this.getAttributes().get("var");
            String varKey = columnOrder.toString();

            HtmlOutputText header = new HtmlOutputText();
            header.setValue(varKey);
            column.getFacets().put("header", header);

            ValueExpression valExpr = expressionFactory.createValueExpression(elContext, "#{" + var + "." + varKey + "}", String.class);

            HtmlOutputText cell = new HtmlOutputText();
            cell.setValueExpression("value", valExpr);
            column.getChildren().add(cell);

            column.setStyleClass(var + "-" + varKey);
            columns.add(column);

            this.getAttributes().remove("columnOrder");
        }
    }

    return columns;
}
@覆盖
公共列表getColumns(){
如果(列==null){
columns=newarraylist();
对于(UIComponent子级:this.getChildren()){
if(child.isRendered()&&child instanceof Column){
列。添加((列)子项);
}
}
Object columnOrder=this.getAttributes().get(“columnOrder”);
if(columnOrder!=null){
FacesContext context=FacesContext.getCurrentInstance();
Application Application=context.getApplication();
ExpressionFactory ExpressionFactory=application.getExpressionFactory();
ELContext=context.getELContext();
Column Column=新列();
Object var=this.getAttributes().get(“var”);
String varKey=columnOrder.toString();
HtmlOutText标头=新的HtmlOutText();
header.setValue(varKey);
column.getFacets().put(“header”,header);
ValueExpression valExpr=expressionFactory.createValueExpression(elContext,“#{”+var+“+varKey+“}”,String.class);
HtmlOutText单元格=新的HtmlOutText();
cell.setValueExpression(“value”,valExpr);
column.getChildren().add(单元格);
column.setStyleClass(var+“-”+varKey);
列。添加(列);
this.getAttributes().remove(“columnOrder”);
}
}
返回列;
}

@maple_轴击中了头部的钉子

通过将代码移动到重写DataTable而不是DataTableRenderer的类,所有这些都可以工作。嗯,就是说,在我加入了ElContext之后

更新代码如下:

@Override
public List<Column> getColumns() {
    if (columns == null) {
        columns = new ArrayList<Column>();

        for (UIComponent child : this.getChildren()) {
            if (child.isRendered() && child instanceof Column) {
                columns.add((Column) child);
            }
        }

        Object columnOrder = this.getAttributes().get("columnOrder");
        if (columnOrder != null) {

            FacesContext context = FacesContext.getCurrentInstance();

            Application application = context.getApplication();
            ExpressionFactory expressionFactory = application.getExpressionFactory();
            ELContext elContext = context.getELContext();

            Column column = new Column();

            Object var = this.getAttributes().get("var");
            String varKey = columnOrder.toString();

            HtmlOutputText header = new HtmlOutputText();
            header.setValue(varKey);
            column.getFacets().put("header", header);

            ValueExpression valExpr = expressionFactory.createValueExpression(elContext, "#{" + var + "." + varKey + "}", String.class);

            HtmlOutputText cell = new HtmlOutputText();
            cell.setValueExpression("value", valExpr);
            column.getChildren().add(cell);

            column.setStyleClass(var + "-" + varKey);
            columns.add(column);

            this.getAttributes().remove("columnOrder");
        }
    }

    return columns;
}
@覆盖
公共列表getColumns(){
如果(列==null){
columns=newarraylist();
对于(UIComponent子级:this.getChildren()){
if(child.isRendered()&&child instanceof Column){
列。添加((列)子项);
}
}
Object columnOrder=this.getAttributes().get(“columnOrder”);
if(columnOrder!=null){
FacesContext context=FacesContext.getCurrentInstance();
Application Application=context.getApplication();
ExpressionFactory ExpressionFactory=application.getExpressionFactory();
ELContext=context.getELContext();
Column Column=新列();
Object var=this.getAttributes().get(“var”);
String varKey=columnOrder.toString();
HtmlOutText标头=新的HtmlOutText();
header.setValue(varKey);
column.getFacets().put(“header”,header);
ValueExpression valExpr=expressionFactory.createValueExpression(elContext,“#{”+var+“+varKey+“}”,String.class);
HtmlOutText单元格=新的HtmlOutText();
cell.setValueExpression(“value”,valExpr);
column.getChildren().add(单元格);
column.setStyleClass(var+“-”+varKey);
列。添加(列);
this.getAttributes().remove(“columnOrder”);
}
}
返回列;
}

我对此不是100%,但我认为EL值表达式在生命周期的INVOKE_应用程序阶段之后和
encodeEnd
之前会被评估为实际值。你是否可以在这之前设置ValueExpression?啊哈。。。我想可能是这样,但我被DataTable代码吓坏了。然而,相关的方法getColumns非常简单,我的代码也在那里工作。我不是100%这样认为,但我认为EL值表达式在生命周期的INVOKE_应用程序阶段之后,
encodeEnd
之前会被评估为实际值。你是否可以在这之前设置ValueExpression?啊哈。。。我想可能是这样,但我被DataTable代码吓坏了。然而,相关的方法getColumns非常简单,我的代码在那里工作。我怀疑是这样的,但不想提供答案,也不想劝阻其他人放弃你的问题。感谢您发回并回答您自己的问题,您会惊讶地发现有这么多人不受普通礼貌的困扰。如果您覆盖getColumns,其他datatable功能将中断。只是提醒一下。在这种情况下,我应该如何扩展功能?或者我不只是复制并粘贴Column.java的全部内容?(顺便说一句,您好,OptimuPrimeFaces先生。)到目前为止,我已经测试了所有PrimeFaces示例,没有任何问题。另一方面,尝试自动注入对列的排序确实会失败——但我认为我可以接受它,并将其留到下一次……我怀疑是这样,但不想这样做