Vistas de página en total

martes, 30 de diciembre de 2014

Almacenar archivos al servidor y guardar los datos con MySQL y PostgreSQL

Aquí utilizaremos el framework jsf, hibernate, primefaces básicamente sera crear un formulario para que el usuario pueda guardar en este caso una imagen ya que en el proyecto en el cual estoy me piden esto y bueno a mi punto de vista me costo trabajo y que mejor que guardarlo y tenerlo presente jeje.

Como decía se almacenara la imagen en el servidor en la ruta especifica y en este caso los datos se almacenaran en la BD que seria la ruta, nivel educativo, año, y etiquetas para esto primefaces nos facilita de alguna manera esto ok  el formulario que pida la información del archivo ojo son 2 proyectos diferentes

Creamos la configuración de Hibernate en MySQL:

<hibernate-configuration>
  <session-factory>
    <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
    <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
    <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/ejem?zeroDateTimeBehavior=convertToNull</property>
    <property name="hibernate.connection.username">root</property>
    <property name="hibernate.connection.password">061090</property>
    <property name="hibernate.current_session_context_class">thread</property>
    <property name="hibernate.show_sql">true</property>
//esto se genera automaticamente despues de crear los pojos
    <mapping resource="com/davho/models/Recurso.hbm.xml"/>
  </session-factory>
</hibernate-configuration>


Creamos la configuración de Hibernate en PostgreSQL:

<hibernate-configuration>
  <session-factory>
    <property name="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</property>
    <property name="hibernate.connection.driver_class">org.postgresql.Driver</property>
    <property name="hibernate.connection.url">jdbc:postgresql://localhost:5432/ejem</property>
    <property name="hibernate.connection.username">postgres</property>
    <property name="hibernate.connection.password">061090</property>
    <property name="hibernate.current_session_context_class">thread</property>
    <property name="hibernate.show_sql">true</property>
//esto se genera automaticamente despues de crear los pojos
    <mapping resource="com/davho/models/Video.hbm.xml"/>
  </session-factory>
</hibernate-configuration>


Despues de esto se hace la reingenieria inversa para filtrar las tablas de la BD que vamos a usar que se hace mediante el asistente ok ojo para el postgres el match-schema debe ser publico sino no filtrara las tablas de la BD debe quedar asi match-schema="public"

Despues creamos los pojos de ambos proyectos y se creara tambien los modelos una vez realizado esto en mi caso creo los interfaces para implementarlos en el DAO necesario y deben quedar asi, para ambos:

public interface FrondEndResource {
    public boolean registerResource(Session session, Recurso resource) throws Exception;
}

el Dao para este caso en ambos proyectos seria:

public class RecursoDAO implements FrondEndResource{
    @Override
    public boolean registerUsers(Session session, Recurso resource) throws Exception {
        session.save(resource);
        return true;
    }
   
}


y bueno finalmente el ManagedBean para el caso de MySQL seria asi:

ManagedBean
@RequestScoped
public class ManagedBeanResource{
    private Session session;
    private Transaction transaction;
    private Recurso recurso;
    private String destino = "C:\\INEE\\BankImage\\";
    private UploadedFile file;
    private Recurso resource;
   
    public ManagedBeanResource() {
        recurso = new Recurso();
        recurso.setId(null);
    }
   
