Jsf 2 如何获取自定义组件的父级?
我有一个自定义容器组件,我想这样使用:Jsf 2 如何获取自定义组件的父级?,jsf-2,facelets,Jsf 2,Facelets,我有一个自定义容器组件,我想这样使用: <p:a>A <p:a>B</p:a> </p:a> A B 应生成此标记的: <div>A <div>B</div> </div> A B 组件的代码如下所示 public class TagA extends TagHandler { Logger logger = Logger.getLogger(getClass().getN
<p:a>A
<p:a>B</p:a>
</p:a>
A
B
应生成此标记的:
<div>A
<div>B</div>
</div>
A
B
组件的代码如下所示
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);
}
}
public类TagA扩展了TagHandler{
Logger=Logger.getLogger(getClass().getName());
公共TagA(TagConfig配置){
超级(配置);
}
公共无效应用(FaceletContext ctx、UIComponent父级)
抛出IOException{
UIComponentBase c=新的UIComponentBase(){
public void encodeBegin(FacesContext ctx)引发IOException{
//getParent()始终返回UIViewRot
info(“父项是:”+getParent().getClass().getName());
ResponseWriter w=ctx.getResponseWriter();
w、 写(“”);
超级编码开始(ctx);
}
public void encodeEnd(FacesContext ctx)引发IOException{
ResponseWriter w=ctx.getResponseWriter();
w、 写(“”);
超级编码端(ctx);
}
//基中的抽象方法,必须重写
公共字符串getFamily(){
返回“com.mobiarch.nf”;
}
};
parent.getChildren().add(c);
nextHandler.apply(ctx,母公司);
}
}
很遗憾,这将呈现以下标记:
<div></div>A
<div></div>B
A
B
对于处于类似情况的其他人,只需开发组件,而不是标签
@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>");
}
}
@FacesComponent(“my.ComponentA”)
公共类ComponentA扩展了UIComponentBase{
Logger=Logger.getLogger(getClass().getName());
公共字符串getFamily(){
返回“my.custom.component”;
}
public void encodeBegin(FacesContext ctx)引发IOException{
超级编码开始(ctx);
info(“组件父级为:”+getParent().getClass().getName());
ResponseWriter w=ctx.getResponseWriter();
w、 写(“”);
}
public void encodeEnd(FacesContext ctx)引发IOException{
超级编码端(ctx);
ResponseWriter w=ctx.getResponseWriter();
w、 写(“”);
}
}
在???.taglib.xml中注册它
<tag>
<tag-name>a</tag-name>
<component>
<component-type>my.ComponentA</component-type>
</component>
</tag>
A.
成分A
这种方法实际上是一种“wtf?”。您为什么不使用普通的ui组件
?谢谢主任。我在学习一些糟糕的教程。我将在这里发布我的解决方案。