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

我现在的问题是我需要插入例如 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");

提前致谢

有帮助吗?

解决方案

您不能使用 响应编写器 如你所愿。我可以想到如何以编程方式添加子控件的两种方法是通过 捆绑 属性 (看到这个答案)或者在通常创建控件的地方(在 JSP 中,即在 标签类).

JSF 组件包含其他控件有两种方法:作为孩子或命名的方面。组件始终控制它们渲染面的方式;如果他们要交出他们的孩子,他们必须返回 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");
  }

其他提示

不是一个真正的答案,更多的是猜测,但也许你可以延长Facelets的控制呢?

另外,无论是直接使用Facelets的 - 这似乎是你想要什么真的,虽然我没有用它自己。或者你可以添加UIOutput控制你想要的HTML显示并设置每个到要出现在HTML的价值 - 这正是F:引擎盖下逐字做,或因此从查看源代码看起来: - )

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top