检查JSF2自定义组件的render-attribute的规则

时间:2013-08-11 08:45:39

标签: jsf-2 custom-component rendered-attribute

我有一个像这样的简单自定义组件,它不尊重渲染的属性

@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中的孩子。

但实施此常用功能的建议规则是什么?

1 个答案:

答案 0 :(得分:1)

已在UIComponent class的javadoc中描述过。

encodeBegin() method为例:

  

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() method

  

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(),那么无论如何都不需要这样做。