    /*metodo para registrar los datos del archivo en la base de datos de MySQL*/
    public void registerUser(){
        /*inicializamos para asegurarnos*/
        this.session = null;
        this.transaction = null;
     
        try {            
             //abrimos sesion de conexcion
             session = HibernateUtil.getSessionFactory().openSession();
             //creamos la transaccion y la comenzamos
             transaction = session.beginTransaction();
             /*instanciamos los objetos*/
             /*creamos el dao que utilizaremos*/
             RecursoDAO rDAO = new RecursoDAO();
             recurso.setRuta(destino+getFile().getFileName());
             rDAO.registerUsers(session, recurso);
             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
             recurso = new Recurso();
             recurso.setId(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();
            }
        }
     
    }
    /*metodo que sirve para crear el archivo seleccionado mediante un flujo de bytes y almacenarlo en la ruta y con el nombre */
    public void transferir(String fileName, InputStream in) {
        try {
            //creamos el arhivo que saldra de la aplicacion
            OutputStream o = new FileOutputStream(new File(destino + fileName));
            //iniciamos un valor
            int reader = 0;
            //recibimos el tamaño del archivo que se va a crear
            byte[] bytes = new byte [(int) getFile().getSize()];
            //generamos un ciclo while que cree el archivo mientras el tamaño no sea menor a -1 byte
            while((reader = in.read(bytes)) != -1){
                //guardamos o escribimos el archivo
                o.write(bytes, 0, reader);
            }
            in.close();
            o.flush();
            o.close();
           
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
       
    }
   
    /*metodo encargado de seleccionar el archivo y restringuiendo que solo sea jpg*/
    public void upload() throws Exception {
        //variable de validar extencion
        String txtValidador;
        //condicional si se obtuvo o no un archivo
        if(getFile() != null){
            //si hay archivo guardar el nombre del archivo en una variable
            String ext = getFile().getFileName();
            //si se obtuve o no el nombre del archivo seleccionado
            if(ext != null){
                //si se obtuvo la variable de extencion obtendra mediante un substring del nombre del archivo que despues del (".") seleccione los caracteres
                txtValidador = ext.substring(ext.indexOf(".")+1);
            }else{
                //sino obtuvo el nombre del archivo se le asigna null
                txtValidador = "null";
            }
            //validar si despues del (".") la extencion permitida sea jpg
            if(txtValidador.equals("jpg")){
                //si es asi genereamos un try catch porque accederemos a algo que esta afuera de la maquina virtual de java
                try {
                    //mandamos a llamar el metodo con los parametros de entrada que pide
                    transferir(getFile().getFileName(), getFile().getInputstream());
                //si falla    
                } catch (Exception e) {
                    //mandamos un mensaje de error
                    Logger.getLogger(ManagedBeanResource.class.getName()).log(Level.SEVERE, null, e);
                    FacesContext context = FacesContext.getCurrentInstance();
                    context.addMessage(null, new FacesMessage("Error","No se subio el archivo"));
                }
             //despues de transferir el archivo mostramos los datos de dicho archivo en un FacesContext para visualizarlo
             FacesContext context = FacesContext.getCurrentInstance();
             context.addMessage(null, new FacesMessage("Exito", "Archivo: " + getFile().getFileName() + " subido al servidor \n\n Tipo de Archivo: " +
                     getFile().getContentType() + "\n\n Tamaño del archivo: " + getFile().getSize() + " bytes , con destino a: " +destino+getFile().getFileName()));  
            }else{
                //mandar mensaje de error si no se selecciono un jpg
                FacesContext context = FacesContext.getCurrentInstance();
                context.addMessage(null, new FacesMessage("Error", "Solo archivos con extencion .jpg"));
            }
        }else{
            //mandar mensaje de que no se selecciono ningun archivo
            FacesContext context = FacesContext.getCurrentInstance();
            context.addMessage(null, new FacesMessage("Error", "No hay archivo seleccionado"));
        }
       
    }
   
    public UploadedFile getFile() {
        return file;
    }
    public void setFile(UploadedFile file) {
        this.file = file;
    }
    public String getDestino() {
        return destino;
    }
    public void setDestino(String destino) {
        this.destino = destino;
    }
    public Recurso getResource() {
        return resource;
    }
    public void setResource(Recurso resource) {
        this.resource = resource;
    }
   
    public Recurso getRecurso() {
        return recurso;
    }
    public void setRecurso(Recurso recurso) {
        this.recurso = recurso;
    }
}

y el ManagedBean para PostgreSQL seria:

@ManagedBean
@RequestScoped
public class ManagedBeanResource{
    private Session session;
    private Transaction transaction;
    private Video recurso;
    private String destino = "C:\\INEE\\BankImage\\";
    private UploadedFile file;
    private Video resource;
   
    public ManagedBeanResource() {
        recurso = new Video();
    }
   
