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

2022-09-01 17:17:39

我有一个具有明确定义的接口的应用程序。它使用CDI来解析模块(特别是它使用API接口上的实例<>注入点来解析模块),并通过接口将各种数据传递回去和第四个而不会出现问题。我特意将 API 和实现分开,模块仅从 API 继承以避免紧密耦合,并且应用程序仅通过运行时依赖项以及通过 API 完成的数据传递来了解模块。应用程序在没有模块的情况下运行良好,只需将jar放入WEB-INF / lib文件夹并重新启动应用程序服务器即可添加模块。

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

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

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

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

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

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


答案 1

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

您可以通过在 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;
    }

}

在 Web 应用中对此进行配置,如下所示:web.xml

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

想象一下,你有一个 in ,然后你可以用通常的方式包含它/META-INF/resources/foo/bar.xhtmlrandom.jar

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

甚至动态

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

注意:由于 Servlet 3.0 和更新的 JBoss/JSF 2.0 版本,如果将文件保存在文件夹中,则不需要整个方法。上述内容仅在 Servlet 2.5 或更早的 JBoss/JSF 版本中是必需的,因为它们在资源解析中存在错误。ResourceResolver/META-INF/resourcesResourceResolverMETA-INF

另请参阅:


答案 2

我正在寻找有关同一主题的信息,并遇到了这个链接:How-to:模块化Java EE应用程序与CDI和PrettyFaces,这对我来说非常有效。


推荐