5

我有一个扩展 UIComponent 和 UIOutput 的标记类。在这个类中,我有 encodeBegin 和 encodeEnd ,我可以使用我的 contextWriter 来输出任何我想要的 html 标签,方法是使用 writer.startElement("div", myComponent) 等等。

我现在的问题是我需要插入例如 a 而不是使用 writer.startElement。我可以通过 getChildren().add(HtmlCommandButton button = new HtmlCommandButton()); 但是当这样做时,我似乎无法输出我希望它们出现的组件,就像我可以使用 write.startElement 一样。

关于如何利用我自己的标签库中的richfaces标签、JSF标签和类似标签,有人有什么好的解决方案吗?简而言之,我真正想做的是在我的 encodeBegin 中:

writer.startElement("a4j:commandButton", myComponent);
writer.writeAttribite("action", "#{Handler.myAction}", null);
writer.endElement("a4j:commandButton");

提前致谢

4

2 回答 2

3

您不能随意使用ResponseWriter。我可以想到如何以编程方式添加子控件的两种方法是通过绑定属性(请参阅此答案)或在通常创建控件的位置(在 JSP 中,即在标记类中)。

JSF 组件包含其他控件有两种方式:作为子控件或作为命名方面。组件总是控制它们如何渲染它们的切面;如果他们要渲染他们的孩子,他们必须为getRendersChildren返回 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");
  }
于 2009-03-17T16:51:39.507 回答
1

不是真正的答案,更多的是猜测,但也许您可以扩展其中一个 facelets 控件?

或者,或者直接使用 facelets - 尽管我自己没有使用它,但这似乎正是你真正想要的。或者,您可以在希望 HTML 出现的位置添加 UIOutput 控件,并将每个控件的值设置为您希望出现的 HTML - 这正是 f:verbatim 在幕后所做的,或者从查看源代码看来:- )

于 2009-03-17T14:07:08.500 回答