Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    primarykey
    data
    text
    <p>First, you need to have a backing component which implements <a href="http://docs.oracle.com/javaee/6/api/javax/faces/component/NamingContainer.html" rel="nofollow noreferrer"><code>NamingContainer</code></a> and returns <code>"javax.faces.NamingContainer"</code> as component family. This is required by composite components, you can't change that part. The <a href="http://docs.oracle.com/javaee/6/api/javax/faces/component/UINamingContainer.html" rel="nofollow noreferrer"><code>UINamingContainer</code></a> implementation already does that, so if you can just extend from it. </p> <pre><code>@FacesComponent("mySelectOneRadio") public class MySelectOneRadio extends UINamingContainer { // ... } </code></pre> <p>Or if you rather want to extend from <code>UISelectOne</code>, then you'd have to implement the <code>NamingContainer</code> interface and make sure that you return <a href="http://docs.oracle.com/javaee/6/api/javax/faces/component/UINamingContainer.html#COMPONENT_FAMILY" rel="nofollow noreferrer"><code>UINamingContainer.COMPONENT_FAMILY</code></a> in the <code>getFamily()</code> override.</p> <p>Then, you need to specify it in <code>&lt;cc:interface componentType&gt;</code>.</p> <pre><code>&lt;cc:interface componentType="mySelectOneRadio"&gt; </code></pre> <hr> <p>Note that at this step you can already perform the rendering (encoding) through Java. Just override the <code>encodeChildren()</code> method.</p> <pre><code>@FacesComponent("mySelectOneRadio") public class MySelectOneRadio extends UINamingContainer { @Override public void encodeChildren(FacesContext context) throws IOException { ResponseWriter writer = context.getResponseWriter(); writer.startElement("div", this); writer.writeText("hello world", null); writer.endElement("div"); } } </code></pre> <hr> <p>Coming back to your concrete question, you'd thus like to have a standalone <code>Renderer</code> class for this. That's fine. For that you need to extend <code>Renderer</code>:</p> <pre><code>@FacesRenderer(componentFamily=UINamingContainer.COMPONENT_FAMILY, rendererType=MySelectOneRadioRenderer.RENDERER_TYPE) public class MySelectOneRadioRenderer extends Renderer { public static final String RENDERER_TYPE = "com.example.MySelectOneRadio"; @Override public void encodeChildren(FacesContext context, UIComponent component) throws IOException { ResponseWriter writer = context.getResponseWriter(); writer.startElement("div", component); writer.writeText("hello world", null); writer.endElement("div"); } } </code></pre> <p>The backing component should be changed as follows in order to properly register this renderer as the default renderer (don't override <code>getRendererType()</code> method! otherwise you or anyone else would be unable to change this by <code>&lt;renderer&gt;</code> in <code>faces-config.xml</code>):</p> <pre><code>@FacesComponent("myComposite") public class MyComposite extends UINamingContainer { public MyComposite() { // Set default renderer. setRendererType(MySelectOneRadioRenderer.RENDERER_TYPE); } } </code></pre> <p>Note that thanks to the <code>@FacesRenderer</code>, you don't need to hassle with <code>faces-config.xml</code>.</p> <hr> <p>Whatever way you choose to encode the children, you can get component's children just by <code>UIComponent#getChildren()</code>. When you're inside <code>MySelectOneRadio</code> component:</p> <pre><code>if (getChildCount() &gt; 0) { for (UICompnent child : getChildren()) { // ... } } </code></pre> <p>Or when you're inside <code>MySelectOneRadioRenderer</code> renderer:</p> <pre><code>if (component.getChildCount() &gt; 0) { for (UICompnent child : component.getChildren()) { // ... } } </code></pre> <p>To delegate to the component's own default rendering, invoke <code>super.encodeChildren()</code> or <code>component.encodeChildren()</code>. To delegate to child's own default rendering, invoke <code>child.encodeAll()</code>.</p> <h3>See also:</h3> <ul> <li><a href="https://stackoverflow.com/questions/8076625/jsf-what-is-the-relationship-between-component-family-component-type-and-rend">What is the relationship between component family, component type and renderer type?</a></li> </ul>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. VO
      singulars
      1. This table or related slice is empty.
    2. VO
      singulars
      1. This table or related slice is empty.
    3. VO
      singulars
      1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload