Как создать модульное приложение JSF 2.0?

У меня есть приложение с четко определенным интерфейсом. Он использует CDI для разрешения модhive, (в частности, он использует Instance точки впрыска на интерфейсах API для разрешения модулей) и без проблем передает различные данные назад и четвертый через интерфейсы. Я намеренно сохранил API и реализацию отдельно, и модули только наследуют от API, чтобы избежать жесткой связи, и приложение знает только о модулях через ожидания выполнения, а передача данных выполняется через API. Приложение отлично работает без модулей, которые можно добавить просто, отбросив банку в папку WEB-INF / lib и перезапустив сервер приложений.

Там, где я сталкиваюсь с проблемами, я хочу, чтобы модули создавали часть представления, и поэтому я хочу использовать переносимый компонент как компонент JSF, так и включить его из модуля, чтобы иметь его сделать вид. Я уже решил, какой модуль я хочу вызывать, и у вас есть ссылки на интерфейс модуля. То, как я изначально думал сделать это, было сделать ui: include, который просит модуль предоставить, где находится шаблон представления, но я понятия не имею, как ответить на этот запрос значимым образом, поскольку разрешение представления выполняется из приложения root, а не корень библиотеки.

Резюме состоит в том, что я понятия не имею, как перераспределить пробел от приложения к библиотеке, используя JSF для файлов .xhtml (template / component).

Использование CC было бы неплохо, но как я могу указать, что я хочу, чтобы конкретный экземпляр CC во время выполнения, вместо того, чтобы иметь жесткую кодировку на странице?

Я могу, конечно, напрямую вызвать код приложения и запросить его для разметки, но это кажется действительно грубой силой, и как только у меня есть разметка, я не уверен точно, как рассказать JSF о ее оценке. Тем не менее, я могу представить себе компонент, который будет использовать путь к ресурсам, захватить разметку и оценить ее, возвращая завершенную разметку, я просто не знаю, как ее реализовать.

Я бы предпочел избегать принуждения разработчиков модhive к возможности использования UIComponent с большой нагрузкой, если это возможно, что означает либо динамический способ выполнения ui: include (или некоторый эквивалент), либо динамический способ вызова CC. (Я не против кодирования UIComponent подхода ONCE в приложении, если это то, что нужно, чтобы облегчить жизнь разработчиков модhive)

Любые предложения о том, где я должен посмотреть, чтобы понять это? (Я отправлю ответ здесь, если найду его первым)

Я понимаю, что ваш вопрос в основном сводится к тому, как я могу включить представления Facelets в JAR?

Вы можете сделать это, разместив в JAR собственный ResourceResolver .

 public class FaceletsResourceResolver extends ResourceResolver { private ResourceResolver parent; private String basePath; public FaceletsResourceResolver(ResourceResolver parent) { this.parent = parent; this.basePath = "/META-INF/resources"; // TODO: Make configureable? } @Override public URL resolveUrl(String path) { URL url = parent.resolveUrl(path); // Resolves from WAR. if (url == null) { url = getClass().getResource(basePath + path); // Resolves from JAR. } return url; } } 

Настройте это в web.xml webapp следующим образом:

  javax.faces.FACELETS_RESOURCE_RESOLVER com.example.FaceletsResourceResolver  

Представьте, что у вас есть /META-INF/resources/foo/bar.xhtml в /META-INF/resources/foo/bar.xhtml , тогда вы можете просто включить его обычным способом

  

или даже динамически

  

Примечание. Начиная с версии Servlet 3.0 и более новых версий JBoss / JSF 2.0 весь подход ResourceResolver не требуется, если вы храните файлы в папке /META-INF/resources . Вышеупомянутый ResourceResolver является обязательным только для версий Servlet 2.5 или старше JBoss / JSF, поскольку они имеют ошибки в разрешении ресурсов META-INF .

Смотрите также:

  • Упаковка файлов Facelets (шаблоны, включая, композиты) в JAR
  • Упаковка шаблонов JSF

Я искал информацию по той же теме и наткнулся на эту ссылку: How-to: Модульные приложения Java EE с CDI и PrettyFaces, которые отлично работали для меня.

Кстати, вы можете избежать реализации своего собственного распознавателя ресурсов, когда вы используете припой для шва (в настоящее время интегрированный в apache deltaspike), который является действительно полезной библиотекой, дополняющей CDI (ваша типичная модель Java EE 6)

Я тоже экспериментировал с модулями в приложениях jsf. В основном я построил интерфейс шаблона с панелью инструментов, которая заполняется кнопками, предоставляемыми каждым модулем. Как правило, вы сделаете это, предоставив список строк как именованный объект:

 @Produces @SomethingScoped @Named("topMenuItems") public List getTopMenuItems(){ return Arrays.asList("/button1.xhtml", "/button2.xhtml", "/button3.xhtml"); } 

Обратите внимание, как каждая из кнопок может поступать из другого модуля приложения jsf. Интерфейс шаблона содержит панель, в которой

вы можете использовать его в своей разметке следующим образом (на свой страх и риск;)):

 .... xmlns:c="http://java.sun.com/jsp/jstl/core" xmlns:ui="http://java.sun.com/jsf/facelets" ....           

Это была панель инструментов и панель содержимого.

простая кнопка или определение представления могут выглядеть так:

    

позволяет называть этот артефакт view1.xhtml

Когда эта кнопка нажата (которая не вызывает обратную передачу с помощью actionListener, мы хотим перезагрузить контент с помощью ajax), switchContentMethod в вашем controllerе может изменить строку, возвращаемую getContentPath:

 public void switchContent(){ contentPath = "/view1.xhtml"; } @Produces @SomethingScoped @Named("contentPath") public String getContentPath(){ return contentPath; } 

теперь вы можете изменить представление, отображаемое на панели, с помощью кнопки в строке меню, которая дает вам навигацию без перезагрузки страницы.

Некоторые советы (или «что я узнал»):

  1. Вы можете выбрать большую область для метода getTopMenuItems
  2. Не вставляйте тег ui: include. К сожалению, это невозможно (например, ваш view1.xhtml не может содержать другую композицию). Мне действительно хотелось бы, чтобы подобное было возможно, поскольку вы можете создавать действительно модульные jsf-представления с этим, вроде портлетов, только без портлетов. = D
  3. делать ui: включить в компоненты контейнера, такие как tabviews, также оказывается проблематичным.
  4. обычно не рекомендуется смешивать JSTL (c: forEach) и JSF. Тем не менее, я нашел, что это единственный способ работать как ui: repeat получает оценку слишком поздно, например, ваш включенный контент не появляется.
Давайте будем гением компьютера.