2012-01-09 2 views
0

Я написал этот вопрос:
https://stackoverflow.com/questions/8589315/jsf2-dynamic-templateДинамический пользовательский интерфейс: включить

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

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

Я полагаю, что это хорошо, но я создаю все страницы, используя мастер netbeans «Новые JSF-страницы из классов объектов ...», и для использования этой структуры с этим мастером я не могу связать непосредственно страницы xhtml, сохраненные в 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 и действий для использования его для моей ситуации!

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

+0

За то, что я прочитал здесь вы хотели бы иметь состояние каждого браузера теге, а не в браузере, не так ли? –

+0

@ Adrian Mitev: если вы для «состояния» означают что-то вроде сеанса, но не разделяете между окнами браузера или вкладкой браузера, да, вы правы! – Filippo1980

+0

Какой сервер приложений вы используете? –

ответ

2

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

Главная страница - http://myfaces.apache.org/extensions/cdi/

+0

Спасибо большое! – Filippo1980

+1

Вы должны аннотировать свой bean-компонент с помощью @WindowScoped при использовании CODI –

Смежные вопросы