将Facelets文件(模板,包含文件,组合文件)打包到JAR中

19

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

4个回答

33
你可以将常用的资源放在JAR文件的/META-INF/resources文件夹中,这样就可以像/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等注解,那么请创建一个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版本且存在META-INF资源解析错误时,Facelets资源解析器才是必需的。请参见如何创建模块化JSF 2.0应用程序?,以获取一个具体示例。


这种方法在 JBoss 6(Mojarra 2.0.1)上无法工作。我已经在 Tomcat 7 和 Glassfish 4 上进行了测试,两者都可以正常工作。JBoss 抛出以下异常:java.io.FileNotFoundException org.apache.naming.resources.DirContextURLConnection.getInputStream(DirContextURLConnection.java:369) - Rafael Orágio
太棒了!现在完美运行!非常感谢@BalusC。 - Rafael Orágio
嘿@BalusC,我应该将JSF和其他依赖项放在我的Maven Jar项目中吗?我如何使IDE识别taglibs和其他所有内容? - Fred
从JSF的角度来看,将整个面板放入jar文件中是否合适?我的意思是将整个网页xhtml文件放入其中,并在faces-config中指定一个导航案例。因此,实际的网页不会被打包在war存档中,而是打包在jar文件中。或者最好创建一个包含与页面相同内容的自定义标记,然后使用它,以便网页将被打包在war中,但该网页的实际内容将在jar文件中(自定义标记)? - St.Antario

4

是的,您可以扩展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文件放置在/META-INF/resources/下。
通过"http://///resource/"(例如 http://localhost/faces/resource/test.xhtml)访问它,它就会被呈现出来。

1

首先在类似问题中阅读war和jar的区别

您需要创建EAR文件并将wars打包在一起。


好的,但我不明白的是:我能把.war文件放在新Web应用程序的库文件夹中,并将.war中的网页包含到其他页面中吗? - Fabio B.

1

Maven

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接