这已经在UIComponent
class的 javadoc 中进行了描述。
以encodeBegin()
方法为例:
编码开始
public abstract void encodeBegin(FacesContext context)
throws java.io.IOException
如果我们的rendered
属性是true
,则将 this 的当前状态的开始呈现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
如果 aRenderer
与 this 相关联UIComponent
,则实际编码将委托给Renderer#encodeBegin(FacesContext, UIComponent)
.
如果我们渲染的属性是false
,立即调用pushComponentToEL(javax.faces.context.FacesContext,javax.faces.component.UIComponent)
并返回。
和getRendersChildren()
方法:
getRendersChildren
public abstract boolean getRendersChildren()
返回一个标志,指示此组件是否负责渲染其子组件。中的默认实现UIComponentBase#getRendersChildren
尝试查找此组件的渲染器。如果是,它调用Renderer#getRendersChildren
并返回结果。如果没有,则返回false
. 从 JavaServer Faces 规范 1.2 版开始,鼓励组件作者true
从此方法返回并依赖UIComponentBase#encodeChildren
.
注意最后一条语句。这是一个UIComponent#encodeChildren()
:
编码儿童
public abstract void encodeChildren(FacesContext context)
throws java.io.IOException
如果我们的rendered
属性是true
,则渲染UIComponents
this的子级UIComponent
。rendersChildren
仅当属性为时才会调用此方法true
。
如果 aRenderer
与 this 相关联UIComponent
,则实际编码将委托给Renderer#encodeChildren(FacesContext, UIComponent)
. 如果 noRenderer
与此关联UIComponent
,则遍历此组件的每个子组件并调用encodeAll(javax.faces.context.FacesContext)
.
请注意,UIComponentBase
它们已经实施。如果您覆盖了一个方法,那么您需要遵循完全相同的规则,或者super.encodeXxx()
尽可能使用。如果您没有encodeChildren()
覆盖,那么无论如何您都不需要这样做。