jsf - Empaquetar archivos de Facelets(plantillas, inclusiones, composites) en un JAR
jsf-2 modularity (3)
¿Es posible colocar archivos JSF2 Facelets con contenido común en un JAR para usarlos desde otras aplicaciones web, por ejemplo, <ui:composition template>
, <ui:include src>
, <cc:implementation>
, etc.? Si es así, ¿cómo puedo lograr esto? ¿Es necesaria alguna configuración extra?
Primero lea aquí sobre la diferencia entre guerra y jarra en una pregunta similar.
Tendrás que crear un archivo EAR y unir las guerras.
Puede colocar recursos comunes en la carpeta /META-INF/resources
del JAR, que debe tratarse como la carpeta /WEB-INF/resources
del WAR.
P.ej
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
:
Los recursos del JAR están disponibles de la siguiente manera:
<... 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" />
...
Si también desea activar el analizador de anotaciones JSF2 para poder poner @FacesValidator
, @FacesConverter
, @FacesConverter
y consorts en ese proyecto, cree un archivo /META-INF/faces-config.xml compatible con /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>
El solucionador de recursos de Facelets solo es necesario si los recursos no están en /META-INF/resources
por alguna razón, o cuando no está utilizando Servlet 3.0 pero 2.5, o cuando está usando una versión anterior de JBoss / JSF que tiene errores en la resolución de recursos META-INF. Consulte también ¿Cómo crear una aplicación JSF 2.0 modular? Para un ejemplo concreto.
Sí, puede extender com.sun.faces.facelets.impl.DefaultResourceResolver para proporcionar recursos a JSF.
Una solución genérica es la siguiente:
En tu pom.xml agrega:
<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 simplemente agregue https://intersult.com/svn/public/maven/com/intersult/jsf-desktop/1.1-SNAPSHOT/jsf-desktop-1.1-SNAPSHOT.jar a su carpeta / WEB-INF / lib.
En tu web.xml agrega:
<context-param>
<param-name>javax.faces.FACELETS_RESOURCE_RESOLVER</param-name>
<param-value>com.intersult.jsf_desktop.util.ClassPathResourceResolver</param-value>
</context-param>
En cualquier JAR dentro de WAR, coloque los archivos XHTML en / META-INF / resources / <archivo.xhtml>
Acceda a él a través de "http: // <dominio> / <web-root> / <jsf-servlet> / resource / <file.xhtml>" (por ejemplo, http://localhost/faces/resource/test.xhtml ) y será rendido