Recuperar objetos da sessão

Estou fazendo uma aplicação com tomcat 7 e jsf 2.0

O problema é que meu bean nao persiste na sessão ao navegar de uma página para outra ele some

ai vai meu código do bean


public class AlunoBean implements Serializable{
	
	private static final long serialVersionUID = 1L;
	private Aluno aluno = new Aluno();
	private CadastroAlunoBean cadastro = new CadastroAlunoBean();
	private AlteraCadastro altera = new AlteraCadastro();
	private Competencia competencia = new Competencia();
	

	//METODOS GETTERS E SETTERS
   
	// MÉTODO PARA CONFERIR O LOGIN DOS ALUNOS 
	public String login(){
		AlunoDAO alunoDAO = new AlunoDAOImpl();
		Aluno temp = alunoDAO.verificaAluno(getAluno());
		FacesContext facesContext = FacesContext.getCurrentInstance();
		if(temp == null){
			FacesMessage facesMessage = new FacesMessage("Erro nos dados fornecidos");
			facesContext.addMessage("aviso", facesMessage);
			return "fracassoLogin";	
		}else{ 
			this.aluno = temp;
			System.out.println(this.aluno.getNome()+" "+this.aluno.getEmail());
			this.aluno.setAlunochas(alunoDAO.carregaAlunoCompetencias(this.aluno)); 
			this.altera.setCompetencia(this.aluno.getAlunochas());
			HttpSession session = (HttpSession) facesContext.getExternalContext().getSession(true); //ESTOU COLOCANDO O USER AQUI NA SESSÃO
			session.setAttribute("aluno", this.aluno);
			facesContext.addMessage("bem-vindo", new FacesMessage("Bem-vindo, "+this.aluno.getNome().toUpperCase()));
			return "welcome";
		}

os dados do usuário nao aparecem na página


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

<h:head>
	<title>.::ROAC::.DADOS DO USUÁRIO</title>
	<h:outputStylesheet library="css" name="estiloUser.css" />
</h:head> 
<h:body> 
	<div id="head">
		<h:outputLabel  value="RECOMENDADOR - CONTA DO USUÁRIO" />
	</div>
		
	<h:form id="formNome">	
		<p:panel id="painelNome" header="NOME" toggleable="true" toggleSpeed="500" collapsed="true">
			<center>
				<p:messages for="nomeSenha" />
			   	<h:panelGrid columns="2" >
					<h:outputText value="Nome Atual: " />
					<h:outputText value="#{alunoBean.aluno.nome}" />   //AQUI DEVERIA ESTAR O NOME DO USER, MAS ELE NAO APARECE
					<h:outputText value="Novo Nome: " />
					<h:inputText value="#{alunoBean.altera.aluno.nome}" />
				</h:panelGrid>
				
				<h:panelGrid >	
					<h:outputText value="Para salvar esta configuração, digite sua senha." />
					<h:inputSecret value="#{alunoBean.altera.aluno.senha}" style="margin-left:25%;" />
					<p:commandButton update="formNome" action="#{alunoBean.alterarNome()}" value="Salvar Alteração" style="margin-left:30%;" />
				</h:panelGrid>
			</center>
		</p:panel>
	</h:form>

Não sei se isso seria um problema do tomcat que cuida das sessoes do usuário ou do jsf.
Se alguem poder me dar uma luz.

[]s

Troca para HttpSession session = (HttpSession) facesContext.getExternalContext().getSession(); e testa.

Se você estivesse chamando toda vez passando true, toda hora ele vai criar uma sessão nova.

[quote=jakefrog]Troca para HttpSession session = (HttpSession) facesContext.getExternalContext().getSession(); e testa.

Se você estivesse chamando toda vez passando true, toda hora ele vai criar uma sessão nova.[/quote]

é necessario ter um valor boolean como parametro. Procurei na documentação e diz " se for true, fornece e cria (se não existir), se for false, retorna null se a sessão ainda nao existir".

Não sei mais o que fazer, simplesmente meu bean some durante a troca de paginas da aplicação, alguem teria mais alguma ideia para mim testar?

Como esta o escopo do seu bean , não seria isso?

meu bean esta assim

@ManagedBean(name="alunoBean")
@SessionScoped
public class AlunoBean {
 ....}

Uma vez fiz via injeção assim e deu certo segue o codigo:

<faces-config> .......... <managed-bean> <managed-bean-name>outroBean</managed-bean-name> <managed-bean-class> pacote.outroBean </managed-bean-class> <managed-bean-scope>session</managed-bean-scope> </managed-bean> <managed-bean-name>meuBean</managed-bean-name> <managed-bean-class> pacote.meuBean </managed-bean-class> <managed-bean-scope>session</managed-bean-scope> <managed-property> <property-name>outroBean</property-name> <property-value>#{outroBean}</property-value> </managed-property> </managed-bean> </faces-config>

Declare a variável no seu bean e o JSF faz a injeção.

Ex:

[code]public class MeuBean{

private OutroBean outroBean;

public MeuBean(){
}

public OutroBean getOutroBean(){
return this.outroBean;
}

public void setOutroBean(OutroBean outroBean){
this.outroBean = outroBean;
}

} [/code]

Ou tente assim

Se o seu bean tiver escopo de sessão, então o Faces instancia registra o objeto como um atributo de sessão.
Assim, você consegue capturar o bean e também pode instanciá-lo por conta própria.
Exemplo:

public static UsuarioMB getUsuarioMB() { Object o = getSessionAttribute("usuarioMB"); if ((o != null) && (o instanceof UsuarioMB)) { return (UsuarioMB) o; } else { UsuarioMB umb = new UsuarioMB(); setSessionAttribute("usuarioMB", umb); return umb; } }

UsuarioMB é o meu ManagedBean e “usuarioMB” é o nome definido no faces-config.xml

O bean só é instanciado quando uma página acessa atributos dele. Por isso pode acontecer do seu bean não ter sido instanciado ainda e é por isso que eu testo se o atributo referente ao mb já foi setado e caso negativo, eu mesmo crio a instância e registro nos atributos de sessão.

Utilizo esta técnica com sucesso no servidor Glassfish. Nos outros servidores (JBoss, WebSphere, etc.) eu nunca testei, mas acredito que vá funcionar do mesmo jeito.

Segue o código dos métodos que uso para ler e gravar os atributos de sessão:

[code]public static Object getSessionAttribute(String attributeName) {
try {
ExternalContext ec = getExternalContext();
if (ec != null){
Map attrMap = ec.getSessionMap();
if (attrMap != null) {
return attrMap.get(attributeName);
} else {
return null;
}
} else {
return null;
}
} catch (Exception e) {
e.printStackTrace();
return null;
}
}

[/code]

[code]@SuppressWarnings(“unchecked”)
public static void setSessionAttribute(String attributeName, Object attributeValue) {
try {
ExternalContext ec = getExternalContext();
if (ec != null){
Map attrMap = ec.getSessionMap();
if (attrMap != null) {
attrMap.put(attributeName, attributeValue);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}

public static ExternalContext getExternalContext() {
try {
FacesContext facesContext = FacesContext.getCurrentInstance();
if (facesContext == null) {
return null;
} else {
return facesContext.getExternalContext();
}
} catch (Exception e) {
e.printStackTrace();
return null;
}
}

[/code]
A classe ExternalContext do JSF também permite acessar o Map de atributos da requisição e de aplicação, assim você pode adaptar esta técnica se o seu bean tiver um destes escopos.

a principio resolvi o que estava acontecendo

eu estava usando Prime faces na minha aplicação , o componente dock


<p:dock>
      	<p:menuitem value="Welcome" icon="/resources/imagem/home4Icon.png" url="Welcome.jsf"/>
      	<p:menuitem value="recomendar" icon="/resources/imagem/recomendacoesIcon2.jpg" url="#"/>
      	<p:menuitem value="User" icon="/resources/imagem/userIcon.png" url="user.jsf"/>
      	<p:menuitem value="Adicionar OA" icon="/resources/imagem/addIcon.png" url="#" />
      	<p:menuitem value="Buscar OA" icon="/resources/imagem/buscaIcon.png" url="#"/>
      	<p:menuitem value="sair" icon="/resources/imagem/looutIcon.png" url="#{alunoBean.logout}"/> //ERRO ESTAVA AQUI
</p:dock>

 public String logout() {  
        FacesContext facesContext = FacesContext.getCurrentInstance();  
        HttpSession session = (HttpSession) facesContext.getExternalContext().getSession(false);  
        Aluno al2 = (Aluno) session.getAttribute("aluno");
        session.invalidate();
        return "login.jsf";  
    }

uma vez que a página era redenrizada, ela executava o método de logout e o usuário era perdido durante a aplicação, pensei que a url somente seria executada se o icone do dock fosse pressionado.
acho que terei que colocar uma action no dock para que ele faça o logout somente quando ele for pressionado

<p:menuitem value="sair" icon="/resources/imagem/looutIcon.png" url="#{alunoBean.logout}" action="#{alunoBean.logout}"/>

Bom espero que funcione. Testarei aqui e verei

Olá pessoal, sei que o tópico é meio antigo mas essa questão é sempre pertinente.

Faça o seguinte:

Bean


@ManagedBean
@SessionScoped
public class UsuarioBean {
...
}

Faça uma classe utilitária com o método a seguir


public static <T> Object getObjectSession(String attribute){		
	HttpServletRequest request = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();  
	HttpSession session = request.getSession(true);  
	return session.getAttribute(attribute);				
}

Para recuperar o objeto, seja ele qual for seu tipo faça o seguinte


UsuarioBean usuarioBean = (UsuarioBean) SuaClasseUtilitaria.getObjectSession("usuarioBean");

Poderia ser um outro MB com escopo de sessão


TesteBean testeBean = (TesteBean) SuaClasseUtilitaria.getObjectSession("testeBean");

Espero que ajude alguém!