我正在研究encodeEnd
方法结束的现有JSF组件:
// popComponentFromEL(context);
UIComponent#popComponentFromEL(FacesContext context)
的Javadoc告诉我:
从
UIComponent
属性地图中弹出当前FacesContext
,以便之前的UIComponent
成为当前组件。
您何时以及为何需要或想要?
我发现同一个库中没有其他组件正在使用它。
答案 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()
。