在JSF应用程序中有多少个ELResolver与一个ELContext相关联?

时间:2016-03-15 15:11:57

标签: jsf el

Here提到

  

虽然只有一个ELResolver与ELContext关联,但那里   对于任何给定的变量或通常考虑多个旋转变压器   财产解决方案。

为了让那个要回答的人能够理解,我正在考虑一个自定义的ELResolver。这仅用于说明目的。在我迄今为止工作的项目中,我没有觉得需要自制的定制ELResolver。

在CustomELResolver中,getValue()方法看起来像

@Override
    public Object getValue(ELContext ctx, Object base, Object property)
            throws NullPointerException, PropertyNotFoundException, ELException {

        logger.log(Level.INFO, "Get Value property : {0}", property);

        if ((base == null) && property.equals(SOME_PROPERTY)) {
            logger.log(Level.INFO, "Found request {0}", base);
            ctx.setPropertyResolved(true);

            return SOME_OBJECT;
        }
        return null;

}
  

每个值表达式由getValue在后台评估   方法。在faces-config.xml中添加自定义   解析器被添加到责任链中。

一个简单的facelet页面:

    <h:outputText value="#{bean.name}" />
    <br />
    <br />
    <b>Ordered:</b>
    <br />
    <h:dataTable id="tableId1" 
                 value="#{PROPERTY DECLARED IN CUSTOM RESOLVER CLASS}" var="t">
        <h:column>#{t}</h:column>
    </h:dataTable>

@ManagedBean(name = "bean")
@RequestScoped
public class Bean {

    private String name = "Rafael";
    // getters & setters
}

当我调试时,对于来自上一页的此表达式value="#{PROPERTY DECLARED IN CUSTOM RESOLVER CLASS}",调用委托给getValue()中的CompositeELResolver,其中以红色突出显示的CustomELResolver被视为。

enter image description here

然而,对于这个表达

value="#{bean.name}"

enter image description here

考虑正常ManagedBeanELResolver。绝对没有问题。

但是对于相同的请求,ELContext显然与2 ELResolvers相关联。

请说明上述第一段中文件的含义

  

...单个ELResolver与ELContext相关联......

1 个答案:

答案 0 :(得分:2)

您忘记阅读所引用链接中的下一句话。

  

使用CompositeELResolvers将ELResolvers组合在一起   定义用于评估表达式的丰富语义。

如果查看调用层次结构,您将看到1个(一个,一个)FacesCompositeELResolver ...因此,有一个CompositeResolver与ELContext直接关联。

但是你也可以读到它实际上只有一个EL解析器实际上每次都在做这个工作,'链'中的一个说“我已经解决了,这就是结果”