【问题标题】:Adding JSF 2 composite component at runtime from backing bean在运行时从支持 bean 添加 JSF 2 复合组件
【发布时间】:2011-05-03 14:04:20
【问题描述】:

已编辑问题...

你好,

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

例如:

public MyBean (){

    String componentFile = "myCompositeComponent.xhtml"

    public String addComponentToPage(){

          //how do that?...

          return null;
    }

} 

谢谢!

【问题讨论】:

  • 直言不讳,这个问题毫无意义。 Composite components 仅存在于 XHTML 中,不存在于 Java 代码中。完全不清楚CCPageLoader 的代码是什么样的,因此无法猜测/理解您实际上的意思。在您修复术语和/或提供一些代码以便更好地理解该问题之前,该问题将一直没有答案。
  • 嗨BalusC,我想做的是:加载复合组件的xhtml文件并将其添加到页面中。这需要由页面的后台 bean 来完成。感谢您的帮助。

标签: jsf runtime loading composite-component


【解决方案1】:

不可能。复合组件是基于模板的,只能在视图中使用。最好的办法是完全重复您最初在模型的复合组件中编写的 JSF 代码。更好的做法是创建一个完整的 @FacesComponent 类,它扩展了 UIComponent,并带有 @FacesRenderer。诚然,这是一项乏味且不透明的工作,但通过这种方式,您最终会得到一个组件,该组件可通过单个代码行在视图和模型中重用。

一个 -ugly- 替代方法是将所有可能的组件放在视图中并使用 rendered 属性。

<my:component1 rendered="#{bean.myComponentType == 'component1'}" />
<my:component2 rendered="#{bean.myComponentType == 'component2'}" />
<my:component3 rendered="#{bean.myComponentType == 'component3'}" />
...

如有必要,将其包装在 Facelets 标记文件中,以便将其隐藏起来并在多个地方重复使用。

【讨论】:

  • 非常感谢!所以我可以理解 JSF 中的复合组件与 .ascx 文件 (.net) 或 .mxml (Flex) 等其他语言/框架中的“复合组件”确实不同......我阅读了有关这方面的文章和文档,但是这方面不够清楚。
  • 您检查过吗:forums.java.net/node/701640 用户“lexi”研究/描述了一些方法。尽管他遇到了困难,但他表示他想出了一个可行的解决方案(见倒数第二篇文章),不幸的是有点神秘。最后一条消息描述了另一个更简单的替代方案,也是 Ed Burns 建议的。但是,根据同一篇文章,它不起作用。对这些方法有什么想法吗?
  • @Tuukka:很有趣。但这是 hacky 并且不是由 JSF API 提供的(因此是特定于 JSF-impl 的)。
  • @FacesCompnent 中的错字
【解决方案2】:

我不明白您为什么要从支持 bean 添加复合组件。我猜你想让它在发生事件时动态可见,但为此有 AJAX reRender。

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

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

renderComponent 属性存储一个boolean 值。您可以切换该值并重新渲染composite,例如Richfaces 的&lt;a4j:commandLink&gt;

希望对您有所帮助,丹尼尔

【讨论】:

  • 对不起,我能做到,但是我不知道组件的名字,名字来自一个String变量...
  • 我认为你想做的事情违背了基本的设计理念。我认为您应该考虑另一种解决问题的方法。
  • 很容易想出您想要执行此操作的情况(从 Java 代码调用复合组件)。例如,考虑一个将构建长/复杂 DOM 结构的组件。通常,您会将其实现为复合组件,但在某些情况下它们不够灵活,因此您需要扩展 UIComponent 并使用 ResponseWriter。然而,在 UIComponent 内部执行复杂逻辑并调用复合组件(模板)来实际构建(大部分)UI 会更好。糟糕的是,当您切换到 Java 代码时,您会被 UIComponents 卡住:/
猜你喜欢
  • 2011-07-24
  • 2011-07-23
  • 2011-07-14
  • 2012-04-29
  • 2012-09-03
  • 2011-05-01
  • 2011-03-24
  • 2013-08-22
相关资源
最近更新 更多