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
4

1 に答える 1

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>
于 2012-10-29T16:00:56.467 に答える