Vistas de página en total

martes, 9 de diciembre de 2014

Script para limpiar el formulario después de hacer una insercion

A la hora de hacer nuestro registro nuestro formulario debe quedar completamente vacio como toque profesional y para ello generamos un script como el siguiente:

function cleanForm(idform){
    /*estamos leyendo el documento mediante su id de form y el reset es para resetear nuestro form*/
    document.getElementById(idform).reset();
}


y posteriormente en nuestro managedBean agregamos una linea que servira para ejecutar nuestro script a la hora de hacer una insercion correcta quedaria asi:

public String registerUser() throws Exception {
        /*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 "/User/RegisterUser";
        }
        /*se agregar a la variable pass de la clase login el pass encriptado*/
        login.setPass(Encrypting.encrypting(login.getPass()));
        usersDAO daoUsers = new usersDAO();
        daoUsers.registerUsers(this.user);
        loginDAO daoLogin = new loginDAO();
        daoLogin.registerLogin(login);
        FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Exito", "Datos insertados Exitosamente"));
        /*ejecutamos el java script*/
        RequestContext.getCurrentInstance().execute("cleanForm('frmRegisterUser')");
        return "/User/RegisterUser";
    }

debemos tomar en cuenta que nuestro RequetsContext debe ser importado de org.primefaces.context.RequestContext, despues mandamos a llamar el script desde nuestro template  asi:

<h:head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
        <h:outputStylesheet name="./css/default.css"/>
        <h:outputStylesheet name="./css/cssLayout.css"/>
        <h:outputScript library="js" name="jsControllers.js"/>
    </h:head>

y al final la aplicacion debe quedar asi despues de insertar correctamente:



Mensajes de Alerta con primefaces

Este este post veremos como mandar los mensajes ya sea de alerta, de informacion o error dependiendo el caso o uso que se le vaya a dar, en este ejemplo tomare en cuenta el de un registro donde se validaran los passwords que sean los mismos.

primefaces tiene un tag que es p:messages en el parametro showDetails es para que se muestren los detalles, closable es para que podamos cerrar el mensaje   

<p:messages id="msjgral" showDetail="true" autoUpdate="true" closable="true"/> asi que nuestro formulario quedaria asi:

<h:form id="frmRegisterUser">
                    <p:messages id="msjgral" showDetail="true" autoUpdate="true" closable="true"/>
                    <h:panelGrid columns="2">
                        <h:outputText value="Nombre"/>
                        <p:inputText id="txtName" value="#{managedBeanUser.getUser().nombres}"/>
                        <h:outputText value="Apellido Paterno"/>
                        <p:inputText id="txtAp" value="#{managedBeanUser.getUser().ap}"/>
                        <h:outputText value="Apellido Materno" />
                        <p:inputText id="txtAm" value="#{managedBeanUser.getUser().am}"/>
                        <h:outputText value="Usuario" />
                        <p:inputText id="txtUser" value="#{managedBeanUser.getLogin().user}"/>
                        <h:outputText value="Contraseña" />
                        <p:password id="txtPass" value="#{managedBeanUser.getLogin().pass}"/>
                        <h:outputText value="Confirmar Contraseña" />
                        <p:password id="txtPassConfirm" value="#{managedBeanUser.confirPassword}"/>
                        <h:outputText value="E-Mail"/>
                        <p:inputText id="txtEmail" value="#{managedBeanUser.getUser().email}" size="39"/>
                        <h:outputText value="Direccion"/>
                        <p:inputText id="txtDireccion" value="#{managedBeanUser.getUser().direccion}" size="49"/>
                        <h:outputText value="Fecha de nacimiento"/>
                        <p:calendar value="#{managedBeanUser.getUser().fechaNacimiento}"/>
                        <h:outputText value="Sexo"/>
                        <p:selectOneRadio id="radSex" value="#{managedBeanUser.getUser().sexo}">
                            <f:selectItem itemLabel="Hombre" itemValue="H"/>
                            <f:selectItem itemLabel="Mujer" itemValue="M"/>
                        </p:selectOneRadio>
                        <p:commandButton id="btn1" value="Registrar" action="#{managedBeanUser.registerUser()}"/>
                    </h:panelGrid>
                </h:form>




Ahora modificaremos de nuevo nuestro managedBean y quedaria de la siguiente forma:

public String registerUser() throws Exception {
        /*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 "/User/RegisterUser";
        }
        /*se agregar a la variable pass de la clase login el pass encriptado*/
        login.setPass(Encrypting.encrypting(login.getPass()));
        usersDAO daoUsers = new usersDAO();
        daoUsers.registerUsers(this.user);
        loginDAO daoLogin = new loginDAO();
        daoLogin.registerLogin(login);
        FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Exito", "Datos insertados Exitosamente"));
        return "/User/RegisterUser";
    }


con esto obtendremos 2 tipos de mensajes uno como error y otro como informacion o exito



Encriptacion de datos

En las aplicaciones es habitual que haya todo tipo de sistemas en las que se genere u obtenga información personal del cliente o empleados, un ejemplo en un login se necesita del usuario y del password del usuario entonces se en-cripta el password en este caso para que se proteja la informacion para ello se realizara mediante una clase de java que se encarga de eso que es "SHA-512"

Se crea la clase para la encriptacion:

public class Encrypting {
    /*metodo que convertira una cadena en bytes*/
    public static String encrypting(String pass){
        /*clase que se encarga de la conversion al momento de recuperarlo y lo almacena en la variable sb*/
        StringBuilder sb = new StringBuilder();
     
        try{
            /*clase que se encarga de obtener la instancia de SHA512 y se llamara md*/
            MessageDigest md=MessageDigest.getInstance("SHA-512");
            /*md se encarga de leer los bytes de la variable pass*/
            md.update(pass.getBytes());
            /*creamos un array de bytes donde se almacenara el pass convertido*/
            byte[] mb=md.digest();
            /*se inicializa un ciclo for que se encargara de ir recorriendo hasta  terminar de encriptar el pass*/
            for(int i = 0; i < mb.length; i++){
                sb.append(Integer.toString((mb[i] & 0xff) + 0x100, 16).substring(1));
            }
            /*caturamos cualquier excepcion que llegue a suceder*/
        }catch(NoSuchAlgorithmException ex){
        }
        /*retornamos la encriptacion de bytes y la convertimos en cadena*/
        return sb.toString();
    }
}


una vez creada modificamos nuestro managedBean que habiamos creado en el post anterior en el metodo registerUser y quedaría de la siguiente forma:

public String registerUser() throws Exception {
        /*se agregar a la variable pass de la clase login el pass encriptado*/
        login.setPass(Encrypting.encrypting(login.getPass()));
        usersDAO daoUsers = new usersDAO();
        daoUsers.registerUsers(this.user);
        loginDAO daoLogin = new loginDAO();
        daoLogin.registerLogin(login);
        return "User/RegisterUser";
    }


Despues de correr la aplicacion y registrar los datos veremos en el campo pass de nuestra base de datos se almacena una cadena enorme y esa es la cadena de bytes (ecriptacion).



Insercion de Datos a 2 tablas en MySQL con Hibernate, JFS y primefaces

Se necesita tener conocimientos previos de java con frameworks jsf e hibernate y nocion de primefaces. Una vez creado el Formulario en JFS un ejemplo:



Nota: en el atributo value se pondra el managedBean para usar en el formulario el cual contiene los datos de los modelos  value="#{nombreBean.metodo().variable} en el atributo action se pondra el metodo que hace la insercion atravez de Hibernate action="#{nombreBean.metodo()}
en el hibernate.cfg.xml se pondra las propiedades para la conexion con la base de datos MySQL y el mapeo de los modelos se genera automaticamente despues de crear los pojos ejemplo:

lo siguiente es hacer la reingeniera inversa para hacer el filtro de las tablas con la aplicacion web y quedaria un codigo como el siguiente:

<hibernate-reverse-engineering>  <schema-selection match-catalog="inee"/>  <table-filter match-name="perfil"/>  <table-filter match-name="usuarios"/>  <table-filter match-name="login"/>  <table-filter match-name="recursos"/></hibernate-reverse-engineering>


Luego creamos los pojos solo se podran crear si ya tenemos la reingenieria inversa creada en nuestro proyecto debe quedar asi:

Se crean las clases o modelos y los archivos xml por parte de Hibernate ahora creamos los DAO necesarios en este caso 2 porque insertaremos en 2 tablas de MySQL
Dao User

public class usersDAO implements FrondEndUser{    private Session session;       @Override    public boolean registerUsers(Usuarios user) throws Exception {        //iniciar la session de conexion con hibernate y abrimos la sesion de conexion a la bd
        session = HibernateUtil.getSessionFactory().openSession();        //creamos la transaccion y la comenzamos        Transaction transaction = session.beginTransaction();        session.save(user);//guardar los datos        transaction.commit();//cerrar transaccion         session.close();//cierra la sesion
        return true;    } }


Dao Login

public class loginDAO implements FrondEndLogin{    private Session session;       @Override    public boolean registerLogin(Login login) throws Exception {         //iniciar la session de conexion con hibernate y abrimos la sesion de conexion a la bd
        session = HibernateUtil.getSessionFactory().openSession();        //creamos la transaccion y la comenzamos        Transaction transaction = session.beginTransaction();        session.save(login);//guardar los datos        transaction.commit();//cerrar transaccion         session.close();//cierra la sesion        return true;    }}


Estas 2 clases debes ser implementadas por sus interfaces o frondend

frondend user

public interface FrondEndUser {    public boolean registerUsers(Usuarios user) throws Exception;    public List<Usuarios> listUsers() throws Exception;    public Usuarios updateUsers(int id) throws Exception;    public Usuarios deleteUsers(int id) throws Exception;}

frondend login

public interface FrondEndLogin {    public boolean registerLogin(Login login) throws Exception;    public Login updateLogin (int id) throws Exception;    public Login deleteLogin (int id) throws Exception;}

crearemos el managedBean para hacer el control algo asi como un servlet en el sentido de controlador ejemplo:

@ManagedBean@RequestScopedpublic class ManagedBeanUser {    private Usuarios user;    private Login login;    public List<Usuarios> listUser;//    private String confirPassword;       public ManagedBeanUser() {        user = new Usuarios();        user.setIdusuarios(null);        login = new Login();        login.setIdlogin(null);    }       public String registerUser() throws Exception {        usersDAO daoUsers = new usersDAO();        daoUsers.registerUsers(this.user);        loginDAO daoLogin = new loginDAO();        daoLogin.registerLogin(login);        return "User/RegisterUser";    }    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;
    }}

y probamos en la salida de consola debe  decir esto:

Información:   Hibernate: insert into inee.usuarios (nombres, ap, am, email, direccion, fechaNacimiento, sexo) values (?, ?, ?, ?, ?, ?, ?)Información:   Hibernate: insert into inee.login (user, pass) values (?, ?)


quiere decir que la insercion se realizo exitosamente :) :D saludos...