    public void registerUser(){
        /*inicializamos para asegurarnos*/
        this.session = null;
        this.transaction = null;
     
        try {            
             //abrimos sesion de conexcion
             session = HibernateUtil.getSessionFactory().openSession();
             //creamos la transaccion y la comenzamos
             transaction = session.beginTransaction();
             /*instanciamos los objetos*/
             /*creamos el dao que utilizaremos*/
             RecursoDAO rDAO = new RecursoDAO();
             recurso.setRuta(destino+getFile().getFileName());
             rDAO.registerUsers(session, recurso);
             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
             recurso = new Video();
        } 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();
            }
        }
     
    }
   
     /*metodo que sirve para crear el archivo seleccionado mediante un flujo de bytes y almacenarlo en la ruta y con el nombre */
    public void transferir(String fileName, InputStream in) {
        try {
            //creamos el arhivo que saldra de la aplicacion
            OutputStream o = new FileOutputStream(new File(destino + fileName));
            //iniciamos un valor
            int reader = 0;
            //recibimos el tamaño del archivo que se va a crear
            byte[] bytes = new byte [(int) getFile().getSize()];
            //generamos un ciclo while que cree el archivo mientras el tamaño no sea menor a -1 byte
            while((reader = in.read(bytes)) != -1){
                //guardamos o escribimos el archivo
                o.write(bytes, 0, reader);
            }
            in.close();
            o.flush();
            o.close();
           
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
       
    }
   
    /*metodo encargado de seleccionar el archivo y restringuiendo que solo sea jpg*/
    public void upload() throws Exception {
        //variable de validar extencion
        String txtValidador;
        //condicional si se obtuvo o no un archivo
        if(getFile() != null){
            //si hay archivo guardar el nombre del archivo en una variable
            String ext = getFile().getFileName();
            //si se obtuve o no el nombre del archivo seleccionado
            if(ext != null){
                //si se obtuvo la variable de extencion obtendra mediante un substring del nombre del archivo que despues del (".") seleccione los caracteres
                txtValidador = ext.substring(ext.indexOf(".")+1);
            }else{
                //sino obtuvo el nombre del archivo se le asigna null
                txtValidador = "null";
            }
            //validar si despues del (".") la extencion permitida sea jpg
            if(txtValidador.equals("jpg")){
                //si es asi genereamos un try catch porque accederemos a algo que esta afuera de la maquina virtual de java
                try {
                    //mandamos a llamar el metodo con los parametros de entrada que pide
                    transferir(getFile().getFileName(), getFile().getInputstream());
                //si falla    
                } catch (Exception e) {
                    //mandamos un mensaje de error
                    Logger.getLogger(ManagedBeanResource.class.getName()).log(Level.SEVERE, null, e);
                    FacesContext context = FacesContext.getCurrentInstance();
                    context.addMessage(null, new FacesMessage("Error","No se subio el archivo"));
                }
             //despues de transferir el archivo mostramos los datos de dicho archivo en un FacesContext para visualizarlo
             FacesContext context = FacesContext.getCurrentInstance();
             context.addMessage(null, new FacesMessage("Exito", "Archivo: " + getFile().getFileName() + " subido al servidor \n\n Tipo de Archivo: " +
                     getFile().getContentType() + "\n\n Tamaño del archivo: " + getFile().getSize() + " bytes , con destino a: " +destino+getFile().getFileName()));  
            }else{
                //mandar mensaje de error si no se selecciono un jpg
                FacesContext context = FacesContext.getCurrentInstance();
                context.addMessage(null, new FacesMessage("Error", "Solo archivos con extencion .jpg"));
            }
        }else{
            //mandar mensaje de que no se selecciono ningun archivo
            FacesContext context = FacesContext.getCurrentInstance();
            context.addMessage(null, new FacesMessage("Error", "No hay archivo seleccionado"));
        }
       
    }
   
    public UploadedFile getFile() {
        return file;
    }
    public void setFile(UploadedFile file) {
        this.file = file;
    }
    public String getDestino() {
        return destino;
    }
    public void setDestino(String destino) {
        this.destino = destino;
    }
    public Video getResource() {
        return resource;
    }
    public void setResource(Video resource) {
        this.resource = resource;
    }
   
    public Video getRecurso() {
        return recurso;
    }
    public void setRecurso(Video recurso) {
        this.recurso = recurso;
    }
   
}





Como crear una carpeta directamente de java muy fácil!!!!

Bueno aquí daré un pequeño tema para la creación de carpetas donde mandaremos algunos archivos en mi caso en el proyecto donde estoy era necesario crear carpetas para subir los archivos ubicando las directamente en la carpeta especifica bueno es algo muy simple ok:

Necesitaremos utilizar la biblioteca IO de java para usar esta clase File que contiene 2 atributos importantes que debo mencionar y que a mi punto de vista resalta mas.

1. mkdir: se encarga de verificar si existe o no el archivo ("Carpeta") en caso de que no la crea
2. mkdis: es básicamente lo mismo pero con la diferencia de que si existe o no lo creara.

En este caso solo utilizare la primera MKDIR, en este caso no le daré una ruta especifica de donde quiero crear la carpeta sino mas bien que la cree dentro del mismo proyecto.

En la imagen veremos que dentro del proyecto estas las carpetas creadas de manera automática.


Ahora ejecutamos el proyecto para crear una carpeta, asignamos un nombre y verificamos que se haya creado.




Aquí esta el código:

public static void main(String[] args) {
        //variable
        String nombre;
        //le asignamos un valor a la variable nombre para la carpeta mediante JOptionPane que muestre una ventana
        nombre = JOptionPane.showInputDialog("Nombre a la Carpeta");
        //se instancia la carpeta y se le asgina el nombre
        File carpeta = new File(nombre);
        //se verifica si la carpeta existe o no y la crea en caso de que no exista
        carpeta.mkdir();
    }




martes, 16 de diciembre de 2014

Actualización de datos

Ahora haremos que el usuario realize una modificacion a sus datos, siempre y cuando haya un errror en ellos puede que el nombre se escribio mal o falto algo asi que lo que haremos sera que cuando se oprima el boton de actualizar carge un cuadro de dialogo con los datos actuales del usuario y con la facilidad de correguirlos y una vez hecho esto en el boton del dialogo sera que actualizara no solo los datos sino tambien el formulario donde se muestra la informacion del usuario para evitarnos el F5 o actualizar la pagina sino que lo hara de manera automatica.

Para ello modificaremos primero nuestro frondend de usuario y el dao respectivamente y quedarian asi:

public interface FrondEndUser {
    public boolean registerUsers(Session session, Usuarios user) throws Exception;
    public List<Usuarios> listAllUsers(Session session) throws Exception;
    public boolean updateUsers(Session session, Usuarios user) throws Exception;
    public Usuarios deleteUsers(int id) throws Exception;
    public Usuarios getByEmail(Session session, String email) throws Exception;
    public Usuarios getByUserName(Session session, String name) throws Exception;
}


