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

Spl*_*ity 25 java modular cdi jsf-2 jboss-weld

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

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

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

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

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

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

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

Bal*_*usC 33

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

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

}
Run Code Online (Sandbox Code Playgroud)

在webapp中配置web.xml如下:

<context-param>
    <param-name>javax.faces.FACELETS_RESOURCE_RESOLVER</param-name>
    <param-value>com.example.FaceletsResourceResolver</param-value>
</context-param>
Run Code Online (Sandbox Code Playgroud)

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

<ui:include src="/foo/bar.xhtml" />
Run Code Online (Sandbox Code Playgroud)

甚至是动态的

<ui:include src="#{bean.path}" />
Run Code Online (Sandbox Code Playgroud)

注意:自Servlet 3.0和更新的JBoss/JSF 2.0版本以来,ResourceResolver如果将文件保存在文件/META-INF/resources夹中,则不需要整个方法.以上ResourceResolver仅在Servlet 2.5或更旧的JBoss/JSF版本中是强制性的,因为它们在META-INF资源解析方面存在缺陷.

也可以看看:


小智 5

我一直在寻找关于同一主题的信息,并通过这一连接就来了:怎么到:模块化Java EE应用程序与CDI和PrettyFaces这工作真的很适合我.