2010-08-20 70 views
19

是否有可能将带有公共内容的JSF2 Facelets文件放入JAR中,以便将其从其他Web应用程序中使用,例如: <ui:composition template><ui:include src><cc:implementation>等?如果是的话,我怎么能做到这一点?是否需要一些额外的配置?在JAR中打包Facelets文件(模板,包含,合成)

回答

29

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

E.g.

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> 

的Facelets的资源如果由于某种原因资源不在/META-INF/resources中,或者当您没有使用Servlet 3.0,但是使用2.5,或者您使用的早期JBoss/JSF版本存在META-INF资源解析错误,则只需要解析器。有关具体示例,另请参阅How to create a modular JSF 2.0 application?

+0

这种方法还没有在JBoss 6(Mojarra 2.0.1)上工作。我已经测试了Tomcat 7和Glassfish 4,并且都在工作。 JBoss抛出这个异常:'java.io.FileNotFoundException \t org.apache.naming.resources.DirContextURLConnection.getInputStream(DirContextURLConnection。java:369)' – 2013-07-19 16:49:47

+1

@Rafael:http://stackoverflow.com/a/6201044 – BalusC 2013-07-19 16:53:16

+0

令人印象深刻!现在就像一个魅力!非常感谢你@BalusC。 – 2013-07-19 17:24:48

1

首先阅读有关difference between war and jar的相似问题。

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

+0

好的,但我不明白的是:我可以将.war放在新的Web应用程序的库文件夹中,并将.war中的网页包含到其他页面中? – Fabio 2010-08-23 14:31:11

+0

谢谢你的时间:) – Fabio 2010-08-23 14:31:49

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> 

在战争中发生的XHTML文件内的任何JAR下/ META-INF /资源/ <file.xhtml>

通过“访问它的HTTP :// <域>/< web的根>/< JSF-的servlet > /资源/ <file.xhtml>“(例如http://localhost/faces/resource/test.xhtml。),它会被渲染。