En este post haremos la validación si existe ya un usuario o no en este caso desde el email y otra validacion si es que el nombre de usuario no esta en uso en caso de que si que cambien de username mediante el Framework Hibernate de acuerdo como lo eh mencionado se debe tener ya conocimientos previos sobre java e Hibernate una vez comentado esto realizamos lo siguiente.
Primero que nada entenderemos que Hibernate es para la persistencia de los datos y que es muy diferentes sus sentencias ya que Hibernate contiene HQL y no SQL como hemos utilizado antes en esta caso el proyecto esta sobre una BD de MySQL, en HQL para hacer una consulta entenderemos que la tabla seria nuestro modelo que se creo con el pojo y sus campos serian las variables de nuestro modelo creado.
Una vez entendido esto realizaremos un cambio en nuestra interfaces o frondend de usuario y frondend login y debe quedar asi;
public interface FrondEndUser {
public boolean registerUsers(Session session, Usuarios user) throws Exception;
public List<Usuarios> listUsers() throws Exception;
public Usuarios updateUsers(int id) throws Exception;
public Usuarios deleteUsers(int id) throws Exception;
public Usuarios getByEmail(Session session, String email) throws Exception;
}
public interface FrondEndLogin {
public boolean registerLogin(Session session, Login login) throws Exception;
public Login updateLogin (int id) throws Exception;
public Login deleteLogin (int id) throws Exception;
public Login getByUserName(Session session, String name) throws Exception;
}
Despues en nuestro Dao implementaremos el metodo creado, ya que todo sera desde nuestro managedBean solo modifcamos unas cuantas lineas de codigo.
public class usersDAO implements FrondEndUser{
private Session session;
@Override
public boolean registerUsers(Session session, Usuarios user) throws Exception {
session.save(user);//guardar los datos
return true;
}
@Override
public List<Usuarios> listUsers() throws Exception {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public Usuarios updateUsers(int id) throws Exception {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public Usuarios deleteUsers(int id) throws Exception {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public Usuarios getByEmail(Session session, String email) throws Exception {
//creamos la sentencia HQL ojo no es lo mismo que SQL en el post lo explicare mas a fondo
String hql = "from Usuarios where email=:email";
//creamos el query donde lo inicializamos con el session
Query query = session.createQuery(hql);
//agregamos al query el parametro de la consulta que se recibira desde el id que se le envie del Bean al DAO es la forma mas segura
//para prevenir inyeccion sql
query.setParameter("email", email);
//pasamos a la consulta para ello instanciaremos el objeto Usuarios con el query donde solo obtendra un unico resultado
Usuarios user = (Usuarios) query.uniqueResult();
//retornamos
return user;
}
Dao login
public class loginDAO implements FrondEndLogin{
private Session session;
@Override
public boolean registerLogin(Session session, Login login) throws Exception {
session.save(login);//guardar los datos
return true;
}
@Override
public Login updateLogin(int id) throws Exception {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public Login deleteLogin(int id) throws Exception {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public Login getByUserName(Session session, String name) throws Exception {
//creamos la sentencia HQL ojo no es lo mismo que SQL en el post lo explicare mas a fondo
String hql = "from Login where user=:user";
//creamos el query donde lo inicializamos con el session
Query query = session.createQuery(hql);
//agregamos al query el parametro de la consulta que se recibira desde el id que se le envie del Bean al DAO es la forma mas segura
//para prevenir inyeccion sql
query.setParameter("user", name);
//pasamos a la consulta para ello instanciaremos el objeto Usuarios con el query dond solo obtendra un unico resultado
Login login = (Login) query.uniqueResult();
//retornamos
return login;
}
}
Hecho esto modificaremos nuestro managedBean y quedaria como el siguiente:
@ManagedBean
@RequestScoped
public class ManagedBeanUser {
private Usuarios user;
private Login login;
public List<Usuarios> listUser;
private String confirPassword;
private Session session;
private Transaction transaction;
public ManagedBeanUser() {
user = new Usuarios();
user.setIdusuarios(null);
login = new Login();
login.setIdlogin(null);
}
public void registerUser(){
/*inicializamos para asegurarnos*/
this.session = null;
this.transaction = null;
try {
/*haremos la validacion de que el password sea el mismo a la hora de confirmarlo con una condicional podremos realizarlo*/
if(!login.getPass().equals(confirPassword)){
/*leer el contexto como msj y poder lanzarlo a la vista FacesMessage(FacesMessage.tipo de msj, titulo, msj)*/
FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error", "Error de coincidencia de Password"));
return;
}
loginDAO lDAO = new loginDAO();
/*creamos el dao que utilizaremos*/
usersDAO uDAO = new usersDAO();
//abrimos sesion de conexcion
session = HibernateUtil.getSessionFactory().openSession();
//creamos la transaccion y la comenzamos
transaction = session.beginTransaction();
/*inicializamos la decision si esta o no esta registrado el ususario*/
if(uDAO.getByEmail(session, user.getEmail()) != null){
/*inidicaremos que el usuario ya existe en la base de datos*/
FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error","El usuario ya esta registrado en la BD de INEE"));
return;
}else if(lDAO.getByUserName(session, login.getUser())!= null){
/*inidicaremos que el usuario ya existe en la base de datos*/
FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error","El nombre de usuario ya esta en uso en la BD de INEE"));
return;
}
/*se agregar a la variable pass de la clase login el pass encriptado*/
login.setPass(Encrypting.encrypting(login.getPass()));
/*instanciamos los objetos*/
usersDAO daoUsers = new usersDAO();
loginDAO daoLogin = new loginDAO();
/*mandamos a llamar los metodos que utilizaremos*/
daoUsers.registerUsers(session, user);
daoLogin.registerLogin(session, login);
FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Exito", "Datos insertados Exitosamente"));
transaction.commit();//cerrar transaccion
//esta forma limpiamos el formulario sin usar el js
user = new Usuarios();
user.setIdusuarios(null);
login = new Login();
login.setIdlogin(null);
} catch (Exception e) {
//verificamos sino hay ya una transaccion ya definida
if(transaction != null){
//si lo hay haremos que todo se revierta en la BD y que como estaba antes de utilizar este metodo
transaction.rollback();
}
FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_FATAL, "Error Fatal", "Contacte con su administrador "+e.getMessage()));
}finally{
//verificamos sino hay ya una session ya definida
if(session != null){
//si lo hay cerramos la session
session.close();
}
}
}
public Login getLogin() {
return login;
}
public void setLogin(Login login) {
this.login = login;
}
public Usuarios getUser() {
return user;
}
public void setUser(Usuarios user) {
this.user = user;
}
public List<Usuarios> getListUser() {
return listUser;
}
public void setListUser(List<Usuarios> listUser) {
this.listUser = listUser;
}
public String getConfirPassword() {
return confirPassword;
}
public void setConfirPassword(String confirPassword) {
this.confirPassword = confirPassword;
}
}
Y nuestra salida en el sistema debe quedar asi: