将复合组件迁移到自定义组件

6

我需要将一个复合组件迁移到自定义组件。这个例子相当简化,但是展示了问题:我的组件(my:test)的子元素需要在另一个组件中呈现。作为一个我不想使用的示例,复合组件my:testC会像这样:

<composite:implementation>
  <p:panel>
    <composite:insertChildren/>
  </p:panel>
</composite:implementation>

显然(至少我希望我的假设是正确的),我不能简单地在encodeBegin中呈现。
@FacesComponent("test")
public class Test extends UIPanel
{   
  @Override
  public void encodeBegin(FacesContext context) throws IOException
  {
    // ??
  }

  @Override
  public void encodeEnd(FacesContext context) throws IOException
  {
   // ??
  }
}

我想要这样使用my:test

<my:test>
  <h:outputText value="some Text"/>
</my:test>

输出应与使用my:testC相同:在PrimeFaces面板中呈现一些文本。我该如何在我的Java类中编码对p:panel的使用?

我不明白具体的问题/问题(实际上,没有具体的问题)。您是否具体询问如何在自定义组件中编码与<p:panel>相同的输出?还是您具体询问如何重用<p:panel>的默认编码器(渲染器)来完成该部分?子项根本不是问题,因为encodeChildren()会自动完成所有操作,但是第一段的最后一句话似乎表明情况并非如此,这很令人困惑。 - BalusC
@BalusC 感谢您关注此问题。我已经更新了问题,希望现在更容易理解了。回答你的问题:我正在尝试编码与 p:panel 相同的输出。 - Thor
1个回答

0

你的观察是正确的。你不能简单地在自定义组件中呈现“p:panel”或任何其他jsf标记。

但你可以做以下事情:

  • 使用Application实例实例化子组件,将其作为facet或child添加到自定义组件中,然后在自己的渲染器中调用encode。

  • 直接呈现HTML

  • 使用facelet API(应该在当前JSF中可用,但我从未真正使用过)

  • 使用任何其他模板处理,如velocity或freemarker来呈现HTML。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接