Exibir dados de perfil do usuario logado [Resolvido]

37 respostas Resolvido
C

Bom galera to criando um painel onde tem a seção de meu perfil para o Administrador que estiver online pode ver as informações de seu perfil. Porém todavia entretanto estou com problemas na criação da página de perfil, já li alguns tutorias e assisti algumas video-aulas, porém está tudo escuro ainda.

Eu queria saber como fazer para exibir em uma página as informações de um único usuário do banco de dados, sendo que no banco existem outros usuários também.

Eu sei selecionar tudo e exibir todos os usuários cadastrados no banco em uma página, mas eu queria mesmo era exibir as informações do usuário que estar logado, ou seja, só as dele.

eu utilizo um <h:link outcome=""/> pra redirecionar porem não faço ideia de como chamar um metodo que me retorne dos dados.

37 Respostas

M

É só dar um select com where, ai vai retornar um objeto.

Pra chamar o método tem algumas formas:
1)Se for um outro managed bean, você pode usar @PostConstruct init para trazer os dados do banco.
2)Se for o mesmo managed bean(Session Scoped), você altera de h:link para h:commandLink, ai na action você chama o método (deve retornar uma String) que da o select no banco e então retorna a url que você ia passar no outcome (mas coloca a extensão da pagina: qualquer-pagina.xhtml)
3)Na sua página de exibir os dados, você pode colocar para executar um método na fase preRenderView, para fazer isso de uma olhada na tag f:event

C

Olá Mike, Muito obrigado reponder.

Então, eu fiz exatamente oque vc falou e fiz um teste. Ele funciona.

Agora gostaria de retorna essa consulta e um panelGrid, ai vc falando do f:event fiquei um pouco confuso. teria algum exemplo que pudesse deixar mais claro?

M

Cria um panelGrid embaixo da sua consulta.

O panelGrid tem um atributo chamado rendered, e esse rendered aceita apenas boolean.

rendered="#{bean.objeto != null}"

Ou

rendered="#{bean.mostrarObj}" mostrarObj é um boolean

No seu botao de consultar, da um update no panelgrid

Ai ele aparecerá

C

esse é meu panelGrid

<h:panelGrid id=“pnelg” columns=“2”  rendered="#{usuarioMB.dadosUsuarioCadastrado}">

Código: <h:outputText 	value="#{<a href="http://usuarioMB.usuario.id">usuarioMB.usuario.id</a>}" />

Nome: <h:outputText value="#{usuarioMB.usuario.nome}" />


</h:panelGrid>

Aqui meu metodo no Bean

public String dadosUsuarioCadastrado() {
		
	Integer id = usuario.getId();
	UsuarioDAO usuarioDAO =  new UsuarioDAO();
	this.usuario =  usuarioDAO.buscaUsuarioPorid(id);
	 System.out.print("ID :" + id);
	return null;
}

aqui eu chamo meu link
<h:commandLink outcome="/usuario/usuario_dadosCadastrais.xhtml" action="#{usuarioMB.dadosUsuarioCadastrado}" ajax=“false” update=“pnelg”>Meus dados
</h:commandLink>

mais ñ está retornando nada na tela

OBS:
no console ele me retorna a query normalmente

só ñ consigo retornar na pagina.:cry:

M
Solucao aceita

Eu esqueci que vc esta usando jsf puro
h:commandLink não tem o atributo update, ajax e nem outcome.

Para utilizar ajax com commandLink é assim:

<h:commandLink action="seuMetodo"  value="Consultar" >
	<f:ajax render="pnelg"></f:ajax>
</h:commandLink>
/*Faça as devidas alterações*/

Você tem que passar uma condição(boolean) e não um método que retorna uma String/null

Cade o seu formulario para consulta?

C

Eu não tenho um formulario, apenas quero pegar os dados do usuario logado e consultar em outra pagina.
Entendeu?

M

Tendi, os dados estão setados direto no seu bean ne?

C

isso…

<fieldset>
				<legend>Dados do Usuario Cadastrado</legend>
				<h:form>
				<h:panelGroup >
					<h:panelGrid id="pnelg" columns="2"  >
                        Código: <h:outputText 	value="#{usuarioMB.usuario.id}" />
                        Nome: <h:outputText value="#{usuarioMB.usuario.nome}" /><br />
					</h:panelGrid>
				</h:panelGroup>
				</h:form>
			</fieldset>

tipo isso

M

O seu método tem que retornar uma pagina

return tela-panelgrid.xhtml

C

vc fala no Meu Bean, neh?

M

Sim

C

entendi…

problema é que ele está me retornando null

metodo no Dao (aqui eu utilizo NamedQuery)

public  Usuario findByid(Integer id) {
		EntityManager em = EntityManagerUtil.getEM();
		try {
			System.out.println("ID: "+ id );
			Usuario usuario =  em.createNamedQuery("Usuario.findByid", Usuario.class)
					.setParameter("id", id)
					.getSingleResult();
			return usuario;
		
		} catch (NoResultException nre) {
		}
		return null;
	}
C

Meu Bean

public String dadosUsuarioCadastrado() {

Integer id = usuario.getId();

UsuarioDAO usuarioDAO =  new UsuarioDAO();

usuarioDAO.findByid(id);
return "/usuario/usuario_dadosCadastrais";
}

Alguma coisa eu fiz errado, só não consigo enxerga onde! rsrs

M

Você esta conseguindo pegar o usuario?

No seu return tem que ter a extensão da pagina
Ex: pagina.xhtml

C

ñ, ele me retorna a query gerada pelo JPA no console mais o ID: ele diz que está null

** ID:null**
Hibernate: 
    select
        usuario0_.id as id1_3_,
        usuario0_.ativo as ativo2_3_,
        usuario0_.cargo as cargo3_3_,
        usuario0_.celular as celular4_3_,
        usuario0_.clt as clt5_3_,
        usuario0_.cpf as cpf6_3_,
        usuario0_.dataAdmissao as dataAdmi7_3_,
        usuario0_.email as email8_3_,
        usuario0_.endereco as endereco9_3_,
        usuario0_.imageUser as imageUs10_3_,
        usuario0_.login as login11_3_,
        usuario0_.nascimento as nascime12_3_,
        usuario0_.nome as nome13_3_,
        usuario0_.salario as salario14_3_,
        usuario0_.senha as senha15_3_,
        usuario0_.sexo as sexo16_3_,
        usuario0_.telefone as telefon17_3_ 
    from
        Usuario usuario0_ 
    where
        usuario0_.id=?
M

Então o usuario esta sem id

C

pois é! ele tem Id, só não traz do banco e isso que ñ estou conseguindo resolver, ou tem algo nos metodos que está errado?

M

Isso retorna algo?

M

Esse usuario foi você que deu um valor qualquer não foi?

C

como assim valor qualquer?

M

Voce criou um objeto usuario e depois pegou o id dele e atribuiu a um “Integer id” para buscar no banco.
Esse id, você tem certeza que não esta nulo?

C

sim quando debuguei ele veio nulo

M

Hum…

Então de um valor pro id do usuario

C

mais os usuarios que estão no DB todos tem Id, e minha query ñ está retornando

@NamedQuery(name="Usuario.findByid", 
query="select u from Usuario u "
		+ "where u.id = :id")
M

Da onde vem esse usuario?

C
@ManagedBean
@SessionScoped
public class UsuarioMB {

	private Usuario usuario = new Usuario();

//Metodos
}
C
@NamedQuery(name="Usuario.findByid", 
query="select u from Usuario u "
		+ "where u.id = :id")

@Entity
public class Usuario implements Serializable {

	private static final long serialVersionUID = 1L;

	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private Integer id;

