2010-08-20 68 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。),它會被渲染。