Tela de Login [Duvidas]

11 respostas
B

Criei uma tela de Login que pede Usuario e Senha, e preciso que a mesma verifique se o Usuario e senha digitados estão no banco de dados ai ele deve mostrar a tela principal, caso contrario retornar uma mensagem não permitindo acesso.

Estou usando o codigo abaixo:

private void botaoEntrarActionPerformed(java.awt.event.ActionEvent evt) {                                            
        // TODO add your handling code here:          
       if(campoUsuario.getText().equals("USUARIO") && (campoSenha.getText().equals("SENHA"))){
          Principal.setVisible(true);
          this.dispose();
        } else {
          JOptionPane.showMessageDialog(this, "Sem Acesso!");
        }
    }

Minha duvida: Como e feita a parte de conexão e verificação dos campos?
Grato!

11 Respostas

pedroroxd

vc pega o que foi digitado, grava numa variavel varnome evarsenha dá 1 select da senha no banco where nome = varnome
Se a senha pega for igual a varsenha, abre a janela…

B

Eu ate entendi, mas como ficaria isso traduzido para o java?

Nicolas_Fernandes

Olá, Bruno!

Faça uma classe de Controller, a qual será responsável por comunicar a tela do usuário com os dados contidos no banco.
Dentro da classe de regras de negócio no Banco de Dados, faça uma pesquisa no banco a fim de procurar um usuário igual ao que o cara digitou, e o mesmo vale para a senha. Se existir, ele retorna um objeto contendo os dados do usuário. Se não, ele retorna null.

Traduzindo isso para linguagem mais ténica:

Crie uma classe CONTROLLER, a qual irá comunicar com o pacote MODEL. Faça uso de um método buscarRegistro(), readById() ou algo do tipo que busque somente um usuário no Banco de Dados. Retorne um objeto Usuário, caso exista. Caso contrário, retorne null. Faça a verificação do retorno na sua VIEW, e pronto!

Espero ter ajudado!
Abraços!

B

Parece complicado, no entanto, que comandos eu utilizo para comparar o que esta no banco de dados com o que foi digitado?

pedroroxd
Vai ser algo do tipo:
public class VerificaLogin {

//recebe a conexão, o usuário e a senha digitados
public void verilog (Connection connection, String us, String pas) throws SQLException, IOException  {
boolean k = false;
Statement stmt = connection.createStatement();
//seleciona do bd, onde o usuario for igual a variável recebida e a senha for igual a variável recebida
String sql = "Select * from dono where usuario = '"+us+"' and senha = '"+ pas +"'";
ResultSet hihi = stmt.executeQuery(sql);
while (hihi.next()) {
    String[] dados = new String[2];
    dados[0] = hihi.getString("usuario");
    dados[1] = hihi.getString("senha");
    if (pas.equalsIgnoreCase(dados[1])) {
                 //Aki vc coloca pra mostrar o form principal e esconder o form senha
                 k = true;
    }
}

       if (k == false) {
                 JOptionPane.showMessageDialog(null, "Dados Incorretos.");
       }
}
B
pedroroxd:
Vai ser algo do tipo:
public class VerificaLogin {

//recebe a conexão, o usuário e a senha digitados
public void verilog (Connection connection, String us, String pas) throws SQLException, IOException  {
boolean k = false;
Statement stmt = connection.createStatement();
//seleciona do bd, onde o usuario for igual a variável recebida e a senha for igual a variável recebida
String sql = "Select * from dono where usuario = '"+us+"' and senha = '"+ pas +"'";
ResultSet hihi = stmt.executeQuery(sql);
while (hihi.next()) {
    String[] dados = new String[2];
    dados[0] = hihi.getString("usuario");
    dados[1] = hihi.getString("senha");
    if (pas.equalsIgnoreCase(dados[1])) {
                 //Aki vc coloca pra mostrar o form principal e esconder o form senha
                 k = true;
    }
}

       if (k == false) {
                 JOptionPane.showMessageDialog(null, "Dados Incorretos.");
       }
}

Esse verificaLogin seria uma nova classe especifica para validar?
Não está incluso pegar os campos que usuario inseriu?
Grato!

pedroroxd
Ela é 1 classe específica para verificar.

Você vai passar para ela como parâmetros:

public void verilog (Connection connection, String us, String pas) throws SQLException, IOException

A conexão, o usuário digitado (String us) e a senha digitada (String pas).

Depois você cria um Statement: Statement stmt = connection.createStatement();  

E armazena o comando a ser executado em uma variável.

Nesse caso é: seleciona do bd chamado dono, onde o campo usuario for igual a variável recebida (String us) e o campo senha for igual a variável recebida (String pas)

String sql = Select * from dono where usuario = '”+us+"’ and senha = ‘"+ pas +"’";  

Depois você vai executar o statement: ResultSet hihi = stmt.executeQuery(sql);

O resto é autoexplicativo…
Você vai passando a cada linha do campo do bd. O dados[0] vai pegar o usuario do bd na coluna chamada usuário, e o dados[1] vai pegar os dados do bd na coluna chamada senha. Após isso vai ser verificado se o dados[1] (senha pega do bd) é igual a variável pas (String pas) recebida por parâmetro na classe.

O k é uma variável booleana, que se não for setada como true (o usuário e a senha existem), ela exibe a mensagem que o usuário ou a senha está incorreto.

Nicolas_Fernandes

Faz um padrão MVC pro seu projeto e arruma essa instrução do pedro direito!

Faz a sua classe de Contrrole, a classe Pojo de Usuário, a classe DAO, a classe Service, comunique-as, e assim terá resultado bacana ^^

B

Hmm… seguinte… me ajudaste muito =] Obrigado, mas usei o seguinte codigo (achei um pouco mais facil):

String usuario = campoUsuario.getText();
        String senha = campoSenha.getText();
        if (usuario.compareTo("") == 0) {
            JOptionPane.showMessageDialog(null,"Informe o Usuário!","Atenção!",JOptionPane.INFORMATION_MESSAGE);
            campoUsuario.requestFocus();
        } else if (senha.compareTo("") == 0) {
            JOptionPane.showMessageDialog(null,"Informe a Senha!","Atenção!",JOptionPane.INFORMATION_MESSAGE);
            campoSenha.requestFocus();
        } else {
        Connection con = null;
            try {
                Class.forName("com.mysql.jdbc.Driver");
                con = (Connection) DriverManager.getConnection("jdbc:mysql://localhost/banco","root","");
                Statement stm = (Statement) con.createStatement();
                String SQL = "Select * from login where USUARIO = '"+ campoUsuario.getText()+"';";
                ResultSet rs = stm.executeQuery(SQL);

                while(rs.next()) {
                    String loginn = rs.getString("USUARIO");
                    String senhaa = rs.getString("SENHA");                    

                    //Nessa parte que está o problema
                    if(campoUsuario.getText().equals(loginn) && campoSenha.getText().equals(senhaa)){
                        Principal.setVisible(true);
                        this.dispose();
                    }else{
                        JOptionPane.showMessageDialog(null,"Usuario ou Senha Inválidos!","Atenção!",JOptionPane.ERROR_MESSAGE);
                        limpar();
                        campoUsuario.requestFocus();
                    }                    
                }                        
                        
            }catch(SQLException e){                
                e.printStackTrace(); //vejamos que erro foi gerado e quem o gerou
                JOptionPane.showMessageDialog(null,"Erro na conexão, com o banco de dados!","Oi. Simples assim!",JOptionPane.WARNING_MESSAGE);
            }catch (ClassNotFoundException e) {
                e.printStackTrace();
            }finally {                
                try{
                    con.close();
                }catch(SQLException onConClose){
                    //System.out.println("Houve erro no fechamento da conexão");
                    JOptionPane.showMessageDialog(null,"Erro na conexão, com o banco de dados!","Oi. Simples assim!",JOptionPane.WARNING_MESSAGE);
                    onConClose.printStackTrace();
                }                
            } // fim do bloco try-catch-finally
        }//else do login e senha vazios

Agora meu problema e o seguinte:
Se eu digitar o usuario errado e a senha correta não acontece nada, a mensagem de erro não aparece!
E para finalizar, se eu digitar usuario e senha incorretos não acontece nada novamente, deveria aparecer uma mensagem de erro!

Seria necessario fazer outra verificação para corrigir isso? Se sim, onde ela seria inserida?

Grato!

Nicolas_Fernandes

Penso que o melhor jeito de resolver isso seria assim…

Crie uma classe DAO:

public class UsuarioDAO {