El metodo en el dao es el siguiente:

   @Override
    public boolean updateUsers(Session session, Usuarios user) throws Exception {
        //agregamos la session para la actualizacion de los datos con los parametros
        session.update(user);
        //retornamos
        return true;
    }


Despues modificaremos el managedBean con el metodo de actualizar:

    public void updateUser(){
        /*inicializamos para asegurarnos*/
        this.session = null;
        this.transaction = null;
     
        try {
             /*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();
             /*instanciamos los objetos*/
             usersDAO daoUsers = new usersDAO();
             /*mandamos a llamar los metodos que utilizaremos*/
             daoUsers.updateUsers(session, user);
             FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Exito", "Datos actualizados Exitosamente"));
             transaction.commit();//cerrar transaccion
             //esta forma limpiamos el formulario sin usar el js
             user = new Usuarios();
             user.setIdusuarios(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();
            }
        }
     
    }

y en el formulario de Datos personales debe quedar asi:

<h2>Mis datos</h2>
                <hr />
                <h:form id="formDataUser">
                    <p:growl id="msjGral" showDetail="true" sticky="false" />
                    <p:dataTable id="tablaTUsuario" var="item" value="#{managedBeanUser.byUserNamel}" paginator="false" rows="1">  
                        <p:column headerText="Nombre">
                            <h:outputText value="#{item.nombres}"/>
                        </p:column>
                        <p:column headerText="Apellido paterno">
                            <h:outputText value="#{item.ap}"/>
                        </p:column>
                        <p:column headerText="Apellido materno">
                            <h:outputText value="#{item.am}"/>
                        </p:column>
                        <p:column headerText="Correo electrónico">
                            <h:outputText value="#{item.email}"/>
                        </p:column>
                        <p:column headerText="Fecha de nacimiento">
                            <h:outputText value="#{item.fechaNacimiento}"/>
                        </p:column>
                        <p:column headerText="Sexo">
                            <h:outputText value="#{item.sexo}"/>
                        </p:column>
                        <p:column headerText="Direccion">
                            <h:outputText value="#{item.direccion}"/>
                        </p:column>
                        <p:column headerText="">
                            <p:commandButton value="Actualizar datos" onclick="PF('dialogEditUser').show()"/>
                        </p:column>
                    </p:dataTable>
                   
                    <p:dialog header="Datos del usuario" widgetVar="dialogEditUser" modal="true">
                        <h:panelGrid columns="3">
                            <p:outputLabel value="Nombre" for="txtNombre"/>
                            <p:inputText id="txtNombre" label="Nombre" value="#{managedBeanUser.user.nombres}">
                                <f:validator validatorId="ValidateEmptyFields"/>
                            </p:inputText>
                            <p:message for="txtNombre"/>
                            <p:outputLabel value="Apellido paterno" for="txtApellidoPaterno"/>
                            <p:inputText id="txtApellidoPaterno" label="Apellido paterno"  value="#{managedBeanUser.user.ap}">
                                <f:validator validatorId="ValidateEmptyFields"/>
                            </p:inputText>
                            <p:message for="txtApellidoPaterno"/>
                            <p:outputLabel value="Apellido materno" for="txtApellidoMaterno"/>
                            <p:inputText id="txtApellidoMaterno" label="Apellido materno" value="#{managedBeanUser.user.am}">
                                <f:validator validatorId="ValidateEmptyFields"/>
                            </p:inputText>
                            <p:message for="txtApellidoMaterno"/>
                            <p:outputLabel for="perfile" value="Perfil" />
                            <p:selectOneMenu id="perfile" value="#{managedBeanUser.getUser().perfil}" style="width:125px">
                                <f:selectItem itemLabel="Seleccionar" itemValue="" />
                                <f:selectItem itemLabel="Administrador" itemValue="Administrador" />
                                <f:selectItem itemLabel="Empleado" itemValue="Empleado" />
                                <f:selectItem itemLabel="Externo" itemValue="Externo" />
                            </p:selectOneMenu>
                            <h:panelGroup></h:panelGroup>
                            <p:outputLabel value="Correo electrónico" for="txtCorreoElectronico"/>
                            <p:inputText id="txtCorreoElectronico" label="Correo electrónico" title="Ejem: username@dominio.com" value="#{managedBeanUser.user.email}">
                                <f:validator validatorId="ValidateEmptyFields"/>
                                <f:validator validatorId="ValidateEmail"/>
                            </p:inputText>
                            <h:panelGroup>
                                <p:tooltip for="txtCorreoElectronico" showEvent="focus" hideEvent="blur"/>
                                <p:message for="txtCorreoElectronico"/>
                            </h:panelGroup>
                            <p:outputLabel value="Fecha de Nacimiento" for="txtFechaNacimiento"/>
                            <p:calendar id="txtFechaNacimiento" label="Fecha de nacimiento" showOn="button" title="Ejemplo: dd/mm/yyyy" value="#{managedBeanUser.user.fechaNacimiento}" pattern="dd/MM/yyyy" required="true" requiredMessage="Fecha de nacimiento es requerido"/>
                            <p:message for="txtFechaNacimiento"/>
                            <h:outputLabel value="Sexo" for="radSex"/>
                            <p:selectOneRadio id="radSex" label="Sexo" value="#{managedBeanUser.getUser().sexo}">
                                <f:selectItem itemLabel="Hombre" itemValue="H"/>
                                <f:selectItem itemLabel="Mujer" itemValue="M"/>
                            </p:selectOneRadio>
                            <h:panelGroup></h:panelGroup>
                            <h:panelGroup></h:panelGroup>
                            <p:commandButton value="Guardar cambios"  actionListener="#{managedBeanUser.updateUser()}" update="formDataUser"/>
                        </h:panelGrid>
                    </p:dialog>                
                </h:form>


