是否可以将具有公共内容的 JSF2 Facelets 文件放入 JAR 中,以便在其他 Web 应用程序中使用它,例如<ui:composition template>
、<ui:include src>
、<cc:implementation>
等?如果是,我怎样才能做到这一点?是否需要一些额外的配置?
4 回答
您可以将公共资源放在/META-INF/resources
JAR 的文件夹中,该文件夹将被视为/WEB-INF/resources
WAR 的文件夹。
例如
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>
Facelets 资源解析器仅在资源/META-INF/resources
因某种原因不在时,或者当您使用的不是 Servlet 3.0 而是 2.5,或者当您使用的早期 JBoss/JSF 版本在 META-INF 资源解析中存在错误时才需要. 另请参阅如何创建模块化 JSF 2.0 应用程序?举一个具体的例子。
是的,您可以扩展 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/<file.xhtml> 下
通过 "http://<domain>/<web-root>/<jsf-servlet>/resource/<file.xhtml>" 访问它(例如http://localhost/faces/resource/test.xhtml)和它将被渲染。
首先在这里阅读类似问题中关于战争和罐子之间的区别。
您将必须创建 EAR 文件并将战争打包在一起。
马文
请注意,如果您使用 Maven 创建 JAR,则应使用以下文件夹将资源放入:
src/main/resources/META-INF/resources/