JSF - dúvida com SESSION

4 respostas
J

Galera estou começando com JSF.

a aplicação é o seguinte: tem várias telas, que quando usuario logar vai carregar em branco se for a primeria vez, ou se ja tiver gravado algo, carregará os valores já guardados no banco.

Porém pela regra de negócio tenho umas 20 classes (pessoa, carta tipo A, carta tipo B)…varios objetos…

minha dúvida é:

devido após logar a pessoa poder transitar nas várias telas, e os dados já tem que estar carregados do banco, e caso ela preencha e mude de tela, quando voltar os dados ainda precisam estar lá, eu preciso então colocar essas 20 classes como SESSION :?: ou eu crio um outro Backing Bean de sessão e NELE eu coloco uma propriedade dessas 20 classes, tipo BackingBean1 e dentro Pessoa a = new Pessoa();

coloco sempre o Pessoa como sessão, ou se colocar o BackingBean1 já serve :?:
complementando, essas 20 classes representam os formulários disponiveis, e a pessoa pode navegar entre varios sem perder os valores…

No caso um Bean declarado como SESSION, eu ainda dentro do código preciso fazer algo assim:

HttpSession session = (HttpSession) facesContext .getExternalContext().getSession(false);

ou isso não é necessário, o JSF já me traz isso :?:

valeu a todos :!:

4 Respostas

henrique.lima

Ola JavaTux, você não precisa acessar a session diretamente para obter este tipo de resultado. Basta que você tenha um backing bean com scope = session onde a classe que você precisa manter durante o wizard esteja dentro dele. Por exemplo:

Considere a seguinte classe que você precisa manter durante o wizard:

public class Pessoa {

    private String nome;
    private String email;

    // metodos setters e getters

}

E o backing bean:

public class MyWonderfulBackingBean {

    private Pessoa pessoa;

    // metodos setters e getters

}

Todo o valor setado no objeto pessoa ficará disponível através do backing bean enquanto a sessão estiver viva.

Para passar os valores para o formulário utilize o código abaixo:

<h:outputLabel id="nome" value="oNomeDoSeuBackingBeanConfiguradoNoFacesConfig.pessoa.nome" />

É sempre bom lembrar que deve-se utilizar com muita cautela backing beans com scope session, pois você pode consumir muita memória desnecessariamente. Uma possível solução é, após você terminar o wizard retirar o backing bean da sessão manualmente. Uma outra solução é, através da utilização do richfaces, usar em suas páginas jsp/xhtml a tag:

<a4j:keepAlive beanName="oNomeDoSeuBackingBeanConfiguradoNoFacesConfig" />

Espero ter ajudado.

Bons estudos!

J

henrique.lima valeu mesmo, ajudou sim, me esclareceu legal uma parte do meu problema.

Minha segunda dúvida ainda não consegui pensar…
como disse eu tenho aprox. 20 classes que representam minhas telas, e devem estar disponiveis o tempo todo…entao no caso eu faria do jeito que vc falou…colocando as instancias dentro de outro backing bean, blz…
algo assim:

ou seja, eu colocaria minhas 20 classes na session, mas desse jeito acima, seria uma UNICA sessão com digamos 20 atributos… ou seria a mesma coisa de que se eu colocasse cada classe acima como escopo de session…

henrique.lima

Ao colocar um managed bean com scopo session os seus atributos estarão disponíveis. É válido lembrar que quanto menor o número de beans na session melhor, pois fica mais fácil de retira-lo quando este já não for mais necessário.

andrestrindade

Aproveitando o embalo, como verificar se a seção está ativa (se existe!?) ?
Estou com um problema no logout do meu projeto.
Quando o usuário deixa o Sistema aberto por um tempo e a seção expira, ao clicar em “LOGOUT” (que é um invalidate na seção), o Sistema se perde e redireciona o usuário para uma tela em branco… Simplesmente porque a seção “vazia” (?) não gera uma Exception. Eu fiz o tratamento de exceção.

Grato. :wink:

-> Caramba, revivi o tópico sem querer Oo"
Maldita ferramenta de pesquisa!

Criado 25 de janeiro de 2008
Ultima resposta 15 de mar. de 2011
Respostas 4
Participantes 3