从后台bean动态添加JSF 2组合组件

4

编辑后的问题...

你好,

我想从后端加载一个组合组件的 .xhtml 文件,并将其动态添加到页面中。该 .xhtml 文件的名称来自一个变量。

例如:

public MyBean (){

    String componentFile = "myCompositeComponent.xhtml"

    public String addComponentToPage(){

          //how do that?...

          return null;
    }

} 

谢谢!


2
简明扼要地说,这个问题没有任何意义。组合组件仅由XHTML组成,而不是Java代码。由于无法理解CCPageLoader的代码是什么样子的,因此无法猜测或理解您实际想表达的内容。除非您修正术语和/或提供一些代码以便更好地理解问题,否则此问题将保持未回答状态。 - BalusC
嗨,BalusC,我想做的是:加载组合组件的xhtml文件并将其添加到页面中。这需要通过页面的后备bean完成。感谢您的帮助。 - Fabio B.
2个回答

6
这是不可能的。组合组件是基于模板的,只能在视图中使用。你最好重复原来在组合组件中编写的JSF代码到模型中。更好的方法是创建一个完整的@FacesComponent类,该类扩展了UIComponent,并带有@FacesRenderer。确实,这是一项繁琐且晦涩的工作,但这样做可以让你得到一个组件,通过单个代码行即可在视图和模型中重用。
一个-丑陋的-替代方案是将所有可能的组件放置在视图中,并使用rendered属性。
<my:component1 rendered="#{bean.myComponentType == 'component1'}" />
<my:component2 rendered="#{bean.myComponentType == 'component2'}" />
<my:component3 rendered="#{bean.myComponentType == 'component3'}" />
...

如果需要,可以将其包装在Facelets标记文件中,以便可以隐藏并在多个位置重复使用。


非常感谢!我理解JSF中的组合组件与其他语言/框架(如.net的.ascx文件或Flex的.mxml)中的“组合组件”确实不同...我阅读了相关文章和文档,但这个方面并不够清晰。 - Fabio B.
@Tuukka:有趣。但这样做是hacky的,并没有由JSF API提供(因此只能在特定的JSF实现中使用)。 - BalusC
@FacesCompnent 中有拼写错误。 - RinaldoDev

0

我不明白为什么你想从后备bean中添加复合组件。我猜你想在事件发生时动态地使它可见,但是为此有AJAX reRender。

例如,您可以执行以下操作:

<h:panelGroup id="composite" rendered="#{myBean.renderComponent}">
    <my:compositecomponent/>
</h:panelGroup>

renderComponent属性存储一个布尔值。您可以切换该值并使用例如Richfaces的<a4j:commandLink>重新渲染composite

希望这有所帮助,Daniel


抱歉,我能够做到,但我不知道组件的名称,名称来自一个字符串变量... - Fabio B.
我认为你想做的与基本设计概念相违背。我认为你应该考虑另一种解决问题的方法。 - Daniel Szalay
2
很容易想到需要这样做的情况(从Java代码调用组合组件)。例如,考虑一个将构建长/复杂DOM结构的组件。通常,您会将其实现为组合组件,但在某些情况下,它们并不够灵活,因此您会采用扩展UIComponent并使用ResponseWriter的方式。然而,最好在UIComponent内部执行复杂逻辑,但仍然调用组合组件(模板)来实际构建(大部分)UI。遗憾的是,当您切换到Java代码时,您将被困在UIComponents中 :/ - Tuukka Mustonen

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