Como carregar dados da sessão em JSF

7 respostas
luz.eduardo

Sou iniciante em JSF e estou com dúvidas de como carregar os dados do usuário. O escopo é de sessão. Eu tenho que utilizar listeners ?
Alguém pode me ajudar ? Agradeço…
Eu tenho que atribuir na mão os dados a sessão ou o controller faz issso ?

POJO:

public String executa() throws SQLException {
		genericoDAO user = new genericoDAO(); // Chamo o controlador
		user.getConnection();

		if (user.pesquisa(this.login, this.senha) != null) {// Passo o Bean para
			// o DAO persistir
			System.out.println("Achou");
			return "sucesso";
		} else {
			System.out.println("Não Achou");
			return "falhou";
		}

	}

DAO para retornar os dados do POJO:

public Usuario pesquisa(String login,String senha) throws SQLException {
		// prepared statement para inserção
		PreparedStatement stmt = con
				.prepareStatement("select id,login,senha from usuario where login = ? and senha = ?");
		// seta os valores
		stmt.setString(1, login);
		stmt.setString(2, senha);
		
		Usuario usuario = null;
		
		ResultSet rs = stmt.executeQuery(); //Busca no banco os dados passados
		if (rs.next()){
			usuario = new Usuario();        //Encontrou no Banco, cria o objeto e retorna para a classe dominio
			usuario.setId(rs.getString("id"));
			usuario.setLogin(rs.getString("login"));			
			usuario.setSenha(rs.getString("senha"));
		}				
		// executa
		stmt.execute();
		stmt.close();
		
		  
		
		return usuario;
	}

O Login :

<f:view>

	<h:form>
		<h:panelGrid title="Login" border="1" columns="2" summary="Teste">
Login<h:inputText id="logLogin" value="#{usuario.login}" required="true" requiredMessage="Campo de preenchimento obrigatório"/>
Senha<h:inputSecret id="logSenha" value="#{usuario.senha}" required="true" requiredMessage="Campo de preenchimento obrigatório"/>

		</h:panelGrid>
		<h:commandButton value="Validar" action="#{usuario.executa}"></h:commandButton>
		
	</h:form>
</f:view>

Como carregar os dados de sessão nesta página no outpulal ?

<f:view>
Logado!
<br>
<h:outputText></h:outputText>
</f:view>

7 Respostas

normandesjr

Amigo, tenho uma notícia boa para você, no JSF é tudo automático!

Vou ser mais claro a respeito deste “automático”.

Quando você cria seu backing bean (sua classe por trás de suas páginas jsp), no faces-config.xml você o declara e define o escopo desta classe. Então você pode definir um escopo de Sessão (SESSION) que tudo que estiver ligado no seu backing bean, vai estar na sessão!!!

Existem outros escopos, como por exemplo de aplicação (APLICATION), de requisição (REQUEST). Se você utilizar o JBoss Seam você tem mais um monte de escopos disponíveis!!!

Basicamente é isso…

Abraços.

Javabuntu

aproveitando o tópico, normandesjr, mas se eu dividir meu código assim: tenho meu POJO usuário, e um backing bean simples, onde faço as chamadas a classe de serviços, e dentro do backing bean eu coloco uma instância do pojo, private UsuarioPojo userPojo; e dentro do Backingbean eu trabalho com algo do tipo userPojo.setNome(“xxxx”);

só pra desacoplar mesmo…

se eu colocar o backingBean no escopo de sessão meu Usuário Pojo também estará na sessão? ou não?

se não estiver, como seria?
Grato

luz.eduardo

Mas no caso que postei, como restauraria os dados na página logado ?
Através de sessionScope eu consigo pegar os login e senha mas o ID do usuário retorna nulo, qual seria o problema

Meus faces-config

<managed-bean>
		<managed-bean-name>usuario</managed-bean-name>
		<managed-bean-class>br.com.dominio.Usuario</managed-bean-class>
		<managed-bean-scope>session</managed-bean-scope>
	</managed-bean>
	<navigation-rule>
		<display-name>login</display-name>
		<from-view-id>/login.jsp</from-view-id>
		<navigation-case>
			<from-outcome>falhou</from-outcome>
			<to-view-id>/erro.jsp</to-view-id>
			<redirect />
		</navigation-case>
	</navigation-rule>
	<navigation-rule>
		<display-name>login</display-name>
		<from-view-id>/login.jsp</from-view-id>
		<navigation-case>
			<from-outcome>sucesso</from-outcome>
			<to-view-id>/logado.jsp</to-view-id>
			<redirect />
		</navigation-case>
	</navigation-rule>
normandesjr

Vamos lá “Javabuntu”. Primeiro quando você disse:

Bem, em JSF isso não é muito comun se você tem um componente de entrada de dados no jsp (um <h:inputText> por exemplo). Isso não é comum porque o JSF vai setar o value do inputText na sua propriedade de userPojo automaticamente. Como um exemplo mais detalhado segue:

<h:inputText value="#{meuBean.userPojo.nome}"/>

No backing bean você precisa de uma propriedade “UserPojo” (com os getters e setters) e no seu POJO uma propriedade “nome” (também com getters e setters).

Nesta outra questão:

Sim, o seu userPojo estará na sessão pois ele é um atributo do seu backing bean que está na sessão.

Se você quiser testar, faz assim: implementa o seu backing bean com o seu userPojo. Agora crie um servlet e faça:

MeuBean meuBean = (meuBean)request.getSession().getAttribute("meuBean");

Você verá que consegue recuperar todas as propriedades do seu backing bean.

Espero ter ajudado.

Agora luz.eduardo tenta me explicar melhor qual o seu problema… Não entendi muito bem o que você quiz dizer na última mensagem.

luz.eduardo

Seguinte, Meu Backingbean possui Atributos Id, login e senha e o mesmo tem escopo de sessão…

Eu passo através de formulário o login e senha e faço a consulta no banco, se retornar um objto que não seja nulo, ele encontrou o usuário, e direciono para a página de logado.
nesta página logado eu gostaria de pegar os dados de ID e Login do usuário da sessão, como faço isto ?

normandesjr

luz.eduardo acho que entendi agora seu problema.

Bem, na minha última mensagem explicando como funciona pegar um backing bean da sessão e como um atributo do backing bean também permanece na sessão, você vai conseguir fazer o que está querendo.

Te aconselho a criar um backing bean de seguranca e então deixar nele o POJO de usuário logado. Quando você estiver em outro backing bean e quiser recuperá-lo faça assim:

SegurancaBean s = (SegurancaBean)FacesContext.getCurrentInstance().getApplication().createValueBinding("#{segurancaBean}").getValue(FacesContext.getCurrentInstance());

É isso ai… tenta ai e veja se da certo…

Abraços

luz.eduardo

Valeu :lol: :lol: :lol:

Criado 4 de novembro de 2007
Ultima resposta 4 de nov. de 2007
Respostas 7
Participantes 3