Finalmente queda asi corriendo:





Consultar Datos a la hora de iniciar sesion

En esta parte realizaremos un formulario donde usuario pueda ver sus datos a la hora de iniciar sesion asi que realizaremos lo siguiente no sin antes mencionar que eh cambiado parte del codigo esto fue porque ya saben el cliente dice una cosa y quiere otra jejeje.

Creamos un nuevo metodo en el managedBeanUser y ya no hay managedBeanLogin lo quite como lo antes mencione asi que deberia quedar asi el bean:

public Usuarios getByUserNamel(){  
        /*inicializamos para asegurarnos*/
        session = null;
        transaction = null;
       
        try {
            /*instanciamos los objetos*/
             usersDAO daoUsers = new usersDAO();
             //abrimos sesion de conexcion
             session = HibernateUtil.getSessionFactory().openSession();
             //creamos la transaccion y la comenzamos
             transaction = session.beginTransaction();
             //sesion para recuperar las url que van llegando y hacer la comparacion
             HttpSession sessionUser = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(true);          
             //pasamos la session al objecto con sus parametros de session y la sessionUser con el atributo del bean de session haciendo un casting a String
             user = daoUsers.getByUserName(session,sessionUser.getAttribute("userName").toString());          
             transaction.commit();//cerrar transaccion
             //retornamos
             return user;
        } 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()));
             return null;
        }finally{
            //verificamos sino hay ya una session ya definida
            if(session != null){
                //si lo hay cerramos la session
                session.close();
            }
        }
    }


Creamos un una pagina enlazada con el template que tenemos hecho y debe quedar asi:

<h2>Mis datos</h2>
                <hr />
                <h:form id="formDataUser">
                    <p:growl id="msjGral" showDetail="true" sticky="false" />
                    <p:dataTable id="tablaTUsuario" var="item" value="#{managedBeanUser.byUserNamel}" paginator="false" rows="1">  
                        <p:column headerText="Nombre">
                            <h:outputText value="#{item.nombres}"/>
                        </p:column>
                        <p:column headerText="Apellido paterno">
                            <h:outputText value="#{item.ap}"/>
                        </p:column>
                        <p:column headerText="Apellido materno">
                            <h:outputText value="#{item.am}"/>
                        </p:column>
                        <p:column headerText="Correo electrónico">
                            <h:outputText value="#{item.email}"/>
                        </p:column>
                        <p:column headerText="Fecha de nacimiento">
                            <h:outputText value="#{item.fechaNacimiento}"/>
                        </p:column>
                        <p:column headerText="Sexo">
                            <h:outputText value="#{item.sexo}"/>
                        </p:column>
                        <p:column headerText="Direccion">
                            <h:outputText value="#{item.direccion}"/>
                        </p:column>
                        <p:column headerText="">
                            <p:commandButton value="Actualizar datos" onclick="PF('dialogoEditarUsuario').show()"/>
                        </p:column>
                    </p:dataTable>                  
                </h:form>


y una vez iniciado session se mostraran los datos del usuario:


lunes, 15 de diciembre de 2014

Url´s permitidas sin inicio de sesion

En las apliacaciones web habra paginas en donde el usuario podra accesar sin la necesidad de tener una sesion inicializada esto mas que nada por publicidad. ¿Porque? simple primero por publicidad debes mostrar y atrapar al cliente solo mostrando poca informacion y una vez cautivado el usuario debe registrarse e iniciar sesion para poder visualizar todo jeje asi que manos a la obra, en este caso teniamos que solo el home esta habilitado pero no el formulario para que se puedan registrar asi que modificaremos un poco nuestra clase de filtro de url y quedara asi:

