Validação de login

Olá pessoal, estou com dúvidas no código de validação de login. Se eu digito um nome existe no bd, ele tambem informa que não existe. Não entendi o que está acontecendo com esse código.
FuncionarioDAO

public boolean existeUnico(Funcionario funcionario) throws SQLException { PreparedStatement stmt = connection.prepareStatement ("select *from funcionarios where usuario=? and senha=?"); stmt.setString(1, funcionario.getUsuario()); stmt.setString(2, funcionario.getSenha()); ResultSet rs = stmt.executeQuery(); try{ if(!rs.next()){ return false; } return !rs.next(); } finally { rs.close(); stmt.close(); } }
LoginAction, onde eu envio o usuario e a senha para o FuncionarioDAO pra retornar true ou false.

if(!new FuncionarioDAO().existeUnico(funcionario)){ return mapping.findForward("erro"); } return mapping.findForward("ok");

Tente assim:

public boolean existeUnico(Funcionario funcionario) throws SQLException { PreparedStatement stmt = connection.prepareStatement ("select *from funcionarios where usuario=? and senha=?"); stmt.setString(1, funcionario.getUsuario()); stmt.setString(2, funcionario.getSenha()); ResultSet rs = stmt.executeQuery(); try{ if(rs.next()){ return true; }else{ return false; } } finally { rs.close(); stmt.close(); } }

Da maneira como está implementado… sempre vai retornar false devido return !rs.next(); quando deveria ser return rs.next();.
Também pode refatorar seu código conforme joao.junior sugeriu.

Se eu fizer assim

try{ if(rs.next()){ return true; }else{ return false; } }
sempre entrará no if e nunca no else, qualquer coisa que eu digito entra no sistema.

O problema que está ocorrendo sempre entra no if, e nunca no else, não importa o que digite. Então será executado apenas o return do if.

Eu utilizo esta mesma logica em um sistema de login aqui, e funciona.

public boolean existeUnico(Funcionario funcionario) throws SQLException { PreparedStatement stmt = connection.prepareStatement ("select *from funcionarios where usuario=? and senha=?"); stmt.setString(1, funcionario.getUsuario()); stmt.setString(2, funcionario.getSenha()); ResultSet rs = stmt.executeQuery(); try{ if(rs.next()){ java.lang.Integer id = rs.getInt("idfuncionario"); if(id.toString().length() > 0){ return true; }else{ return false; } }else{ return false; } } finally { rs.close(); stmt.close(); } }

eu sempre uso o código:

resultSet.last();
if (resultSet.getRow() == 1) {
//login valido
} else {
//login falho
}

se getRow() retornar zero não existem usuários com os dados informados, se retornar mais que 1 então eu estou com um problema de usuário duplicado (nome/senha o que deveria se evitado no cadastro)… e não valido a entrada do usuário. Coisa que eu não conseguiria usando apenas “!resultSet().next” se você gostar da idéia tenta.