Упаковка шаблонов JSF

Как всегда, я немного запутался.

Здесь https://community.jboss.org/wiki/ModularWebAppsWithJSF2 я узнал, что это легко и работает из коробки, чтобы связать шаблоны в отдельные банки, начиная с JSF 2.0.

Единственная проблема: я не могу заставить его работать. Я просто развертываю "page.xhtml" во всех версиях (каталог META-INF, каталог ресурсов, root, с и без лиц face-config.xml) в банке, которая включена в веб-приложение WEB-INF/lib, и запрашиваю что-то как http://host/demo/faces/page.xhtml или сделать "включить" или "украсить" в шаблоне. Я получаю исключение.

Здесь Java EE6> Упаковка фасетов JSF (xhtml) и ManagedBeans в качестве JAR, мой любимый учитель JSF объясняет, как использовать собственный ResourceResolver для выполнения именно этого. Поскольку я отлаживал разрешение ресурса, я не сомневаюсь, что это сработает и попробует.

Это вопрос о механике - в чем разница между двумя подходами?

Какие именно ресурсы ищутся в META-INF/resources автоматически?

1 ответ

Решение

Facelets композиции (так что, просто *.xhtml страницы, шаблоны и включаемые файлы) разрешаются ExternalContext#getResource() который делегирует ServletContext#getResource(), Для этого требуется Servlet 3.x совместимый контейнер, потому что /WEB-INF/lib/*.jar!/META-INF/resources Разрешение от является новым с Servlet 3.0. Если вы еще не используете Servlet 3.x или по какой-то причине хотите поместить эти JAR-файлы в другое место, вам нужно создать пользовательский ResourceResolver, См. Также Как создать модульное приложение JSF 2.0?

Композитные компоненты Facelets и статические ресурсы (так, <cc:xxx> компоненты и ресурсы CSS/JS/ изображения, которые должны быть загружены <h:outputStylesheet>, <h:outputScript> а также <h:graphicImage>) разрешены из пути к классам ClassLoader#getResource(), Чтобы включить файл JAR в проверку пути к классам JSF, вам необходимо включить JSF 2.x-совместимый faces-config.xml файл в /META-INF папка файла JAR. Та же история относится к @ManagedBean, @FacesValidator, @FacesConverter, @FacesComponent и другие артефакты JSF.


При разработке в Eclipse вы можете выбрать " Веб"> "Проект веб-фрагмента", чтобы создать такой проект модуля. Он не сильно отличается от обычного Java-проекта, ожидайте, что он будет неявно включать фасет JavaScript и целевую среду выполнения, автоматически создавать /META-INF/web-fragment.xml файл и связать его с существующим динамическим веб-проектом, добавив себя в качестве сборки развертывания в этот проект.

Вы также можете использовать существующий стандартный проект Java с подготовленной правильной структурой папок. /META-INF папка должна идти в исходной папке Java. web-fragment.xml Файл, кстати, не является обязательным. Вам просто нужно вручную добавить проект Java в раздел " Сборка развертывания " основных свойств веб-проекта. Не добавляйте его как другой проект в раздел пути проекта.

При создании (вручную) файла JAR из него необходимо убедиться, что записи каталога добавлены в JAR, в противном случае композиции Facelets не могут быть разрешены. Если вы собираете с помощью инструментов сборки, таких как Eclipse/Ant/Maven/ и т. Д., Это также необходимо учитывать. Если это не контролируется, пользовательский ResourceResolver это самый надежный подход.

Другие вопросы по тегам