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被视为。
然而,对于这个表达
value="#{bean.name}"
考虑正常ManagedBeanELResolver
。绝对没有问题。
但是对于相同的请求,ELContext
显然与2 ELResolvers
相关联。
请说明上述第一段中文件的含义
...单个ELResolver与ELContext相关联......
答案 0 :(得分:2)
您忘记阅读所引用链接中的下一句话。
使用CompositeELResolvers将ELResolvers组合在一起 定义用于评估表达式的丰富语义。
如果查看调用层次结构,您将看到1个(一个,一个)FacesCompositeELResolver ...因此,有一个CompositeResolver与ELContext直接关联。
但是你也可以读到它实际上只有一个EL解析器实际上每次都在做这个工作,'链'中的一个说“我已经解决了,这就是结果”