Login

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 !

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

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.

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!!

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

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 !!

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

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:

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 leocantanhede@gmail.com

Então eu acho estranho .

Porque eu tenho uma action para listar e funciona perfeitamente .

na jsp eu faço :

[code]
<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>
	[/code]

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…

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:

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.

Então eu uso . :smiley:

Segue o código :

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

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();

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:

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;

Alguém??

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

â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 ??

O seu método pesquisa retorna uma list ?