当前位置: 首页 > 面试题库 >

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

冯宏浚
2023-03-14
问题内容

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

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

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

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

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

我宁愿避免强迫模块开发人员尽可能采用繁重的UIComponent方法,这意味着采用动态方式执行ui:include(或某些等效方式)或采用动态方式调用CC。(如果这样做会使模块开发人员的工作变得更轻松,那么我不介意在应用程序中编码UIComponent方法ONCE)

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


问题答案:

我了解您的问题基本上可以归结为 如何在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;
    }

}

在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.xhtmlrandom.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资源解析中存在错误。



 类似资料:
  • 问题内容: 我一直在寻找创建模块化Web应用程序的解决方案,该模块是模块化的,即用户可以以简单jar的形式提供自己的插件,然后将其自身的数据提供给我的Web应用程序,而我的webapp将负责用于显示它。 现在的问题是,我希望我的Web应用程序尽可能通用,而不依赖于j2ee Web容器来支持任何内容。即,我不能依靠我的Web容器来提供osgi支持并将Web应用程序作为osgi捆绑包本身部署(这确实使

  • 我试图为我的java fx应用程序创建一个安装程序,但它不起作用。我第一次用的是罐子。安装程序已创建,但应用程序未启动。我认为这是非模块化应用的方法。我尝试了模块化的应用方式:,但它回答说模块不存在,我尝试了在没有eurogogrip/的情况下为模块编写不同的代码。。。。。和类型化java——列出模块。我的模块根本不存在。如何部署模块化应用程序? 这是我的模块信息。JAVA } 非常感谢。

  • 我试图使我的Java应用程序模块化,这样就会有一个核心的基础模块,一个客户端将不得不aqcuire,但他/她将能够添加额外的功能/插件,因为他们出现了,或者她的需求扩展。 我计划在客户端pc中有一个名为modules/plugins的子目录,任何插件应用程序都将作为一个目录包含在内。jar文件。当用户启动应用程序时,主模块将在最后一项中包含这些其他插件,例如,一个舞台将在同一场景中包含来自主模块和

  • 问题内容: 我正在使用将Spring用于DI / bean管理的超大型JSF / Facelets应用程序。我的应用程序具有模块化结构,我目前正在寻找使模块化标准化的方法。 我的目标是由许多模块(可能相互依赖)组成一个Web应用程序。每个模块可能包含以下内容: 类; 静态资源(图像,CSS,脚本); Facelet模板; 托管Bean-具有请求,会话和应用程序范围的Bean的Spring应用程序上

  • 我有这个问题 我的 我的 在中创建新的React应用程序。 警告您正在使用不支持的节点"13.0.0-夜间20190802452b393c1f",可能会遇到错误或意外行为。纱线支持以下范围:"^4.8.0||^5.7.0||^6.2.2|| 纱线添加v1。17.3警告您正在使用的节点“13.0.0-nightly20190802452b393c1f”不受支持,可能会遇到错误或意外行为。纱线支持以下

  • 使用npx create react应用程序创建新的react项目时,该过程停止并出现错误:内部/modules/cjs/loader。js:311。 内部/模块/cjs/loader.js:311抛出err;^错误:找不到模块'C:\用户\shonm\桌面\Web开发\WebSites\test1\node_modules\fs-额外\lib\index.js'。请验证package.json是