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

Как всегда, я немного смущен.

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

Единственная проблема: я не могу заставить ее работать. Я просто развертываю "page.xhtml" во всех вариантах (каталог META-INF, каталог ресурсов, root, с и без faces-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 разрешается с нового сервлета 3.0. Если вы еще не на Servlet 3.x или хотите поместить эти JAR в другое место по какой-либо причине, вам нужно будет создать пользовательский ResourceResolver. См. Также Как создать модульное приложение JSF 2.0?

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


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

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

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