Упаковка файлов Facelets (шаблоны, включает в себя, композиты) в JAR
Можно ли поместить файлы JSF2 Facelets с общим содержимым в JAR, чтобы использовать его из других веб-приложений, например, внутри <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
и поддерживает в этом проекте, а затем создать 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>
В любом JAR-файле внутри WAR поместите XHTML-файлы в /META-INF/resources/
Получите доступ к нему через "http: //<домен>/<веб-корень>/
Сначала прочитайте здесь о разнице между войной и банкой в аналогичном вопросе.
Вам нужно будет создать файл EAR и собрать войны вместе.
Maven
Обратите внимание, что если вы используете Maven для создания JAR, вы должны использовать следующую папку для размещения ваших ресурсов:
src/main/resources/META-INF/resources/