在 JAR 中打包 Facelets 文件(模板、包含、组合)

Posted

技术标签:

【中文标题】在 JAR 中打包 Facelets 文件(模板、包含、组合)【英文标题】:Packaging Facelets files (templates, includes, composites) in a JAR 【发布时间】:2019-12-27 02:49:18 【问题描述】:

是否可以将具有公共内容的 JSF2 Facelets 文件放入 JAR 中,以便在内部的其他 Web 应用程序中使用它,例如<ui:composition template><ui:include src><cc:implementation> 等等?如果是,我该如何实现?是否需要一些额外的配置?

【问题讨论】:

【参考方案1】:

您可以将公共资源放在JAR 的/META-INF/resources 文件夹中,该文件夹将被视为WAR 的/WEB-INF/resources 文件夹。

例如

CommonWebProject
 |-- META-INF
 |    |-- resources
 |    |    `-- common
 |    |         |-- css
 |    |         |    `-- some.css
 |    |         |-- js
 |    |         |    `-- some.js
 |    |         |-- images
 |    |         |    `-- some.png
 |    |         |-- components
 |    |         |    `-- somecomposite.xhtml
 |    |         |-- someinclude.xhtml
 |    |         `-- sometemplate.xhtml
 |    |-- faces-config.xml
 |    `-- MANIFEST.MF
 :

JAR 的资源如下所示:

<... xmlns:common="http://xmlns.jcp.org/jsf/composite/common/components">
<h:outputStylesheet library="common" name="css/some.css" />
<h:outputScript library="common" name="js/some.js" />
<h:graphicImage library="common" name="images/some.png" />
<common:somecomposite />
<ui:include src="/common/someinclude.xhtml" />
<ui:composition template="/common/sometemplate.xhtml" />
...

如果您还想触发 JSF2 注释扫描器,以便您可以将 @ManagedBean@FacesValidator@FacesConverter 和 consorts 也放入该项目中,那么创建一个 JSF2 兼容的 /META-INF/faces-config.xml 文件:

<?xml version="1.0" encoding="UTF-8"?>
<faces-config
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd"
    version="2.0">
</faces-config>

仅当资源由于某种原因不在/META-INF/resources 中,或者当您使用的不是 Servlet 3.0 而是 2.5,或者当您使用有错误的早期 JBoss/JSF 版本时,才需要使用 Facelets 资源解析器在 META-INF 资源解析中。具体示例参见How to create a modular JSF 2.0 application?。

【讨论】:

这种方法不适用于 JBoss 6 (Mojarra 2.0.1)。我已经在 Tomcat 7 和 Glassfish 4 上进行了测试,并且都可以正常工作。 JBoss 抛出此异常:java.io.FileNotFoundException org.apache.naming.resources.DirContextURLConnection.getInputStream(DirContextURLConnection.java:369) 令人印象深刻!现在就像一个魅力!非常感谢@BalusC。 嘿@BalusC 我应该将 JSF 和其他依赖项放在我的 maven jar 项目中吗?如何让 IDE 识别标签库和其他所有内容? 从 JSF 的角度来看,将整个 facelet 放入一个罐子中是否合适?我的意思是把整个网页的 xhtml 文件放在一个 faces-config 中并为其指定一个导航案例。因此,实际的网页不会被打包在战争档案中,而是在 jar 中。或者最好创建一个包含与页面相同的自定义标签然后使用它,这样网页将被打包在war中,但该网页的实际内容将在jar中(自定义标签) ?【参考方案2】:

是的,您可以扩展 com.sun.faces.facelets.impl.DefaultResourceResolver 以向 JSF 提供资源。

一个通用的解决方案如下:

在你的 pom.xml 中添加:

    <dependency>
        <groupId>com.intersult</groupId>
        <artifactId>jsf-desktop</artifactId>
        <version>1.1-SNAPSHOT</version>
    </dependency>

    <repository>
        <id>intersult-repo</id>
        <name>Intersult Repository</name>
        <url>https://intersult.com/svn/public/maven</url>
    </repository>

或者简单地将https://intersult.com/svn/public/maven/com/intersult/jsf-desktop/1.1-SNAPSHOT/jsf-desktop-1.1-SNAPSHOT.jar 添加到您的/WEB-INF/lib 文件夹中。

在你的 web.xml 中添加:

<context-param>
    <param-name>javax.faces.FACELETS_RESOURCE_RESOLVER</param-name>
    <param-value>com.intersult.jsf_desktop.util.ClassPathResourceResolver</param-value>
</context-param>

在 WAR 内的任何 JAR 中,将 XHTML-Files 放在 /META-INF/resources/

通过“http://///resource/”(例如http://localhost/faces/resource/test.xhtml)访问它,它将被渲染。

【讨论】:

【参考方案3】:

首先在此处阅读有关difference between war and jar 的类似问题。

您必须创建 EAR 文件并将战争打包在一起。

【讨论】:

好的,但我不明白的是:我可以将 .war 放在新 Web 应用程序的库文件夹中,并将 .war 中的网页包含到其他页面中吗?【参考方案4】:

Maven

请注意,如果您使用 Maven 创建 JAR,则应使用以下文件夹将资源放入:

src/main/resources/META-INF/resources/

【讨论】:

以上是关于在 JAR 中打包 Facelets 文件(模板、包含、组合)的主要内容,如果未能解决你的问题,请参考以下文章

SpringBoot.14.SpringBoot使用jsp模板打包成jar

SpringBoot.14.SpringBoot使用jsp模板打包成jar

SpringBoot.14.SpringBoot使用jsp模板打包成jar

SpringBoot.14.SpringBoot使用jsp模板打包成jar

Spring MVC 和 Facelets 等模板引擎

如何在Facelets模板中引用CSS / JS /图像资源?