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

Я написал этот вопрос:
https://stackru.com/questions/8589315/jsf2-dynamic-template

но BalusC и casperOne сказали, что я написал это плохо, поэтому я пытаюсь лучше объяснить мою проблему.
Как я уже писал, у меня есть проект в этой структуре:

  • в корне сети 3 xhtml страницы: индексировать, включать и приветствовать;
  • все остальные xhtml-страницы в подпапке в WEB-INF с именем jsf.

Я полагаю, что это хорошо, но я создаю все страницы с помощью мастера netbeans "Новые страницы JSF из классов сущностей...", и для использования этой структуры с этим мастером я не могу напрямую связать страницы HTML, сохраненные в jsf forlder, созданный мастером, и я создал файл include.xhtml и изменил все методы для перенаправления на эту страницу, как я объясню позже, файл include.xhtml содержит только этот код:

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml"
   xmlns:ui="http://java.sun.com/jsf/facelets"
   xmlns:f="http://java.sun.com/jsf/core"
   xmlns:h="http://java.sun.com/jsf/html">


   <h:head>
   </h:head>
   <h:body>
      Utente connesso:<h:outputText value="#{userBean.cognome}"/>

      <h:outputText value="#{userBean.nome}"/>
      <br/&gr;

      <ui:include src="#{logicBean.pageIncluded}"/>

   </h:body>
</html>

Как я уже сказал, я изменил все методы для вызова метода действия в LogicBean, который содержит setPageIncluded и возвращает "include.xhtml" примерно так:
PageController.java:

public void prepareList() {
    recreateModel();
    LogicBean l = (LogicBean) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("logicBean");
    l.action(url+"List.xhtml");
}

LogicBean.java:

public String action(String value) {
   setPageIncluded(value);
   return "include";
}

Теперь этот код работает довольно хорошо, и я могу переходить со всех страниц.
Есть только проблема, боб LogicBean хранится в сессии!
Это означает, что если я попытался открыть новые окна для навигации по другой части проекта в одно и то же время, я не смогу этого сделать, потому что LogicBean может содержать только одно значение pageInclude!

Я пытался использовать ViewScope, но или я не понимаю, как он работает, и в этом случае это бесполезно, или я что-то неправильно и он не работает должным образом!
Кто-нибудь может мне помочь?

Я нашел этот вопрос, который, кажется, может помочь мне: dynamic ui: include with el-expression?
но я не знаю, может ли это помочь и как изменить c:forEach и метод действий для его использования в моей ситуации!

Я надеюсь, что на этот раз я лучше объясню свою проблему и, если это так, я благодарю вас за помощь!

1 ответ

Решение

Вы используете сертифицированный JEE6 сервер, поэтому вы можете использовать CDI для управления компонентами. Существует библиотека расширений CDI под названием MyFaces CODI, в которой есть пакет области действия Window, и вы можете использовать ее для определения области действия ваших компонентов вместо использования области действия сеанса. Это решит вашу проблему с определением бобов.

Домашняя страница - http://myfaces.apache.org/extensions/cdi/

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