如何创建模块化 JSF 2.0 应用程序?

2023-11-23

我有一个具有明确定义的界面的应用程序。它使用 CDI 来解析模块(具体来说,它使用 API 接口上的 Instance 注入点来解析模块),并通过接口毫无问题地来回传递各种数据。我故意将 API 和实现分开,模块仅从 API 继承以避免紧密耦合,应用程序仅通过运行时依赖关系了解模块,并通过 API 完成数据传递。应用程序无需模块即可正常运行,只需将 jar 放入 WEB-INF/lib 文件夹并重新启动应用程序服务器即可添加模块。

我遇到的问题是我希望模块创建视图的一部分,因此我想以可移植的方式调用 JSF 组件,或者从模块中包含以获得它呈现其视图。我已经解决了我想要调用的模块,并且已经准备好对该模块接口的引用。我最初想到的方法是执行 ui:include ,要求模块提供视图模板的位置,但我不知道如何以有意义的方式回答该查询,因为视图解析是从应用程序完成的根,而不是库根。

执行摘要是,我不知道如何使用 JSF for .xhtml(模板/组件)文件从应用程序跳转到库。

使用 CC 会很好,但如何指定在运行时需要特定的 CC 实例,而不是将其硬编码到页面中?

我当然可以直接调用应用程序代码并要求它提供标记,但这看起来确实很暴力,而且一旦我有了标记,我不确定如何告诉 JSF 对其进行评估。也就是说,我可以想象一个组件将采用资源路径,获取标记并对其进行评估,返回完整的标记,我只是不知道如何实现它。

如果可能的话,我宁愿避免强迫模块开发人员采用重型 UIComponent 方法,这意味着要么采用动态方式执行 ui:include (或某种等效方式),要么采用动态方式调用 CC。 (我不介意在应用程序中编写一次 UIComponent 方法,如果这样可以让模块开发人员的生活更轻松)

关于我应该在哪里解决这个问题有什么建议吗? (如果我先找到答案,我会在这里发布答案)


我知道你的问题基本上可以归结为如何将 Facelets 视图包含在 JAR 中?

您可以通过放置自定义来做到这一点ResourceResolver在 JAR 中。

public class FaceletsResourceResolver extends ResourceResolver {

    private ResourceResolver parent;
    private String basePath;

    public FaceletsResourceResolver(ResourceResolver parent) {
        this.parent = parent;
        this.basePath = "/META-INF/resources"; // TODO: Make configureable?
    }

    @Override
    public URL resolveUrl(String path) {
        URL url = parent.resolveUrl(path); // Resolves from WAR.

        if (url == null) {
            url = getClass().getResource(basePath + path); // Resolves from JAR.
        }

        return url;
    }

}

在 webapp 中配置它web.xml如下:

<context-param>
    <param-name>javax.faces.FACELETS_RESOURCE_RESOLVER</param-name>
    <param-value>com.example.FaceletsResourceResolver</param-value>
</context-param>

想象一下你有一个/META-INF/resources/foo/bar.xhtml in random.jar,那么你可以按照通常的方式包含它

<ui:include src="/foo/bar.xhtml" />

甚至动态地

<ui:include src="#{bean.path}" />

注意:从 Servlet 3.0 和更新的 JBoss/JSF 2.0 版本开始,整个ResourceResolver如果您将文件保存在/META-INF/resources文件夹。以上ResourceResolver仅在 Servlet 2.5 或更早的 JBoss/JSF 版本中是强制性的,因为它们在META-INF资源解析。

也可以看看:

  • 将 Facelets 文件(模板、包含、复合)打包到 JAR 中
  • JSF Facelets 模板打包
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何创建模块化 JSF 2.0 应用程序? 的相关文章

