Česky   |  Deutsch   |  English   |  Español   |  Français   |  Indonesia   |  日本語   |  한글   |  Polski   |  Português (BR)   |  Türkçe   |  中文   |  正體中文   |  Tu idioma  
PlanetNetbeans
Planet NetBeans es un rama de NetBeans relacionado con toda la Blogosphere.
Feeds
[RSS 1.0 Feed] [RSS 2.0 Feed]
[FOAF Subscriptions] [OPML Subscriptions]
¿Tienes un blog acerca de NetBeans? Agrega tu blog a PlanetNetBeans.
Feed Subscripciones

Powered by:    Planet

Última actualización:
May 27, 2015 08:01 AM
All times are UTC

Sponsored by
sponsored by Oracle

visit NetBeans website
AVBravo - May 20, 2015 01:08 AM
Lo nuevo que traera NetBeans 8.1

Lo nuevo que traera NetBeans 8.1

Soporte para plantillas Jade



  • Soporte para NodeJS
  • JUnit integrado


AVBravo - May 19, 2015 01:31 AM
Autocompletado con Primefaces + JPA

Autocompletado con Primefaces + JPA
Tabla: Nivel1


Con NetBeans IDE generamos los Entity
Categories: Persistence    File Types: Entity Classes from Database


Luego generar los EJB


Editamos Nivel1Facade.java y agregar los métodos findByIdNivel1Like(), findByNombreLike().

public List<Nivel1> findByIdNivel1Like(String idnivel1) {

              Query query = em.createQuery("SELECT n FROM Nivel1 n WHERE lower(n.idnivel1) like :idnivel1");
                   idnivel1 = "%" + idnivel1.trim() + "%";
       return query.setParameter("idnivel1", idnivel1).getResultList();
     
}

    public List<Nivel1> findByNombreLike(String nombre) {

              Query query = em.createQuery("SELECT n FROM Nivel1 n WHERE lower(c.nombre) like :nombre");
                   nombre = "%" + nombre.trim() + "%";
       return query.setParameter("nombre", nombre).getResultList();
     
    
   }


Editar Nivel1SearchController.java

Agregar los métodos complete(),  completeNombre()

public List<Nivel1> complete(String query) { List<Nivel1> suggestions = new ArrayList<>(); try { query = query.trim(); nivel1Facade.findByIdNivel1Like(query.toLowerCase()); nivel1List.stream().forEach((p) -> { suggestions.add(p); }); } catch (Exception e) { JSFUtil.addErrorMessage("complete() "+e.getLocalizedMessage()); } return suggestions; } public List<Nivel1> completeNombre(String query) { List<Nivel1> suggestions = new ArrayList<>(); try { query = query.trim(); nivel1Facade.findByNombreLike(query.toLowerCase()); nivel1List.stream().forEach((p) -> { suggestions.add(p); }); } catch (Exception e) { JSFUtil.addErrorMessage("completeNombre() "+e.getLocalizedMessage()); } return suggestions; }

En la página .xhtml
   <p:outputLabel  rendered="#{!nivel1Controller.nuevoregistro}" value="#{msg.idnivel1}" for="idnivel1" />
                               <p:autoComplete size="45"   rendered="#{!nivel1Controller.nuevoregistro}" value="#{nivel1Controller.selected}"  
                                                 completeMethod="#{nivel1SearchController.complete}"  
                                                 var="p"  
                                                 itemLabel="#{p.idnivel1}"  itemValue="#{p}" converter="nivel1Converter" forceSelection="true">

                                   <p:ajax event="itemSelect" listener="#{nivel1Controller.handleSelect}" update=":form,:form:growl" />  
                                   <f:facet name="itemtip">
                                       <h:panelGrid columns="2" cellpadding="5">
                                           <h:outputText value="#{p.nombre}" />
                                       </h:panelGrid>
                                   </f:facet>
                               </p:autoComplete>



AVBravo - May 18, 2015 10:45 PM
primefaces growl con bootfaces

Para mostrar el componente <p:growl> de Primefaces si utilizamos en conjunto con bootfaces y deseamos evitar que el growl se muestre sobrepuesto en el menu, incluimos en nuestro template o archivo css

  .ui-growl { right: 50%; top: 20%; }





AVBravo - May 09, 2015 09:57 PM
Crear Submenú bootfaces

Crear Submenú bootfaces


Basado en el ejemplo "Multi level dropdown menu BS3" cuya fuente es 

A continuación se muestra como integrarlo con bootfaces y primefaces.


Para crear submenus con bootfaces seguimos el siguiente procedimiento

  • Editar template.xhtml  y en la sección <h:header> y dentro de   <style type="text/css">
t.png
copiar

.dropdown-submenu {
   position: relative;
}

.dropdown-submenu>.dropdown-menu {
   top: 0;
   left: 100%;
   margin-top: -6px;
   margin-left: -1px;
   -webkit-border-radius: 0 6px 6px 6px;
   -moz-border-radius: 0 6px 6px;
   border-radius: 0 6px 6px 6px;
}

.dropdown-submenu:hover>.dropdown-menu {
   display: block;
}

.dropdown-submenu>a:after {
   display: block;
   content: " ";
   float: right;
   width: 0;
   height: 0;
   border-color: transparent;
   border-style: solid;
   border-width: 5px 0 5px 5px;
   border-left-color: #ccc;
   margin-top: 5px;
   margin-right: -10px;
}

.dropdown-submenu:hover>a:after {
   border-left-color: #fff;
}

.dropdown-submenu.pull-left {
   float: none;
}

.dropdown-submenu.pull-left>.dropdown-menu {
   left: -100%;
   margin-left: 10px;
   -webkit-border-radius: 6px 0 6px 6px;
   -moz-border-radius: 6px 0 6px 6px;
   border-radius: 6px 0 6px 6px;
}



  • En la página de Menú
<b:dropMenu rendered="#{loginBean.logeado}" value="#{men['menu.ingresos']}" >
                   <b:navLink value="#{men['menu.nivel1']}"  href="/faces/page/nivel1/nivel1.xhtml"/>

                   <li class="dropdown-submenu">
                       <a tabindex="-1" href="#">Regimen</a>
                       <ul class="dropdown-menu">

                            <b:navLink value="#{men['menu.nivel2']}"  href="/faces/page/nivel1/nivel2.xhtml"/>
                           <li class="dropdown-submenu">
                               <a href="#">Otros</a>
                               <ul class="dropdown-menu">                                 
                                    <b:navLink value="#{men['menu.nivel4']}"  href="/faces/page/nivel4/nivel4.xhtml"/>
                                    <b:navLink value="#{men['menu.nivel5']}"  href="/faces/page/nivel5/nivel5.xhtml"/>
                               </ul>
                           </li>
                            <b:navLink value="#{men['menu.nivel3']}"  href="/faces/page/nivel3/nivel3.xhtml"/>
                     
                       </ul>
                   </li>
               </b:dropMenu>



AVBravo - April 07, 2015 12:47 AM
Grupos de Usuarios Java America Latina

Este video muestra la opinión de los lideres de Java de América Latina, y acerca de su trabajo.
Entre ellos Yara, Bruno, Alexis, Jorge, Cesar entre otros miembros importantes que están haciendo un gran trabajo con las comunidades en esta actividad de promoción de Java .

AVBravo - March 31, 2015 05:09 PM
GitHub con NetBeans

GitHub con NetBeans  (Guía rápida)
Pasos 
❏ Crear un repositorio en GitHub https://github.com/ 
❏ Clonar el repositorio en Netbeans 

❏ Menu Team­­>Git­­>Clone 


❏ Indicar el Repository URL ,User  y Password 

Presionar el botón Next 

❏ seleccionar el Remote Branches 


Presionar el botón Next 
❏ Seleccionar el directorio destino 

❏ Si el proyecto existe el IDE lo abrirá automáticamente 
❏ Si aun no hemos creado el proyecto y no hemos realizado ningun Push al 
repositorio 
❏ NetBeans nos solicitara que creemos un proyecto Nuevo 
❏ Procedemos a configurar el proyecto 
❏ Cuando realizamos cambios en el proyecto, estos debemos subirlos al repositorio 
❏ Seleccionamos el proyecto y desde el menú ​
Team​
 (o dar clic derecho en el Proyecto 
y seleccionar Git) 
❏ Ejecutar Add (Solo cuando existan archivos nuevos el IDE los marcará de color 
verde) 
❏ Luego Commit (Los archivos que se modifican tendrán un color azul) 
❏ Luego Remote­­>Push to stream 














AVBravo - March 17, 2015 03:27 AM

Si desemos utilizar <p:feedReader> componente de Primefaces

<p:feedReader value="http://rss.news.yahoo.com/rss/sports" var="feed">
   <h:outputText value="#{feed.title}" style="font-weight: bold;display:block"/>
   <h:outputText value="#{feed.description.value}" escape="false"/>
   <p:separator />
</p:feedReader>

Debemos incluir las siguientes dependencias <p:feedReader
<dependency>
           <groupId>com.totsp.feedpod</groupId>
           <artifactId>purl-org-content</artifactId>
           <version>0.3</version>
       </dependency>

 <dependency>
           <groupId>rome</groupId>
           <artifactId>rome</artifactId>
           <version>1.0</version>
       </dependency>

  <dependency>
           <groupId>jdom</groupId>
           <artifactId>jdom</artifactId>
           <version>1.1</version>
           <type>pom</type>

       </dependency>

AVBravo - March 14, 2015 02:54 PM
Método onblur

Método onblur
Si tenemos un formulario y deseamos que el usuario escribe por ejemplo una cédula, y no da enter, podríamos invocar algún método específico mediante el método onblour y usando <p:remoteCommnad>.
De esta manera no es necesario que presione Enter con escribir la cédula y salir del componente se activa el método.


Segmento de codigo


<p:remoteCommand update="tabView,:form:barra:toolbar,:form:growl,:form:datatableImpuestos"  
                                            name="remotefindcontribuyentes" actionListener="#{componentePagos


      <p:inputText   id="cedula"
                                          disabled="#{!componentePagos.escontribuyente}"
                                          value="#{componentePagos.cedula}"  placeholder="8-888-8888"
                                          title="#{msg.cedula}"
                                          onblur="remotefindcontribuyentes();"
                                          onkeypress="if (event.keyCode == 13) {
                                                      remotefindcontribuyentes();
                                                      return false;
                                                  }"
                                          />

AVBravo - February 13, 2015 02:45 AM
Java Español- Norte America-Centro America-Sur America Reunión 2015

Java Español- Norte America-Centro America-Sur America Reunión 2015
Continuan las reuniones para organizar las actividades de promoción de Java a Nivel de Latinoamerica, próximamente se estarán comunicando los avances.



AVBravo - February 12, 2015 09:46 PM
Como usar ui:repeat

Como usar ui:repeat

Entity
@Entity
@Table(name = "TIPOS_PATOLOGICOS")
@XmlRootElement
@NamedQueries({
    @NamedQuery(name = "TiposPatologicos.findAll", query = "SELECT t FROM TiposPatologicos t"),
    @NamedQuery(name = "TiposPatologicos.findByIdTipoPatologico", query = "SELECT t FROM TiposPatologicos t WHERE t.idTipoPatologico = :idTipoPatologico"),
    @NamedQuery(name = "TiposPatologicos.findByDescripcion", query = "SELECT t FROM TiposPatologicos t WHERE t.descripcion = :descripcion")})
public class TiposPatologicos implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "ID_TIPO_PATOLOGICO")
    private Integer idTipoPatologico;
    @Basic(optional = false)
    @NotNull
    @Size(min = 1, max = 50)
    @Column(name = "DESCRIPCION")
    private String descripcion;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "idTipoPatologico")
    private Collection<AntecedentesPatologicos> antecedentesPatologicosCollection;


Creamos un beans
Ya que deseamos mostrar la descripción y solicitar al usuario que ingrese un comentario
public class TiposPatologicosBeans {
private String antecedente;
TiposPatologicos tiposPatologicos = new TiposPatologicos();

    /**
     * Creates a new instance of TiposPacientesBeans
     */
    public TiposPatologicosBeans() {
    }

/*
*agregar los get/set
*
*/
}


En el Controller
Crear un método para cargar los registros
 private Boolean cargarTiposPatologicos() {
        try {

            listTiposPatologicosBeans.removeAll(listTiposPatologicosBeans);

            List<TiposPatologicos> l;
            l = tiposPatologicosFacade.findAll();

            if (l == null || l.isEmpty()) {

                JSFUtil.addSuccessMessage(rf.getMensajeArb("warning.nohaytipospatologicos"));
                return false;
            }

            for (TiposPatologicos t : l) {

                TiposPatologicosBeans tp = new TiposPatologicosBeans();

                tp.setAntecedente(rf.getMensajeArb("label.ninguno"));
                tp.setTiposPatologicos(t);
                listTiposPatologicosBeans.add(tp);

            }

            return true;
        } catch (Exception e) {

            JSFUtil.addErrorMessage("cargarTiposPatologicos()" + e.getLocalizedMessage());
        }
        return false;
    }


