【问题标题】:How to programmatically generate JSF components at run time?如何在运行时以编程方式生成 JSF 组件?
【发布时间】:2013-03-31 04:33:46
【问题描述】:

我必须创建屏幕以在视图中显示大量 JPA 实体。创建一个 facelet 并将一组字段传递给它会很棒,例如List<Object>

facelet/自定义组件需要将列表中的每个元素转换为适当的标签以进行显示,例如h:selectOneMenu 的枚举字段,h:inputText 的字符串字段等。这需要在运行时完成。

最简单的方法是什么?

【问题讨论】:

    标签: jsf jsf-2


    【解决方案1】:

    之前参与过一个从存储的配置动态创建整个页面的项目。你需要两个基本的东西

    • BackingBean。您将使用它来访问 facelet 上的 UIComponent,该 UIComponent 将充当生成的 UIComponents 的父级。类似于 panelGroup 的东西。但是,您需要将 UIComponent 绑定到支持 bean,以便拥有一个父级,您将针对该父级添加动态创建的 UIComponents
    • 访问应用程序组件。通常是 FacesContext.getApplication() (我在 JavaEE 5 中处理过这个问题,所以它看起来可能与注入有点不同)。拥有 Application 组件后,调用 createComponent 方法,传入您要创建的组件类型。

    然后它变成动态创建组件、在代码中配置它们并将它们添加到通过绑定 bean 定义的父 UIComponent 的活动。这可能很棘手,但可以做到。

    【讨论】:

    • 哇!凉爽的!在服务器端的项目中,我使用了 org.primefaces.component.toolbar.Toolbar 并向其中添加了 UIComponent 子项。在 facelet 中,我做了<p:toolBar binding="#{primeFacesMenuBuilder.toolbar}"/>,瞧,它在运行时生成了整个工具栏。在这种情况下,工具栏是为每个用户唯一生成的,这真是太好了。在 facelet 的一个标签中,p:toolbar 做到了。在您描述 facelet 中的样子的场景中,例如我会将根 UIComponent 绑定到什么标签?
    • 我认为它看起来与您所描述的非常相似。您可能会在 facelet 本身中使用 h:panelGroup,或者类似的东西将成为父容器 UIComponent。使用 binding 属性将其绑定与工具栏示例中描述的完全相同。框架将创建 UIComponent,您将在 backingBean 中引用它。一旦你有了它,你就可以向它添加子 UIComponents,它们是通过编程创建的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-29
    • 2014-08-10
    相关资源
    最近更新 更多