我什么时候应该使用UIComponent#popComponentFromEL(FacesContext context)?

时间:2017-05-20 16:30:04

标签: jsf uicomponents facescontext

我正在研究encodeEnd方法结束的现有JSF组件:

// popComponentFromEL(context);

UIComponent#popComponentFromEL(FacesContext context)的Javadoc告诉我:

  

UIComponent属性地图中弹出当前FacesContext,以便之前的UIComponent成为当前组件。

您何时以及为何需要或想要?

我发现同一个库中没有其他组件正在使用它。

1 个答案:

答案 0 :(得分:2)

这是pushComponentToEL()的对应物,其Javadoc更精心地解释了这一点。

  

pushComponentToEL

     

public final void pushComponentToEL(FacesContext context, UIComponent component)

     

使用密钥FacesContext将当前UIComponent推送到CURRENT_COMPONENT属性地图,保存与UIComponent关联的先前CURRENT_COMPONENT,以便后续调用popComponentFromEL(javax.faces.context.FacesContext)

     

此方法和popComponentFromEL()构成了合同的基础,使EL表达式“#{component}”能够解析为生命周期中正在处理的“当前”组件。必须在此类的javadoc中根据需要指定何时必须调用pushComponentToEL()popComponentFromEL()的要求。   pushComponentToEL()返回后,对getCurrentComponent(javax.faces.context.FacesContext)的调用必须返回此UIComponent实例,直到调用popComponentFromEL()为止,此后将从UIComponent返回getCurrentComponent()实例{1}}

基本上,这种方法

public void encodeXxx(FacesContext context) {
    try {
        pushComponentToEL(context, this);

        // ...
    }
    finally {
        popComponentFromEL(context);
    }
}

允许您在// ...进程中使用EL中的this或托管bean中的UIComponent#getCurrentComponent()来获取#{component}组件。

well known examples中的一个是这个结构:

<h:inputText ... styleClass="#{component.valid ? 'valid' : 'error'}" />

其中#{component.valid}基本上是指UIInput#isValid()