Crear un método para guardar cada registro
Recorremos el list
 private Boolean saveAntecedentesPatologicos() {
        try {

            for (TiposPatologicosBeans tpb : listTiposPatologicosBeans) {
                antecedentesPatologicos.setIdFicha(fichaClinica);
                antecedentesPatologicos.setIdTipoPatologico(tpb.getTiposPatologicos());
                antecedentesPatologicos.setObservaciones(tpb.getAntecedente());
                antecedentesPatologicosFacade.create(antecedentesPatologicos);

            }
            return true;
        } catch (Exception e) {
            JSFUtil.addErrorMessage("saveAntecedentesPatologicos()" + e.getLocalizedMessage());
        }
        return false;
    }




En el xhtml
Deseamos mostrar la descripción y crear un <p:inputTextarea para cada registro


Genera la siguiente vista


AVBravo - January 30, 2015 02:51 PM
HTML6 y Java Server Faces

HTML6 y Java Server Faces
En http://html6spec.com/. explican algunas características de html6, entre ellas el uso de namespaces como se hacia en xhtml, ahora es parte de la especificación.

Para los desarrolladores Java EE,(a continuación el tutorial oficial de Oracle)
Encontraran Facelets,  que es un poderoso lenguaje de declaración que es usado para construir vistas  Java Server Faces usando plantillas HTML. Se basa en el uso de XHTML. para crear las paginas web.

Ahora en HMTL6 podemos usar directamente los namespaces


Java Server Faces

Por ejemplo:
head en facelets



head en html6



body en facelets



body en hmtl6


Los cambios en HMTL6 son comunes en Facelets, para los desarrolladores Java Server Faces+ Faceletes, representan una mejor integración. Y el algo comuen en el desarrollo. basado en componentes (Primefaces)




AVBravo - January 27, 2015 09:37 PM
FileUpload con Primefaces

FileUpload con Primefaces


goto.png
Si queremos subir imagenes a nuestra aplicación usaremos el componente FileUpload
Debemos realizar los siguientes pasos:

Agregar al archivo web.xml


   <filter>
       <filter-name>PrimeFaces FileUpload Filter</filter-name>
       <filter-class>
           org.primefaces.webapp.filter.FileUploadFilter
       </filter-class>
   </filter>
   <filter-mapping>
       <filter-name>PrimeFaces FileUpload Filter</filter-name>
       <servlet-name>Faces Servlet</servlet-name>
   </filter-mapping>


s.png


Crear dentro de resources el directorio donde deseamos almacenar las imagenes
En este ejemplo: resources/fotos/clinicas y agregue una imagen llamada fotos.png que se usará como imagen inicial.
f.png




En JSFUtil u otro @Named Beans que usemos agregamos tres métodos uno para obtener el path de la aplicación web , otro para obtener el path relativo a /fotos/clinicas y el otro para copiar los archivos.
/*
    devuelve el path de la aplicacion
    */
   public static String getPath() {
       try {
           ServletContext ctx = (ServletContext) FacesContext.getCurrentInstance()
                   .getExternalContext().getContext();
           return ctx.getRealPath("/");


       } catch (Exception e) {


           addErrorMessage("getPath() " + e.getLocalizedMessage());
       }
       return null;


   }

/*
    devuelve un hashmap con la ruta de fotos clinicas y el url para las imagenes
    */
   public static HashMap<String, String> getMapPathFotosClinica() {
       try {
           HashMap<String, String> map = new HashMap<String, String>();
          
           String path = getPath() + "resources/fotos/clinicas/";
           map.put("path", path);
           map.put("url", "/resources/fotos/clinicas/");
           return map;
       } catch (Exception e) {


           addErrorMessage(" getMapPathFotosClinica() " + e.getLocalizedMessage());
       }
       return null;


   }


    /*
    devuelve un hashmap con la ruta de fotos clinicas y el url para las imagenes
    */
   public static String getPathFotosClinica() {
       try {             
       
           String path = getPath() + "resources/fotos/clinicas/";
return path;
       } catch (Exception e) {


           addErrorMessage("getPathFotosClinica() " + e.getLocalizedMessage());
       }
       return null;


   }



   /*
    copia un archivo generalmente cuando se usa el fileupload
    fileName: nombre del archivo a copiar
    in: Es el InputStream
    destination: ruta donde se guardara el archivo
 
    */
   public static Boolean copyFile(String fileName, InputStream in, String destination) {
       try {


           // write the inputStream to a FileOutputStream
           OutputStream out = new FileOutputStream(new File(destination + fileName));


           int read = 0;
           byte[] bytes = new byte[1024];


           while ((read = in.read(bytes)) != -1) {
               out.write(bytes, 0, read);
           }


           in.close();
           out.flush();
           out.close();


           return true;
       } catch (IOException e) {
           JSFUtil.addErrorMessage("copyFile() " + e.getLocalizedMessage());
       }
       return false;
   }
Mostrare dos formas para manejar la imagen , una atraves del path incluyendo el url
En el Controller agregar dos atributos.


private String imagenURL ="/resources/fotos/clinicas/foto.png";
private String imagen="foto.png";


Nota: Recuerde que en el directorio /resources/fotos/clinicas se agrego una imagen llamada fotos.png.


crear el método  handleFileUpload() que se encarga de guardar el archivo


En este obtenemos la ruta del directorio /fotos/clinicas/
   public void handleFileUpload(FileUploadEvent event) {
       try {


           UploadedFile file = event.getFile();
//application code
           String destination;


           HashMap<String, String> map = JSFUtil.getPathFotosClinica();


           destination = map.get("path");
           if (destination == null) {
               JSFUtil.addErrorMessage(rf.getMensajeArb("warning.noseobtuvopath"));
           } else {
               imagenURL = map.get("url") + file.getFileName();
               imagen = file.getFileName();
               if (JSFUtil.copyFile(file.getFileName(), file.getInputstream(), destination)) {                  
               }
           }


       } catch (Exception e) {
           JSFUtil.addErrorMessage("handleFileUpload()" + e.getLocalizedMessage());
       }


   }




En la pagina xhtml agregamos el componente.
Colocamos dos <h:graphicImage en el primero usamos el url completo y en el segundo solo el nombre de la imagen.
y.png
 <p:panelGrid id="fotos" columns="1">
             <h:graphicImage value="#{clinicasController.imagenURL}" height="100" width="100"/>
           <h:graphicImage value="/resources/fotos/clinicas/#{clinicasController.imagen}" height="100" width="100"/>
         <p:fileUpload auto="true" label="Foto" fileUploadListener="#{clinicasController.handleFileUpload}" update=":form:growl,:form:fotos"/>
                          
                        </p:panelGrid>


al dar clic en el botón FOTO , seleccionamos una imagen y se carga la  imagen en los dos componentes.
d.png
Solo dejamos una de los dos , esta incluido solo a modo de ejemplo. Recomendaria usar     <h:graphicImage value="/resources/fotos/clinicas/#{clinicasController.imagen}" height="100" width="100"/>


Si ejecutamos el proyecto desde NetBeans IDE, con un proyecto web Maven
lo guarda la imagen en el path /target/nombreproyectoversion/resources/fotos/clinicas
a.png

FileUpload y almacenar la imagen en una base de datos
Si tenemos un campo llamado logoClinica de tipo String en la tabla


Ajustamos el Controller
 @PostConstruct
   public void init() {
       nuevoregistro = false;
       desactivar = true;
       clinicas.setLogoClinica("foto.png");


   }
 @Override
   public String prepararNew() {
       try {
           
           clinicas = new Clinicas();
           clinicas.setLogoClinica(imagen);


       } catch (Exception e) {
           JSFUtil.addErrorMessage(e.getLocalizedMessage());
       }
       return null;
   }

