2012-10-29 54 views
1

我有一個自定義容器組件,我想用這樣的:如何獲取自定義組件的父級?

<p:a>A 
    <p:a>B</p:a> 
</p:a> 

這應該產生這樣的標記:

<div>A 
    <div>B</div> 
</div> 

代碼組件如下。

public class TagA extends TagHandler { 
    Logger logger = Logger.getLogger(getClass().getName()); 

    public TagA(TagConfig config) { 
     super(config); 
    } 

    public void apply(FaceletContext ctx, UIComponent parent) 
     throws IOException { 
     UIComponentBase c = new UIComponentBase() { 
       public void encodeBegin(FacesContext ctx) throws IOException { 
        //getParent() always returns UIViewRot 
        logger.info("Parent is: " + getParent().getClass().getName()); 
        ResponseWriter w = ctx.getResponseWriter(); 
        w.write("<div>"); 
        super.encodeBegin(ctx); 
       } 

       public void encodeEnd(FacesContext ctx) throws IOException { 
        ResponseWriter w = ctx.getResponseWriter(); 
        w.write("</div>"); 

        super.encodeEnd(ctx); 
       } 
       // abstract method in base, must override 
       public String getFamily() { 
        return "com.mobiarch.nf"; 
       } 
     }; 
     parent.getChildren().add(c); 
     nextHandler.apply(ctx, parent); 
    } 
} 

不幸的是,這是呈現以下標記:

<div></div>A 
<div></div>B 
+0

這種做法實際上是 「跆拳道?」。你爲什麼不使用普通的'UIComponent'? – BalusC

+0

謝謝首席。我正在關注一些糟糕的教程。我會在這裏發佈我的解決方案。 – RajV

回答

0

對於其他類似的情況,只是開發組件,而不是標籤。

@FacesComponent("my.ComponentA") 
public class ComponentA extends UIComponentBase { 
    Logger logger = Logger.getLogger(getClass().getName()); 

    public String getFamily() { 
     return "my.custom.component"; 
    } 
    public void encodeBegin(FacesContext ctx) throws IOException { 
     super.encodeBegin(ctx); 
     logger.info("Component parent is: " + getParent().getClass().getName()); 
     ResponseWriter w = ctx.getResponseWriter(); 
     w.write("<div>"); 
    } 

    public void encodeEnd(FacesContext ctx) throws IOException { 
     super.encodeEnd(ctx); 
     ResponseWriter w = ctx.getResponseWriter(); 
     w.write("</div>"); 
    } 
} 

在你??註冊。taglib.xml

<tag> 
    <tag-name>a</tag-name> 
    <component> 
     <component-type>my.ComponentA</component-type> 
    </component> 
</tag>