随机推荐

  • Python:如何使用 DictReader 两次?

    这感觉像是一个非常基本的问题 但我在其他地方找不到任何提及 我是一个 Python 初学者 当我使用 DictReader 读取数据 然后使用字典时 我无法再次引用它 例如 使用以下代码 usr bin python import csv
  • 箱线图屏蔽数组

    如何仅对 MaskedArray 的非屏蔽值进行箱线图 我以为这会自动发生boxplot ma 但这似乎是对非屏蔽数组进行箱线图 我想你是对的 plt boxplot如果发送掩码数组 则忽略掩码 所以看起来你必须付出boxplot通过仅发送
  • 如何连接 React 键的字符串?

    我正在创建一个列表列表 并希望为每个元素添加一个唯一的键 当我使用 React Dev Tool 时 新键是 2016 10 football 为什么里面有逗号 当我想要 2016 10 football 时指定键的正确方法是什么 Reac
  • Flutter StreamBuilder 在初始化时调用两次

    StreamBuilder 总是被调用两次吗 一次用于初始数据 然后一次用于输入流 初始化下面的StreamBuilder可以看出build方法被调用了两次 第二次调用比第一次调用晚了 0 4 秒 流 内部版本 1566239814897
  • SASS 连接类名?

    我从中得到了一个 LESS 文件日期选择器插件并想将其转换为 SASS 但在 LESS 中 它连接了一个类名 如下所示 LESS dropdown inline Result dropdown inline 我在 SASS 中尝试了很多东西
  • 图像直方图的高斯混合模型

    我正在尝试根据像素强度值对 2D MR 图像的不同区域进行自动图像分割 第一步是在图像的直方图上实现高斯混合模型 我需要绘制从获得的结果高斯score samples方法到直方图上 我尝试按照答案中的代码进行操作 了解高斯混合模型 Howe
  • 如何将人造丝的 .par_iter() 与泛型向量一起使用?

    这是一个人为的例子 但我相信如果我能让这个工作正常 我可以将其应用到我的具体案例中 extern crate num extern crate rayon use rayon prelude use num Float fn sqrts
  • 如何自定义 ggpairs 中的行 [GGally]

    我有以下情节 使用此代码生成 library GGally data iris ggpairs iris 1 4 lower list continuous smooth params c colour blue diag list con
  • jQuery removeAttr('type') 不起作用

    我的问题很简单 button removeAttr type 在 firebug 上触发错误 type property can t be changed 我有两个问题 如何解决这个问题 是否有包含无法更改的属性列表的参考 Thanks E
  • 如何创建一个数组或字典,其值只能是 String、Int 和 Boolean? [复制]

    这个问题在这里已经有答案了 我有一个要求 我需要创建一个数组 其值只能是 String Int 或 boolean 如果我尝试添加 Double 或任何其他值类型 Swift 编译器应该会抱怨 protocol Elem extension
  • 查找某个点下方的所有窗口

    我想找到桌面上给定点下方的所有顶级窗口 桌面的子窗口 我找不到这方面的 API 我的情况是 我正在屏幕上拖动一个窗口 并希望将其放入另一个 已知 窗口中 我可以测试目标窗口的边界 但这并不能告诉我它是否被另一个 未知 窗口遮挡 使用Wind
  • Spring MVC 中的有序 RequestMapping

    我正在使用带注释的控制器开发 Spring MVC 项目 我感兴趣的一件事是关于顺序 RequestMapping待处理的指令 例如 我想要所有 green basic welcome要映射到GreenController welcome
  • move_uploaded_file 不起作用,没有错误

    我正在运行一个脚本 该脚本移动上传的文件move uploaded file 我已经这样做了数千次 但由于某种原因它不起作用 我已确认以下事项
  • 在 Linux 中使用 Chrome 通过 Selenium 运行 NaCl 辅助进程,不会出现沙箱错误

    我在 Linux 中通过 Selenium 使用 Chrome 时遇到以下错误 ERROR browser main loop cc 1512 Unable to open X display ERROR nacl helper linux
  • 在 IIS 重写规则中排除路径?

    我有一个将 URL 转换为小写的重写规则 我想排除一个文件夹 但不知道正则表达式 如何从下面的规则中排除 myfolder
  • 在 javascript 中的数组文字上调用 forEach 时出错[重复]

    这个问题在这里已经有答案了 当我使用 Node v6 9 2 运行此代码时会生成错误 var req foo bar forEach prop gt console log prop prop 错误是 TypeError Cannot re
  • 在android中从图库和相机捕获图像

    我首先知道这是一个重复的问题 但我在从画廊或相机捕获图像方面没有问题 我在虚拟项目上创建来检查我的代码 它工作正常 但是当我在我的项目中使用相同的代码时 即使我没有收到任何错误 它也不起作用 一旦我开始活动以获取结果 它就会被取消 但我仍然
  • 如何修复 1 字节 UTF-8 序列的无效字节 1

    我正在尝试使用 java 方法从数据库获取以下 xml 但出现错误 用于解析xml的代码 DocumentBuilderFactory dbf DocumentBuilderFactory newInstance DocumentBuild
  • 我什么时候应该使用一对一关系?

    抱歉这个菜鸟问题 但是是否确实需要与数据库中的表使用一对一关系 您可以在一张表中实现所有必需的字段 即使数据变得非常大 您也可以枚举您需要的列名SELECT声明而不是使用SELECT 你什么时候真正需要这种分离 1 到 0 1 超类和子类之
  • 如何创建模块化 JSF 2.0 应用程序?

    我有一个具有明确定义的界面的应用程序 它使用 CDI 来解析模块 具体来说 它使用 API 接口上的 Instance 注入点来解析模块 并通过接口毫无问题地来回传递各种数据 我故意将 API 和实现分开 模块仅从 API 继承以避免紧密耦