Vistas de página en total

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:


Ver detalle del usuario en un dialogo de primefaces

En algunos caso el cliente quera ver la informacion del usuario y que mejor aprovechando nuestra tabla creada en el post anterior asi que para esto agregaremos mas funciones al dataTable de acuerdo las explicare.

Agregamos esta funcion rowsPerPageTemplate que sirve para decidir de cuantas filas queremos que se vean los registros ejemplo "5, 10, 15, 20" aqui decimos que podemos elejir que se muestren 5 por cada pagina o 10, etc,

En la funcion selection pondremos en bean de seleccion donde esta manipulado nuestro pojo que en este caso es nuestro managedBean que hemos trabajado usando el objeto del pojo

En la selectionMode aqui decimos el modo de seleccion puede ser uno solo o varios en este caso queremos saber de un usuario que seleccionemos

Y finalmente en rowKey en esta parte pondremos el identificado por cada usuario el cual es el id del usuario, en nuestra tabla agreamos un boton para realizar el evento de ver los datos del usuario process aqui va el id de la tabla a utilizar update aqui pondremos el id del formulario y el  id del panel que vamos a crear y debe quedar como la siguiente sintaxis update=":idform:idpanel"  oncomplete ira el nombre del dialogo a completa para que se muestre.

En el dialogo hay otras funciones que son widgetVar es el nombre del dialogo o la variable que lo identificara y que se pondra en la opcion oncomplete antes mensionada,  el showEffect y hideEffect son los efectos que tendra el dialogo

Bueno aqui dejo el codigo

            <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}">
                        <f:facet name="header">
                            Lista de Usuarios
                        </f:facet>
                        <p:column headerText="Nombre">
                            <h:outputText value="#{item.nombres}"/>
                        </p:column>
                        <p:column headerText="Apellido Materno">
                            <h:outputText value="#{item.ap}"/>
                        </p:column>
                        <p:column headerText="Apellido Paterno">
                            <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}" />
                            </h:panelGrid>
                        </p:outputPanel>
                    </p:dialog>
                </h:form>


Y en pantalla quedaria asi;



Listar todo los usuarios con dataTable de primefaces

En este post comentare como poder listar todos los usuarios registrados en nuestra base de datos mediente Hibernate y mostrarlos en un dataTable de primefaces cabe mencionar que el framework primefaces ya tiene predefinidos sus diseños por eso a veces es muy dificil manipularlos de acuerdo a tu vista que deseas pero bueno hay que darles un buen uso jeje.

Ahora modificaremos nuevamente nuestro FrondEnd de usuario y debe quedar como el siguiente:

public interface FrondEndUser {
    public boolean registerUsers(Session session, Usuarios user) throws Exception;
    public List<Usuarios> listAllUsers(Session session) 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;
}

Y por ende nuestro DAO se modificara y se le asignara el codigo necesario para consultar todos los regitros. Practicamente no explico el codigo porque lo eh documentado linea por linea espero se pueda entender.

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> listAllUsers(Session session) 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";
        //creamos el query donde lo inicializamos con el session que pasamos como parametro
        Query query = session.createQuery(hql);
        //recuperamos en una variable de tipo list que retorne una lista del pojo usuarios hacemos el casting y extraemos del query
        List<Usuarios> listUser = (List<Usuarios>) query.list();
        //retornamos la lista
        return listUser;
    }
    @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
        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 dond solo obtendra un unico resultado
        Usuarios user = (Usuarios) query.uniqueResult();
        //retornamos
        return user;
    }
   
}


Modificaremos nuestro mangedBean para que pueda mostrar la consulta en la vista asi que creamos un nuevo metodo en el managedBean como el siguiente:

public List<Usuarios> getAll(){  
        /*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();
             //pasamos la session a la lista
             listUser = daoUsers.listAllUsers(session);          
             transaction.commit();//cerrar transaccion
             //retornamos
             return listUser;
        } 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();
            }
        }
    }


Despues de esto generamos un nuevo FacesClient para que visualice los datos de la consulta y dicho esto debe quedar de la siguiente forma que lo definimos en nuestro Content del Template.

Explicare parte del codigo el tag de dataTable tiene varios parametros el id sirve para identificar nuestro dataTable si es que llegaremos a utilizar mas de uno en la aplicacion, el parametro var es la varible que servira como objeto para consultar los datos, el value sirve para decir de donde proviene la consulta en que Bean se esta realizando, paginator es para decir si queremos que contenga paginaciones para mostrar los resultados y el rows es para decir que en cada paginacion habra un tanto de consultas mostradas en este caso 5, para mostrar los datos en las columnas de la tabla utilizamos el tag column ponemos el titulo y con el tag de outputText de html mostramos el dato mediante el parametro value en el cual utilizamos la varible de tipo objeto "item" por asi decirlo para acceder a al pojo y mostrar los datos

       <ui:define name="content">
                <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">
                        <f:facet name="header">
                            Lista de Usuarios
                        </f:facet>
                        <p:column headerText="Nombre">
                            <h:outputText value="#{item.nombres}"/>
                        </p:column>
                        <p:column headerText="Apellido Materno">
                            <h:outputText value="#{item.ap}"/>
                        </p:column>
                        <p:column headerText="Apellido Paterno">
                            <h:outputText value="#{item.am}"/>
                        </p:column>
                        <p:column headerText="E-mail">
                            <h:outputText value="#{item.email}"/>
                        </p:column>
                    </p:dataTable>              
                </h:form>
            </ui:define>


Y finalmente nuestra aplicacion queda asi: