Login

22 respostas
J

Gente eu tenho uma classe que contém a lógica do login.

Ela verifica se o mesmo existe e redireciona para a “home” do projeto.

Porém eu tento na home pegar o nome do usuário e não consigo…

Tento fazer assim :

Bem vindo ${usuario.nome}

Porém ele não mostra nada , alguém poderia me falar como que eu passo o nome do usuário para essa página ? Muito obrigado !

22 Respostas

leocantanhede

Você esta atribuindo o objeto a um request.setAttribute ou HttpSession antes de tentar recuperar ele na página de destino ?

Hebert_Coelho

Nesse post aqui eu mostro como fazer: Autenticação de Usuários (Filter/Servlet).

Vc precisa colocar o usuário no request/session como o leocantanhede disse.

J

Então creio eu que não estou fazendo isso não .

Eu apenos monto a query e em um preparedStatement e passo os parametros para a query.

Como que eu passaria para esse request?

Muito obrigado!!

leocantanhede

Depois que você obter o resultado no método que você criou, deverá atribuir o resultado a sua váriavel.

Ex:

//Método que recupera o nome do cliente

public String retornarNomeCliente(int cdCliente) {

    Connection con = null;
    PreparedStatement pst = null;
    ResultSet rs = null;
    	
    try {
       
       con = DBPool.getConnection();
       pst = con.prepareStatement("select nome from clientes whrere cd_cliente = ?");

       pst.setInt(1, cdCliente);

       rs = pst.executeQuery();

       if(rs.next()) {

          //Aqui ele recupera o nome do cliente
          nomeCliente = rs.getString("nome");

       }

    } catch (SQLException e) {

          e.printStackTrace();

   } finally {
    
         DBPool.doFinallyClose(con, pst, rs);

   }
		
}

No seu servlet irá fazer o seguinte:

//Exemplo

   Cliente cliente = new Cliente();

   cliente.setCodigo(Integer.parseInteger(request.getParameter("codigoCliente")));

   cliente.setNome(cliente.retornarNomeCliente(cliente.getCodigo()));

   //Atribui o objeto a um request

   request.setAttribute("cliente", cliente);

   //Redireciona para a página de destino

   RequestDispatcher rd = request.getRequestDispatcher("./index.jsp");

   rd.foward(request, response);

Para pegar o objeto na página de destino

<jsp:useBean id="cliente" scope="request" class="br.com.lunasoft.entidades.Cliente"/>

   cliente = Cliente(request.getAttribute("cliente"));

  //Exibindo 

  <b>Bem vindo ${cliente.nome}</b>

É mais ou menos isso que deve ser feito

J

Muito obrigado mesmo !

Mais no meu caso que não trabalho com servlet pura …

Mexo com Struts2.

então a minha action está assim :

package br.com.cfr.action;

import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Result;

import br.com.cfr.jdbc.dao.UsuarioDAO;
import br.com.cfr.jdbc.modelo.Usuario;

public class LoginAction {

	private Usuario usuario;

	@Action(value = "login", results = {
			@Result(name = "ok", location = "home_usuario.jsp"),
			@Result(name = "admin", location = "home_admin.jsp"),
			@Result(name = "invalido", location = "login-errado.jsp") })
	
	public String execute() throws ClassNotFoundException {
		if (new UsuarioDAO().procura(usuario)) {
			if (new UsuarioDAO().pesquisa(usuario)) {
				return "admin";
			}else {
				return "ok";
			}
		}
		return "invalido";
	}
	
	public Usuario getUsuario() {
		return usuario;
	}
	
	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
		}

}

Eu devo colocar aonde o request?
E quando eu coloco ele pede (obvio) para importar , porém tem muitos imports qual seria o correto??

Muito obrigado !!

leocantanhede

Qual o critério de busca do usuário ?

J

Como assim o critério ?

Apenas faço um select e passo os parâmetros login e senha .

