展开EL-Context获取某些值

时间:2017-10-10 12:54:18

标签: jsf datatable el

xhtml中的示例有效,因为#{row}中定义了p:dataTable。如果我在getData的上下文中调用p:dataTable,则会返回null。有关方法返回Values.iterateOverDatatableValues的情况,请参阅null。如何定义row以在我的上下文中使用。可能有数据表的一些函数来迭代值,以便定义#{row}

爪哇:

@Named
@SessionScoped
class Test {
  public Object getData () {
     return Faces.evaluateExpressionGet("#{row.someProperty}"); //The String "#{row.someProperty}" comes from a collection.
  }
}

XHTML #{row}Test.getData()中定义:

<p:dataTable value="#{bean.values}" var="row">

   <p:column>
      <h:outputText value="#{test.data}" />
   </p:column>
</p:dataTable>

Java,#{row}未定义:

class Values {
  @Inject
  Test test;

  public void iterateOverDatatableValues (){
    DataTable dt = Components.findComponent("datatableId");
    for (Object o : dt.getValues()){
      test.getData(); // <---- NULL because #{row} is not defined. 
    }
  }
}

1 个答案:

答案 0 :(得分:0)

解决方案是使用expressionFactory()。createValueExperssion方法。

private void setRowEL(Object o) {
    ELContext elContext = Faces.getELContext();
    ExpressionFactory expressionFactory = Faces.getApplication().getExpressionFactory();
    ValueExpression aliasValueExpression = expressionFactory.createValueExpression(elContext, "#{row}", MyValue.class);
    aliasValueExpression.setValue(elContext, o);
}