我有一个像这样的简单自定义组件,它不尊重渲染的属性。
@FacesComponent("my.OutputText")
public class OutputText extends UIPanel
{
@Override public void encodeBegin(FacesContext context) throws IOException {...}
@Override public void encodeEnd(FacesContext context) throws IOException {...}
}
当然,我可以检查两种方法中的呈现属性,添加@Override public boolean getRendersChildren()
并检查呈现的属性,然后简单地不渲染encodeChildren
中的孩子。
但实施此常用功能的建议规则是什么?
答案 0 :(得分:1)
已在UIComponent
class的javadoc中描述过。
encodeBegin
public abstract void encodeBegin(FacesContext context) throws java.io.IOException
如果我们的
rendered
属性为true
,则将此UIComponent
的当前状态的开头呈现给指定的FacesContext中包含的响应。致电pushComponentToEL(javax.faces.context.FacesContext,javax.faces.component.UIComponent)
。调用Application.publishEvent(javax.faces.context.FacesContext, java.lang.Class, java.lang.Object)
,将PreRenderComponentEvent
.class
作为第一个参数传递,将组件实例作为第二个参数传递。如果
Renderer
与此UIComponent
相关联,则实际编码将委托给Renderer#encodeBegin(FacesContext, UIComponent)
。如果我们的渲染属性为
false
,请致电pushComponentToEL(javax.faces.context.FacesContext,javax.faces.component.UIComponent)
并立即返回。
getRendersChildren
public abstract boolean getRendersChildren()
返回一个标志,指示此组件是否负责呈现其子组件。
UIComponentBase#getRendersChildren
中的默认实现尝试查找此组件的渲染器。如果是,则调用Renderer#getRendersChildren
并返回结果。如果没有,则返回false
。从JavaServer Faces规范1.2版开始,鼓励组件作者从此方法返回true
并依赖UIComponentBase#encodeChildren
。
请注意最后一句话。这是UIComponent#encodeChildren()
的一个:
encodeChildren
public abstract void encodeChildren(FacesContext context) throws java.io.IOException
如果我们的
rendered
媒体资源为true
,请渲染此UIComponents
的孩子UIComponent
。仅当rendersChildren
属性为true
时才会调用此方法。如果
Renderer
与此UIComponent
相关联,则实际编码将委托给Renderer#encodeChildren(FacesContext, UIComponent)
。如果没有Renderer
与此UIComponent
相关联,请迭代此组件的每个子项并调用encodeAll(javax.faces.context.FacesContext)
。
请注意UIComponentBase
已经实现了它们。如果您已覆盖某个方法,则需要遵循完全相同的规则,或者如果可能,请使用super.encodeXxx()
。如果您没有覆盖encodeChildren()
,那么无论如何都不需要这样做。