Se existir esses parâmetros ele vai retorna true apenas isto.

A minha dúvida é aonde eu coloco esse request e se posso simplesmente coloca-lo se não tem que fazer algo antes sei lá.

Muitissimo obrigado , e também …

Se existe outro jeito para isso , ou se isso é apenas o único jeito mesmo .

:slight_smile:

leocantanhede

Você não esta passando os parâmetros esta passando um objeto, com os atributos setados, no Struts não precisa do request.setAttribute, pelo que estou vendo parace que seu método de pesquisa é que esta errado, o seu select deve possuir um critério parecido com aquele que postei, seja ele pelo login ou senha, que deverá ser usado no método pesquisa, se quizer me mande o código do DAO, do jsp de entrada, da classe do Struts e do jsp de saída para eu entender melhor o que está sendo feito para assim poder te ajudar melhor, mande para [email removido]

J

Então eu acho estranho .

Porque eu tenho uma action para listar e funciona perfeitamente .

na jsp eu faço :

<c:forEach items="${veiculos}" var="veiculo" >
													
														<tr>
															<td hidden="veiculo.id">${veiculo.id}</td>
															<td>${veiculo.nome}</td>
															<td >${veiculo.marca}</td>
															<td >${veiculo.cor}</td>		
															<td >${veiculo.cilindrada}</td>
															<td >${veiculo.categoria}</td>
															<td >${veiculo.tarifaBasica}</td> 
															<td >${veiculo.tarifaEspecial}</td>
															<td >${veiculo.estadoReserva}</td>    
															<td><a href="reservaVeiculo?veiculo.id=${veiculo.id}">Reservar</a></td>
														
														</tr>
														</c:forEach>

E funciona perfeitamente!!!

E apenas faço isso na action :

package br.com.cfr.action;

import java.util.List;

import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Result;

import br.com.cfr.jdbc.dao.VeiculoDAO;
import br.com.cfr.jdbc.modelo.Veiculo;

public class ListaVeiculoAction {

		private List<Veiculo> veiculos;		

		public void setVeiculos(List<Veiculo> veiculos) {
			this.veiculos = veiculos;
		}
		@Action(value="listaVeiculo", results= {
		@Result(name="ok", location="lista_veiculo.jsp")
		})
		public String execute() throws ClassNotFoundException {
		veiculos = new VeiculoDAO().lista();
		return "ok";
		}
		public List<Veiculo> getVeiculos() {
		return veiculos;
		}
		
	}

O método lista faz um select e adiciona em uma List , segue código :

public List<Veiculo> lista() {
            try {
                  List<Veiculo> veiculos = new ArrayList<Veiculo>();
                  PreparedStatement stmt = this.connection.prepareStatement("select * from tabveic where estadoReserva= 'L' ");
                  
                  ResultSet rs = stmt.executeQuery();
                 
                  while (rs.next()){
                       
                	    Veiculo veiculo= new Veiculo();
                	    veiculo.setId(rs.getLong("id"));
                	    veiculo.setNome(rs.getString("nome"));
                	    veiculo.setMarca(rs.getString("marca")); 
                	    veiculo.setCilindrada(rs.getString("cilindrada"));
                	    veiculo.setCategoria(rs.getString("categoria"));
                	    veiculo.setCor(rs.getString("cor"));
                	    veiculo.setTarifaBasica(rs.getString("tarifaBasica"));  
                	    veiculo.setTarifaEspecial(rs.getString("tarifaEspecial"));
                	    veiculo.setEstadoReserva(rs.getString("estadoReserva"));
                        
                        veiculos.add(veiculo);
                  }
                  
                  rs.close();
                  stmt.close();
                  return veiculos;  
                 
            } catch (SQLException e) {
            	
            	throw new RuntimeException(e);
            }    
      }

E funciona perfeitamente , eu não entendo porque não funciona no login..

J

Acho melhor resolver por aqui mesmo , que isso acaba ajudando outras pessoas que acabam se deparando na mesma situação que eu . :slight_smile:

Obrigado !! :smiley:

leocantanhede

Uma coisa é você verificar se o tem usuário no banco, para buscar somente um especifico deverá ser usado uma cláusula where na sua consulta, o método consulta procura verifica se tem usuário no banco e retorna true se achar, mas no método pesquisa esta sendo passado um *, então ele não traz somente 1 e sim todos que estiverem cadastrados.

J

Então eu uso . :smiley:

Segue o código :

PreparedStatement stmt = connection.prepareStatement("select * from tabclie where login=? and senha=?");
leocantanhede

Usa somente a chave primária da tabela, que ai só vai trazer o que você quer, e coloque o método setUsuario e getUsuario abaixo da declaração da variável.

Exemplo:

Supondo que o login seja único:

PreparedStatement stmt = connection.prepareStatement("select * from tabclie where login=?");
stmt.setString(1, getUsario().getLogin());
stmt.execute();
rs = stmt.executeQuery();
J

Então .

O método em si do login funciona legal .

Porque eu tenho que compara com a base passando o login e senha .

Depois eu verifico se a query retornou algo , e se retornou eu retorno true para a action.

O problema é que ele teima em não aparecer nada na JSP … :confused:

leocantanhede

Na minha opinião você não precisa do método consulta, usa somente o pesquisa com a cláusula where, antes do execute coloque o set e o get e de quando no execute coloque:

usuario = new UsuarioDAO().pesquisa(usuario.getLogin());

Ai sim estara atribuindo um usuário com valores;

J

Alguém??

leocantanhede

Blz cara tentei te ajudar e parece que não gostou muito, deixo a vontade para que resolva seu problema.

J

âhn??

Não entendi …

Mais então .

Eu não entendo o fato de um funcionar e o outro não …

Será que é por causa da List??

Que ele retorna a list na jsp ??

leocantanhede

O seu método pesquisa retorna uma list ?

J

Não , não .

Eles apenas retornam o resultado da query apenas verifico se a query veio com algum resultado e já mando true .

Segue o código :

try {
	  		  PreparedStatement stmt = connection.prepareStatement("select * from tabclie where login=? and senha=?"); 
	  		  stmt.setString(1, usuario.getLogin());
	  		  stmt.setString(2, usuario.getSenha());
	  		  ResultSet rs = stmt.executeQuery();
	  		  
             if (rs.next()){
            	 stmt.close();
            	 return true;
            	 
             } else {
            	return false;
            }

Apenas retorno true ou false dependendo de a query me retorna algum resultado .

leocantanhede

Seu resultSet esta retornando um valor booelan, é por isso, deve ser alterado para que traga as informações do usuário.

Supondo que seu método retorne um usuário, faça assim:

Usuario usuarioRetornado = null;

try {
   
   PreparedStatement stmt = connection.prepareStatement("select * from tabclie where login=? and senha=?");   
   stmt.setString(1, usuario.getLogin());   
   stmt.setString(2, usuario.getSenha());   
   ResultSet rs = stmt.executeQuery();   
             
   if (rs.next()) {   
             
      usuarioRetornado = new Usuario();
      usuarioRetornado.setLogin(rs.getString("login"));
      usuarioRetornado.setSenha(rs.getString("senha"));

   }
       
} catch (SQLException e) {
    	
      e.printStackTrace();

} finally {

      rs.close();
      stmt.close();  
      connection.close();             
       
} 

return usuarioRetornado;

}
J

NOSSA , nunca tinha parado pra pensar nisso !!

Eu nem testei vou testar agora , mais tenho certeza que é isso que você falou !!

MUITO OBRIGADOOOOOOOOOO!

Valeu mesmo !!

Criado 24 de novembro de 2011
Ultima resposta 27 de nov. de 2011
Respostas 22
Participantes 3