Динамические шаблоны в JSF

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

Проблема — У нас есть следующий шаблон — Layout.xhtml — содержит следующий макет —

<ui:insert name="header"></ui:insert>
<ui:insert name="body"></ui:insert>
<ui:insert name="footer"></ui:insert>

Ниже приведен пример файла (скажем, index.xhtml) —

<ui:composition template="/layout.xhtml">
   <ui:define name="header"><h1>Sample Header</h1></ui:define>
   <ui:define name="body"><ui:include src="/searchRecord.xhtml"></ui:define>
   <ui:define name="footer"><h3>Sample foorter</h3></ui:define>
</ui:compositio>

Проблема в том, что верхний и нижний колонтитулы будут одинаковыми для всех страниц, но тело будет другим. т.е. сначала при запуске приложения будет отображаться страница searchRecord. После того, как пользователь вводит информацию, данные должны отображаться. На этой странице, если пользователь нажимает выход, тело должно включать страницу выхода. Если нажать предыдущую, снова будет отображаться страница searchRecord.

Короче говоря, я ищу способы включить динамический <ui:include>. В противном случае мне нужно создать 3-4 страницы xhtml по одной для каждой операции.

Исследования –

Я рассмотрел пару вопросов -

‹ui:include› с динамическим источником... полное безумие

Динамический пользовательский интерфейс: включить

Но ничего, кажется, не решает мою проблему. Когда я использую следующим образом -

<ui:fragment rendered="#{bean.searchRecord}>
  <ui:include src="/searchRecord.xhtml">
</ui:fragment>
<ui:fragment rendered="#{bean.showDetails}>
  <ui:include src="/showdetails.xhtml">
</ui:fragment>
<ui:fragment rendered="#{bean.exit}">
  <ui:include src="/exit.xhtml">
</ui:fragment>

Во-первых, у меня были трудности с запуском первой страницы, так как bean-компонент не инициализирован. Я попытался решить эту проблему, используя <f:event type="preRenderComponent">, который инициализирует bean-компонент и устанавливает флаг. Это решило проблему запуска, и я правильно получаю страницу searchRecord. Но когда я сейчас нажимаю кнопку «Показать подробности», она либо остается на той же странице, либо переходит на страницу showDetails (с использованием метода postback()), подробности не отображаются (т.е. bean-компонент showDetails не вызывается).

Может ли кто-нибудь помочь мне реализовать динамическую компоновку, как указано выше?


person Akash    schedule 13.09.2017    source источник
comment
@BalusC. Спасибо, что указали на это. Я прошел через это. Часть ‹ui:fragment› выглядит так же, как я пытаюсь реализовать, но у меня есть проблемы, о которых я упоминал в последнем абзаце. Не могли бы вы сообщить мне, как решить эту проблему?   -  person Akash    schedule 13.09.2017
comment
Ответ уже говорит об использовании bean-компонента @ViewScoped.   -  person BalusC    schedule 13.09.2017