//definimos a que url se va aplicar la restricción en este caso a todas las peticiones url
@WebFilter("*.xhtml")
//implementamos el filtro de servlet y agremos los metodos abstractos
public class SessionUrlFliters implements Filter{
    //agregamos una variable filterConfig
    FilterConfig fc;
           
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        //hacemos que la variable sea igual al filter config que recibe del index o home
        fc = filterConfig;
    }
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        /*restriccion de urls*/
        //agregamos el httpservletrequest haciendolo un casting e igualando al request que recibe como parametro de doFilter
        HttpServletRequest req = (HttpServletRequest) request;
        //agregamos el httpservletresponse haciendolo un casting e igualando al response que recibe como parametro de doFilter
        HttpServletResponse res = (HttpServletResponse) response;
        //sesion para recuperar las url que van llegando y hacer la comparacion
        HttpSession session = req.getSession(true);
        //variable para recibir la url de la peticion que sera igualado la variable req
        String reqUrl = req.getRequestURL().toString();
        //variable de acceso para loguearse en el sistema aqui pueden ir todas las url para accesar sin necesidad de comenzar sesion
        //y por ende sera un array
        String [] urlPermissions = new String[]{
            //definimos el index o home (pagina de inicio)
            "/faces/home.xhtml",
            //definimos el formulario
            "/faces/User/RegisterUser.xhtml"
        };
        //hacemos la condicional el cual modificaremos en el Bean y la variable donde esta el url es diferente a la consecuencia
        if(session.getAttribute("userName") == null){
            //agregamos una variable para la redirreccion de tipo booleano
            boolean redirectionRequets = true;
            //comprobacion en un bucle for de las url permitidas sin sesion
            for(String item : urlPermissions){
                //si contiene el item que son las url permitidas sin sesion
                if(reqUrl.contains(item)){
                    //hacer la variable redirectionRequets falsa
                    redirectionRequets = false;
                    //una vez hecho esto finalizamos el ciclo for
                    break;
                }
            }
            //hacemos la redireccion hacia home.xhtml desde la raiz y concatenamos
            if(redirectionRequets){
                res.sendRedirect(req.getContextPath()+"/faces/home.xhtml");
            }else{
                //permitimos la direccion
                chain.doFilter(request, response);
            }
        }else{
            //permitimos la direccion
            chain.doFilter(request, response);
        }
    }
    @Override
    public void destroy() {
        //borramos el filter config
        fc=null;
    }
   
}


Asi tenemos habilitado el formulario para los registros.

jueves, 11 de diciembre de 2014

Restricciones a la url

Pondremos en practica las restricciones a la url de la manera mas facil o sencilla posible pero eficiente. Suele pasar que en cualquier pagina o aplicacion debemos registranos y acceder a las demas paginas o datos pero si una aplicacion o sistema web no tiene restricciones cualquiera que este registrado o no puede acceder con simple facilidad y eso es algo inseguro y poco profesional asi que implementaremos una clase que haga las restricciones como sabran las lineas estan documentadas para su entendimiento no cabe recalcar que deben tener conocimientos previos de estos tipos de temas para su mejor entendimiento dicho esto agreamos la clase y quedara asi:

//definimos a que url se va aplicar la restriccion en este caso a todas las peticiones url
@WebFilter("*.xhtml")
//implementamos el filtro de servlet y agremos los metodos abstractos
public class SessionUrlFliters implements Filter{
    //agregamos una variable filterConfig
    FilterConfig fc;
           
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        //hacemos que la variable sea igual al filter config que recibe del index o home
        fc = filterConfig;
    }
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        /*restriccion de urls*/
        //agregamos el httpservletrequest haciendolo un casting e igualando al request que recibe como parametro de doFilter
        HttpServletRequest req = (HttpServletRequest) request;
        //agregamos el httpservletresponse haciendolo un casting e igualando al response que recibe como parametro de doFilter
        HttpServletResponse res = (HttpServletResponse) response;
        //sesion para recuperar las url que van llegando y hacer la comparacion
        HttpSession session = req.getSession(true);
        //variable para recibir la url de la peticion que sera igualado la variable req
        String reqUrl = req.getRequestURL().toString();
        //hacemos la condicional el cual modificaremos en el Bean y la variable donde esta el url es diferente a la consecuencia
        if(session.getAttribute("userName") == null && ! reqUrl.contains("home.xhtml")){
            //hacemos la redireccion hacia home.xhtml desde la raiz y concatenamos
            res.sendRedirect(req.getContextPath()+"/faces/home.xhtml");
        }else{
            //permitimos la direccion
            chain.doFilter(request, response);
        }
    }
    @Override
    public void destroy() {
        //borramos el filter config
        fc=null;
    }
   
}


Y el managedBean se modificara y quedara asi:

@ManagedBean
@SessionScoped
public class ManagedBeanSesionLogin implements Serializable{
    private String userName;
    private String userPass;
    private Login login;
    private Session session;
    private Transaction transaction;
   
    public ManagedBeanSesionLogin() {
        //daremos un tiempo para la sesion si pasa del tiempo establecido se cerrara y haciendo el casting
        HttpSession timerSession = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(true);
        //tiempo de espera
        timerSession.setMaxInactiveInterval(300);
    }
   
