以编程方式在支持 bean 中创建并添加复合组件

2023-12-25

我正在使用动态仪表板,用户可以根据需要固定和删除项目。现在我有一个问题,我想将现有的复合组件从支持 bean 添加到视图中。我试图从互联网上找到正确的方法来做到这一点,但到目前为止还没有成功。这是我要添加的简单复合组件:

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:cc="http://java.sun.com/jsf/composite"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:p="http://primefaces.org/ui"
      xmlns:composite="http://java.sun.com/jsf/composite">
    <!-- INTERFACE -->
    <cc:interface>

    </cc:interface>

    <!-- IMPLEMENTATION -->
    <cc:implementation>
        <h:outputText value="TEST"/>
    </cc:implementation>
</html>

这是应该返回复合组件的代码:

public static UIComponent getCompositeComponent(String xhtml, String namespace) {
    FacesContext fc = FacesContext.getCurrentInstance();
    Application app = fc.getApplication();
    Resource componentResource = app.getResourceHandler().createResource(xhtml, namespace);

    UIPanel facet = (UIPanel) app.createComponent(UIPanel.COMPONENT_TYPE);
    facet.setRendererType("javax.faces.Group");
    UIComponent composite = app.createComponent(fc, componentResource);
    composite.getFacets().put(UIComponent.COMPOSITE_FACET_NAME, facet);

    return composite;
}

这是我使用该函数的方式:

Column column = new Column();
UIComponent test = HtmlUtil.getCompositeComponent("test.xhtml", "comp");
column.getChildren().add(test);

但列内没有呈现任何内容。有什么想法可以做到这一点吗?我不想采用 render="#{bean.is This Rendered}" 方式,因为它不适合我的用例。


这段代码不完整。你需要使用FaceletContext#includeFacelet() http://docs.oracle.com/javaee/6/api/javax/faces/view/facelets/FaceletContext.html#includeFacelet%28javax.faces.component.UIComponent,%20java.net.URL%29然后将复合组件资源包含在复合组件实现中。这是完成这项工作的实用方法。父母在场很重要,因为这是孩子成长的环境。#{cc}应该在 EL 范围内创建。因此,此实用程序方法还会立即将组合添加为给定父级的子级。此外,为复合组件提供固定的 ID 很重要,否则 JSF 将无法处理复合内部的任何表单/输入/命令组件。

public static void includeCompositeComponent(UIComponent parent, String libraryName, String resourceName, String id) {
    // Prepare.
    FacesContext context = FacesContext.getCurrentInstance();
    Application application = context.getApplication();
    FaceletContext faceletContext = (FaceletContext) context.getAttributes().get(FaceletContext.FACELET_CONTEXT_KEY);

    // This basically creates <ui:component> based on <composite:interface>.
    Resource resource = application.getResourceHandler().createResource(resourceName, libraryName);
    UIComponent composite = application.createComponent(context, resource);
    composite.setId(id); // Mandatory for the case composite is part of UIForm! Otherwise JSF can't find inputs.

    // This basically creates <composite:implementation>.
    UIComponent implementation = application.createComponent(UIPanel.COMPONENT_TYPE);
    implementation.setRendererType("javax.faces.Group");
    composite.getFacets().put(UIComponent.COMPOSITE_FACET_NAME, implementation);

    // Now include the composite component file in the given parent.
    parent.getChildren().add(composite);
    parent.pushComponentToEL(context, composite); // This makes #{cc} available.
    try {
        faceletContext.includeFacelet(implementation, resource.getURL());
    } catch (IOException e) {
        throw new FacesException(e);
    } finally {
        parent.popComponentFromEL(context);
    }
}

因此,在您的特定示例中,请按如下方式使用它:

includeCompositeComponent(column, "comp", "test.xhtml", "someUniqueId");
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

以编程方式在支持 bean 中创建并添加复合组件 的相关文章

随机推荐

  • SWT ExpandListener 在 Linux 上发生崩溃之前执行

    这是一个显示问题的简单可执行代码片段 使用 ExpandBar 时 期望的结果是在折叠或展开时调整窗口大小 它在 Mac 上可以正常工作 但在 Linux 上却不能 它看起来像扩展监听器在折叠 展开实际发生之前调用 因此pack 调整大小不
  • 当我更新时,Recyclerview 位置更改为第一个位置

    我在用onLoadMoreListener当我滚动时RecyclerView 它将更新RecyclerView滚动到底部时的数据 更新后Recyclerview数据 这Recyclerview返回顶部 理想情况下 我想保留在Recycler
  • 类型不匹配:无法从 String 转换为 R.string

    我是新人 所以请原谅我的原始问题 我真的不明白 我只是在做教程时在我的主要活动中创建这个数组 但出现错误 package com TaskReminder import android R string import android app
  • 使用 Haxe 将参数传递给延迟函数

    你知道是否有一种简单的方法可以将一些参数传递给通过调用的函数 haxe Timer delay func delay 我所说的 简单 是指无需创建任何自定义计时器 您可以使用bind https haxe org manual lf fun
  • 本地主机 - 您的浏览器已阻止或不支持 Cookie [关闭]

    Closed 这个问题是与编程或软件开发无关 help closed questions 目前不接受答案 我刚刚在我的本地主机上设置了这个多站点 WordPress 它由一个域 local example com 和 2 个子域 local
  • 引用第 3 方程序集的最佳实践

    我一直想知道引用第 3 方程序集时的最佳实践是什么 前段时间我问了一个问题 依赖关系和引用 我到底应该引用什么 https stackoverflow com questions 268214 dependencies and refere
  • @Entity 不同数据库上表之间的关系

    我是 Java Enterprise 和 JPA 的新手 使用 Netbeans 的 EclipseLink JPA 2 0 我试图实现不同项目和包中不同 Entity 类之间的链接 但没有成功 数据库 D1 具有表 T1 和引用数据库 D
  • 为什么这个函数会占用大量内存?

    我正在尝试将 1 4 亿位的二进制向量解压到列表中 我正在检查这个函数的内存使用情况 但看起来很奇怪 内存使用量上升至 35GB GB 而不是 MB 如何减少内存使用 sub bin2list This sub translates a b
  • signal() 覆盖其他信号处理程序

    是否signal 函数会覆盖进程可能设置的其他信号调用吗 IE 如果一个SIGINT处理程序已由进程设置 并且 DLL 调用signal SIGINT xxx 处理自己的终止代码 原来的SIGINT处理程序被禁用 The signal ca
  • 时间戳和计算滑动速度

    嘿 我知道已经有一些关于此的帖子 但我仍然找不到针对我遇到的问题的充分答案 我刚刚接触 cocoa 和 iOS 正在开发我的第一个 iOS 游戏 在这个游戏中 我希望能够计算用户滑动的速度 我可以轻松找到滑动动作中连续触摸之间的距离 但很难
  • 如何在 Eclipse 中针对特定文件禁用编译器警告? [复制]

    这个问题在这里已经有答案了 在我的 Eclipse 项目中 有一些生成的 java 文件 我需要将它们用于 SQLJ 并且我无法移动到单独的项目 由于管理开销 这些文件也会定期重新生成 因此不幸的是无法编辑它们 不幸的是 这些文件生成了数百
  • 是否有记录的 Android 版本接收安全更新的生命周期?

    Android 版本是否有官方生命周期来说明每月哪些版本会收到安全补丁 如果你看最新安全公告 https source android com security bulletin 2020 09 01看来 8 0 仍在接收补丁 但我想知道这
  • 具有嵌套条件行为的奇怪工具栏

    我遇到了一个非常奇怪的问题 如果你有一个很深的链ViewBuilder和 if 语句以及工具栏 工具栏中的某些项目是重复的 这是一张图片来说明我的意思 注意 2 个 按我 按钮 重现 注意 我使用的是 macOS Monterey Beta
  • 我的网站上需要有图标吗?如何消除我在 apache 日志中看到的错误?

    我不断在我的 apache 日志中看到 favicon 警告 我该如何摆脱这些 我的网站必须有图标吗 favicon ico是浏览器黑暗时代的产物之一 cca 2000 虽然无法阻止浏览器请求 但创建名为 favicon ico 的 0 字
  • 使用 ng-if 作为 ng-repeat 内部的开关?

    我正在开发 Angular 应用程序 我尝试使用 ng if 并在里面切换NG 重复但没有成功 我有这样的数据 id 52fb84fac6b93c152d8b4569 post id 52fb84fac6b93c152d8b4567 use
  • 在核心 MVC 中是否有任何充分的理由不使用 ViewComponent 而不是 Partial View?

    我是 MVC 新手 决定从 net core 开始 所以我对 core 与旧版本的差异不太了解 我确实找到了下面的问题 它提供了一些见解 但并没有帮助我决定是否可以基本上忽略部分视图 为什么我们应该使用 MVC 6 功能视图组件而不是部分视
  • Silverlight 中的 FrameworkPropertyMetadataOptions

    Silverlight 5 中是否有与 FrameworkPropertyMetadataOptions 等效的工具 我希望能够从我的用户控件强制进行双向绑定 如下所示 public static readonly DependencyPr
  • 从一个列表创建两个随机列表

    我想获取一个包含大约 12 个对象的字符串列表 并将其拆分为两个字符串列表 但将其完全随机化 列表示例 List 1 EXAMPLE 1 EXAMPLE 2 EXAMPLE 3 EXAMPLE 4 EXAMPLE 5 EXAMPLE 6 E
  • 使用 C 语言的套接字编程,使用 select() 函数

    根据我得到的答案这个线程 https stackoverflow com q 3366808 我创建了这个 Server sock init from SFL see http legacy imatix com html sfl time
  • 以编程方式在支持 bean 中创建并添加复合组件

    我正在使用动态仪表板 用户可以根据需要固定和删除项目 现在我有一个问题 我想将现有的复合组件从支持 bean 添加到视图中 我试图从互联网上找到正确的方法来做到这一点 但到目前为止还没有成功 这是我要添加的简单复合组件