	@Column(length = 50)
	private String nome;

	@Column
	private String cpf;
	
	@Column
	private Date nascimento;

	@Column(length = 15)
	private String telefone;

	@Column(length = 15)
	private String celular;

	@Column(length = 100)
	private String endereco;

	@Column(length = 10, precision = 2)
	private float salario;

	@Column
	private String sexo;

	@Column(length = 20)
	private String cargo;

	@Column(length = 30)
	private String email;

	@Column(length = 15,unique =true)
	private String login;

	@Column(length = 20)
	private String senha;

	@Column
	private boolean ativo;

	private Date dataAdmissao;

	@Column
	private String clt;
//getter e setter
}
M

Você esta setando algum valor para o id desse usuario?

Se não, vai estar nulo mesmo.

C

setar um valor? como assim??

M

Você esta dando algum valor ao id?

Olha o que você esta fazendo:

Você tem um objeto usuario e então atribui o valor de seu id para uma variavel id
Você cria um objeto DAO
Você busca um usuario com base no id

Você precisa dar um id pro seu objeto usuario, antes de buscar no banco.

Supondo que tudo esteja correto, você deve armazenar o retorno de findById em um objeto

objeto = usuarioDAO.findByid(id);

C

acho que entendi…

eu fiz assim…
public String dadosUsuarioCadastrado() {

UsuarioDAO usuarioDAO = new UsuarioDAO();

		visualizaDadosUsuarioLogado = usuarioDAO.findByid(visualizaDadosUsuarioLogado.getId());
	
		return "/usuario/usuario_dadosCadastrais.xhtml";
}
M

Deu certo?

visualizaDadosUsuarioLogado = usuarioDAO.findByid(visualizaDadosUsuarioLogado.getId());

esse visualizaDadosUsuarioLogado possui um id antes de pegar o retorno de usuarioDAO.findById()?

C

deu certo ñ

private Usuario visualizaDadosUsuario;

public String dadosUsuarioCadastrado() {
			
		UsuarioDAO usuarioDAO = new UsuarioDAO();

		this.visualizaDadosUsuario = usuarioDAO.findByid(visualizaDadosUsuario.getId());
	
		return "/usuario/usuario_dadosCadastrais.xhtml";
}

já mudei varias vezes esse metodo e nada…

M

Eu nem vou entrar no mérito de qual forma é a mais adequada, só estou seguindo a sua lógica…

O seu visualizaDadosUsuario esta nulo.
usuarioDAO.findByid(id); você tem que passar um id aqui

if(visualizaDadosUsuario != null)
{
    System.out.prinln("visualizaDadosUsuario nao esta nulo");
    if(visualizaDadosUsuario.getId() != null)
    {
         System.out.prinln("visualizaDadosUsuario.getId() nao esta nulo");
    }
    else
    {
          System.out.prinln("visualizaDadosUsuario.getId() esta nulo");
    }
}
else
{
     System.out.prinln("visualizaDadosUsuario esta nulo");
}

Cara, poem isso antes de
this.visualizaDadosUsuario = usuarioDAO.findByid(visualizaDadosUsuario.getId());
pra vc ver o que esta acontecendo, ja tentei explicar de mil formar mas não vai…

Você pulou algumas etapas do aprendizado ai chega uma parte que não da para prosseguir

C

Eu eu conseguir , era o eclipse que estava bichado,ai reiniciei ele e o metodo funcionou.
Mais era exatamente os exemplos que vc passou… Muito obrigado mike mais uma vez.:smiley:

M

Haha que bom que deu certo.

Direto o eclipse buga aqui também, ai tenho que reiniciar para fazer funcionar kk

C

pois é! engraçado que agente fica louco achando que o problema é com agente…rsrsrsr Vlw Mike. vou encerrar o Post :+1:

Criado 10 de abril de 2018
Ultima resposta 10 de abr. de 2018
Respostas 37
Participantes 2