@Override
   public String save() {
       try {
               clinicas = new Clinicas();
              clinicas.setLogoClinica(imagen);
       


@Override
   public String delete() {
       try {
                   clinicas.setLogoClinica(imagen);




Editamos el método  handleFileUpload()
public void handleFileUpload(FileUploadEvent event) {
       try {


           UploadedFile file = event.getFile();
//application code
           String destination;


                 destination = JSFUtil.getPathFotosClinica();
           if (destination == null) {


               JSFUtil.addErrorMessage(rf.getMensajeArb("warning.noseobtuvopath"));
           } else {
               
               clinicas.setLogoClinica(file.getFileName());
               if (JSFUtil.copyFile(file.getFileName(), file.getInputstream(), destination)) {
                  
               }
           }


       } catch (Exception e) {
           JSFUtil.addErrorMessage("handleFileUpload()" + e.getLocalizedMessage());
       }


   }

AVBravo - January 26, 2015 02:11 PM
Búsquedas en JPA utilizando concat y like

Búsquedas en JPA utilizando concat y like

Deseamos tener una página xhtml donde realizamos búsquedas de registros, una tabla tiene los campos (primernombre, segundonombre,apellidopaterno,apellidomaterno).
Queremos buscar por primer nombre, apellido paterno o permitirle al usuario que escriba en una caja el nombre completo, es decir una combinacion de dos campos primernombre y apellidopaterno. Nuestro dialogo de busqueda (basado en Java Server Faces->Primefaces), tendrá una vista similar a esta.
busqueda.png

El código xhtml del diálogo donde se generan los componentes para el <p:outputLabel y el <p:inputText> correspondientes al atributo nombreCompleto que debe ser declarado en el @Named y el metodo buscarNombreCompleto()
s.png


Definiciones en el @Named
@Named
@ViewScoped
public class AdministradoresSistemaSearchController implements Serializable{
 private String nombreCompleto;

public String getNombreCompleto() {
       return nombreCompleto;
   }

   public void setNombreCompleto(String nombreCompleto) {
       this.nombreCompleto = nombreCompleto;
   }
public String buscarNombreCompleto() {
       try {
           administradoresSistema.setPrimerNombre("");
           administradoresSistema.setPrimerNombre("");
           administradoresSistemaList = administradoresSistemaFacade.findByNombreCompletoLike(nombreCompleto);
       } catch (Exception e) {
           JSFUtil.addErrorMessage(e.getLocalizedMessage());
       }
       return "";
   }

En el Facade
Descomponer el texto para separar el nombre y el apellido y colocarle % entre ambos para hacer más genérica la búsqueda.
Esto permitirá buscar por ejemplo
a vill → buscara todos los nombres que inicien con a y el apellido que inicie con vill
aristides v → buscara todos los nombre que inicien con aristides y el apellido inicie con v

   public List<AdministradoresSistema> findByNombreCompletoLike(String nombreCompleto) {
      nombreCompleto = nombreCompleto.trim();
      StringTokenizer st = new StringTokenizer(nombreCompleto);
      String texto="";
      while (st.hasMoreTokens()) {
          if(!texto.equals("")){
              texto+="%";
          }
          texto += " "+st.nextToken();

    }
      nombreCompleto = "%" +texto.trim() + "%";
       Query query = em.createQuery("SELECT a FROM AdministradoresSistema a WHERE CONCAT (lower(a.primerNombre),' ',lower(a.apellidoPaterno)) like ?1");
       query.setParameter(1, nombreCompleto);
      return query.getResultList();

  }

AVBravo - January 16, 2015 02:14 PM
PrimeFaces BluePrints

Si deseas conocer sobre el desarrollo de aplicaciones web con Java Server Faces y Primefaces, el libro Primefaces BluePints que puedes ver en el siguiente enlace



Es una guía para su aprendizaje, se ofrece una explicación muy básica de los componentes, con ejemplos bastante claros, con la famosa aplicación "Hello World".
Se explica el uso de Ajax con Primefaces, que se realiza de manera muy sencilla.
Client Side Validation: Se muestran sugerencias y ejemplos de uso.
Aplicación completa desde el Login de usuarios hasta manejo de imágenes.
Manejo de base de datos, uso de Layouts.
Sin lugar  a dudas una serie de ejemplos y recomendaciones que son muy utiles, para lograr un conocimiento adecuado que nos permita el desarrollo de aplicaciones web con Java server faces + Primefaces.

El uso de datatable, dialogos, reportes , exportaciones de datos, graficas, son componentes que se explican con mucho detalle.




AVBravo - December 17, 2014 07:44 PM
Agrupar, Ordenar por Fechas y Totalizar con Java 8

Agrupar, Ordenar por Fechas y Totalizar con Java 8


Tenemos una lista de registros de recibosdetalles.


Deseamos agruparlos por idnivel6 y luego por fecha, y encontrar el total por cada fecha del idnivel6.
Similar a la salida que se muestra a continuacion
ordenar.png


Primero obtenemos los registros
2d.png
filtrados por fecha


  recibosdetallesList = recibosdetallesFacade.findByEntreFechas(desde, hasta);


 /*
                0. elimino los recibosdetalles cuyos recibos fueran anualados
                */
               recibosdetallesList.stream().filter((r) -> (r.getIdrecibo().getAnulado().equals("si"))).forEach((r) -> {
                   recibosdetallesList.remove(r);
               });


//IMPRIMIR LOS DETALLES
 System.out.println("!================= Recibos Detalles =====================!");
               recibosdetallesList.forEach(p
                       -> System.out.println(p.getIdrecibo().getIdrecibo() + " ---> " + p.getIdnivel6().getIdnivel6() + " --> " + p.getFecha()));

/*
                1. Agruparlos por nivel6
                */
               Map<Nivel6, List<Recibosdetalles>> listRecibosdetallesAgrupado = recibosdetallesList
                       .stream()
                       .collect(Collectors.groupingBy(p -> p.getIdnivel6()));


  /*
                2. Recorrer los agrupados por nivel6
                */
               System.out.println("!============== <AGRUPADOS POR NIVEL 6< ==================!");
               listRecibosdetallesAgrupado
                       .forEach((Nivel6 idnivel6, List<Recibosdetalles> p) -> {
                           /*
                            2.1 Imprime cada nivel6 agrupado
                            */
                           System.out.println("====================================================");
                           System.out.println("Nivel6: " + idnivel6.getIdnivel6());


                           /*
                            2.3 Agrupo por fecha                                
                            */
                           Map<Date, List<Recibosdetalles>> listFecha = p
                           .stream()
                           .collect(Collectors.groupingBy(p2 -> p2.getFecha()));


                           /*
                            2.3 Recorro la agrupacion por fecha
                            */
                           listFecha
                           .forEach((Date fecha, List<Recibosdetalles> p3) -> {


                               System.out.println("Fecha: " + fecha);
                               /*
                                2.4 Recorro la lista ordenada y sumo los montos de las fechas
                                */
                               System.out.println(" ---------total: " + totalizarFecha(p3));


                           });


                     

                       });

private Double totalizarFecha(List<Recibosdetalles> p3) { try { Double s = 0.0; s = p3.stream().map((i) -> i.getPago()).reduce(s, (accumulator, _item) -> accumulator + _item); return s; } catch (Exception e) { JSFUtil.addErrorMessage("totalizarFecha() " + e.getLocalizedMessage()); } return 0.0; }

AVBravo - December 17, 2014 02:07 AM
Ordenar List y agrupar con Java 8

Ordenar List y agrupar con Java 8


Proyecto: Rigemjsf
Clase: InformeConsolidadoController.java


Queremos un informe agrupado por idnivel5 y totalizar cada idnivel6.




Tenemos un Beans llamado consolidado


@Named
@RequestScoped
public class Consolidado {
private Date fecha;
private String nombre;
private Integer idrecibo;
private Double pago;
private String idnivel6;
private String nombrenivel6;
private String idnivel5;
private String nombrenivel5;









 public String imprimirTodos() {
       try {
           /*
           agruparlo por idnivel6
            */


Map<String, List<Consolidado>> listAgrupado = listConsolidado
                   .stream()
                   .collect(Collectors.groupingBy(p -> p.getIdnivel6()));


           //recorrer el list
           listAgrupado
                   .forEach((String idnivel6, List<Consolidado> p) -> {
                       add(p);
                   });


//Ordenarlo por nivel5


           Collections.sort(listConsolidadoFinal,
                   (Consolidado a, Consolidado b) -> a.getIdnivel5().compareTo(b.getIdnivel6()));
           


         
       } catch (Exception ex) {
           JSFUtil.addErrorMessage("imprimir() " + ex.getLocalizedMessage());
       }
       return null;
   }
   /*
    anade a la lista final la sumatoria
    */
//Aqui totalizamos y agregamos objetos al  nuevo list
     private void add(List<Consolidado> list) {
       try {
           Double s = 0.0;
           s = list.stream().map((i) -> i.getPago()).reduce(s, (accumulator, _item) -> accumulator + _item);
           Consolidado icr = new Consolidado();
           icr = list.get(0);
           icr.setPago(s);
           listConsolidadoFinal.add(icr);
       } catch (Exception e) {
           JSFUtil.addErrorMessage("add() " + e.getLocalizedMessage());
       }


   }


   }

AVBravo - December 07, 2014 07:06 PM
Libro JEE7 Capítulo 0. Búsquedas

Capítulo 7. Búsquedas
Puedes descargarlo en pdf
https://www.dropbox.com/sh/yzivtufjce1h57g/AAAJzegPVBxFtiqzEOlIAdsoa?dl=0

Encuesta
https://docs.google.com/forms/d/1WG7uzOe17V4u36fC05V3ijYEPZ8fhJD1NPUrkNBS0Jk/alreadyresponded?usp=send_form




Formulario de Búsqueda con DialogFrame


Crearemos un formulario de búsqueda que se podrá invocar desde cualquier formulario o CDI/Beans.


al dar clic en buscar, nos llevará al diálogo para realizar las búsquedas








Para el manejo de registros, a veces no deseamos tener un datatable con todos los registros cargados, si no simplemente un formulario, en el cual podamos realizar búsquedas de manera rápida, cuando lo hacemos por la llave primaria es sencillo ya que solo tendremos un registro, cuando lo hacemos por otros atributos tendremos una lista de registros en los cuales podemos seleccionar uno de ellos, esta lista se mostrará en un dialog, para que el usuario seleccione el registro adecuado.

Crearemos un formulario para realizar búsquedas por cualquier atributo , por palabras exactas o mediante aproximación.


















Pasos:
  1. Editar el CDI Beans EstatusController, inyectar CDI Beans Globales,crear el método init() con la anotación @PostConstructor.


@Inject
   GestorImpresion gestorImpresion;

@PostConstruct
   public void init() {
       //nomnbre de la pagina a retornar
       globales.setUltimapagina("estatusinsert");
      // encontrado = false;
       if (globales.getEstatus().getIdestatus() != "") {
           estatus = globales.getEstatus();
       //    encontrado = true;
       }
   }




  1. Crear CDI EstatusSearchController.java que usaremos para realizar las búsquedas.


  • Desde menú File, seleccione New
  • en Categories, seleccione Java Server Faces
  • en File Types, seleccione JSF ManagedBeans
  • Class Name: EstatusSearchController
  • Package com.avbravo.scrumweb.controlller.net
  • Scope: ViewScoped


import com.avbravo.scrumweb.Estatus;
import com.avbravo.scrumweb.ejb.EstatusFacade;
import com.avbravo.scrumweb.generales.Globales;
import com.avbravo.scrumweb.generales.ResourcesFiles;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.faces.view.ViewScoped;
import javax.inject.Inject;
import javax.inject.Named;


@Named
@ViewScoped
public class EstatusSearchController implements Serializable{

   @Inject
   EstatusFacade estatusFacade;
   @Inject
   ResourcesFiles rf;
   @Inject
   Globales globales;
   Estatus selected = new Estatus();
   private List<Estatus> filtered;
   List<Estatus> estatusList;

   private String nombreestatus;
   private String idestatus;
   private String esinicial;

   private Boolean usarlike = false;

   public String getIdestatus() {
       return idestatus;
   }

   public void setIdestatus(String idestatus) {
       this.idestatus = idestatus;
   }

   public String getEsinicial() {
       return esinicial;
   }

   public void setEsinicial(String esinicial) {
       this.esinicial = esinicial;
   }

   public List<Estatus> getFiltered() {
       return filtered;
   }

   public void setFiltered(List<Estatus> filtered) {
       this.filtered = filtered;
   }

   /**
    * Creates a new instance of EstatusDataController
    */
   public Estatus getSelected() {
       return selected;
   }

   public void setSelected(Estatus selected) {
       this.selected = selected;
   }

   public EstatusSearchController() {
       estatusList = new ArrayList<>();

   }

   public List<Estatus> getEstatusList() {
       return estatusList;
   }

   public void setEstatusList(List<Estatus> estatusList) {
       this.estatusList = estatusList;
   }

   public String getNombreestatus() {
       return nombreestatus;
   }

   public void setNombreestatus(String nombreestatus) {
       this.nombreestatus = nombreestatus;
   }

   public Boolean getUsarlike() {
       return usarlike;
   }

   public void setUsarlike(Boolean usarlike) {
       this.usarlike = usarlike;
   }

   @PostConstruct
   public void init() {

   }

   public void iniciar() {
       estatusList = estatusFacade.getEstatusList();
   }

   public void iniciar(String value) {
       estatusList = estatusFacade.findByEsinicial(value);
   }

   public String buscar() {
       if (!usarlike) {
           estatusList = estatusFacade.findByEstatus(nombreestatus);
       } else {
           estatusList = estatusFacade.findByEstatusLike(nombreestatus);
       }

       return "";
   }

   public String buscarEsInicial() {

       estatusList = estatusFacade.findByEsinicial(esinicial);
       return "";
   }

   public String buscarIdEstatusList() {

       estatusList = estatusFacade.findByIdEstatusList(idestatus);
       return "";
   }

   public String showAll() {
       estatusList = estatusFacade.findAll();
       return "";
   }

   public String retornar() {
       globales.setEstatus(selected);
       return globales.getUltimapagina();
   }

}



  1. Editar estatusinsert.xml, agregamos un boton para buscar, uno para editar y otro para eliminar, ademas de un diálogo donde se confirmará si se eliminara o no el registro.  

  • Colocar el id=”form” para el form principal
<h:form rendered="#{menuBeans.estatusCrear}" id="form">
  • Indicar el alto y ancho del dialogo
height="175"  width="400"

<p:dialog visible="true" header="#{app['form.estatusnew']}" closable="true"
                                 height="175"  width="400"
        showEffect="clip" hideEffect="fade"   
         widgetVar="estatusinsertDialog">



  • Agregamos panelGroup con el botón buscar en el inputText estatus

  <h:outputLabel value="#{msg.idestatus}" for="idestatus" />
   <h:panelGroup>
             <h:inputText id="idestatus" value="#{estatusController.estatus.idestatus}" title="#{msg.idestatus}" required="true" requiredMessage="#{msg.idestatus} #{app['info.required']}"/>
            <p:commandButton immediate="true"   icon="ui-icon-search"  action="estatussearch"/>
   </h:panelGroup>


  • Agregar los botones de editar , imprimir y eliminar en el <f:facet name="footer">
             <f:facet name="footer">
                      <p:commandButton icon="ui-icon-disk" update="panel,growl"                                                    
rendered="#{menuBeans.estatusCrear}"
                                       action="#{estatusController.save()}"/>
                      <p:commandButton id="button_edit"
                                      update="form,growl"
rendered="#{menuBeans.estatusEditar}"
                                      icon="ui-icon-pencil" action="#{estatusController.edit()}"/>
                       <p:commandButton  id="printButton"
                                      action="#{estatusController.imprimir()}"
                                     icon="ui-icon-print" ajax="false" />
                       <p:commandButton  id="button_delete" update="form,growl" icon="ui-icon-trash"
rendered="#{menuBeans.estatusEliminar}"
                               onclick="PF('confirmationwidgetVar').show();" type="button" />
            </f:facet>










  • Agregar el diálogo para confirmar la eliminación debajo del otro diálogo

<p:dialog id="confirmDialog" modal="false"  header="Delete"  widgetVar="confirmationwidgetVar">
                           <h:panelGrid columns="2">
                               <p:outputLabel value="#{msg.estatus}"/>
                               <p:outputLabel value="#{estatusController.estatus.estatus}"/>

                           </h:panelGrid>

                           <f:facet name="footer">
                               <p:commandButton id="removeButton" value="si"
                                                update="form,growl"
                                                oncomplete="PF('confirmationwidgetVar').hide();"
                                                actionListener="#{estatusController.delete()}" />

                               <p:commandButton id="cancelButton" value="no" onclick="PF('confirmationwidgetVar').hide()" type="button" />
                           </f:facet>
                       </p:dialog>






















  1. Crear la página estatussearch.xhtml, usaremos un diálogo , donde colocaremos inputText para cada atributo y los commandButton para realizar las operaciones de búsqueda, los resultados los mostraremos en un datatable para que se seleccione el registro adecuado.

Ahora creamos un Facelets Template Client
  • Desde menú File, seleccione New
  • en Categories, seleccione Java Server Faces
  • en File Types, seleccione Facelets Template Client
  • En File Name: estatussearch
  • Folder colocamos /page/estatus/
  • Template seleccionamos template.xhtml

Pasos:
  1. Comentamos las opciones del menú
  2. Agregar view,form, growl, messages, y un dialogo global
  3. Agregamos un panelGrid con los atributos que deseamos usar para buscar y un botón al lado de cada uno
  4. Creamos un dataTable que contendrá el resultado de la búsqueda con un botón para seleccionar la fila adecuada. Con dos botones, retornar y mostrar todos.
Agregamos en el    <ui:define name="center">
<f:view>
<h:form id="form" rendered="#{menuBeans.estatusListar}">
<p:messages autoUpdate="true"/>
<p:growl id="growl"/>
<p:dialog  header="search"
                                  closable="true" showEffect="clip"
                                  visible="true"
                                  hideEffect="fade"                                 
                                  height="235"  width="550"
                                  widgetVar="searchDialogWidgetVar">
                           <p:ajax event="close" update="growl"  listener="#{loginBean.irInicio()}"/>  

Colocar un panelGrid colocamos los componentes y los botones de buscar.

<h:panelGrid columns="2">
                               
                               <h:outputLabel value="#{app['form.estatussearch']}" />
                               <h:outputLabel value=""/>
                              
                               <h:outputLabel value="#{msg.idestatus}" for="idestatus" />
                               <h:panelGroup>
                                   <h:inputText id="idestatus" value="#{estatusSearchController.idestatus}" title="Idestatus" />
                                   <p:commandButton  icon="ui-icon-search"  update=":form:datatable" action="#{estatusSearchController.buscarIdEstatusList()}"/>
                               </h:panelGroup>
                               
                               <h:outputLabel value="#{msg.estatus}" for="estatus" />
                               <h:panelGroup>
                                   <h:inputText  id="estatus" value="#{estatusSearchController.nombreestatus}" title="#{msg.estatus}" />

                                   <p:commandButton  icon="ui-icon-search"  update=":form:datatable" action="#{estatusSearchController.buscar()}"/>
                                   <h:outputLabel value="Like"  />
                                   <p:selectBooleanCheckbox   value="#{estatusSearchController.usarlike}" />  
                               </h:panelGroup>

                               <h:outputLabel value="#{msg.esinicial}" for="esinicial" />
                               <h:panelGroup>
                                   
                                   <p:selectOneMenu id="esinicial" value="#{estatusSearchController.esinicial}"
                                                    requiredMessage="#{msg.esinicial} #{app['info.notnull']}">
                                       <f:selectItem itemLabel="#{app['boton.yes']}" itemValue="si" />
                                       <f:selectItem itemLabel="#{app['boton.no']}" itemValue="no" />
                                   </p:selectOneMenu>
                                   <p:commandButton  icon="ui-icon-search"  update=":form:datatable" action="#{estatusSearchController.buscarEsInicial()}"/>
                               </h:panelGroup>
                               <f:facet name="footer">

                               </f:facet>
                           </h:panelGrid>


Agregamos un dataTable basado en estatusSearchController,
  • colocamos dos botones uno para retornar a la página que lo invoco y otro para mostrar todos los registros.
  • Una columna contendrá un botón de selección. Y en el header colocamos el botón de regresar y un botón para mostrar todo.
  • Colocar el id=”datatable”, rows=”7”, utilizar los mensajes de los archivos properties.
  • Colocamos dos botones en el header, retornar y mostrar todo.
  • Cambiar de <h:datatable> y <h:columns> a <p:datatable> y <p:columns>
  <p:dataTable id="datatable" rows="7" value="#{estatusSearchController.estatusList}" var="item">
                               <p:column>
                                   <f:facet name="header">
                                       <h:outputText value="Idestatus"/>
                                   </f:facet>
                                   <h:outputText value="#{item.idestatus}"/>
                               </p:column>
                               <p:column>
                                   <f:facet name="header">
                                       <h:outputText value="Estatus"/>
                                   </f:facet>
                                   <h:outputText value="#{item.estatus}"/>
                               </p:column>
                               <p:column>
                                   <f:facet name="header">
                                       <h:outputText value="Esinicial"/>
                                   </f:facet>
                                   <h:outputText value="#{item.esinicial}"/>
                               </p:column>
                               <p:column >  
             <p:commandButton id="selectButton" update=":form:display"
oncomplete="PF('widgetVarSearch').show()" icon="ui-icon-search" title="View">  
                                       <f:setPropertyActionListener value="#{item}" target="#{estatusSearchController.selected}" />  
             </p:commandButton>  
                               </p:column>
                               <f:facet name="header">
<p:commandButton icon="ui-icon-circle-arrow-w"  action="#{estatusSearchController.retornar()}"/>
<p:commandButton value="All" update ="datatable" action="#{estatusSearchController.showAll()}"/>
                               </f:facet>
                           </p:dataTable>

Cambiamos los textos fijos para usar las etiquetas de los archivos de propiedades.






Agregamos un diálogo debajo del datatable

<p:dialog header="#{app['dialog.search']}" widgetVar="widgetVarSearch" resizable="false" id="searchDialog"  
                                 showEffect="fade" hideEffect="explode"
                                 height="135"  width="250"
                                 modal="false">  

                           <h:panelGrid id="display" columns="2" cellpadding="4" style="margin:0 auto;">  

                               <h:outputLabel value="#{msg.estatus}" for="idestatus" />
                               <h:outputLabel value="#{estatusSearchController.selected.estatus}" />

                               <f:facet name="footer">

                                   <p:commandButton ajax="false"  value="#{app['boton.return']}" action="#{estatusSearchController.retornar()}"/>

                               </f:facet>
                           </h:panelGrid>  

                       </p:dialog>  



Código de estatussearch.xhtml

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
     xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
     xmlns:h="http://xmlns.jcp.org/jsf/html"
     xmlns:f="http://xmlns.jcp.org/jsf/core"
     xmlns:p="http://primefaces.org/ui">

   <body>

       <ui:composition template="./../../template.xhtml">
           <!--
                       <ui:define name="top">
                           top
                       </ui:define>
           
                       <ui:define name="bottom">
                           bottom
                       </ui:define>
           
                       <ui:define name="left">
                           left
                       </ui:define>
           -->
           <ui:define name="center">
               <f:view>
                   <h:form id="form" rendered="#{menuBeans.estatusListar}">
                       <p:messages autoUpdate="true"/>
                       <p:growl id="growl"/>
                       <p:dialog  header="search"
                                  closable="true" showEffect="clip"
                                  visible="true"
                                  hideEffect="fade"                                 
                                  height="235"  width="550"
                                  widgetVar="searchDialogWidgetVar">
                           <p:ajax event="close" update="growl"  listener="#{loginBean.irInicio()}"/>  

                           <h:panelGrid columns="2">
                               
                               <h:outputLabel value="Search:"  />
                               <h:outputLabel value=""/>
                              
                               <h:outputLabel value="#{msg.idestatus}" for="idestatus" />
                               <h:panelGroup>
                                   <h:inputText id="idestatus" value="#{estatusSearchController.idestatus}" title="Idestatus" />
                                   <p:commandButton  icon="ui-icon-search"  update=":form:datatable" action="#{estatusSearchController.buscarIdEstatusList()}"/>
                               </h:panelGroup>
                               
                               <h:outputLabel value="#{msg.estatus}" for="estatus" />
                               <h:panelGroup>
                                   <h:inputText  id="estatus" value="#{estatusSearchController.nombreestatus}" title="Estatus" />

                                   <p:commandButton  icon="ui-icon-search"  update=":form:datatable" action="#{estatusSearchController.buscar()}"/>
                                   <h:outputLabel value="Like"  />
                                   <p:selectBooleanCheckbox   value="#{estatusSearchController.usarlike}" />  
                               </h:panelGroup>

                               <h:outputLabel value="#{msg.esinicial}" for="esinicial" />
                               <h:panelGroup>
                                   
                                   <p:selectOneMenu id="esinicial" value="#{estatusSearchController.esinicial}"
                                                    requiredMessage="#{msg.esinicial} #{app['info.notnull']}">
                                       <f:selectItem itemLabel="#{app['boton.yes']}" itemValue="si" />
                                       <f:selectItem itemLabel="#{app['boton.no']}" itemValue="no" />
                                   </p:selectOneMenu>
                                   <p:commandButton  icon="ui-icon-search"  update=":form:datatable" action="#{estatusSearchController.buscarEsInicial()}"/>
                               </h:panelGroup>
                               <f:facet name="footer">

                               </f:facet>
                           </h:panelGrid>

                           <p:dataTable id="datatable" rows="7" value="#{estatusSearchController.estatusList}" var="item">
                               <p:column>
                                   <f:facet name="header">
                                       <h:outputText value="Idestatus"/>
                                   </f:facet>
                                   <h:outputText value="#{item.idestatus}"/>
                               </p:column>
                               <p:column>
                                   <f:facet name="header">
                                       <h:outputText value="Estatus"/>
                                   </f:facet>
                                   <h:outputText value="#{item.estatus}"/>
                               </p:column>
                               <p:column>
                                   <f:facet name="header">
                                       <h:outputText value="Esinicial"/>
                                   </f:facet>
                                   <h:outputText value="#{item.esinicial}"/>
                               </p:column>
                               <p:column >  
                                   <p:commandButton id="selectButton" update=":form:display" oncomplete="PF('widgetVarSearch').show()" icon="ui-icon-search" title="View">  
                                       <f:setPropertyActionListener value="#{item}" target="#{estatusSearchController.selected}" />  
                                   </p:commandButton>  
                               </p:column>
                               <f:facet name="header">
                                   <p:commandButton icon="ui-icon-circle-arrow-w"  action="#{estatusSearchController.retornar()}"/>
                                   <p:commandButton value="All" update ="datatable" action="#{estatusSearchController.showAll()}"/>
                               </f:facet>
                           </p:dataTable>



                       </p:dialog>

                       <p:dialog header="#{app['dialog.search']}" widgetVar="widgetVarSearch" resizable="false" id="searchDialog"  
                                 showEffect="fade" hideEffect="explode"
                                 height="135"  width="250"
                                 modal="false">  

                           <h:panelGrid id="display" columns="2" cellpadding="4" style="margin:0 auto;">  

                               <h:outputLabel value="#{msg.estatus}" for="idestatus" />
                               <h:outputLabel value="#{estatusSearchController.selected.estatus}" />

                               <f:facet name="footer">

                                   <p:commandButton ajax="false"  value="#{app['boton.return']}" action="#{estatusSearchController.retornar()}"/>

                               </f:facet>
                           </h:panelGrid>  

                       </p:dialog>  
                   </h:form>
               </f:view>

           </ui:define>

       </ui:composition>

   </body>
</html>
















AVBravo - December 06, 2014 03:16 PM
Conociendo los nuevos miembros del Dream Team

 

I'm now a NetBeans Dream Team Member!

http://blog.eisele.net/2014/12/im-now-netbeans-dream-team-member.html



AVBravo - December 05, 2014 05:57 PM
16 Nuevos Miembros de NetBeans Dream Team

Se incorporan 16 nuevos miembros a NetBeans Dream Team, ampliamente conocidos y comprometidos con la evolución, desarrollo y promoción de NetBeans
Listado actualizado

  • Gail Anderson
  • Paul Anderson
  • Jens Deters
  • Constantin Drabo
  • Markus Eisele
  • Arun Gupta
  • David Heffelfinger
  • Rajmahendra Hegde
  • Josh Juneau
  • Martin Klähn
  • Thomas Kruse
  • Benno Markiewicz
  • Sean Phillips
  • Mark Stephens
  • Martijn Verburg
  • Johan Vos




AVBravo - December 04, 2014 02:13 PM
Libro JEE7 Capitulo 06 iReport

Capitulo 06 iReport

Puedes descargarlo en pdf
https://www.dropbox.com/sh/yzivtufjce1h57g/AAAJzegPVBxFtiqzEOlIAdsoa?dl=0

Encuesta
https://docs.google.com/forms/d/1WG7uzOe17V4u36fC05V3ijYEPZ8fhJD1NPUrkNBS0Jk/alreadyresponded?usp=send_form


En este capítulo mostraremos la forma de crear reportes de una manera muy sencilla utilizando iReport.


Pasos:
  1. Descargar el plugin iReport
  2. Crear reporte
  3. Desarrollar el código para imprimir reporte.


Descargamos el plugin de iReport para NetBeans






Descomprimir el archivo .zip

Desde el menú de NetBeans Tools-->Plugins-->Pestaña Downloaded-->Presionar el botón Add Plugins

En el proyecto seleccionar Build with dependences

Nos ubicamos en resources -->clic derecho y seleccionar New-->Categories: Other→ File Types: Folder

Crear el paquete reportes dentro de resources

Nos ubicamos en reportes y seleccionar  NewOther


Seleccionar Categories: Report
                    File Types: Empty report


dar el nombre





se muestra el diseñador de reportes





Revisamos los atributos del Entity Estatus.java


Abrimos el reporte y en  Field agregamos los tres fields. Clic derecho seleccionar Add Field

se genera el nombre field1
renombrar a idestatus, estatus,esinicial

En la paleta le cambiamos el tipo de dato en las propiedades
Propiedad Field Class
Arrastramos los campos a la sección Detail1, de manera automática se coloca en la columna el título.

Arrastras label Static Text  desde la paleta a la sección Page Header
En el texto colocamos ESTATUS y las propiedades seleccionamos Bold, para que lo coloque en negrita.

En Tools arrastramos Current date para agregar la fecha del sistema.

compilamos el reporte
En la barra se genera el mensaje de compilación exitosa

Se muestra el reporte compilado








CREAR CDI/BEANS PARA MANEJO DE IMPRESIONES

CDI Beans GestorImpresion.java lo usaremos para gestionar las diversos métodos para realizar las impresiones.
Crearemos los métodos con dos parámetros List<?> t , colocamos el ? para que podamos pasar cual list de objetos al método, y String ruta, es la ruta del reporte, HashMap para los parámetros que usaremos en los reportes.
  • imprimir(List<?> t,String ruta,HashMap hashmap) ,imprime la lista de objetos pasados
  • pdf(List<?> t, String ruta, HashMap hashmap), genera un pdf
  • docx(List<?> t, String ruta, HashMap hashmap), genera un archivo docx
  • xlsx(List<?> t, String ruta, HashMap hashmap), genera un archivo xlsx
  • odt(List<?> t, String ruta, HashMap hashmap), genera un archivo odt
  • ppt(List<?> t, String ruta, HashMap hashmap), genera un archivo ppt
  • preparar(List<?> t, String ruta, HashMap hashmap), se utiliza internamente para configurar el entorno del reporte.
De esta manera podemos invocar el reporte desde el controller, donde pasaremos la lista de objetos
public String imprimir() {
       String ruta = "/resources/reportes/estatus.jasper";
       HashMap parameters = new HashMap();
       gestorImpresion.imprimir(estatusFacade.getEstatusList(), ruta, parameters);

       return null;
   }


Crear el CDI Beans
  • Desde menú File, seleccione New
  • en Categories, seleccione Java Server Faces
  • en File Types, seleccione JSF ManagedBeans
  • Class Name: GestorImpresion
  • Package com.avbravo.scrumweb.generales
  • Scope: request







Código completo  de GestorImpresion.java

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import javax.enterprise.context.RequestScoped;
import javax.faces.context.FacesContext;
import javax.inject.Named;
import javax.servlet.ServletContext;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRExporterParameter;
import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import net.sf.jasperreports.engine.export.JRPdfExporter;
import net.sf.jasperreports.engine.export.oasis.JROdtExporter;
import net.sf.jasperreports.engine.export.ooxml.JRDocxExporter;
import net.sf.jasperreports.engine.export.ooxml.JRPptxExporter;
import net.sf.jasperreports.engine.export.ooxml.JRXlsxExporter;

/**
*
* @author avbravo
*/
@Named
@RequestScoped

public class GestorImpresion {

   JRBeanCollectionDataSource ds;
   FacesContext facesContext;
   ServletContext scontext;
   JasperPrint jasperPrint;

   /**
    * Creates a new instance of GestorImpresion
    */
   public GestorImpresion() {
   }

   public String imprimir(List<?> t, String ruta, HashMap hashmap) {
       try {
           preparar(t, ruta, hashmap);
           ByteArrayOutputStream baos = new ByteArrayOutputStream();
           JRPdfExporter exporter = new JRPdfExporter();
           exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
           exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, baos);
           exporter.exportReport();
           byte[] bytes = baos.toByteArray();
           if (bytes != null && bytes.length > 0) {
               HttpServletResponse response = (HttpServletResponse) facesContext.getExternalContext().getResponse();
               response.setContentType("application/pdf");
               response.setHeader("Content­disposition", "inline; filename=\"relatorioPorData.pdf\"");
               response.setContentLength(bytes.length);
               ServletOutputStream outputStream = response.getOutputStream();
               outputStream.write(bytes, 0, bytes.length);
               outputStream.flush();
               outputStream.close();
           }
       } catch (JRException | IOException e) {
           JSFUtil.addErrorMessage(e.getMessage());
       }
       return null;
   }

   public String pdf(List<?> t, String ruta, HashMap hashmap) {
       try {
           preparar(t, ruta, hashmap);
           HttpServletResponse httpServletResponse = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();
           httpServletResponse.addHeader("Content­disposition", "attachment;filename=report.pdf");
           ServletOutputStream servletOutputStream = httpServletResponse.getOutputStream();
           JasperExportManager.exportReportToPdfStream(jasperPrint, servletOutputStream);
           FacesContext.getCurrentInstance().responseComplete();
       } catch (JRException | IOException e) {
           JSFUtil.addErrorMessage(e.getMessage());
       }
       return null;
   }

   public String docx(List<?> t, String ruta, HashMap hashmap) {
       try {
           preparar(t, ruta, hashmap);
           HttpServletResponse httpServletResponse = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();
           httpServletResponse.addHeader("Content­disposition", "attachment;filename=report.docx");
           ServletOutputStream servletOutputStream = httpServletResponse.getOutputStream();
           JRDocxExporter docxExporter = new JRDocxExporter();
           docxExporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
           docxExporter.setParameter(JRExporterParameter.OUTPUT_STREAM,
                   servletOutputStream);
           docxExporter.exportReport();
           FacesContext.getCurrentInstance().responseComplete();
       } catch (JRException | IOException e) {
           JSFUtil.addErrorMessage(e.getMessage());
       }
       return null;
   }

   public String xlsx(List<?> t, String ruta, HashMap hashmap) {
       try {
           preparar(t, ruta, hashmap);
           HttpServletResponse httpServletResponse = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();
           httpServletResponse.addHeader("Content­disposition", "attachment;filename=report.xlsx");
           ServletOutputStream servletOutputStream = httpServletResponse.getOutputStream();
           JRXlsxExporter docxExporter = new JRXlsxExporter();
           docxExporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
           docxExporter.setParameter(JRExporterParameter.OUTPUT_STREAM,
                   servletOutputStream);
           docxExporter.exportReport();
           FacesContext.getCurrentInstance().responseComplete();
       } catch (JRException | IOException e) {
           JSFUtil.addErrorMessage(e.getMessage());
       }
       return null;
   }

   public String odt(List<?> t, String ruta, HashMap hashmap) {
       try {
           preparar(t, ruta, hashmap);
           HttpServletResponse httpServletResponse = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();
           httpServletResponse.addHeader("Content­disposition", "attachment;filename=report.odt");
           ServletOutputStream servletOutputStream = httpServletResponse.getOutputStream();
           JROdtExporter docxExporter = new JROdtExporter();
           docxExporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
           docxExporter.setParameter(JRExporterParameter.OUTPUT_STREAM,
                   servletOutputStream);
           docxExporter.exportReport();
           FacesContext.getCurrentInstance().responseComplete();
       } catch (JRException | IOException e) {
           JSFUtil.addErrorMessage(e.getMessage());
       }
       return null;
   }

   public String ppt(List<?> t, String ruta, HashMap hashmap) {
       try {
           preparar(t, ruta, hashmap);
           HttpServletResponse httpServletResponse = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();
           httpServletResponse.addHeader("Content­disposition", "attachment;filename=report.pptx");
           ServletOutputStream servletOutputStream = httpServletResponse.getOutputStream();
           JRPptxExporter docxExporter = new JRPptxExporter();
           docxExporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
           docxExporter.setParameter(JRExporterParameter.OUTPUT_STREAM,
                   servletOutputStream);
           docxExporter.exportReport();
           FacesContext.getCurrentInstance().responseComplete();
       } catch (JRException | IOException e) {
           JSFUtil.addErrorMessage(e.getMessage());
       }
       return null;
   }

   private void preparar(List<?> t, String ruta, HashMap hashmap) {
       try {
           ds = new JRBeanCollectionDataSource(t);
           facesContext = FacesContext.getCurrentInstance();
           facesContext.responseComplete();
           scontext = (ServletContext) facesContext.getExternalContext().getContext();
           jasperPrint = JasperFillManager.fillReport(scontext.getRealPath(ruta), hashmap, ds);
       } catch (Exception e) {
           JSFUtil.addErrorMessage(e.getMessage());
       }
   }
 }


































Editar EstatusDataController.java , inyectar GestionImpresion y agregar el método imprimir().En este indicaremos la ruta del reporte, la lista de entitys y el HashMap con los parámetros. E invocamos al método correspondiente en GestionImpresion

@Inject
   GestorImpresion gestorImpresion;

public String imprimir() {
       String ruta = "/resources/reportes/estatus.jasper";
       HashMap parameters = new HashMap();
       gestorImpresion.imprimir(estatusFacade.getEstatusList(), ruta, parameters);
       return null;
   }

/*
*imprimir un solo entity
*/
public String imprimir() {
List<Estatus> list = new ArrayList<>();
list.add(estatus);
       String ruta = "/resources/reportes/estatus.jasper";
       HashMap parameters = new HashMap();
       gestorImpresion.imprimir(list, ruta, parameters);
       return null;
   }



















Editamos estatuslist.xhmtl, agregamos un footer con el boton imprimir, utilizamos en este caso immediate=”true”, para evitar que se realicen las validaciones, ya que desamos mostrar el reporte directamente.

<f:facet name="footer">
             <p:commandButton immediate="true" id="printButton" value="#{app['boton.print']}" action="#{estatusDataController.imprimir()}" icon="ui-icon-print" ajax="false" />                                                                     
  </f:facet>
                        </p:dataTable>
                        </p:dialog>

Cuando ejecutamos el proyecto y seleccionamos estatuslist, se muestra el botón Imprimir
al presionarlo se muestra el reporte para imprimir


AVBravo - December 01, 2014 10:19 PM
Libro JEE7 05. Login y Seguridad

Libro JEE7 05. Login y Seguridad
  • ROLES
  • CREAR CDI BEANS para administrar los roles
  • CREAR CDI RolAdministrador
  • CREAR CDI ValidadorRoles
  • CREAR CDI LoginBean
  • Codigo completo de LoginBean.java
  • EDITAR LA PAGINA index.xhtml
  • EDITAR LA PAGINA menu.xhtml
  • CREAR LA PÁGINA accesodenegado.xhtml
  • EDITAR LA PÁGINA estatusinsert.xhtml
Puedes descargar los capítulos en formato pdf desde aquí
https://www.dropbox.com/sh/yzivtufjce1h57g/AAAJzegPVBxFtiqzEOlIAdsoa?dl=0



En este capítulo mostraremos cómo crear el formulario de login y realizar las validaciones necesarias de los privilegios.
También colocaremos los formularios en un diálogo visible.









ROLES



Para validar los roles de usuarios tenemos varias alternativas, en esta ocasión lo controlaremos desde CDI Beans.
Crearemos un CDI Beans llamado MenuBeans que contendrá las opciones del menú y los privilegios que tiene el usuario en cada opción.


  • Desde menú File, seleccione New
  • en Categories, seleccione Java Server Faces
  • en File Types, seleccione JSF ManagedBeans
  • Class Name:  MenuBeans
  • Package com.avbravo.scrumweb.generales
  • Scope: Session


Recordar cambiar las anotaciones y los imports.
Si observamos el menú, contamos con la opción Registros y dentro de ella Estatus con dos menuitems, Insertar, Listar.
Definiremos atributos booleanos para los diversos componentes.

Definiremos:
  • Los elementos de la barra con el formato: barraNombre
    • private Boolean barraRegistros = false;
  • Los menú con el formato: nombreMenu
    • private Boolean estatusMenu = false;
  • Los submenu con el formato: nombreOperacion
    • private Boolean estatusCrear = false;


Generamos los get/set mendiante , clic derecho en el código y seleccionar  Insert CodeGetters and Setterts
Nota:
El código generado como son atributos booleanos se generan los métodos is, en nuestro CDI Beans debemos cambiarlo a get para utilizarlo dentro de nuestras páginas java server faces.


 public Boolean isBarraRegistros() {
       return barraRegistros;
   }


   public void setBarraRegistros(Boolean barraRegistros) {
       this.barraRegistros = barraRegistros;
   }


Cambiamos is por get, los métodos set quedan iguales no se modifican.


public Boolean getBarraRegistros() {
       return barraRegistros;
   }


   public void setBarraRegistros(Boolean barraRegistros) {
       this.barraRegistros = barraRegistros;
   }








Codigo completo  de MenuBeans.java


import java.io.Serializable;
import javax.enterprise.context.SessionScoped;
import javax.inject.Named;


/**
*
* @author avbravo
*/
@Named
@SessionScoped
public class MenuBeans implements Serializable {


   private static final long serialVersionUID = 1L;


   /*
    * barra de menu
    */
   private Boolean barraRegistros = false;
   /*   
    */
   private Boolean estatusMenu = false;
   private Boolean estatusCrear = false;
   private Boolean estatusConsultar = false;
   private Boolean estatusEditar = false;
   private Boolean estatusListar = false;
   private Boolean estatusEliminar = false;

//Crear el método habilitarTodo(Boolean activo), que recibi un parámetro de tipo //booleano y que será asignado a los todos los atributos del CDI Beans.

public void habilitarTodo(Boolean activo) {
       /*
        barra
        */
       barraRegistros = activo;


       estatusMenu = activo;
       estatusCrear = activo;
       estatusConsultar = activo;
       estatusEditar = activo;
       estatusListar = activo;
       estatusEliminar = activo;
   }


public Boolean getBarraRegistros() {
       return barraRegistros;
   }


   public void setBarraRegistros(Boolean barraRegistros) {
       this.barraRegistros = barraRegistros;
   }


   public Boolean getEstatusMenu() {
       return estatusMenu;
   }


   public void setEstatusMenu(Boolean estatusMenu) {
       this.estatusMenu = estatusMenu;
   }


   public Boolean getEstatusCrear() {
       return estatusCrear;
   }


   public void setEstatusCrear(Boolean estatusCrear) {
       this.estatusCrear = estatusCrear;
   }


   public Boolean getEstatusConsultar() {
       return estatusConsultar;
   }


   public void setEstatusConsultar(Boolean estatusConsultar) {
       this.estatusConsultar = estatusConsultar;
   }


   public Boolean getEstatusEditar() {
       return estatusEditar;
   }
   public void setEstatusEditar(Boolean estatusEditar) {
       this.estatusEditar = estatusEditar;
   }
   public Boolean getEstatusListar() {
       return estatusListar;
   }


   public void setEstatusListar(Boolean estatusListar) {
       this.estatusListar = estatusListar;
   }


   public Boolean getEstatusEliminar() {
       return estatusEliminar;
   }


   public void setEstatusEliminar(Boolean estatusEliminar) {
       this.estatusEliminar = estatusEliminar;
   }


}






















       

CREAR CDI BEANS para administrar los roles

Pasos:
Crearemos un CDI Beans para cada rol, donde indicaremos los privilegios que tiene en base a su rol, y el CDI Beans ValidadorRoles, a continuación mostraremos la imagen de como seria nuestro paquete con los CDI Beans, si observamos existe un CDI para cada rol.

CREAR  CDI RolAdministrador



  • Desde menú File, seleccione New
  • en Categories, seleccione Java Server Faces
  • en File Types, seleccione JSF ManagedBeans
  • Class Name: RolAdministrador
  • Package com.avbravo.scrumweb.roles
  • Scope: request


Inyectamos MenuBeans
 @Inject
   MenuBeans menuBeans;


y creamos el método activar(), donde asignamos valores de true a los atributos correspondientes a los roles, si deseamos que el usuario no tenga acceso a una opción simplemente asignamos un valor de false.


 public void activar() {
       menuBeans.setBarraRegistros(true);
       menuBeans.setEstatusMenu(true);
       menuBeans.setEstatusCrear(true);
       menuBeans.setEstatusConsultar(true);
       menuBeans.setEstatusEditar(true);
       menuBeans.setEstatusListar(true);
       menuBeans.setEstatusEliminar(true);
   }






Código completo  de RolAdministrador.java
import com.avbravo.scrumweb.generales.MenuBeans;
import java.io.Serializable;
import javax.enterprise.context.RequestScoped;
import javax.inject.Inject;
import javax.inject.Named;


/**
*
* @author avbravo
*/
@Named
@RequestScoped


public class RolAdministrador {


   @Inject
   MenuBeans menuBeans;


   /**
    * Creates a new instance of RolAdministrador
    */
   public RolAdministrador() {
   }
   public void activar() {
       menuBeans.setBarraRegistros(true);
       menuBeans.setEstatusMenu(true);
       menuBeans.setEstatusCrear(true);
       menuBeans.setEstatusConsultar(true);
       menuBeans.setEstatusEditar(true);
       menuBeans.setEstatusListar(true);
       menuBeans.setEstatusEliminar(true);
   }
}

De la misma forma creamos los CDI Beans RolDuenoProducto y en el método activar de cada uno de ellos establecemos los privilegios para acceder o no cada opción.


CREAR  CDI ValidadorRoles



  • Desde menú File, seleccione New
  • en Categories, seleccione Java Server Faces
  • en File Types, seleccione JSF ManagedBeans
  • Class Name: ValidadorRoles
  • Package com.avbravo.scrumweb.roles
  • Scope: request


Pasos:
  1. Inyectamos los CDI Beans de roles
  2. Inyectamos MenuBeans
  3. Crear un método validarRoles(String rolvalidacion), que recivira un parámetro que indica el rol y este será validado llamando al método activar(), del CDI Beans correspondiente.
  4. Si no existe un rol especifico se desactivara todos las opciones de los menu, invocando a menuBeans.habilitarTodo(false);


Código completo  de ValidadorRoles.java


import com.avbravo.scrumweb.generales.JSFUtil;
import com.avbravo.scrumweb.generales.MenuBeans;
import com.avbravo.scrumweb.generales.ResourcesFiles;
import java.io.Serializable;
import javax.enterprise.context.RequestScoped;
import javax.inject.Inject;
import javax.inject.Named;


/**
*
* @author avbravo
*/
@Named
@RequestScoped
public class ValidadorRoles {
@Inject
RolAdministrador rolAdministrador;
@Inject
RolDuenoProducto rolDuenoProducto;


   @Inject
   MenuBeans menuBeans;
   @Inject
   ResourcesFiles rf;


   /**
    * Creates a new instance of ValidadorRoles
    */
   public ValidadorRoles() {
   }


   public Boolean validarRoles(String rolvalidacion) {
       Boolean ok = Boolean.TRUE;


       try {
           switch (rolvalidacion) {
               case "administrador":


                   rolAdministrador.activar();
                   break;
               case "product owner":


                   rolDuenoProducto.activar();
                   break;
             
               default:
                   menuBeans.habilitarTodo(false);
                   ok = Boolean.FALSE;
                   JSFUtil.warningDialog(rf.getMensajeArb("warning.title"), rf.getMensajeArb("info.sinrolasignado"));
                  
           }
       } catch (Exception e) {
           JSFUtil.addErrorMessage("validarRoles() " + e.getLocalizedMessage());
       }
       return ok;
   }


}





CREAR  CDI LoginBean



  • Desde menú File, seleccione New
  • en Categories, seleccione Java Server Faces
  • en File Types, seleccione JSF ManagedBeans
  • Class Name: LoginBean
  • Package com.avbravo.scrumweb.generales
  • Scope: Session


Pasos:
  1. Inyectamos Usuarios, UsuariosFacade,ResourcesFiles, MenuBeans,ValidadorRoles
  2. Crear metodos get/set para el Entity Usuarios.
  3. Crear atributo Boolean logeado y los    @Inject
  4.    RolAdministrador rolAdministrador;
  5.    @Inject
  6.    RolDuenoProducto rolDuenoProducto;
  7. métodos set/get. Recordar cambiar el método is por get.
  8. Crear el método verificarLogin(), en este método se validará el username y password del usuario y el rol que tiene el mismo dentro de la aplicación.
  9. Crear metodo logout()
  10. Crear método init()


Codigo completo  de LoginBean.java

import com.avbravo.scrumweb.Usuarios;
import com.avbravo.scrumweb.ejb.UsuariosFacade;
import com.avbravo.scrumweb.roles.ValidadorRoles;
import java.io.IOException;
import java.io.Serializable;
import javax.annotation.PostConstruct;
import javax.enterprise.context.SessionScoped;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.inject.Inject;
import javax.inject.Named;
import javax.servlet.http.HttpSession;


@Named
@SessionScoped
public class LoginBean implements Serializable {


private static final long serialVersionUID = 1L;
   @Inject
   UsuariosFacade usuariosFacade;
   Usuarios usuarios = new Usuarios();
   @Inject
   ResourcesFiles rf;
   @Inject
   MenuBeans menuBeans;
   @Inject
   ValidadorRoles validadorRoles;


   Boolean logeado = false;
   /**
    * Creates a new instance of LoginBean
    */
    public Usuarios getUsuarios() {
       return usuarios;
   }


   public void setUsuarios(Usuarios usuarios) {
       this.usuarios = usuarios;
   }


   public Boolean getLogeado() {
       return logeado;
   }


   public void setLogeado(Boolean logeado) {
       this.logeado = logeado;
   }


   @PostConstruct
   public void init() {
   }


   public LoginBean() {
   }
   
   public String verificarLogin() {
       try {
           menuBeans.habilitarTodo(false);
           setLogeado(Boolean.FALSE);
           Usuarios u = usuariosFacade.find(usuarios.getUsername());


           if (u == null) {
               JSFUtil.addWarningMessage(rf.getMensajeArb("login.usernamenotvalid"));
               return null;
           }
           if (!u.getActivo().equals("si")) {
               JSFUtil.addSuccessMessage(rf.getMensajeArb("login.inactive"));
               return "";
           }
           if (!u.getPassword().equals(usuarios.getPassword())) {
               JSFUtil.addSuccessMessage(rf.getMensajeArb("login.passwordnotvalid"));
               return "";
           }
           usuarios = u;
           setLogeado(Boolean.TRUE);


           if (validadorRoles.validarRoles(usuarios.getIdgruposusuario().getIdgruposusuario())) {


               return "";
           }


       } catch (Exception e) {
           JSFUtil.addErrorMessage(e, "verificarLogin()");
       }


       return null;
   }


   public String logout() {
       try {


           HttpSession session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(false);
           if (session != null) {
               session.invalidate();
           }
String url = "/scrumweb/faces/index.xhtml?faces-redirect=true";
           FacesContext fc = FacesContext.getCurrentInstance();
           ExternalContext ec = fc.getExternalContext();
           try {
               ec.redirect(url);
           } catch (IOException ex) {
               JSFUtil.addErrorMessage(ex.getLocalizedMessage());
           }
return "/scrumweb/faces/index.xhtml?faces-redirect=true";
       } catch (Exception e) {
           JSFUtil.addErrorMessage(e, "logout()");
       }
       return null;
   }


   public String irLogin() {
       return "/index";
   }


   public void irInicio() {
       FacesContext ctx = FacesContext.getCurrentInstance();
       ExternalContext extContext = ctx.getExternalContext();


       String url = extContext.encodeActionURL(ctx.getApplication().getViewHandler().getActionURL(ctx, "/index.xhtml"));


       try {
           extContext.redirect(url);
       } catch (IOException ioe) {
           JSFUtil.addErrorMessage(ioe.getLocalizedMessage().toString());
       }
   }
}














EDITAR LA PAGINA index.xhtml

Colocar las etiquetas para validar el login de usuario.
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
     xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
     xmlns:h="http://xmlns.jcp.org/jsf/html"
     xmlns:p="http://primefaces.org/ui"
     xmlns:f="http://xmlns.jcp.org/jsf/core">


   <body>


       <ui:composition template="./template.xhtml">
           <!--
                       <ui:define name="top">
                           top
                       </ui:define>
           
                       <ui:define name="bottom">
                           bottom
                       </ui:define>
           
                       <ui:define name="left">
                           left
                       </ui:define>
           -->


<ui:define name="center">
               <h:form id="formtopnologeado" rendered="#{!loginBean.logeado}" >
                   <p:growl id="growl" life="1500" />
                   <p:dialog visible="true" header="#{app['application.title']}" closable="false" showEffect="clip" hideEffect="fade" widgetVar="loginDialog">  


                       <h:panelGrid columns="2" >
                           <f:facet name="header">
                               <h:outputLabel  value="#{mensajes['boton.login']}"/>
                           </f:facet>


                           <h:outputText value="#{app['login.username']}"></h:outputText>
                         <h:inputText value="#{loginBean.usuarios.username}"  required="true" />
                        <h:outputText value="#{app['login.password']}"  ></h:outputText>
                           <h:inputSecret value="#{loginBean.usuarios.password}"  required="true" />
                           <f:facet name="footer">
<p:commandButton action="#{loginBean.verificarLogin}" value="#{app['boton.login']}" ajax = "false" />
                           </f:facet>
                       </h:panelGrid>
                   </p:dialog>  
               </h:form>


           </ui:define>
</ui:composition>


   </body>
</html>

























EDITAR LA PAGINA menu.xhtml

Editar las opciones y colocar la validación para activar las opciones en base al valor de los atributos de menuBeans.
Paso:
  1. Colocar la propiedad rendered en el <p:megaMenu> utilizando el atributo logeado de loginBean.
  2. Utilizar rendered en el submenú utilizando barraRegistros
  3. Utilizar el atributo rendered de los <menuitem> utilizando estatusCrear y estatusListar.
el rendered y el atributo de menuBeans correspondientes, para establecer la validación.
  1. Colocar en el menuitem logout  actionListener="#{loginBean.logout}" ajax = "false" rendered="#{loginBean.logeado}"

<h:body>
       <ui:composition>
           <h:form id="menuForm" >
               <p:megaMenu rendered="#{loginBean.logeado}">  
                   <p:submenu label="#{app['menu.records']}" rendered="#{menuBeans.barraRegistros}"  icon="ui-icon-check">  
                       <p:column>                              
      <p:submenu label="#{app['menu.estatus']}" rendered="#{menuBeans.estatusMenu}">  
              <p:menuitem value="#{app['menu.insert']}" rendered="#{menuBeans.estatusCrear}" url="/faces/page/estatus/estatusinsert.xhtml" />  
              <p:menuitem value="#{app['menu.list']}"  rendered="#{menuBeans.estatusListar}" url="/faces/page/estatus/estatuslist.xhtml"/>  
      </p:submenu>  


                       </p:column>  
                   </p:submenu>  
                  <p:menuitem value="#{app['login.logout']}" actionListener="#{loginBean.logout}" title="#{app['login.logout']}" ajax = "false" rendered="#{loginBean.logeado}" icon="ui-icon-power"/>


          







CREAR LA PÁGINA accesodenegado.xhtml

Esta página la usaremos para desplegar un mensaje indicando que el usuario no tiene privilegios para visualizar la página, generalmente ocurre cuando el usuario trata de ingresar el url en el navegador para ingresar a paginas no autorizadas.
Pasos:
  1. Crear el Facelets Template Client
  2. Agregar un dialogo visible
  3. Mostrar un texto
  4. Utilizar un boton para enviarlo a la pagina para logearse.


Ahora creamos un Facelets Template Client
  • Desde menú File, seleccione New
  • en Categories, seleccione Java Server Faces
  • en File Types,  JSF Page
  • En File Name: accesodenegado




Colocamos un diálogo, con un panelGrid donde colocamos una etiqueta y un botón para regresar al index.xhtml.











Código completo  de accesodenegado.xhtml


<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
     xmlns:h="http://xmlns.jcp.org/jsf/html"
     xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
     xmlns:p="http://primefaces.org/ui">


   <h:body>
       <ui:composition>
 
        <p:dialog visible="true" header="#{app['login.accesodenegado']}"  closable="false" showEffect="fade" hideEffect="fade" widgetVar="loginDialog">  
                   <p:panelGrid columns="1" >
                       <h:outputText value="#{app['login.accesodenegadoDetalle']}"/>
                       <p:commandButton action="#{loginBean.irLogin}" value="#{app['boton.return']}" ajax="false"/>
                   </p:panelGrid>
               </p:dialog>
       
       </ui:composition>
  </h:body>
</html>

















EDITAR  LA PÁGINA estatusinsert.xhtml

Estableceremos validación de acceso a nivel de cada página para solo permitir el ingreso al usuario con los privilegios.
Pasos:


  1. Establecer el rendered con la opción de menuBeans en el form principal
<ui:define name="center">
               <f:view>
                   <h:form rendered="#{menuBeans.estatusCrear}">


colocar en comentarios
<!--                            <h1><h:outputText value="#{app['form.estatusnew']}"/></h1>-->


  1. Colocar un dialogo
<p:dialog visible="true" header="#{app['form.estatusnew']}" closable="true" showEffect="clip" hideEffect="fade" widgetVar="estatusinsertDialog">  


cerramos el diálogo después </h:panelGrid>
</p:dialog>


  1. Agregar el include accesodenegado si no se tiene permisos para ingresar al formulario.
antes del </f:view> fuera del form principal.
                
   <h:form rendered="#{!menuBeans.estatusCrear}">
                       <ui:include src="/accesodenegado.xhtml" />
   </h:form>


</f:view>

se mostrará en un diálogo el formulario


Repetimos el proceso para la página estatuslist.xhtml usando el rendered
<h:form id="form" rendered="#{menuBeans.estatusListar}">


Colocamos el datatable en un dialogo.
<p:dialog visible="true" header="#{app['form.estatuslist']}" closable="false" showEffect="clip" hideEffect="fade" widgetVar="estatuslistDialog">  
<p:dataTable id="datatable" paginator="true"
                                        rows="7" value="#{estatusDataController.estatusList}" var="item"
                                        rowKey="#{item.idestatus}"
                                        selectionMode="single"
                                        selection="#{estatusDataController.selected}"
                                        filteredValue="#{estatusDataController.filtered}"
                                        >
   </p:dataTable>
                       </p:dialog>

Agregamos el include con el rendered.
<h:form rendered="#{!menuBeans.estatusListar}">
                       <ui:include src="/accesodenegado.xhtml" />
   </h:form>



Para probarlo podemos pegar en el browser el url


Sin haberse logueado y mostrará el diálogo de acceso denegado, y al presionar el boton Regresar nos lleva a la página index.html donde nos debemos loguear.




De esta manera restringimos el acceso por privilegios a cada página



AVBravo - December 01, 2014 10:10 PM
@NamedQuery y Query con JPA

Si deseamos realizar consultas mediante JPA

1. Crear un NamedQuery 
Creamos el  @NamedQuery en el Entity

    @NamedQuery(name = "Configuracion.findByIdmunicipio", query = "SELECT c FROM Configuracion c WHERE c.idmunicipio = :idmuinicipio"),

@Entity
@Table(name = "configuracion")
@XmlRootElement
@NamedQueries({
    @NamedQuery(name = "Configuracion.findAll", query = "SELECT c FROM Configuracion c"),
    @NamedQuery(name = "Configuracion.findByIdreglasrecargo", query = "SELECT c FROM Configuracion c WHERE c.idreglasrecargo = :idreglasrecargo"),
      @NamedQuery(name = "Configuracion.findByIdmunicipio", query = "SELECT c FROM Configuracion c WHERE c.idmunicipio = :idmunicipio"),
    @NamedQuery(name = "Configuracion.findByFecha", query = "SELECT c FROM Configuracion c WHERE c.fecha = :fecha")})


En el EJB invocamos el NamedQuery creado
public List<Configuracion> findByIdMunicipio(Municipios value) {
    Query query = em.createNamedQuery("Configuracion.findByIdmunicipio");
        return query.setParameter("idmunicipio", value).getResultList();
    }

2. No modificamos el Entity
@Entity
@Table(name = "configuracion")
@XmlRootElement
@NamedQueries({
    @NamedQuery(name = "Configuracion.findAll", query = "SELECT c FROM Configuracion c"),
    @NamedQuery(name = "Configuracion.findByIdreglasrecargo", query = "SELECT c FROM Configuracion c WHERE c.idreglasrecargo = :idreglasrecargo"),
    @NamedQuery(name = "Configuracion.findByFecha", query = "SELECT c FROM Configuracion c WHERE c.fecha = :fecha")})

En el EJB creamos el Query
public List<Configuracion> findByIdMunicipio(Municipios value) {
        Query query = em.createQuery("SELECT c FROM Configuracion c WHERE c.idmunicipio = :idmunicipio");
        return query.setParameter("idmunicipio", value).getResultList();
    }


AVBravo - December 01, 2014 03:55 PM
WakaTime plugin para NetBeans

WakaTime ha liberado su plugin para NetBeans.
WakaTime permite dar un seguimiento de tiempo a los desarrolladores.
Lo instalamos en NetBeans, idicamos el api Key, y empezara a llevar el registro de las actividades.


El dashboard, nos permite ver por proyectos



Otros informes

AVBravo - November 29, 2014 09:55 PM
Encuesta sobre el Libro

Amigos, este enlace tiene una encuesta sobre el libro
https://docs.google.com/forms/d/1WG7uzOe17V4u36fC05V3ijYEPZ8fhJD1NPUrkNBS0Jk/viewform?usp=send_form

AVBravo - November 29, 2014 03:50 PM
Libro JEE7 Capítulo 4. DataTable

Libro JEE7 Capítulo 4. DataTable

  • Para el manejo de tablas usaremos el componente <p:datatable>
  • Utilizaremos el CDI Beans EstatusDataController.java , que crearemos para el manejo de la lista de estatus que serán desplegados mediante el componente datatable.
  • Usaremos Método @PostConstructor
  • FILTRAR Y ORDENAR REGISTROS
  • DATATABLE CON FORMULARIO DE INSERCIÓN
  • Datatable con Selección, Edición y Eliminación de Registros


Para el manejo de tablas usaremos el componente <p:datatable>

Utilizaremos el CDI Beans EstatusDataController.java , que crearemos para el manejo de la lista de estatus que serán desplegados mediante el componente datatable.


Usaremos Método @PostConstructor

Se utiliza para invocar métodos al inicio, lo podemos usar para invocar mediante parámetros de un CDI Beans o de Session.

Pasos:
  1. Creamos un List<Estatus>
List<Estatus> estatusList;

  1. en el constructor inicializamos el estatusList.

public EstatusDataController() {
        estatusList = new ArrayList<>();
   }

  1. Ajustar método  getEstatusList()

Cambiamos el método getEstatusList()
por
public List<Estatus> getEstatusList() {
       return estatusFacade.getEstatusList();
   }
public List<Estatus> getEstatusList() {
       return estatusList;
   }

  1. crear los métodos set para estatusList, podemos utilizar el asistente clic derecho Insert code -->Getter and Setter… seleccionar estatusList

   public void setEstatusList(List<Estatus> estatusList) {
       this.estatusList = estatusList;
   }

Creamos el método  init con la anotación @PostConstruct, que sera invocado la primera vez que se carga el CDIBeans.Se usara otro metodo iniciar(), para el caso que deba ser invocado nuevamente.
@PostConstruct
       public void init(){
           iniciar();
       }
corregimos los import

Crear el método iniciar() para cargar registros.
public void iniciar(){
 estatusList = estatusFacade.getEstatusList();
}

Crear otro método iniciar con parámetro String ,este recibirá un parámetro para establecer el filtro de las entidades a mostrar en el datatable.
public void iniciar(String value){
   estatusList = estatusFacade.findByEsinicial(value);
}



Editar el método delete() y agregar la invocación al método iniciar(); de manera que carge el list actualizado.
 public String delete() {
       try {
           estatusFacade.remove(selected);
  iniciar();
           JSFUtil.addSuccessMessage(rf.getMensajeArb("info.delete"));
       } catch (Exception e) {
           JSFUtil.addErrorMessage(e.getLocalizedMessage());
       }
       return null;
   }


Si deseamos filtrar los registros iniciales


para obtener los filtrados por el atributo esinicial=”no”
En el método init() de  r, invocamos el método iniciar( con el parámetro no), para que devuelva los registros que cumplan esa condición.
 @PostConstruct
   public void init(){
       //iniciar();
       iniciar("no");       
   }
Solo se muestran los registros con esincial = “no”

Otra forma seria para invocar el método antes de cargar la página, en el código xhtml , en la sección metadata, indicamos el parámetro, y el viewAction.
<f:metadata>
<f:viewParam name="id" value="#{estatusDataController.estatus.idestatus}"/>
<f:viewAction action="#{estatusDataController.iniciar}"/>
</f:metadata>


FILTRAR Y ORDENAR REGISTROS


Agregamos un list del Entity Estatus
private List<Estatus> filtered;

y creamos los métodos set/get

public List<Estatus> getFiltered() {
       return filtered;
   }

   public void setFiltered(List<Estatus> filtered) {
       this.filtered = filtered;
   }
   En el componente dataTable agregar filteredValue="#{estatusDataController.filtered}"
<p:dataTable id="datatable" paginator="true" rows="7" value="#{estatusDataController.estatusList}"
                                    var="item"
                                     rowKey="#{item.idestatus}"
                                    selectionMode="single"
                                    selection="#{estatusDataController.selected}"
                                    filteredValue="#{estatusDataController.filtered}"
                                    >


En las columnas colocamos para filtrar por cada atributo filterBy="#{item.idestatus}"  y para ordenar sortBy="#{item.idestatus}"

       <p:column style="width:5%" filterBy="#{item.idestatus}" sortBy="#{item.idestatus}">
                    <f:facet name="header">
                            <h:outputText value="#{msg.idestatus}"/>
                     </f:facet>
                     <h:outputText value="#{item.idestatus}"/>
        </p:column>




en el browser, se muestra el componente para filtrar y ordenar


Agregaremos un dialogo con la propiedad es visible=”true”
<p:dialog visible="true" header="#{app['form.estatuslist']}" closable="false"
showEffect="clip" hideEffect="fade" widgetVar="estatuslistDialog">




DATATABLE CON FORMULARIO DE INSERCIÓN

PrimeFaces ofrece el componente <p:datatable> que permite generar una tabla en la página, con opciones como búsquedas, filtros, selección de filas.
Usaremos Named Queries, para obtener la lista de Entitys que cumplan los criterios deseados, de manera que podamos realizar operaciones de edición o eliminación sobre los mismos.

Si observamos en el entity “Estatus”, podemos ver las definiciones y Bean Validation como mostramos a continuación.




Formulario de estatusinsert .xthml
Ubicarse en el formulario estatusinsert.xhtml antes de  </h:form> y

dar clic derecho y seleccionar insert code

seleccionar  JSF Data Table From Entity
En el cuadro de diálogo que se presenta seleccionamos  Estatus como Entity y como  ManagedBean Property estatusDataController estatusList







El ide genera el siguiente código
<h:form>
                           <h1><h:outputText value="List"/></h1>
                           <h:dataTable value="#{estatusDataController.estatusList}" var="item">
                               <h:column>
                                   <f:facet name="header">
                                       <h:outputText value="Idestatus"/>
                                   </f:facet>
                                   <h:outputText value="#{item.idestatus}"/>
                               </h:column>
                               <h:column>
                                   <f:facet name="header">
                                       <h:outputText value="Estatus"/>
                                   </f:facet>
                                   <h:outputText value="#{item.estatus}"/>
                               </h:column>
                               <h:column>
                                   <f:facet name="header">
                                       <h:outputText value="Esinicial"/>
                                   </f:facet>
                                   <h:outputText value="#{item.esinicial}"/>
                               </h:column>
                           </h:dataTable>
                       </h:form>

Quitamos el componente <h:form> y </h:form> del  datatable de manera que únicamente exista el form principal.  Como se muestra a continuación en el  browser, tendremos los registros de estatus

Cambiaremos las etiquetas  <h:datatable> por <p:datatable> y <h:column> por <p:column> para usar los componentes primefaces y se usarán las etiquetas de los archivos de propiedades en los header de cada columna.



Esto permitirá que al cambiar el idioma el encabezado de cada columna cambie automáticamente.


<f:facet name="header">
     <h:outputText value="Idestatus"/>
</f:facet>
por
<f:facet name="header">
         <h:outputText value="#{msg.idestatus}"/>
</f:facet>

Colocamos el id=”datatable”,  paginación de la tabla y el número de filas
<p:dataTable id="datatable" paginator="true" rows="7" value="#{estatusDataController.estatusList}" var="item">







Despues de los cambios quedaria de la siguiente manera.


Para actualizar el datatable al agregar un registro, en el commandButton que utilizamos para guardar , agregamos al update el componente datatable, de esta manera se mostrará en el datatable los cambios sin renderizar el formulario completo.
        <p:commandButton value="#{app['boton.save']}" update="panel,growl,datatable" action="#{estatusDataController.save()}"/>






Al crear un nuevo estatus este automáticamente actualiza la tabla






Removemos el código que utilizamos del datatable del formulario estatusinsert.xhtml, ya que crearemos una página xhtml que se encargara de mostrar , editar y eliminar los registros.
Y eliminamos del <p:commandButton en el método update la actualización datatable.












Datatable con Selección, Edición y Eliminación de Registros

Aquí mostraremos como crear una página que permite mostrar los registros, realizar búsquedas e invocar un diálogo para realizar la edición de los registros.

Creamos una página nueva llamada estatuslist.xhtml en el directorio /page/estatus
Ahora creamos un Facelets Template Client
  • Desde menú File, seleccione New
  • en Categories, seleccione Java Server Faces
  • en File Types, seleccione Facelets Template Client
  • En File Name: estatuslist
  • Folder colocamos /page/estatus/
  • Template seleccionamos template.xhtml


Se genera el código de la página y  colocamos en comentario top,bottom, left <!--  - ->  para que este tome el que este utilice el que esta en el template, y en center escribimos

Editamos estatuslist.xhtml , nos ubicamos en la sección center y

dar clic derecho y seleccionar insert code , seleccionar  JSF Data Table From Entity

Seleccionar Entity Estatus y el CDI Property estatusDataController propiedad estatusList

Colocar el id para el form

<h:form id="form">

En el código generado, nos ubicamos en <h:datatable> y <h:column> y los reemplazamos por <p:datatable> y <p:column> para utilizar los componentes primefaces.
Seleccionar p=”http://primefaces.org/ui” library declaration

Modificamos  el componente dataTable original, indicando el número de filas(rows),  value indicamos el list de objetos, var define la variable para indicar los elementos, selectionMode define el modo de selección y selection asocia al entity la fila seleccionada.

 <p:dataTable id="datatable" paginator="true"
                                    rows="7" value="#{estatusDataController.estatusList}" var="item"
                                    rowKey="#{item.idestatus}"
                                    selectionMode="single"
                                    selection="#{estatusDataController.selected}"
                                    >                       

Ejecutamos el proyecto , podemos ver los registros en el datatable





Agregamos  el evento ajax  oncomplete()  para mostrar un diálogo con la fila seleccionada , y actualizaremos mediante  update el growl y el panel que contendrá el entity seleccionado de la fila.
Para mostrar el dialogo usamos   oncomplete="PF('editwidgetVar').show()"/>.
Si deseamos ocultarlo usamos     oncomplete="PF('editwidgetVar').hide()"/>

Codigo del datatable
<h1><h:outputText value="#{app['form.estatuslist']}" /></h1>
                       <p:dataTable id="datatable" paginator="true"
                                    rows="7" value="#{estatusDataController.estatusList}" var="item"
                                    rowKey="#{item.idestatus}"
                                    selectionMode="single"
                                    selection="#{estatusDataController.selected}"
                                    >
                            <p:ajax event="rowSelect"   
                                   oncomplete="PF('editwidgetVar').show();"
                                    update=":form:growl,:form:displayEdit" />
                         


Nos ubicamos debajo de    </p:dataTable>, colocamos el componente dialog y un panelGrid. La propiedad widgetVar se usará para asignar un nombre al componente que será localizado mediante PrimefacesFramework PF().

 <p:dialog id="editDialog"  header="#{app['dialog.edit']}"  widgetVar="editwidgetVar"
                  resizable="false"  height="235" width="550" showEffect="clip" hideEffect="fold">

            <h:panelGrid id="displayEdit" columns="2" title="#{app['dialog.edit']}">
            </h:panelGrid>
 </p:dialog>

Ubicarse dentro del panelgrid <h:panelGrid id="displayEdit"  y dar clic derecho Insert Code→ seleccionar JSF Form From Entity

Ahora seleccionar el Entity Estatus y el Managed Bean Property selecionar selected

se genera el código, y debemos eliminar las etiquetas <h:form> y </h:form>  ya que tenemos un formulario principal.

Eliminar <h1><h:outputText value="Create/Edit"/></h1>
Y colocamos las etiquetas de los properties, el title y requiredMessage para los componentes utilizados.

Cambiamos el  <h:inputText id="esinicial" … />, por el selectOneMenu similar al que usamos en el formulario insert.

     <p:selectOneMenu  id="esinicial" value="#{estatusDataController.selected.esinicial}"  required="true" requiredMessage="#{msg.esinicial} #{app['info.notnull']}">
                                       <f:selectItem itemLabel="#{app['boton.yes']}" itemValue="si" />  
                                       <f:selectItem itemLabel="#{app['boton.no']}" itemValue="no" />  
                                   </p:selectOneMenu>


Creamos la sección<f:facet name="footer"> del panelGrid y colocamos los botones para editar, eliminar,cerrar. El botón eliminar mostrará un diálogo solicitando la confirmación de si eliminamos o no el registro.
 <f:facet name="footer">
                                       <p:commandButton id="editButton" value="#{app['boton.update']}"
                                                        update=":form:growl,:form:datatable,:form:displayEdit"
                                                        actionListener="#{estatusDataController.edit()}"
                                                        oncomplete="PF('editwidgetVar').hide()"/>
                                       <p:commandButton id="deleteButton" value="#{app['boton.delete']}" title="#{app['boton.delete']}"  onclick="PF('confirmationwidgetVar').show();" type="button" icon="ui-icon-trash" />
                                       <p:commandButton id="declineButton" value="#{app['boton.cerrar']}" onclick="PF('editwidgetVar').hide();" type="button" />
                                   </f:facet>


Agregar antes del </h:form> el growl y el componente para mensajes
 <p:growl id="growl"/>
<p:messages autoUpdate="true"/>




En el browser al dar clic en la fila se muestra el registro con las opciones de editar/eliminar
Al presionar el boton eliminar se muestra el diálogo para confirmar


Para ajustar el tamaño de las columnas podemos hacerlo de dos maneras
<p:column style="width:20%">
o
<p:column style="width:5%; text-align:center;"> si lo deseamos centrado.
































Código completo estatuslist.xhtml

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
     xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
     xmlns:h="http://xmlns.jcp.org/jsf/html"
     xmlns:f="http://xmlns.jcp.org/jsf/core"
     xmlns:p="http://primefaces.org/ui">

   <body>

       <ui:composition template="./../../template.xhtml">
           <!--
                       <ui:define name="top">
                           top
                       </ui:define>
           
                       <ui:define name="bottom">
                           bottom
                       </ui:define>
           
                       <ui:define name="left">
                           left
                       </ui:define>
           -->
           <ui:define name="center">
               <f:view>
                   <h:form id="form" >
                       <p:dialog visible="true" header="#{app['form.estatuslist']}" closable="false"
                                 showEffect="clip" hideEffect="fade" widgetVar="estatuslistDialog">

                           <h1><h:outputText value="List"/></h1>
                           <p:dataTable id="datatable" paginator="true"
                                        rows="7" value="#{estatusDataController.estatusList}" var="item"
                                        rowKey="#{item.idestatus}"
                                        selectionMode="single"
                                        selection="#{estatusDataController.selected}"
                                        filteredValue="#{estatusDataController.filtered}"
                                        >
                               <p:ajax event="rowSelect"
                                       oncomplete="PF('editwidgetVar').show();"
                                       update=":form:growl,:form:displayEdit"/>
                               <p:column style="width:20%" filterBy="#{item.idestatus}" sortBy="#{item.idestatus}">
                                   <f:facet name="header">
                                       <h:outputText value="#{msg.idestatus}"/>
                                   </f:facet>
                                   <h:outputText value="#{item.idestatus}"/>
                               </p:column>
                               <p:column filterBy="#{item.estatus}" sortBy="#{item.estatus}">
                                   <f:facet name="header">
                                       <h:outputText value="#{msg.estatus}"/>
                                   </f:facet>
                                   <h:outputText value="#{item.estatus}"/>
                               </p:column>
                               <p:column filterBy="#{item.esinicial}" sortBy="#{item.esinicial}">
                                   <f:facet name="header">
                                       <h:outputText value="#{msg.esinicial}"/>
                                   </f:facet>
                                   <h:outputText value="#{item.esinicial}"/>
                               </p:column>
                              
                           </p:dataTable>
                       </p:dialog>

                       <p:dialog id="editDialog"  header="#{app['dialog.edit']}" widgetVar="editwidgetVar"
                                 resizable="false" height="235"  width="550" showEffect="clip" hideEffect="fold">
                           <h:panelGrid id="displayEdit" columns="2" title="#{app['dialog.edit']}">

                               <h1><h:outputText value="Create/Edit"/></h1>
                               <h:panelGrid columns="2">
                                   <h:outputLabel value="Idestatus:" for="idestatus" />
                                   <h:inputText id="idestatus" value="#{estatusDataController.selected.idestatus}" title="Idestatus" required="true" requiredMessage="The Idestatus field is required."/>
                                   <h:outputLabel value="Estatus:" for="estatus" />
                                   <h:inputText id="estatus" value="#{estatusDataController.selected.estatus}" title="Estatus" required="true" requiredMessage="The Estatus field is required."/>
                                   <h:outputLabel value="Esinicial:" for="esinicial" />
                                   <p:selectOneMenu  id="esinicial"
                                                     value="#{estatusDataController.selected.esinicial}"  required="true"
                                                     requiredMessage="#{msg.esinicial} #{app['info.notnull']}">
                                       <f:selectItem itemLabel="#{app['boton.yes']}" itemValue="si" />
                                       <f:selectItem itemLabel="#{app['boton.no']}" itemValue="no" />
                                   </p:selectOneMenu>
                                   <f:facet name="footer">
                                       <p:commandButton id="editButton" value="#{app['boton.update']}"
                                                        update=":form:growl,:form:datatable,:form:displayEdit"
                                                        actionListener="#{estatusDataController.edit()}"
                                                        oncomplete="PF('editwidgetVar').hide()"/>
                                       <p:commandButton id="deleteButton" value="#{app['boton.delete']}"
                                                        title="#{app['boton.delete']}"  onclick="PF('confirmationwidgetVar').show();" type="button"
                                                        icon="ui­icon­trash" />
                                       <p:commandButton id="declineButton" value="#{app['boton.cerrar']}"
                                                        onclick="PF('editwidgetVar').hide();" type="button" />
                                   </f:facet>

                               </h:panelGrid>



                           </h:panelGrid>
                       </p:dialog>
                       <p:dialog id="confirmDialog" modal="false"  header="#{app['boton.delete']}"
                                 widgetVar="confirmationwidgetVar">
                           <p:commandButton id="removeButton" value="#{app['boton.yes']}"
                                            update=":form:displayEdit, :form:growl, :form:datatable"
                                            oncomplete="PF('confirmationwidgetVar').hide();,
                                            PF('editwidgetVar').hide();"
                                            actionListener="#{estatusDataController.delete()}" />
                           <p:commandButton id="cancelButton" value="#{app['boton.no']}"
                                            onclick="PF('confirmationwidgetVar').hide()" type="button" />
                       </p:dialog>
                       <p:growl id="growl"/>
                       <p:messages autoUpdate="true"/>
                   </h:form>
                   


               </f:view>

           </ui:define>

       </ui:composition>

   </body>
</html>







































Crear un CDI Beans para gestionar las list de entity para mostrar en las páginas
  • Desde menú File, seleccione New
  • en Categories, seleccione Java Server Faces
  • en File Types, seleccione JSF ManagedBeans
  • Class Name: EstatusDataController
  • Package com.avbravo.scrumweb.controller
  • Scope: View





Cambiar
Reemplazar
@ManagedBeans
@Named
import javax.faces.bean.ManagedBean;
import javax.inject.Named;
import javax.faces.bean.ViewScoped;
import javax.faces.view.ViewScoped;



Implementamos serializable,
inyectamos mediante @Inject EstatusFacade, ResourceFiles.

Agregamos un objeto de tipo estatus que se utilizará para hacer referencia al entity seleccionado del datatable.
Estatus selected = new Estatus();
generamos los métodos get/set, para ello hacemos  clic derecho Insert Code  y seleccionar Getter and Setter…



Seleccionar selected: Estatus, tal como aparece en la  imagen



el IDE genera los métodos

   public Estatus getSelected() {
       return selected;
   }

   public void setSelected(Estatus selected) {
       this.selected = selected;
   }


Además se creará el método edit() para actualizar registros y delete() para eliminarlo.

Crear método getEstatusList() para que devuelva un list de estatus
public List<Estatus> getEstatusList() {
       return estatusFacade.getEstatusList();
   }













Código de EstatusDataController.java
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package com.avbravo.scrumweb.controller;

import com.avbravo.scrumweb.Estatus;
import com.avbravo.scrumweb.ejb.EstatusFacade;
import com.avbravo.scrumweb.generales.JSFUtil;
import com.avbravo.scrumweb.generales.ResourcesFiles;
import java.io.Serializable;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.faces.view.ViewScoped;
import javax.inject.Inject;
import javax.inject.Named;

/**
*