È possibile mettere file JSF2 Facelets con contenuto comune in un JAR per utilizzarlo da altre applicazioni Web all'interno ad es. <ui:composition template>
, <ui:include src>
, <cc:implementation>
, ecc.? Se sì, come posso ottenere questo? È necessaria qualche configurazione aggiuntiva?File Facelets di imballaggio (modelli, include, materiali compositi) in un JAR
risposta
È possibile inserire risorse comuni nella cartella /META-INF/resources
del JAR che deve essere trattata come cartella /WEB-INF/resources
di WAR.
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
:
Le risorse del JAR sono poi disponibili i seguenti:
<... 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" />
...
Se si desidera attivare lo scanner di annotazione JSF2 pure in modo che si può mettere @ManagedBean
, @FacesValidator
, @FacesConverter
e consorti in che progetto pure, quindi creare un JSF2 compatibile /META-INF/faces-config.xml
di file:
<?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>
La risorsa Facelets il resolver è necessario solo se le risorse non sono in /META-INF/resources
per qualche motivo, o quando non si utilizza Servlet 3.0 ma 2.5, o quando si utilizza una versione JBoss/JSF iniziale che presenta bug nella risoluzione delle risorse META-INF. Vedi anche How to create a modular JSF 2.0 application? per un esempio concreto.
Prima di leggere qui sullo difference between war and jar in una domanda simile.
Dovrai creare un file EAR e mettere insieme le guerre.
Sì, è possibile estendere com.sun.faces.facelets.impl.DefaultResourceResolver per fornire risorse a JSF.
Una soluzione generica è la seguente:
Nel vostro pom.xml aggiuntivo:
<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>
o semplicemente aggiungere https://intersult.com/svn/public/maven/com/intersult/jsf-desktop/1.1-SNAPSHOT/jsf-desktop-1.1-SNAPSHOT.jar alla vostra cartella WEB-INF// lib.
Nel vostro web.xml aggiuntivo:
<context-param>
<param-name>javax.faces.FACELETS_RESOURCE_RESOLVER</param-name>
<param-value>com.intersult.jsf_desktop.util.ClassPathResourceResolver</param-value>
</context-param>
In ogni JAR all'interno del luogo WAR XHTML-Files sotto/META-INF/risorse/<file.xhtml>
accedervi tramite "http : // <dominio>/< web-root >/< JSF-servlet >/risorse/<file.xhtml> "(ad es http://localhost/faces/resource/test.xhtml.) e si sarà reso.
Questo approccio non ha funzionato su JBoss 6 (Mojarra 2.0.1). Ho provato su Tomcat 7 e Glassfish 4, ed entrambi funzionavano. JBoss genera questa eccezione: 'java.io.FileNotFoundException \t org.apache.naming.resources.DirContextURLConnection.getInputStream (DirContextURLConnection.java: 369) ' –
@ Rafael: http://stackoverflow.com/a/6201044 – BalusC
Impressionante! Ora funziona come un fascino! Grazie mille @BalusC. –