我有一个扩展UIComponent和UIOutput的标记类。在这个类中我有encodeBegin和encodeEnd,我可以使用我的contextWriter通过使用writer.startElement(“div”,myComponent)等输出我想要的任何类型的html标签。
我现在的问题是我需要插入例如一个而不是使用writer.startElement。我可以通过执行getChildren()来完成此操作.add(HtmlCommandButton button = new HtmlCommandButton());但是当我这样做时,我似乎无法输出我希望它们出现的组件,就像我可以使用write.startElement。
我是否有任何好的解决方案可以利用我自己的taglibrary中的richfaces标签,JSF标签和类似标签?简而言之,我真正想要做的就是在我的encodeBegin中:
writer.startElement("a4j:commandButton", myComponent);
writer.writeAttribite("action", "#{Handler.myAction}", null);
writer.endElement("a4j:commandButton");
先谢谢
答案 0 :(得分:3)
您无法按照自己的意愿使用 ResponseWriter 。我可以通过绑定属性(see this answer)或者通常创建控件的地方(在JSP中,在{中)来考虑如何以编程方式添加子控件的两种方法{3}})。
JSF组件有两种方式来包含其他控件:作为子项或命名facet。组件总是控制它们如何渲染它们的方面;如果他们要渲染他们的孩子,他们必须为tag class返回true。
这是未经测试的代码,但序列如下:
@Override
public boolean getRendersChildren() {
return true;
}
@Override
public void encodeBegin(FacesContext context)
throws IOException {
// should really delegate to a renderer, but this is only demo code
ResponseWriter writer = context.getResponseWriter();
writer.startElement("span", this);
String styleClass = getStyleClass();
writer
.writeAttribute("class", styleClass, "styleClass");
UIComponent headerComponent = getFacet("header");
if (headerComponent != null) {
headerComponent.encodeAll(context);
}
writer.startElement("hr", null);
}
@Override
public void encodeChildren(FacesContext context)
throws IOException {
ResponseWriter writer = context.getResponseWriter();
for (UIComponent kid : getChildren()) {
kid.encodeAll(context);
writer.startElement("br", null);
}
}
@Override
public void encodeEnd(FacesContext context)
throws IOException {
ResponseWriter writer = context.getResponseWriter();
writer.endElement("span");
}
答案 1 :(得分:1)
不是一个真正的答案,更多的猜测,但也许你可以扩展其中一个facelets控件?
或者,要么直接使用facelets - 这似乎正是你想要的,尽管我自己并没有使用它。或者你可以在你希望HTML出现的地方添加UIOutput控件,并将每个值设置为你想要出现的HTML - 这正是f:verbatim在幕后所做的,或者看起来似乎是源代码: - )