    public String beginSession(){
        /*inicializamos para asegurarnos*/
        session = null;
        transaction = null;
       
        try {
            /*instanciamos los objetos*/
             loginDAO daoLogin = new loginDAO();
             //abrimos sesion de conexcion
             session = HibernateUtil.getSessionFactory().openSession();
             //creamos la transaccion y la comenzamos
             transaction = session.beginTransaction();
             //intanciamos el objeto
             Login login = daoLogin.getByUserName(session, userName);
             //valida si es que existe el usuario
             if(login != null){
                 //valida que la contraseña sea la misma
                 if(login.getPass().equals(Encrypting.encrypting(userPass))){
                     //creamos una session de http para los filtros de url no pude implementarlo de otra manera
                     HttpSession httpS = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(true);
                     //agregamos el atributo a la variable
                     httpS.setAttribute("userName", userName);
                     //si todo es valido manda a la pagina
                     return "/User/viewAll";
                 }
             }          
             transaction.commit();//cerrar transaccion
             userName = null;
             userPass = null;
             //mandar mensaje de error de datos
             FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error de Acceso", "Datos Incorecctos"));
             //retornar
             RequestContext.getCurrentInstance().execute("cleanForm('loginForm')");
             return "/home";
        } 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()));
             login = new Login();
             return null;
        }finally{
            //verificamos sino hay ya una session ya definida
            if(session != null){
                //si lo hay cerramos la session
                session.close();
            }
        }
    }
    public String closeSession() {
        userName = null;
        userPass = null;
         //creamos una session de http para los filtros de url no pude implementarlo de otra manera
         HttpSession httpS = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(true);
         //borramos las session almacenadas
         httpS.invalidate();
        return "/home";
    }
   
    public String getUserName() {
        return userName;
    }
    public void setUserName(String userName) {
        this.userName = userName;
    }
    public String getUserPass() {
        return userPass;
    }
    public void setUserPass(String userPass) {
        this.userPass = userPass;
    }  
}


Listo así nadie podrá redirigirse a otra pagina que no sea home siempre y cuando no haya inicialisado session

Cerrar Sesion por tiempo de expiracion

Ahora vamos hacer que la aplicación después de un cierto tiempo (5 min. exactos) se cierre la sesión por cuestiones de seguridad y para esto prácticamente no es mucho solo son escasas 2 lineas obviamente algo sencillo porque si nos adentráramos mas afondo sobre seguridad llevaría bastante tiempo, así que manos a la obra, modificaremos el managedBean de login ok así que el constructor que tiene sin nada inicializado agregamos esto:

public ManagedBeanSesionLogin() {
        //daremos un tiempo para la sesion si pasa del tiempo establecido se cerrara y haciendo el casting
        HttpSession timerSession = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(true);
        //tiempo de espera
        timerSession.setMaxInactiveInterval(300);
    }


O en el web.xml se puede hacer tambien y esto es todo por el momento.

Inicio y Cierre de Sesion con Hibernate, JSF con Primefaces

Ahora en esta parte del blog hablare mas de lo que se necesita para un inicio de sesión y cierre de sesión de acuerdo tendremos que interactuar con nuestra interfaz o frondend de login al cual debe quedar así:

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;
}

Modificamos el login Dao

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;
    }
   
}


Para este caso crearemos un nuevo ManagedBean y debe quedar como el siguiente al cual implementamos 2 métodos el de iniciar sesión y cerrar sesión:

@ManagedBean
@SessionScoped
public class ManagedBeanSesionLogin implements Serializable{
    private String userName;
    private String userPass;
    private Login login;
    private Session session;
    private Transaction transaction;
   
    public ManagedBeanSesionLogin() {
    }
   
    public String beginSession(){
        /*inicializamos para asegurarnos*/
        session = null;
        transaction = null;
       
        try {
            /*instanciamos los objetos*/
             loginDAO daoLogin = new loginDAO();
             //abrimos sesion de conexcion
             session = HibernateUtil.getSessionFactory().openSession();
             //creamos la transaccion y la comenzamos
             transaction = session.beginTransaction();
             //intanciamos el objeto
             Login login = daoLogin.getByUserName(session, userName);
             //valida si es que existe el usuario
             if(login != null){
                 //valida que la contraseña sea la misma
                 if(login.getPass().equals(Encrypting.encrypting(userPass))){
                     //si todo es valido manda a la pagina
                     return "/User/viewAll";
                 }
             }          
             transaction.commit();//cerrar transaccion
             userName = null;
             userPass = null;
             //mandar mensaje de error de datos
             FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error de Acceso", "Datos Incorecctos"));
             //retornar
             RequestContext.getCurrentInstance().execute("cleanForm('loginForm')");
             return "/home";
        } 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()));
             login = new Login();
             return null;
        }finally{
            //verificamos sino hay ya una session ya definida
            if(session != null){
                //si lo hay cerramos la session
                session.close();
            }
        }
    }
    public String closeSession() {
        userName = null;
        userPass = null;
        return "/home";
    }
   
    public String getUserName() {
        return userName;
    }
    public void setUserName(String userName) {
        this.userName = userName;
    }
    public String getUserPass() {
        return userPass;
    }
    public void setUserPass(String userPass) {
        this.userPass = userPass;
    } 