   public Usuario pesquisarUsuario( String nomeUsuario ) {

      Connection usuarioConnection = ConnectionManager.getInstance().getConnection(); /*Sua classe de Conexão*/
      
      // Busca um usuário no Banco de acordo com o nome passado por parâmetro.
      String usuarioCommand = "Select U.Id, U.Usuario, U.Senha From Usuarios U Where U.Usuario = ?";
      PreparedStatement usuarioStatement = usuarioConnection.prepareStatement( usuarioCommand );
                        usuarioStatement.setString( 1, nomeUsuario );
      ResultSet usuarioResultSet = usuarioStatement.execute();

      Usuario anUsuario = null;
      
      // Se existir usuário com aquele nome, então cria o objeto. Se não, retorna nulo.
      if ( usuarioResultSet != null ) {

         anUsuario = new Usuario();
         if ( usuarioResultSet.next() ) {

            anUsuario.setId( usuarioResultSet.getLong( "Id" ) );
            anUsuario.setNome( usuarioResultSet.getString( "Nome" ) );
            anUsuario.setSenha( usuarioResultSet.getString( "Senha" ) );
         }
      }

      usuarioStatement.close();
      usuarioConnection.close();

      /*Zera o resto das variáveis*/

      return anUsuario;
   }
}

Faz o seu action que chama o método DAO do Model.
(Não vou mostrar exemplo de como criar uma classe Service para tal. Isso tá implícito.)

public class UsuarioAction {

   public Usuario pesquisarUsuario( String nomeUsuario ) {

      // A classe Service é quem chama o DAO.
      UsuarioService.getInstance().pesquisarUsuario( nomeUsuario );
   }
}

E, na sua view…

JTextField textUsuario, textSenha;

JButton buttonLogin = new JButton( "Login" );
           buttonLogin.addActionListener( new ButtonLogin() );

private class ButtonLogin implements ActionListener {

   public void actionPerformed( ActionEvent e ) {

      Usuario anUsuario = UsuarioAction.getInstance().pesquisarUsuario( textUsuario.getText() );

      bool ehValido = false;
      if ( anUsuario != null ) {
         
         // Quer dizer que o usuário já existe.
         if ( anUsuario.getSenha().equals( textSenha.getText() ) ehValido = true;
      }
      
      if ( !ehValido ) {
      
         System.out.println( "Usuário e/ou senha inválido(s)!" );
      } else {

         /* Faz qualquer coisa */
      }
   }
}

Sacou a idéia? ^^

Abraços!

B

Complicado! Meu metodo e mais simples!
Se puder detalhar mais… agradeço!

Criado 1 de maio de 2010
Ultima resposta 3 de mai. de 2010
Respostas 11
Participantes 3