如何将现有的JSF组件添加到我自己的自定义组件中?

时间:2009-03-17 13:35:49

标签: jsf taglib uicomponents

我有一个扩展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");

先谢谢

2 个答案:

答案 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在幕后所做的,或者看起来似乎是源代码: - )