creamos en nuestra pagina que tengamos como inicio o index el formulario y es el siguiente en la parte del content del template:

         <h:form id="loginForm">
                    <p:growl id="growl" sticky="true" showDetail="true" life="3000" />
                        <p:dialog header="Iniciar Sesion INEE" modal="true" widgetVar="dlg" resizable="false" showEffect="explode" showHeader="explode">
                            <h:panelGrid columns="2" cellpadding="5">
                                <h:outputLabel for="username" value="Username:"/>
                                <p:inputText id="username" value="#{managedBeanSesionLogin.userName}" placeholder="Nombre de Usuario" required="true" label="username">
                                    <f:validator validatorId="ValidateEmptyFields"/>
                                </p:inputText>
                                <h:outputLabel for="password" value="Password:" />
                                <p:password id="password" value="#{managedBeanSesionLogin.userPass}" placeholder="Contraseña de Usuario" required="true" label="password" />
                            <f:facet name="footer">
                                <center><p:commandButton value="Iniciar" action="#{managedBeanSesionLogin.beginSession()}" update="loginForm"/></center>
                            </f:facet>
                            </h:panelGrid>
                        </p:dialog>
                </h:form>

Y en la parte top del template agregamos la siguiente linea:

                <h:outputLink value="javascript:void(0)" onclick="PF('dlg').show();" title="login">
                     <p:outputLabel  id="label1" value="Iniciar Sesion" style="color: white;"/>
                 </h:outputLink>

Entonces la pagina de inicio en mi proyecto es el siguiente obviamente aun es un diseño asi que falta para implementar pero solo es para mostrar, mas bien seria lo que llevamos hasta el momento de acuerdo:














Busqueda avanzada o por filtros

Modificaremos el listado de los usuarios ya tenemos que nos muestre la informacion detallada de cada uno al seleccionar y hacer click al boton ahora solo vamos a buscar ya sea por nombre, apellido paterno y apellido materno que son las basicas para alguna busqueda asi que creamos una variable de tipo list al managebBean que estamos utilizando y sus metodos getters y setters

private List<Usuarios> listByFilterUser;

Los metodos van a ir hasta abajo simplemente por darle un orden de acuerdo

 public List<Usuarios> getListByFilterUser() {
        return listByFilterUser;
    }
    public void setListByFilterUser(List<Usuarios> listByFilterUser) {
        this.listByFilterUser = listByFilterUser;
    }

Y nuevamente agregamos otra funcion al dataTable que es filteredValue que es el valor filtrado que esta en el mangedBean de acuerdo y al column agreamos otra funcion filterBy que es "filtrar por" de acuerdo al campo donde se ponga sera la busqueda de filtracion miren el ejemplo:

           <h2>Lista de usuarios</h2>
                <h:form id="formListAll">
                    <p:growl id="msjgral" showDetail="true" sticky="false" />
                    <p:dataTable id="tableListAll" var="item" value="#{managedBeanUser.all}" paginator="true" rows="5" rowsPerPageTemplate="10, 20, 30, 40, 50, 60, 70, 80, 90, 100"
                                 selection="#{managedBeanUser.user}" selectionMode="single" rowKey="#{item.idusuarios}" filteredValue="#{managedBeanUser.listByFilterUser}">
                        <f:facet name="header">
                            Lista de Usuarios
                        </f:facet>
                        <p:column headerText="Nombre" filterBy="nombres">
                            <h:outputText value="#{item.nombres}"/>
                        </p:column>
                        <p:column headerText="Apellido Materno" filterBy="ap">
                            <h:outputText value="#{item.ap}"/>
                        </p:column>
                        <p:column headerText="Apellido Paterno" filterBy="am">
                            <h:outputText value="#{item.am}"/>
                        </p:column>
                        <p:column headerText="E-mail">
                            <h:outputText value="#{item.email}"/>
                        </p:column>
                        <f:facet name="footer">
                            <p:commandButton process="tableListAll" update=":formListAll:usersDetail" icon="ui-icon-search" value="Ver" oncomplete="PF('ty').show()" />
                        </f:facet>
                    </p:dataTable>
                   
                    <p:dialog header="Informacion de Usuario" widgetVar="ty" modal="true" showEffect="explode" hideEffect="explode" resizable="false">
                        <p:outputPanel id="usersDetail" style="text-align:center;">
                            <h:panelGrid  columns="2">
                                <p:outputLabel value="Nombre"/>
                                <h:outputText value="#{managedBeanUser.user.nombres}" />
                                <p:outputLabel value="Apellido Paterno"/>
                                <h:outputText value="#{managedBeanUser.user.ap}" />
                                <p:outputLabel value="Apellido Materno"/>
                                <h:outputText value="#{managedBeanUser.user.am}" />
                                <p:outputLabel value="Email"/>
                                <h:outputText value="#{managedBeanUser.user.email}" />
                                <p:outputLabel value="Direccion"/>
                                <h:outputText value="#{managedBeanUser.user.direccion}" />
                                <p:outputLabel value="Fecha de Nacimiento"/>
                                <h:outputText value="#{managedBeanUser.user.fechaNacimiento}" />
                                <p:outputLabel value="Sexo"/>
                                <h:outputText value="#{managedBeanUser.user.sexo}" />
                            </h:panelGrid>
                        </p:outputPanel>
                    </p:dialog>
                </h:form>

Y quedaria asi: