Č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:
November 28, 2014 09:02 AM
All times are UTC

Sponsored by
sponsored by Oracle

visit NetBeans website
AVBravo - November 27, 2014 01:11 PM
Libro JEE7 Capítulo 3. Archivos de propiedades y temas

Capítulo 3. Archivos de propiedades y temas

  • Internacionalización y Localización de Aplicaciones
  • Creación de los archivos properties
  • Creación de las etiquetas para los campos de las Entity
  • Listado de propiedades en application.properties
  • Ahora crearemos el CDI Beans ResourcesFiles, para manejar los archivos properties.
  • Editar template.xhtml
  • Editamos menu.xhtml
  • Editar EstatusController.java
  • CREAR UN SelectOneMenu
  • TEMAS DE PRIMEFACES



Internacionalización y Localización de Aplicaciones


En este capítulo se mostrará como crear aplicaciones con soporte para múltiples idiomas.


Esté será el estándar que se usarán para las propiedades de la aplicación

messages.properties --> contendrá las etiquetas y nombre de tablas
application.properties --> mensajes del sistema, botones , mensajes de error.

Formato
sistema
application.
botones
boton.
idioma
language.
elementos de menu
menu.
elementos menuitem
menuitem.
formularios
form.
form.entidad, form.entidadnew, form.entidadedit, form.entidadlist, form.entidadsearch, form.entidadprint
mensajes de error
error.
mensajes warning
warning.
warning.ATRIBUTOcomplemento
warning.idexist
existe un registro con ese id
mensajes de información
info.
dialogos
dialog.



Para agregar el soporte para múltiples idiomas en nuestra aplicacion web, debemos seguir los siguientes pasos

Creación de los archivos properties

En Other Sources hacemos clic derecho sobre  src/main/resources  y seleccionamos New→ Java Package


Seguidamente, indicamos el nombre del paquete: com.avbravo.scrumweb.properties

Ahora, seguimos:

  1. Desde menú File, seleccionamos New
  2. en Categories, escogemos Other
  3. y en File Types, seleccionamos Properties File

Seguimos indicando el nombre: messages


Ahora le damos  clic derecho y seleccionamos Add→ Locale para crear compatibilidad con otros idiomas:


Indicamos la compatibilidad para el idioma inglés colocando en Language Code: en


Repetimos el procedimiento y agregamos soporte para el idioma español colocando en Language Code: es

Con esto se generarán los archivos messages_en.properties, y  messages_es.properties



Creación de las etiquetas para los campos de las Entity


Abrimos  el Entity Estatus
y observamos los atributos, que son los que usaremos para agregar al archivo de propiedades.

  • idestatus
  • estatus
  • esinicial



Agregaremos propiedades con el mismo nombre de cada atributo en el archivo messages.properties. Para ello, seleccionaremos el archivo messages.properties dar con el clic derecho y seleccionamos Open , luego hacemos clic en New Property
Indicamos los valores para los campos key y value correspondientes a los atributos del Entity




De esta manera agregamos todas las propiedades del Entity  para los idiomas que establecimos(predeterminado, inglés, español)




Creamos un archivo properties para el manejo de los mensajes, etiquetas, botones de la aplicacion, lo llamaremos application.properties y agregamos el soporte para el idioma español e inglés.




Listado de propiedades en application.properties

application.title=Scrum Web
application.shorttitle=Scrum Web
boton.all=Todos
boton.cerrar=Cerrar
boton.changetheme=Cambiar
boton.new=Nuevo
boton.save=Guardar
boton.delete=Eliminar
boton.update=Actualizar
boton.ayuda=Ayuda
boton.filter=Filtrar
boton.search=Buscar
boton.home=Inicio
boton.query=Consultar
boton.clear=Limpiar
boton.yes=Si
boton.no=No
boton.list=Listar
boton.print=Imprimir
boton.login=Login
boton.logout=Salir
boton.menu=Menu
boton.return=Regresar
dialog.edit=Editar
dialog.search=Busqueda
dialog.delete=Eliminar
error.title=Error
form.estatus=Estatus

form.estatusnew=Crear Estatus
form.estatusedit=Editar Estatus
form.estatuslist=Listar  Estatus
form.estatussearch=Buscar Estatus
form.estatusprint= Imprimir Estatus
label.similar=Similar
info.message=Mensaje
info.save=Guardado exitosamente
info.theme=Tema
info.required=es requerido
info.update=Editado exitosamente
info.delete=Eliminado
info.notnull=No nulo
info.sinrolasignado=No tiene rol asignado
info.title=Informacion
language.spanish=Espanol
language.english=Ingles
language.language=Idiomas
login.username=Username
login.password=Password
login.passwordnotvalid=Password no es correcto
login.usernamenotvalid=Nombre de usuario no valido
login.inactive=Usuario inactivo
login.logout=Salir
login.accesodenegado=Acceso Denegado
login.accesodenegadoDetalle=No cuenta con los privilegios para accesar esta pagina
menu.edit=Editar
menu.options=Opciones
menu.search=Buscar
menu.insert=Insertar
menu.list=Listar
menu.estatus=Estatus
menu.records=Registros
menu.themes=Temas
warning.title=Advertencia
warning.idnotexist=No existe un registro con ese id
warning.idexist=Existe registro con ese id


Nota:
Recuerde colocar el valor de las etiquetas en inglés y otros idiomas que desee agregar.











Ahora crearemos el CDI Beans ResourcesFiles, para manejar los archivos properties.


Crear el CDI llamado ResourcesFiles.java en el paquete generales
  • Desde menú File, seleccione New
  • Categories, seleccione Java Server Faces
  • File Types, seleccione JSF ManagedBeans
  • Class Name: ResourcesFiles
  • Package: com.avbravo.scrumweb.generales
  • Scope: Session




Nota:
Recuerde eliminar  import javax.faces.bean.ManagedBean; ,
import javax.faces.bean.SessionScoped; y @ManagedBean



Codigo completo ResourcesFiles.java
Definiremos dos atributos ResourceBundle mrb para el manejo de message.properties y arb para el manejo de application.properties, en el método  asignar() establecemos el idioma que el usuario seleccione. Locale usamos para obtener el objeto Locale correspondiente al idioma. Creamos losmétodoss set/get para arb, mrb.

import java.io.Serializable;
import java.util.Locale;
import java.util.ResourceBundle;
import javax.annotation.PostConstruct;
import javax.enterprise.context.SessionScoped;
import javax.faces.context.FacesContext;
import javax.inject.Named;

/**
*
* @author avbravo
*/
@Named
@SessionScoped
public class ResourcesFiles  implements Serializable{
private static final long serialVersionUID = 1L;
   Locale currentLocale;
   ResourceBundle mrb; //for messages
   ResourceBundle arb; //for application
   

   public  ResourcesFiles() {
   }

   @PostConstruct
   public void init() {
    saveLocale();
   }

   public void saveLocale() {
        currentLocale = FacesContext.getCurrentInstance().getViewRoot().getLocale();
       mrb = ResourceBundle.getBundle("com.avbravo.scrumweb.properties.messages", currentLocale);
         arb = ResourceBundle.getBundle("com.avbravo.scrumweb.properties.application", currentLocale);

   }
   public Locale getCurrentLocale() {
       return currentLocale;
   }

   public void setCurrentLocale(Locale currentLocale) {
       this.currentLocale = currentLocale;
   }

   public ResourceBundle getMrb() {
       return mrb;
   }

   public void setMrb(ResourceBundle mrb) {
       this.mrb = mrb;
   }

   public ResourceBundle getArb() {
       return arb;
   }

   public void setArb(ResourceBundle arb) {
       this.arb = arb;
   }

/*
    *Devuelve el mensaje Mrb
    */

   public String getMensajeMrb(String mensaje) {
       return mrb.getString(mensaje);
   }
   /*
    *Devuelve el mensaje Arb
    */

   public String getMensajeArb(String mensaje) {
       return arb.getString(mensaje);
   }

}


























Crear el CDI Idiomas.java ,obtenemos el objeto locale y se define los métodos para cambiar el idioma a español inglés y se llama al método saveLocale() para guardar el idioma y establecerlo para la sesión del usuario.
  • Desde menú File, seleccione New
  • Categories, seleccione Java Server Faces
  • File Types, seleccione JSF ManagedBeans
  • Class Name: Idiomas
  • Package: com.avbravo.scrumweb.generales
  • Scope: Session



Codigo completo Idiomas.java

import java.io.Serializable;
import java.util.Locale;
import javax.enterprise.context.SessionScoped;
import javax.faces.context.FacesContext;
import javax.inject.Inject;
import javax.inject.Named;

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

   private static final long serialVersionUID = 1L;
   @Inject
   ResourcesFiles rf;

  
   private String locale = Locale.getDefault().getDisplayLanguage();

   public void setLocale(String locale) {
       this.locale = locale;
   }

   public synchronized String getLocale() {
       return locale;
   }
   public synchronized String changeLanguage() {
       return "changed";
   }
public Idiomas() {
   }

   public String englishAction() {
       FacesContext context = FacesContext.getCurrentInstance();
       context.getViewRoot().setLocale(Locale.ENGLISH);
       this.locale = "en";
       rf.saveLocale();
       return null;
   }

   public String spanishAction() {
       FacesContext context = FacesContext.getCurrentInstance();
       context.getViewRoot().setLocale(new Locale("es"));
       this.locale = "es";
       rf.saveLocale();
       return null;
   }
}





















Editar template.xhtml

colocamos dentro de las etiquetas <h:head>,   el <f:view locale="#{idiomas.locale}"> indicaremos el CDI Beans que contiene el locale.
y para indicar el archivo de propiedades mediante    <f:loadBundle> y el valor de var como variable de referencia.
 <h:head>
             <f:facet name="first">
               <meta content='text/html; charset=UTF-8' http-equiv="Content-Type"/>

Agregamos
  <f:view locale="#{idiomas.locale}"></f:view>
     <f:loadBundle basename="com.avbravo.scrumweb.properties.messages" var="msg" />
    <f:loadBundle basename="com.avbravo.scrumweb.properties.application" var="app" />

con esto podemos utilizar msg para referirnos a los archivos message y app para application.



Ahora usaremos los valores establecidos en los archivos de propiedades dentro de template.xhtml, haremos referencia mediante "#{app['application.title']}"
   <title><h:outputText value="Scrum web"/></title>
por
<title><h:outputText value="#{app['application.title']}"/></title>

en donde app hace referencia a la variable para application.properties, y usamos ['aplication.title'] ya que la propiedad esta compuesta de application.title


y cambiar en bottom para agregar       <h:outputText value="#{app['application.foot']}"/>

<p:layoutUnit position="south" size="50" closable="true" collapsible="true">
               <ui:insert name="bottom">
                   Footer
              </ui:insert>
           </p:layoutUnit>

por
<p:layoutUnit position="south" size="50" closable="true" collapsible="true">
               <ui:insert name="bottom">
                                   <h:outputText value="#{app['application.footer']}"/>
               </ui:insert>
           </p:layoutUnit>


































Editamos menu.xhtml

Cambiamos las etiquetas de los menús
 <p:submenu label="#{app['menu.records']}" icon="ui-icon-check">  
             <p:column>                              
      <p:submenu label="#{app['menu.estatus']}">  
              <p:menuitem value="#{app['menu.insert']}" url="/faces/page/estatus/estatusinsert.xhtml" />  
              <p:menuitem value="#{app['menu.list']}"  url="/faces/page/estatus/estatuslist.xhtml"/>  
      </p:submenu>  


y agregamos las etiquetas para los idiomas

 <p:submenu label="#{app['menu.options']}" icon="ui-icon-check">  
         <p:column>  
              <p:submenu label="#{app['language.language']}"  >
    <p:menuitem action="#{idiomas.englishAction}" value="#{app['language.english']}" immediate = "true" ajax = "false" icon="ui-icon-flag"/>
   <p:menuitem action="#{idiomas.spanishAction}" value="#{app['language.spanish']}" immediate = "true" ajax = "false" icon="ui-icon-flag" />  
                           </p:submenu>
      </p:column>  
  </p:submenu>  


codigo de menu.xhtml

<h:form id="menuForm" >
           <p:megaMenu>
               <p:submenu label="#{app['menu.records']}" icon="ui-icon-check">  
                   <p:column>                              
                       <p:submenu label="#{app['menu.estatus']}">  
                           <p:menuitem value="#{app['menu.insert']}" url="/faces/page/estatus/estatusinsert.xhtml" />  
                           <p:menuitem value="#{app['menu.list']}"  url="/faces/page/estatus/estatuslist.xhtml"/>  
                       </p:submenu>  
                   </p:column>  
               </p:submenu>
               <p:submenu label="#{app['menu.options']}" icon="ui-icon-check">  
                   <p:column>  
                       <p:submenu label="#{app['language.language']}"  >
                           <p:menuitem action="#{idiomas.englishAction}" value="#{app['language.english']}" immediate = "true" ajax = "false" icon="ui-icon-flag"/>
                           <p:menuitem action="#{idiomas.spanishAction}" value="#{app['language.spanish']}" immediate = "true" ajax = "false" icon="ui-icon-flag" />  
                       </p:submenu>
                   </p:column>  
               </p:submenu>  

           </p:megaMenu>
       </h:form>







Si observamos el browser



Dar clic en ingles y cambia el idioma





Editamos estatusinsert.xhtml para agregar las etiquetas de los archivos de propiedades usar app.  para archivos application.properties y msg para messages.properties .
Usamos  msg.idestatus  para las etiquetas y el nombre del formulario
Cambiar
<h1><h:outputText value="Create/Edit"/></h1>
por
<h1><h:outputText value="#{app['form.estatusnew']}"/> </h1>

Cambiar
   value="Idestatus:" for="idestatus" />
por
<h:outputLabel value="#{msg.idestatus}" for="idestatus" />
Esto lo hacemos para cada atributo del CDI Beans que se encuentra en el JSF

Importante, crear las propiedades para title y para requiredMessage
En los inputText cambiamos title y requiredMessage agregamos la etiqueta con el atributo #{app['info.required']}" para enviar el mensaje que es requerido.
<h:inputText id="idestatus" value="#{estatusController.estatus.idestatus}" title="#{msg.idestatus}" required="true" requiredMessage="#{msg.idestatus} #{app['info.required']}"/>

Cambiamos todas las etiquetas.


Cambiar el botón save
<p:commandButton value="#{app['boton.save']}" update="panel,growl" action="#{estatusController.save()}"/>



Código que implementa las etiquetas

 <h1><h:outputText value="#{app['form.estatusnew']}"/></h1>
                       <h:panelGrid id="panel" columns="2">
                           <h:outputLabel value="#{msg.idestatus}" for="idestatus" />
                           <h:inputText id="idestatus" value="#{estatusController.estatus.idestatus}" title="#{msg.idestatus}" required="true" requiredMessage="#{msg.idestatus} #{app['info.required']}"/>
                           <h:outputLabel value="#{msg.estatus}" for="estatus" />
                           <h:inputText id="estatus" value="#{estatusController.estatus.estatus}" title="#{msg.estatus}" required="true" requiredMessage="#{msg.estatus} #{app['info.required']}"/>
                          <h:outputLabel value="#{msg.esinicial}" for="esinicial" />
                         <h:inputText id="esinicial" value="#{estatusController.estatus.esinicial}" title="#{msg.esinicial}" required="true" requiredMessage="#{msg.esinicial} #{app['info.required']}"/>

       <f:facet name="footer">
   <p:commandButton value="#{app['boton.save']}" update="panel,growl"  action="#{estatusController.save()}"/>
   </f:facet>

                       </h:panelGrid>




Formulario con idioma español
seleccionar el idioma inglés para cambiar los valores de los atributos
Mensajes de campos requeridos en español


Mensajes de campos requeridos en inglés




title, se mostrará una ayuda al colocar el cursor sobre el componente.











Editar EstatusController.java

Cambiaremos los mensajes en el CDI para utilizar los de los archivos messages.properties y application.properties, y en los métodos.
Inyectar ResourcesFiles

 @Inject
ResourcesFiles rf;

usamos rf.getMensajeArb(etiqueta)para obtener las etiquetas del archivo application.properties.
usamos rf.getMensajeMrb(etiqueta)para obtener las etiquetas del archivo messages.properties.

Modificar el codigo del método save(), para utilizar las etiquetas de los archivos properties.

@Named
@SessionScoped
public class EstatusController implements Serializable {
   @Inject
   EstatusFacade estatusFacade;
   Estatus estatus = new Estatus();
   @Inject
   ResourcesFiles rf;
   private List<Estatus> items;
   // Add business logic below. (Right-click in editor and choose
   // "Insert Code > Add Business Method")
   public Estatus getEstatus() {
       return estatus;
   }

   public void setEstatus(Estatus estatus) {
       this.estatus = estatus;
   }

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

   public String save() {
       try {
           if (estatusFacade.find(estatus.getIdestatus()) != null) {
 JSFUtil.warningDialog(rf.getMensajeArb("info.message"), rf.getMensajeArb("warning.idexist"));
               return null;
           }
           estatusFacade.create(estatus);
            JSFUtil.addSuccessMessage(rf.getMensajeArb("info.save"));
           estatus = new Estatus();
       } catch (Exception e) {
           JSFUtil.addErrorMessage(e.getLocalizedMessage());
       }
       return null;
   }

public String edit() {
       try {
           estatusFacade.edit(estatus);
           JSFUtil.addSuccessMessage(rf.getMensajeArb("info.update"));
       } catch (Exception e) {
           JSFUtil.addErrorMessage(e.getLocalizedMessage());
       }
       return null;
   }

public String delete() {
       try {
           estatusFacade.remove(estatus);
           JSFUtil.addSuccessMessage(rf.getMensajeArb("info.delete"));
            encontrado = false;
           estatus = new Estatus();

       } catch (Exception e) {
           JSFUtil.addErrorMessage(e.getLocalizedMessage());
       }
       return null;
   }
public List<Estatus> getItems() {
       if (items == null) {
           items = estatusFacade.findAll();
       }
       return items;
   }


Muestra el mensaje en Espanol

o en inglés dependiendo del idioma seleccionado




CREAR UN SelectOneMenu

Ahora crearemos un selectOneMenu para desplegar las opciones para el atributo esinicial, con los valores de si/no.
Utilizamos el componente <p:selectOneMenu/> de primefaces, el valor para value se indicará el atributo del Entity

<p:selectOneMenu  id="esinicial" value="#{estatusController.estatus.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>

Genera el selectOneMenu con los valores en diversos idiomas.
en Español


Cambiamos el idioma a ingles.

















TEMAS DE PRIMEFACES

Primefaces ofrece una serie de temas que podemos implementar en nuestra aplicación web y cambiar su aspecto de manera sencilla.
Primero crearemos un CDI de tipo @SessionScoped para que contenga durante la sesión  del usuario el tema seleccionado, modificaremos el archivo web.xml para establecer el soporte para el tema y se mostrará una lista de temas para seleccionarlo.
  • Desde menú File, seleccione New
  • en Categories, seleccione Java Server Faces
  • en File Types, seleccione JSF ManagedBeans
  • Class Name: ManagementThemes
  • Package com.avbravo.scrumweb.generales
  • Scope: Session



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

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

   private static final long serialVersionUID = 1L;
   private String tema = "home";
   private String temaPredeterminado = "home";

   private Map<String, String> themes;

   public Map<String, String> getThemes() {
       themes = new TreeMap<String, String>();
       themes.put("afterdark", "afterdark");
       themes.put("afternoon", "afternoon");
       themes.put("afterwork", "afterwork");
       themes.put("aristo", "aristo");
       themes.put("black-tie", "black-tie");
       themes.put("blitzer", "blitzer");
       themes.put("bluesky", "bluesky");
       themes.put("casablanca", "casablanca");
       themes.put("cupertino", "cupertino");
       themes.put("cruze", "cruze");
       themes.put("dark-hive", "dark-hive");
       themes.put("dot-luv", "dot-luv");
       themes.put("eggplant", "eggplant");
       themes.put("excite-bike", "excite-bike");
       themes.put("flick", "flick");
       themes.put("glass-x", "glass-x");
       themes.put("home", "home");
       themes.put("hot-sneaks", "hot-sneaks");
       themes.put("humanity", "humanity");
       themes.put("le-frog", "le-frog");
       themes.put("midnight", "midnight");
       themes.put("mint-choc", "mint-choc");
       themes.put("none", "none");
       themes.put("overcast", "overcast");
       themes.put("pepper-grinder", "pepper-grinder");
       themes.put("redmond", "redmond");
       themes.put("rocket", "rocket");
       themes.put("sam", "sam");
       themes.put("smoothness", "smoothness");
       themes.put("south-street", "south-street");
       themes.put("start", "start");
       themes.put("sunny", "sunny");
       themes.put("swanky-purse", "swanky-purse");
       themes.put("trontastic", "trontastic");
       themes.put("ui-darkness", "ui-darkness");
       themes.put("ui-lightness", "ui-lightness");
       themes.put("vader", "vader");
       return themes;
   }

   public String getTemaPredeterminado() {
       return temaPredeterminado;
   }

   public void setTemaPredeterminado(String temaPredeterminado) {
       this.temaPredeterminado = temaPredeterminado;
   }

   public void setThemes(Map<String, String> themes) {
       this.themes = themes;
   }

   public String getTema() {
       return tema;
   }

   public void setTema(String tema) {
       this.tema = tema;
   }
  
 public String cambiar(){
       return null;
   }
}


Editar el archivo web.xml ubicado en la carpeta WEB-INF

Agregar en <context-param> referencia al CDI ManagementThemes
   <context-param>
<param-name>primefaces.THEME</param-name>
<param-value>#{managementThemes.tema}</param-value>
</context-param>



Editar menu.xhtml
Agregar dentro del <p:column> en el submenú option
<p:submenu label="#{app['menu.themes']}">
                               <p:menuitem icon="ui-icon-star" onclick="PF('dlgTheme').show();"
                                           value="#{app['info.theme']}" immediate = "true" />
  </p:submenu>

y colocamos el menuitem para salir
<p:menuitem value="#{app['login.logout']}"  title="#{app['login.logout']}"  icon="ui-icon-power"/>

y agregamos el <p:dialog> debajo del  </p:megaMenu>

               <p:dialog header="#{app['info.theme']}" widgetVar="dlgTheme"
                         showEffect="bounce" hideEffect="explode" width="400"
                         height="200">
                   <h:panelGrid columns="2">
                       <h:panelGroup>
                           <p:outputLabel value="#{app['info.theme']}"/>
                           <p:selectOneMenu value="#{managementThemes.tema}" immediate
                                            = "true" editable="true">
                               <f:selectItems value="#{managementThemes.themes}" />
                           </p:selectOneMenu>
                           <p:commandButton value="#{app['boton.changetheme']}"
                                            action="#{managementThemes.cambiar}" ajax="false"/>
                       </h:panelGroup>
                   </h:panelGrid>
               </p:dialog>















Codigo de menu.xhtml

<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:submenu label="#{app['menu.options']}">
                       <p:column>
                           <p:submenu label="#{app['menu.themes']}">
                               <p:menuitem icon="ui-icon-star" onclick="PF('dlgTheme').show();"
                                           value="#{app['info.theme']}" immediate = "true" />
                           </p:submenu>

                           <p:submenu label="#{app['language.language']}">
                               <p:menuitem action="#{idiomas.englishAction}" value="#{app['language.english']}"
                                           immediate = "true" ajax = "false" icon="ui-icon-flag"/>
                               <p:menuitem action="#{idiomas.spanishAction}" value="#{app['language.spanish']}"
                                           immediate = "true" ajax = "false" icon="ui-icon-flag" />


                           </p:submenu>
                       </p:column>
                   </p:submenu>
<p:menuitem value="#{app['login.logout']}"  title="#{app['login.logout']}"  icon="ui-icon-power"/>
   
               </p:megaMenu>
               <p:dialog header="#{app['info.theme']}" widgetVar="dlgTheme"
                         showEffect="bounce" hideEffect="explode" width="400"
                         height="200">
                   <h:panelGrid columns="2">
                       <h:panelGroup>
                           <p:outputLabel value="#{app['info.theme']}"/>
                           <p:selectOneMenu value="#{managementThemes.tema}" immediate
                                            = "true" editable="true">
                               <f:selectItems value="#{managementThemes.themes}" />
                           </p:selectOneMenu>
                           <p:commandButton value="#{app['boton.changetheme']}"
                                            action="#{managementThemes.cambiar}" ajax="false"/>
                       </h:panelGroup>
                   </h:panelGrid>
               </p:dialog>
           </h:form>


Tenemos un ejemplo cambiando el tema a hot-sneaks
se muestra la aplicación con el tema aplicado







primefaces ofrece el componente  <p:themeSwitcher> que realiza la misma función.
                           <h:outputText value="#{app['info.theme']}" />   
                                       <p:themeSwitcher style="width:165px" id="defaultSwitcher">  
                                           <f:selectItem itemLabel="Choose Theme" itemValue="" />  
                                           <f:selectItems value="#{managementThemes.themes}" />  
                                       </p:themeSwitcher>  




AVBravo - November 27, 2014 02:25 AM
Libro JEE7 descargas capitulos en pdf

Para descarga de los capitulos del libro en formato pdf  puedes entrar a la siguiente dirección
https://www.dropbox.com/sh/yzivtufjce1h57g/AAAJzegPVBxFtiqzEOlIAdsoa?dl=0

AVBravo - November 26, 2014 04:48 PM
Libro JEE7 Capítulo 2. Crear aplicación Web

Capítulo 2. Crear  aplicación Web
Modelo General
Desarrollo de una aplicacion Web
Dependencias Maven
Usando el Asistente Maven del IDE
Editar el archivo pom.xml
MODELO DESARROLLO
JPA
Proceder a Crear los Entity con NetBeans
Creación de los EJB
CDI vs ManagedBeans
CREAR UN CDI PARA EL MANEJO DE MENSAJES
Código completo del CDI JSFUtil.java
FACELETS
CREAR PLANTILLA FACELETS CON <p:layout> de PRIMEFACES
Código completo de template.xhtml
Editar template.xhtml
Crear la página Index.xhtml
CREAR CDI BEANS ESTATUSCONTROLLER.java
Crear los Facelets Template Client para insertar Estatus
Editar el entity Estatus.java
Editar EstatusFacade.java
Convertidores

Crear EstatusConverter.java

















Modelo General





Desarrollo de una aplicacion Web

Este capítulo  muestra el desarrollo de la aplicación de ejemplo de Scrum usando tecnologías JEE 7. Esta aplicación  permitirá insertar registros en una tabla utilizando JPA, primefaces / JavaServer Faces, EJB, CDI.


Para ello utilizamos:
  • NetBeans IDE 8.0.1
  • Maven (como parte del IDE)
  • GlassFish 4.1
  • Base de datos MySQL

1. Crear un proyecto Maven → Web Application desde NetBeans:




2. Indicar Project Name: scrumweb
Group id: com.avbravo (Es el grupo de proyectos al que pertenece nuestro proyecto)

En Settings, seleccionamos GlassFish Server 4.1. y en Java EE Version 7
add.png


El IDE genera la estructura del proyecto:


Ahora, vamos a seleccionar Projects → Properties → Configurations → Configurations: <default config> y presionar el botón Activate.




Hacemos clic en la categoría Frameworks


Hacer clic  el botón Add, y luego seleccionar JavaServer Faces

En la pestaña Configuration verificar que esté seleccionado la opción Facelets en la opción Preferred Language:


y en la pestaña Components seleccionamos Primefaces


Dependencias Maven

Maven consta de repositorios donde se encuentran las dependencias (bibliotecas .jar) necesarias para ejecutar nuestros proyectos. La ventaja que ofrece es que no es necesario descargar  manualmente estas dependencias. Simplemente Maven se encarga de buscarlas y en los repositorios y nos permite agregarlas facilmente. Si una biblioteca depende de otra, Maven se encargará agregar estas dependencias a nuestro proyecto.


Para nuestra aplicación web utilizaremos las siguientes dependencias:
  • primefaces all-themes
  • mysql
  • primefaces  
  • itext
  • jasperreports
  • jfreechart


NetBeans nos ofrece dos alternativas para realizarlo: la primera mediante el asistente y la segunda editando el archivo pom.xml  que encontramos en Project Files.


Usando el Asistente Maven del IDE



Usaremos la alternativa del asistente del IDE. Para ello, en el nodo  “Dependencies” hacer clic derecho y seleccionar Add Dependency...


En el diálogo Add Dependency  escribiremos en el campo Query la dependencia a buscar y presionamos la tecla Intro. En ese momento se mostrará un listado con las dependencias locales y remotas y seleccionamos la que deseamos de la lista.
  • Para primefaces all-themes (Permite manejar los temas de primefaces)


  • Dependencia mysql-connector-java (Para manejar la comunicación con mysql)


  • Actualizamos la versión de primefaces a 5.1 (Última versión de primefaces community al momento de escribir este libro)
51.png



  • Dependencia itext (Utilizado para reportes)


  • Dependencia jasperreports (Utilizado para reportes)






  • Dependencia jfreechart (Generación de gráficas)


Editar el archivo pom.xml

La segunda alternativa es editar el archivo pom.xml ubicado en Project Files


Podemos escribir directamente la dependencia, o dar clic derecho Insert Code→ Dependency.
Mostrará el diálogo para buscar dependencias.


En el archivo pom.xml ingresamos directamente la dependencia indicando el groupId(generalmente es la organización o empresa que desarrolla), artifactId (nombre del jar), versión (número de versión )


<dependencies>
       <dependency>
           <groupId>org.primefaces</groupId>
           <artifactId>primefaces</artifactId>
           <version>5.1</version>
       </dependency>
       <dependency>
           <groupId>commons-fileupload</groupId>
           <artifactId>commons-fileupload</artifactId>
           <version>1.3</version>
       </dependency>
       <dependency>
           <groupId>org.primefaces.extensions</groupId>
           <artifactId>all-themes</artifactId>
           <version>1.0.8</version>
       </dependency>
       <dependency>
           <groupId>mysql</groupId>
           <artifactId>mysql-connector-java</artifactId>
           <version>5.1.26</version>
       </dependency>
       <dependency>
           <groupId>com.lowagie</groupId>
           <artifactId>itext</artifactId>
           <version>2.1.7</version>
       </dependency>
       <dependency>
           <groupId>net.sf.jasperreports</groupId>
           <artifactId>jasperreports</artifactId>
           <version>5.2.0</version>
       </dependency>
       <dependency>
           <groupId>jfree</groupId>
           <artifactId>jfreechart</artifactId>
           <version>1.0.13</version>
       </dependency>
       <dependency>
           <groupId>javax</groupId>
           <artifactId>javaee-web-api</artifactId>
           <version>7.0</version>
           <scope>provided</scope>
       </dependency>
   </dependencies>


y en repositories agregar
<repositories>
       <repository>
           <url>http://repository.primefaces.org/</url>
           <id>PrimeFaces-maven-lib</id>
           <layout>default</layout>
           <name>Repository for library PrimeFaces-maven-lib</name>
       </repository>

Al terminar de agregar las dependencias, hacer clic derecho sobre el ícono del proyecto, y seleccionamos “Build with  Dependencies” para descargar las dependencias del proyecto Maven.




Se observa un listado de dependencias
d.png













MODELO DESARROLLO

  • Java Server Faces ofrece un mecanismo sencillo para el desarrollo de interfaces de usuario web, el modelo será dividido en tres capas (Capa Web, Capa Negocio, Capa de Datos),








Para poder manejar la base de datos MySQL desde NetBeans  IDE, se agrega la base de datos desde la pestaña Services→ Databases→ Drivers→ MySQL




Indicar el nombre de la base de datos el usuario y password, y presionar el botón Test Connection, para comprobar que la conexión a la base de datos sea exitosa.




NetBeans IDE nos ofrece un potente editor de consultas y operaciones sobre la base de datos.




Nota: Desde este panel podemos conectarnos a cualquier base de datos, de cualquier tipo, siempre y cuando contemos con el controlador JDBC.


JPA

EL ORM(Object Relational Mapping), predeterminado en JEE7 es JPA, que ofrece un mecanismo sencillo de manejo de registros de las tablas y su equivalente en clases en Java. Generalmente POJOs(Plain Old Java  Object), que se denominan Entity, ya que a diferencia de un objeto Java tradicional, el Entity permite que el valor de sus atributos sea almacenado permanentemente en la base de datos.


Los Entity ofrecen una serie de atributos y anotaciones que facilitan el manejo de los mismos, aprovechando las ventajas de la plataforma Java EE7.


Proceder a Crear los Entity con NetBeans

  • Desde menú File, seleccione New
  • en Categories, seleccione Persistence
  • en File Types, seleccione Entity Classes from DataBase



Luego, si no existe el jdbc/scrumweb procedemos a crear el Data Source para nuestra aplicación, para ello seleccionaremos New Data Source...
Seguidamente, indicamos el  nombre JNDI que vamos a utilizar. En nuestro caso, usaremos: jdbc/scrumweb


De ahora en adelante, cada vez que queramos referirnos a la base de datos, lo haremos usando JNDI. Seleccionamos Data Source el nombre JNDI que deseamos crear jdbc/scrumweb


Continuamos con el asistente, y cuando nos pregunte que tablas vamos a importar(Available Tables):


Y como queremos importar todas las tablas, hacemos clic en Add All


Notaremos que algunos nombres de  tablas se presentarán en color gris; estas son las que dependen de otras tablas, porque tienen una clave foránea, y es necesaria importarla para que la tabla principal pueda funcionar.


Continuamos con el asistente. En el diálogo Entity Classes, muestra las columnas con el nombre de la tabla, clases y tipo de generación.


En el diálogo Mapping Options, dejamos los valores predeterminados en el campo “Collection Type” con el valor java.util.Collection y presionamos el botón “Finalizar”



Se iniciara la generación de los Entity, en base al análisis de las tablas.


En la imagen podrá apreciar los Entity generados, cada uno  corresponde a una tabla de la base de datos




Nos ubicamos en Other Sources /src/main/resources y dar clic derecho sobre persistence.xml, seleccionar Open.




se muestra la configuración del archivo persistence.xml, y comprobar que Data Source: muestra jdbc/scrumweb
si damos clic en la pestaña Source, podemos observar la configuración.


<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
 <persistence-unit name="com.avbravo_scrumweb_war_1.0-SNAPSHOTPU" transaction-type="JTA">
   <jta-data-source>jdbc/scrumweb</jta-data-source>
   <exclude-unlisted-classes>false</exclude-unlisted-classes>
   <properties/>
 </persistence-unit>
</persistence>

Creación de los EJB

Los “Enterprise Java Beans” son clases especiales en Java que se ejecutan en el Contenedor Java EE. En estos componentes se establece la lógica de negocio para nuestras aplicaciones. Esto nos permite separar limpiamente la lógica de negocio, de la vista y de la capa de datos.


NetBeans nos permite crear estos EJB con el modelo CRUD (Create-Read-Update-Delete) para nuestras Entities de una manera muy rápida de la siguiente manera.


  • Desde menú File, seleccione New
  • en Categories, seleccione Enterprise JavaBeans
  • en File Types, seleccione Session Beans For Entity Classes



Seleccionar de la lista “Available Entity Classes” y presionar el botón Add All>> para generar todos los EJB para nuestras entidades.





En el dialogo Generated Session Beans, indicar el campo  “Packagecom.avbravo.scrumweb.ejb  (Para almacenar en ese paquete los ejb que se generen) y presionar el botón “Finalizar”


Se crean en el paquete com.avbravo.scrumweb.ejb los EJB AbstractFacade.java y un EJB para cada Entity seleccionado.





CDI vs ManagedBeans

JEE7 utiliza por defecto CDI en lugar de ManagedBeans, ya que estos estan más integrados con la plataforma y permiten la inyección de dependencias.


Para utilizarla debemos importar el paquete javax.enterprise.context y deben implementar la interfaz Serializable para los SessionScoped.


por ejemplo


import javax.annotation.ManagedBean;
import javax.enterprise.context.SessionScoped;


los paquetes que corresponden  a ManagedBeans ya no se usarán


import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;

CDI define los alcances
  • @Application Scoped: Se mantiene durante toda la ejecución de la aplicacion.
  • @SessionScoped:       Se mantiene durante la sesion de un unico usuario.
  • @RequestScoped:      Corresponde a una unica solicitud HTTP o la invocación de un  
                                           método. El beans solo persiste mientras el método es
                                           invocado.
  • @ConversationScoped: Se mantiene entre multiples invocaciones.
  • @Dependent:             Es el mismo ciclo que el de un cliente. Un bean dependiente
 es creado cada vez que se inyecta y la referencia es removida cuando la inyección es removida.


Utilizamos la anotación  @Named para hacer referencia desde las páginas xhtml , se utiliza la siguiente estandarización: si el CDI se llama JSFUtil y se utiliza @Named este se usará en las páginas xhtml como jSFUtil, con la primera letra en minúsculas.









CREAR UN CDI PARA EL MANEJO DE MENSAJES

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



Se permite seleccionar el Scope (Alcance) en este ejemplo utilizamos request, indicar el paquete generales donde se almacenará.
Código generado por el IDE

Se procede a  eliminar la anotación  @ManagedBean y será reemplazada por @Named, la importación javax.faces.bean.ManagedBean y javax.faces.bean.RequestScoped se deben eliminar. Ya que estas en depreciadas para usar en su lugar CDI.


Dar Clic derecho-> Fix import y seleccionar javax.inject.Named y javax.enterprise.context.RequestScoped

























Se mostrará el código de la siguiente manera:


package com.avbravo.scrumweb.generales;


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


/**
*
* @author avbravo
*/
@Named
@RequestScoped
public class JSFUtil  {

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


}



En el código usaremos métodos para enviar mensajes a los componentes  <p:growl> y <h:messages>, y tambien se usara para desplegar diálogos utilizando Dialog Framework.


Por ejemplo el método addSuccessMessage() actualiza el <p:growl> y <h:messages> de la pagina xhtml.






Mientras el método infoDialog() muestran un diálogo con los mensajes utilizando Dialog Framework de Primefaces implementado en la versión 4.0, y no actualiza <p:growl> ni <h:messages> de la pagina xhtml.

Código completo del CDI JSFUtil.java



import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import javax.enterprise.context.RequestScoped;
import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.component.UIInput;
import javax.faces.component.UISelectItem;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.model.SelectItem;
import javax.inject.Named;
import javax.servlet.http.HttpSession;
import org.primefaces.context.RequestContext;


/**
*
* @author avbravo
*/
@Named
@RequestScoped
public class JSFUtil {


  
   public static SelectItem[] getSelectItems(List<?> entities, boolean selectOne) {
       int size = selectOne ? entities.size() + 1 : entities.size();
       SelectItem[] items = new SelectItem[size];
       int i = 0;
       if (selectOne) {
           items[0] = new SelectItem("", "­­­");
           i++;
       }
       for (Object x : entities) {
           items[i++] = new SelectItem(x, x.toString());
       }
       return items;
   }
   /*
    * logout
    */


   public String logout() {
       HttpSession session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(false);
       if (session != null) {
           session.invalidate();
       }
       return "/index";
   }


   public static void addErrorMessage(Exception ex, String defaultMsg) {
       String msg = ex.getLocalizedMessage();
       if (msg != null && msg.length() > 0) {
           addErrorMessage(msg);
       } else {
           addErrorMessage(defaultMsg);
       }
   }


   public static void addErrorMessages(List<String> messages) {
       for (String message : messages) {
           addErrorMessage(message);
       }
   }


   public static void addErrorMessage(String msg) {
       FacesMessage facesMsg = new FacesMessage(FacesMessage.SEVERITY_ERROR,
               msg, msg);
       FacesContext.getCurrentInstance().addMessage(null, facesMsg);
   }


    public static void testMessage(String msg) {
       FacesMessage facesMsg = new FacesMessage(FacesMessage.SEVERITY_ERROR,
               msg, msg);
       FacesContext.getCurrentInstance().addMessage(null, facesMsg);
   }
   public static void addSuccessMessage(String msg) {
       FacesMessage facesMsg = new FacesMessage(FacesMessage.SEVERITY_INFO, msg,
               msg);
       FacesContext.getCurrentInstance().addMessage("successInfo", facesMsg);
   }


   public static void addWarningMessage(String msg) {
       FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, msg, ""));
   }


   public static void addFatalMessage(String msg) {
       FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_FATAL, msg, ""));
   }


   public static String getRequestParameter(String key) {
       return FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get(key);
   }


   public static Object getObjectFromRequestParameter(String requestParameterName,
           Converter converter, UIComponent component) {
       String theId = JSFUtil.getRequestParameter(requestParameterName);
       return converter.getAsObject(FacesContext.getCurrentInstance(), component, theId);
   }


   public static void infoDialog(String titulo, String texto) {
       FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, titulo,
               texto);
       RequestContext.getCurrentInstance().showMessageInDialog(message);
   }


   public static void warningDialog(String titulo, String texto) {
       FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_WARN, titulo,
               texto);
       RequestContext.getCurrentInstance().showMessageInDialog(message);
   }


   public static void fatalDialog(String titulo, String texto) {
       FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_FATAL, titulo,
               texto);
       RequestContext.getCurrentInstance().showMessageInDialog(message);
   }


   public static void errorDialog(String titulo, String texto) {
       FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR,
               titulo, texto);
       RequestContext.getCurrentInstance().showMessageInDialog(message);
   }


   public static java.sql.Date converterDate(java.util.Date fecha) {
       try {
           long lfecha = fecha.getTime();
           java.sql.Date dtfecha = new java.sql.Date(lfecha);
           return dtfecha;
       } catch (Exception e) {
           addErrorMessage("converterDate() " + e.getLocalizedMessage());
       }
       return null;
   }


   public static java.util.Date getFechaActual() {
       java.util.Calendar ca = java.util.Calendar.getInstance();
       java.sql.Date mydate = new java.sql.Date(ca.getTimeInMillis());
       return new java.sql.Date(mydate.getTime());


   }


   public static Integer getAnioActual() {
       java.util.Calendar ca = java.util.Calendar.getInstance();
       java.sql.Date mydate = new java.sql.Date(ca.getTimeInMillis());
       return ca.get(Calendar.YEAR);
   }


   public static Integer getMesActual() {
       java.util.Calendar ca = java.util.Calendar.getInstance();
       java.sql.Date mydate = new java.sql.Date(ca.getTimeInMillis());
       return ca.get(Calendar.MONTH);
   }


   public static Integer getMesDeUnaFecha(Date date) {
       Calendar calendar = Calendar.getInstance();
       calendar.setTime(date);


       int anio = calendar.get(Calendar.YEAR);
       int mes = calendar.get(Calendar.MONTH) + 1;
       int dia = calendar.get(Calendar.DAY_OF_MONTH);
       return mes;
   }
public static Integer getAnioDeUnaFecha(Date date) {
       Calendar calendar = Calendar.getInstance();
       calendar.setTime(date);


       int anio = calendar.get(Calendar.YEAR);
       int mes = calendar.get(Calendar.MONTH) + 1;
       int dia = calendar.get(Calendar.DAY_OF_MONTH);
       return anio;
   }
 public static Integer getDiaDeUnaFecha(Date date) {
       Calendar calendar = Calendar.getInstance();
       calendar.setTime(date);


       int anio = calendar.get(Calendar.YEAR);
       int mes = calendar.get(Calendar.MONTH) + 1;
       int dia = calendar.get(Calendar.DAY_OF_MONTH);
       return dia;
   }
   public static Integer getDiaActual() {
       java.util.Calendar ca = java.util.Calendar.getInstance();
       java.sql.Date mydate = new java.sql.Date(ca.getTimeInMillis());
       return ca.get(Calendar.DATE);
   }


   public static boolean isValidationFailed() {
       return FacesContext.getCurrentInstance().isValidationFailed();
   }


   public static boolean isDummySelectItem(UIComponent component, String value) {
       for (UIComponent children : component.getChildren()) {
           if (children instanceof UISelectItem) {
               UISelectItem item = (UISelectItem) children;
               if (item.getItemValue() == null && item.getItemLabel().equals(value)) {
                   return true;
               }
               break;
           }
       }
       return false;
   }


   public static String getComponentMessages(String clientComponent, String defaultMessage) {
       FacesContext fc = FacesContext.getCurrentInstance();
       UIComponent component = UIComponent.getCurrentComponent(fc).findComponent(clientComponent);
       if (component instanceof UIInput) {
           UIInput inputComponent = (UIInput) component;
           if (inputComponent.isValid()) {
               return defaultMessage;
           } else {
               Iterator<FacesMessage> iter = fc.getMessages(inputComponent.getClientId());
               if (iter.hasNext()) {
                   return iter.next().getDetail();
               }
           }
       }
       return "";
   }


   public static Throwable getRootCause(Throwable cause) {
       if (cause != null) {
           Throwable source = cause.getCause();
           if (source != null) {
               return getRootCause(source);
           } else {
               return cause;
           }
       }
       return null;
   }
   }












FACELETS

Facelets nos permite manejar un sistema de plantillas y componentes de manera facil.


CREAR PLANTILLA FACELETS CON <p:layout> de PRIMEFACES

Primefaces nos ofrece el componente <p:layout>  que nos permite una disposición adecuada de los componentes. A continuación se mostrará una forma sencilla de integrar facelets con <p:layout> para crear una plantilla dinámica  para nuestra aplicación web.


  • Desde menú File, seleccione New
  • en Categories, seleccione Java Server Faces
  • en File Types, seleccione Facelets Template




colocar  el nombre File Name: template



El IDE genera el archivo templates.xhtml y en la carpeta resources los css


Eliminamos el código que genera y agregamos el código para implementar el layout de primefaces.
Integramos facelets con el componente <p:layout> de primefaces. Teniendo presente que <p:layout> utiliza    <p:layoutUnit position="north”> para definir las areas y facelets necesitamos  definir el área mediante <ui:insert name="top"> .
Tabla comparativa
Primefaces
Facelets
north
top
south
bottom
west
left
east
Right
center
center


Indicamos que será pagina completa.
 <p:layout fullPage="true">
usamos <p:layoutUnit de primefaces y dentro de el <ui:insert>
<p:layoutUnit position="north" size="100" resizable="true" closable="true" collapsible="true">
        <ui:insert name="top">
         Header
        </ui:insert>
</p:layoutUnit>







Si deseamos incluir menú en la parte superior y que estos se muestran en sobre otras áreas y no solo sobre la parte superior incluir el css donde se modifica .ui-layout-north y .ui-layout-unit-content


<style type="text/css">
               .ui-layout-north {
                   z-index:20 !important;
                   overflow:visible !important;;
               }
               .ui-layout-north .ui-layout-unit-content {
                   overflow:visible !important;
               }
           </style>





Cambiar
Por
<title>Facelets Template</title>
<title><h:outputText value="Scrum web"/></title>





Agregar dentro del <h:head> el <f:facet name=”first”>, lo usamos para reordenar el contenido en Primefaces. Indicando lo primero que debe cargarse.
<f:facet name="first">
           <meta content='text/html; charset=UTF­8'  http-equiv="Content­Type"/>
           <title><h:outputText value="Scrum web"/></title>
       </f:facet>





Código completo de template.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://java.sun.com/jsf/facelets"
     xmlns:h="http://java.sun.com/jsf/html"
     xmlns:p="http://primefaces.org/ui"
     xmlns:f="http://xmlns.jcp.org/jsf/core">
   <f:view contentType="text/html">

    <h:head>
       <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
       <h:outputStylesheet name="./css/default.css"/>
       <h:outputStylesheet name="./css/cssLayout.css"/>
       <f:facet name="first">
           <meta content='text/html; charset=UTF­8'  http-equiv="Content­Type"/>
           <title><h:outputText value="Scrum web"/></title>
       </f:facet>


       <style type="text/css">
               .ui-layout-north {
                   z-index:20 !important;
                   overflow:visible !important;;
               }
               .ui-layout-north .ui-layout-unit-content {
                   overflow:visible !important;
               }
           </style>


   </h:head>

   <h:body>
       <p:layout fullPage="true">
           <p:layoutUnit position="north" size="100" resizable="true" closable="true" collapsible="true">
               <ui:insert name="top">
         Header
               </ui:insert>
           </p:layoutUnit>
          <p:layoutUnit position="south" size="50" closable="true" collapsible="true">
               <ui:insert name="bottom">
                   Footer
               </ui:insert>
           </p:layoutUnit>
    <p:layoutUnit position="west" size="175" header="Left" collapsible="true">
               <ui:insert name="left">
                   Left
               </ui:insert>
           </p:layoutUnit>
           
           <p:layoutUnit position="center">
               <ui:insert name="center"></ui:insert>
           </p:layoutUnit>
       </p:layout>
   </h:body>
       </f:view>
</html>





















Eliminar los archivos index.html e index.xhtml


Crear menu.xhtml
Crear una página Java Server Faces que contendrá las opciones del Menú separadas del template que luego la incluiremos dentro.
  • Desde menú File, seleccione New
  • en Categories, seleccione Java Server Faces
  • en File Types, seleccione JSF Page

Se utiliza el componente <p:megamenu> de primefaces debe estar incluido dentro de un <h:form>.
Utilizaremos menuitem  para indicar las opciones a desplegar en el menu.
 <p:menuitem value="Insertar"  url="/faces/page/estatus/estatusinsert.xhtml" />
la ruta /faces/pages/estatus/ indica que se debe crear la carpeta /page/estatus dentro de Web Pages.






Código completo de menu.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>
           <h:form id="menuForm" >
             <p:megaMenu>  
              <p:submenu label="Registros" icon="ui-icon-check">  
               <p:column>  
                   <p:submenu label="Estatus">  
                      <p:menuitem value="Insertar"  url="/faces/page/estatus/estatusinsert.xhtml" />  
                      <p:menuitem value="Listar"   url="/faces/page/estatus/estatuslist.xhtml"/>  
                   </p:submenu>  
               </p:column>  
             </p:submenu>  
          
           </p:megaMenu>  
         </h:form>
       </ui:composition>


   </h:body>
</html>














Editar template.xhtml

en el top, colocamos el <ui:include src=”menu.xhtml”/>, mediante el include incluimos en la parte superior de la plantilla el menú que tenemos en menu.xhtml
 <p:layout fullPage="true">
           <p:layoutUnit position="north" size="100" resizable="true" closable="true"
                         collapsible="true">
               <ui:insert name="top">
                   <ui:include src="menu.xhtml"/>
               </ui:insert>
           </p:layoutUnit>

Crear la página Index.xhtml

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 : index
Presionar el botón Browse de Template:


seleccionamos el  Template  template.xhtml


Se genera el código de la página y  colocamos en comentario top,bottom, left. Utilizando
 <!-- --> ,de esta manera el área top, bottom,left serán reemplazadas por la definición en el template, y nosotros editamos el área center, donde  escribimos los componentes java server faces que deseamos mostrar. En este caso escribimos BIENVENIDOS A SCRUMWEB

Ejecutamos el proyecto  


se carga en el browser, podemos observar el layout con el menú y el mensaje de la página index.xhtml que es la primera en cargarse al ejecutar el proyecto.


CREAR CDI BEANS ESTATUSCONTROLLER.java

Estos CDI los utilizamos invocar las diversas operaciones sobre los Entity y asociar los componentes con las páginas Java Server Faces.


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

Agregamos las anotaciones @Named, @RequestScoped.
Nota:  Recordar utilizar javax.enterprise.context.RequestScoped.


Agregamos el EJB inyectandolo mediante @Inject
@Inject
EstatusFacade estatusFacade;


Agregamos el Entity
Estatus estatus = new Estatus();


creamos los get/set del entity estatus clic derecho Insert Code-->Generated set/get y seleccionamos estatus

Implementamos el método save() donde haremos persistentes los entity en la base de datos,  en este método buscaremos por la llave primaria mediante estatusFacade.find(), y si no existe invocamos estatusFacade.create(), para guardarlo.
Si deseamos limpiar la vista escribimos estatus = new Estatus(), de manera que al actualizarse la página xhtml, esta mostrará los atributos limpios.
JSFUtil.infoDialog(), mostrará el mensaje en un diálogo. Si queremos que se muestre en el growl usamos JSFUtil.addSuccessMessage().
Crear métodos edit() y delete(),  crear atributo encontrado con los métodos get/set. Recordar cambiar
public Boolean isEncontrado() {
       return encontrado;
   }


por
public Boolean getEncontrado() {
       return encontrado;
   }


































Código completo de CDI Beans EstatusController.java


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 javax.enterprise.context.RequestScoped;
import javax.inject.Inject;
import javax.inject.Named;


/**
*
* @author avbravo
*/
@Named
@RequestScoped
public class EstatusController  {
   @Inject
   EstatusFacade estatusFacade;
   Estatus estatus = new Estatus();
   private Boolean encontrado = false;
   private List<Estatus> items;


   public Estatus getEstatus() {
       return estatus;
   }


   public void setEstatus(Estatus estatus) {
       this.estatus = estatus;
   }


   public Boolean getEncontrado() {
       return encontrado;
   }


   public void setEncontrado(Boolean encontrado) {
       this.encontrado = encontrado;
   }


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


   public String save() {
       try {
           if (estatusFacade.find(estatus.getIdestatus()) != null) {
               JSFUtil.infoDialog("Mensaje", "Existe un registro con ese id");
               return null;
           }
           estatusFacade.create(estatus);
           JSFUtil.addSuccessMessage("Guardado");
           estatus = new Estatus();
       } catch (Exception e) {
           JSFUtil.addErrorMessage(e.getLocalizedMessage());
       }
       return null;
   }


   public String edit() {
       try {
           estatusFacade.edit(estatus);
           JSFUtil.addSuccessMessage("Guardado");
       } catch (Exception e) {
           JSFUtil.addErrorMessage(e.getLocalizedMessage());
       }
       return null;
   }


   public String delete() {
       try {
           estatusFacade.remove(estatus);
           JSFUtil.addSuccessMessage("Eliminado");
           encontrado = false;
           estatus = new Estatus();


       } catch (Exception e) {
           JSFUtil.addErrorMessage(e.getLocalizedMessage());
       }
       return null;
   }
//Devuelve eln list para un selectOneMenu
public List<Estatus> getItems() {
       if (items == null) {
           items = estatusFacade.findAll();
       }
       return items;
   }

}




Crear los Facelets Template Client para insertar 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: estatusinsert
  • Folder colocamos /page/estatus/
  • Template seleccionamos template.xhtml

Se crea el Facelets client  estatusinsert.xhtml en la carpeta page/estatus



De la misma manera que hicimos con la página index, colocamos en comentario top, button,left, mediante <!-- →.
      
Nos ubicamos en la palabra  center. En esta parte vamos a reemplazarlo con un formulario generado por el IDE..


           <ui:define name="center">
               center
           </ui:define>

Una vez seleccionado, hacemos clic sobre el texto y seleccionamos  Insert Code




Luego, hacemos clic en JSF Form From Entity




Seleccionar el Entity: com.avbravo.scrumweb.Estatus
y el Managed Bean Property: estatusController.estatus






Genera el código con los componentes JSF asociado a los atributos del entity
Indicamos el id del panel esto se utiliza para identificar el componente por el id respectivo
<h:panelGrid id="panel" columns="2">


Colocamos la etiqueta <p:growl id="growl" /> y <p:messages autoUpdate=”true”  para que nos muestre los mensajes del aplicativo.


Ahora vemos que la etiqueta   <p:growl id="growl" /> muestra un error . Esto se debe a que  no está agregado el taglib de primefaces. Para agregarlo, seleccionamos el icono  de la sugerencia y seleccionamos que agregue la biblioteca respectiva


Agregamos el componente para mensajes que se mantendrán en la página.
 <p:messages autoUpdate="true"/>


Creamos la  sección footer en el panelGrid y agregar el boton Guardar, para invocar el método save() del CDI y en  la propiedad update utilizamos  panel y growl, de manera que el guardar un registro se actualice el panel y se muestre los mensajes en el growl. Si no lo colocamos en el update los mensajes no se mostraran, ya que el <p:commandButton> por defecto tiene Ajax habilitado en true.


<f:facet name="footer">
  <p:commandButton value="Guardar" update="panel,growl" action="#{estatusController.save()}"/>
</f:facet>






Vista final de la página estatusinsert.xhtml, con los componentes y el botón Guardar.

Guardamos el archivo, y volvemos a ejecutar la aplicación para mostrar los cambios


Ingresamos los datos y al dar clic en el boton Guardar se almacenan en la base de datos los atributos que estan en el Entity y se envía el mensaje en el growl y en messages.



si ingresamos un idestatus que ya existe nos enviará el mensaje.


Si no usaramos la validación para determinar si existe un registro con esa llave primaria obtendremos el mensaje Transaction aborted, y no sería muy explicativo para el usuario
Si deseamos usar icono en el botón, agregamos el atributo icon="ui-icon-disk" a <p:commandButton>.


En el siguiente enlace podemos encontrar la lista de iconos jquery disponibles para los componentes primefaces, que usaremos mediante icon="nombre del icono”
colocamos el cursor sobre el icono y se despliega el mensaje con el nombre.


Editar el entity Estatus.java

Agregar el @NamedQuery findByEstatusLike que nos permitirá realizar búsquedas por coincidencias en el atributo estatus.
   @NamedQuery(name = "Estatus.findByEstatusLike", query = "SELECT e FROM Estatus e WHERE lower(e.estatus) like :estatus"),



Segmento del código Entidad.java donde se agrega el @NamedQuery


@Entity
@Table(name = "estatus")
@XmlRootElement
@NamedQueries({
   @NamedQuery(name = "Estatus.findAll", query = "SELECT e FROM Estatus e"),
   @NamedQuery(name = "Estatus.findByIdestatus", query = "SELECT e FROM Estatus e WHERE e.idestatus = :idestatus"),
   @NamedQuery(name = "Estatus.findByEstatus", query = "SELECT e FROM Estatus e WHERE e.estatus = :estatus"),
   @NamedQuery(name = "Estatus.findByEstatusLike", query = "SELECT e FROM Estatus e WHERE lower(e.estatus) like :estatus"),
   @NamedQuery(name = "Estatus.findByEsinicial", query = "SELECT e FROM Estatus e WHERE e.esinicial = :esinicial")})
public class Estatus implements Serializable {
   private static final long serialVersionUID = 1L;

Editar EstatusFacade.java

Agregar el método  findById , que nos devolverá un objeto de tipo Estatus.
El método find, el cual buscará el entity por la llave primaria.
El método findByEsinicial() que recibe un parámetro correspondiente al valor del atributo esinicial(si/no).


El Entity Estatus findByEsinicial es el  @NamedQuery(name = "Estatus.findByEsinicial", usaremos un Query que implementa la búsqueda y devolverá un list.
El método  getEstatusList() para que devuelva todos los entity , al invocar Estatus.findAll. y elmétodoo  findByEsinicial().
agregar los métodos findByEstatus(), findByIdEstatusList() y  findByEstatusLike()


Editar EstatusFacade.java


public Estatus findById(String id) {
       return em.find(Estatus.class, id);
}


public List<Estatus> getEstatusList() {
       return em.createNamedQuery("Estatus.findAll").getResultList();
   }


public List<Estatus>  findByEsinicial(String value){
           Query query = em.createNamedQuery("Estatus.findByEsinicial");
           return  query.setParameter("esinicial", value).getResultList();
   }


public List<Estatus> findByEstatus(String value){
       Query query = em.createNamedQuery("Estatus.findByEstatus");
       return query.setParameter("estatus",value).getResultList();
   }


       public List<Estatus>  findByIdEstatusList(String value){
     Query query = em.createNamedQuery("Estatus.findByIdestatus");
     return  query.setParameter("idestatus", value).getResultList();
   }


public List<Estatus>  findByEstatusLike(String value){
     Query query = em.createNamedQuery("Estatus.findByEstatusLike");
     value = "%" +value.trim() +"%";
     return  query.setParameter("estatus", value).getResultList();
   }


Convertidores

Convierten los objetos en el tipo de datos necesario. Por ejemplo si usamos un selectOneMenu con una lista de objetos, el converter devolverá el objeto seleccionado.

Crear EstatusConverter.java

Crear EstatusConverter.java
  • Desde menú File, seleccione New
  • en Categories, seleccione Java Server Faces
  • en File Types, seleccione JSF ManagedBeans
  • Class Name: EstatusConverter
  • Package com.avbravo.scrumweb.converter

import com.javscaz.rigemjsf.Usuarios;
import com.javscaz.rigemjsf.ejb.UsuariosFacade;
import com.javscaz.rigemjsf.generales.JSFUtil;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.inject.Inject;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.FacesConverter;


@FacesConverter(value = "estatusConverter")
public class EstatusConverter implements Converter {


   @Inject
   private EstatusFacade ejbFacade;


   @Override
   public Object getAsObject(FacesContext facesContext, UIComponent component, String value) {
       if (value == null || value.length() == 0 || JSFUtil.isDummySelectItem(component, value)) {
           return null;
       }
       return this.ejbFacade.find(getKey(value));
   }


   java.lang.String getKey(String value) {
       java.lang.String key;
       key = value;
       return key;
   }


   String getStringKey(java.lang.String value) {
       StringBuffer sb = new StringBuffer();
       sb.append(value);
       return sb.toString();
   }


   @Override
   public String getAsString(FacesContext facesContext, UIComponent component, Object object) {
       if (object == null
               || (object instanceof String && ((String) object).length() == 0)) {
           return null;
       }
       if (object instanceof Estatus) {
           Estatus o = (Estatus) object;
           return getStringKey(o.getUsername());
       } else {
           Logger.getLogger(this.getClass().getName()).log(Level.SEVERE, "object {0} is of type {1}; expected type: {2}", new Object[]{object, object.getClass().getName(), Estatus.class.getName()});
           return null;
       }
   }


}

Nota:
Si la llave primaria es de tipo integer, utilizar el tipo de datos java.lang.Integer
java.lang.Integer getKey(String value) {
       java.lang.Integer key;
       key = Integer.valueOf(value);
       return key;
   }


   String getStringKey(java.lang.Integer value) {
       StringBuffer sb = new StringBuffer();
       sb.append(value);
       return sb.toString();
   }

AVBravo - November 26, 2014 04:47 PM
Libro JEE7 Capítulo 01 Requisitos

Capítulo 01 Requisitos


Introducción Instalar JDK En linux En Windows INSTALAR MAVEN INSTALAR NETBEANS Plugins de NetBeans IDE INSTALAR MYSQL En Linux MySQL Workbench En Windows Creación de la base de datos desde NetBeans MERCURIAL Clona tu nuevo repositorio GlassFish Crear pool de conexiones en GlassFish desde NetBeans IDE



Introducción

En este libro se describirá todo del desarrollo de una aplicación Java EE 7 utilizando las características de la tecnología. Para realizarlo, necesitamos la instalación de algunos componentes, así como su configuración.Ya que Java es multiplataforma, la instalación de los componentes lo describiremos para las plataformas Windows y Linux.

Instalar JDK

Para poder desarrollar una aplicación, necesitamos siempre el Kit de Desarrollo Java: JDK. Este kit lo descargamos desde http://www.oracle.com/technetwork/java/javase/downloads/index.html
J.png


Debemos ser muy cautelosos sobre la versión que deseamos instalar, ya que existen versiones de 32 bits y 64 bits.


En linux



H.png
Lo descomprimimos y lo movemos a /usr/local mediante


sudo mv jdk1.8.0_20 /usr/local


luego editamos el archivo profile


sudo gedit /etc/profile


y agregamos las siguientes líneas


export JAVA_HOME=/usr/local/jdk1.8.0_20
export JRE_HOME=${JAVA_HOME}/jre
export PATH=$PATH:${JAVA_HOME}/bin


ejecutar
cd /etc
source profile


y verificar la versión de java instalada


java -version


En Windows

Descargamos uno de estos instaladores, dependiendo de nuestro sistema operativo:





Hacemos doble clic sobre el instalador




... y dejamos todas las opciones por omisión.


Al finalizar la instalación, verifiquemos que se ha creado la carpeta correcta en %ProgramFiles%\Java. Para ello, presionamos las teclas Windows+R y escribimos el texto anterior




Hacemos clic en “Aceptar” y nos debería abrir la ventana del explorador de archivos con el contenido.




Como hemos descargado la versión JDK1.7.0_45 se creará la carpeta con el mismo nombre. Además vemos que existe otra carpeta llamada jre7. La primera carpeta tiene todo lo necesario para desarrollar una aplicación Java, la segunda tiene todo lo necesario para ejecutar una aplicación Java.


Debemos crear las variables de entorno que nos permitirá a utilizar correctamente el JDK dentro del entorno de Windows. Para ello, necesitamos tener la ruta completa del JDK. Así que - para no fallar en obtener la ruta completa de la carpeta - entramos a la primera carpeta y copiamos la dirección que aparece en la barra de direcciones.




Luego, entramos a las propiedades del equipo utilizando las teclas Windows+Pausa y hacemos clic en “Configuración avanzada del sistema”


Hacemos clic en “Variables de entorno”




Debemos crear dos variables de entorno. Hacemos clic en el botón “Nueva…” de la sección “Variables del sistema” y escribimos los siguientes valores


Nombre de variable: JAVA_HOME
Valor de la variable: (El que copiamos hace un rato)



Nombre de variable: JRE_HOME
Valor de la variable: %JAVA_HOME%\jre




Buscamos la variable PATH , lo seleccionamos y hacemos clic en “Editar…” y en el campo “valor de la variable” agregamos el texto %JAVA_HOME%\bin




Hacemos clic en todas las ventanas “Aceptar” para cerrarlas

Ahora, vamos a una ventana del símbolo de sistema, y escribimos


java -version


...para ver la versión instalada de Java:




Y escribimos


javac -version


… para ver la versión del compilador


INSTALAR MAVEN

Maven viene integrado con NetBeans IDE, pero también podemos instalarlo manualmente con los siguientes pasos
  • Descargar desde
descomprimir el archivo y copiarlo en /home/avbravo


  • Editar el profile
sudo gedit /etc/profile
Agregar
export MAVEN_HOME=/home/avbravo/apache-maven-3.0.5
export PATH=$PATH:${MAVEN_HOME}/bin


  • ejecutar
cd /etc
source profile


Verificar la versión de maven con
mvn --version




INSTALAR NETBEANS

Descargamos el IDE desde https://netbeans.org/downloads/
nb.png
le damos permiso de ejecución
chmod 775 *.sh


ejecutamos el instalador
./netbeans-8.0.1-linux.sh


se muestra el instalador
presionamos el botón Customize…, seleccionamos Tomcat, y presionamos el botón Next→
Seleccionamos la instalación de JUnit

Plugins de NetBeans IDE

DBackRestore
Lo utilizaremos para realizar backup y restauraciones de la base de datos MySQL.




Entramos a NetBeans y en el menú Tools->Plugins, seleccionar la pestaña Downloaded y hacer clic en el botón Add Plugins...


seleccionar el archivo .nbm correspondiente al plugin, presionar el botón Aceptar
Luego presionar el botón Install y respondemos a las opciones del instalador. Al finalizar la instalación  se muestra el icono en la barra principal del ide.
d.png

INSTALAR MYSQL

En Linux



Instalamos MySql
sudo apt-get install mysql-server mysql-client


Luego se solicita la contraseña y debemos repetirla



MySQL Workbench



Descargamos la versión para nuestro sistema operativo


procedemos a instalarlo, haciendo doble clic


En Windows

MySQL dispone un único instalador que contiene el Workbench, el Servidor en sí, los conectores y más herramientas. Este instalador se puede descargar desde aquí




Asegúrese descargar el que dice mysql-installer-community-5.x.msi donde “x” es el decimal de la versión.


Una vez descargado, proceda con la instalación siguiendo las opciones por omisión.


Creación de la base de datos desde NetBeans



Creamos la base de datos desde terminal o desde NetBeans menu, Window->IDE Tools->Terminal

Ejecutamos


mysql -h localhost -u root - p


si estamos en el mismo servidor podemos usar


mysql -u root -p

Ejecutamos el comando para crear la base de datos


create database scrumweb;


para salir de la consola de mysql escribimos


exit


y para salir de la consola del ide, escribimos nuevamente


exit


Ahora en la pestaña Services
Ubicarse en Drivers->MySQL(Connector/J driver)->clic derecho y seleccionar Connect Using…
En el Conecction  Wizard, indicamos el nombre de la base de datos y el user name y password, y presionamos el botón Finish.


Se muestra la conexión scrumweb
Ahora presionamos el icono del plugin DBackRestore , seleccionamos la pestaña Restore, dar clic en el icono para buscar el script , seleccionamos el archivo de script y hacemos clic en el botón Restore.
Nos muestra las tablas





MERCURIAL



Mercurial es un sistema de control de versiones distribuidos, permite clonar un repositorio, y funciona como cliente y servidor. Podemos subir nuestros cambios a otro repositorio clonado y luego estos se pueden subir al repositorio master.
Pull para actualizar nuestro repositorio.
Push para subir los cambios a un repositorio remoto.


A. Instalacion Mercurial
sudo apt-get install mercurial
   
B. Crearemos una cuenta en bitbucket,entrar a bitbucket, registrarse r

seleccionar en el menú Repositorios->Crear un nuevo repositorio

Al crearlo tenemos dos opciones
Iniciar con un proyecto desde cero, o si tenemos el proyecto lo subimos al repositorio.


al darle clic en Estoy comenzando desde cero y nos muestra los pasos para crearlo y subirlo al repositorio


Clona tu nuevo repositorio

Configura Mercurial en tu máquina si es que no lo has hecho ya.⏎
mkdir /path/to/your/project
cd /path/to/your/project
hg clone https://avbravo@bitbucket.org/avbravo/scrumweb


Nos interesa  el url que usaremos para subir los cambios de nuestro proyecto al repositorio.
https://avbravo@bitbucket.org/avbravo/scrumweb

Utilizamos la opción de administración




Habilitar los servicios, seleccionamos Hooks, seleccionamos
presionar el botón Añadir hook

Administración de acceso







GlassFish

Cuando instalamos NetBeans IDE, este trae integrado GlassFish, en este caso mostraremos el proceso de crear un pool de conexiones en GlassFish de dos maneras.En la primera será a través de NetBeans IDE y en la segunda en GlassFish Standalone.


Copiar el driver JDBC


Buscamos en la carpeta netbeans8.0.1->ide->modules->ext el driver mysql-connector-java-5.1.23bin.jar
m.png|


lo copiamos a  glassfish-3.1.2/glassfish/domains/domain1/lib

Crear pool de conexiones en GlassFish desde NetBeans IDE

Recomendacion:
Para crear el pool de conexiones de esta manera debe tener creado el proyecto.


Seleccionamos File-->New File en el menú de NetBeans
Categories: GlassFish y File Types: JDBC Connection Pool
El asistente cargará la conexión con el user y password a la base de datos


podemos modificar los parámetros que deseamos y presionamos el botón finalizar.

Ahora creamos JDBC Resource
File-->New -->Categories: GlassFish File Types: JDBC Resource

Seleccionar el pool de conexión scrumwebPool, en JNDI Name colocar jdbc/scrumweb


No agregamos ninguna propiedad y presionamos el botón finalizar.

También lo podemos hacer


Ejecutamos GlassFish desde NetBeans, clic derecho en GlassFish server y seleccionar Start
start.png

Si seleccionamos Properties, podemos ver el usuario y password de GlassFish
pro.png

Desde el navegador ingresamos la direccion localhost:4848


ingresamos el nombre de usuario y contraseña

Ventana administración



Seleccionamos Recursos->JDBC->Pool de conexiones JDBC


Hacer clic en el botón Nuevo... indicamos el nombre del pool scrumwebPool, tipo de recursos javax.sql.DataSource y el proveedor de bases de datos: MySQL


presionamos el botón siguiente




Nos muestra una lista enorme de parámetros eliminamos los que no necesitamos y agregamos estos
user
root
DatabaseName
scrumwebdb
password
mypassword
Url
jdbc:mysql://localhost:3306/scrumwebdb
PortNumber
3306
driverClass
com.mysql.jdbc.Driver


r.png
Presionar el botón Finalizar
Se muestra el listado de pools de conexión


dar clic en el pool scrumwebdbPool
Dar clic en el botón




Nos envía el mensaje que fue exitoso el ping


dar clic en el botón








Ahora en RECURSOS JDBC
Dar clic en Nuevo...
Dar clic en nuevo


colocamos como nombre jdbc/scrumwebdb y seleccionamos el pool scrumwebdbPool
s.png
y presionar el botón Aceptar
comprobamos que aparezca el jdbc/scrumwebdb












AVBravo - November 24, 2014 04:51 PM
Libro JEE7 Capitulo 0. Introducción

Capitulo 0. Introducción

Porque escribir este libro?
El desarrollo de aplicaciones empresariales ha evolucionado grandemente, Java EE es sin duda una de los componentes más utilizados, y NetBeans es uno de los mejores IDEs para desarrollo de aplicaciones.
Para un novato o un desarrollador de otros lenguajes generalmente se encuentra con muchos frameworks, IDEs, componentes y en algunas situaciones el inicio con el desarrollo de una aplicación empresarial se convierte en un proceso de análisis de tecnologías e implementaciones.
Este libro es una pequeña guia que se orienta al desarrollo de una aplicación JEE7 utilizando NetBeans IDE, GlassFish, Primefaces, Maven.
De manera que permita un conocimiento práctico de las aplicaciones y se complemente con otros libros especificos del area de desarrollo.
Encontrarás información sobre JPA, CDI.

“Pues bien, si mas que decir bienvenido al mundo Java, JEE7+NetBeans+GlassFish+Primefaces”

AVBravo - November 20, 2014 04:43 AM
Corregir Error Caused by: javax.el.PropertyNotFoundException

Corregir Error Caused by: javax.el.PropertyNotFoundException


s.png

al ingresar un valor en exoneracion y presionar enter se genera el error y no actualiza el saldo.
exception.png






Caused by: javax.el.PropertyNotFoundException: /page/pagos/pagoseventuales.xhtml @272,122 value="#{pagoseventualesSearchController.selected.comentario}": Target Unreachable, 'null' returned null
at com.sun.faces.facelets.el.TagValueExpression.setValue(TagValueExpression.java:133)
at javax.faces.component.UIInput.updateModel(UIInput.java:832)
... 43 more
Caused by: javax.el.PropertyNotFoundException: Target Unreachable, 'null' returned null
at com.sun.el.parser.AstValue.getTarget(AstValue.java:192)
at com.sun.el.parser.AstValue.setValue(AstValue.java:226)
at com.sun.el.ValueExpressionImpl.setValue(ValueExpressionImpl.java:294)
at org.jboss.weld.el.WeldValueExpression.setValue(WeldValueExpression.java:64)
at com.sun.faces.facelets.el.TagValueExpression.setValue(TagValueExpression.java:131)
... 44 more



La línea 272 es donde se genera el error
error.png


El formulario esta compuesto por un diálogo, dentro de el un datatable, se  invoca a otro diálogo con las opciones y este lo carga el registro en en el datatable, dentro de una de las columnas hay un botón que invoca al diálogo de para escribir el comentario.

columna donde se invoca el diálogo
column.png

si revisamos el error
@272,122 value="#{pagoseventualesSearchController.selected.comentario}": Target Unreachable, 'null' returned null

En el datatable en selection
selection="#{pagoseventualesSearchController.selected}"
indica que el objeto selected contendrá el objeto seleccionado pero al cargar el dialogo genera el error null
f.png


una forma sencilla de corregirlo, en el método get verificar si es null el objeto


public Recibosdetalles getSelected() {
       if(selected == null){
        
              selected = new Recibosdetalles();
       }
       return selected;
   }


d.png


si ejecutamos el proyecto, e ingresamos la exoneración se actualiza el saldo.
t.png

AVBravo - November 14, 2014 01:29 PM
Usando < p:cellEditor > para editar dos celdas de un datatable

Pensemos que tenemos un datatable en el cual las celdas pago y exoneración son editables, deseamos que se actualice el saldo, en base a los valores en estas dos celdas.


En nuestro archivo .xhtml
agregamos un <p:remoteCommand>
  <p:remoteCommand name="onCellEditTableComplete"  update=":form:growl,:form:datatableImpuestos" />

En el <p:datatable>

   <p:dataTable id="datatableImpuestos"
                                             rows="10"
                                             value="#{pagoseventualesSearchController.listRecibosdetalles}" 
                                             var="item"
                                             paginator="true"
                                             rowKey="#{item.idnivel6}"
                                             selectionMode="single"
                                             emptyMessage="#{app['info.notienedeudapendiente']}"

                                             selection="#{pagoseventualesSearchController.selected}"
                                             filteredValue="#{pagoseventualesSearchController.filtered}" 
                                             editable="true" editMode="cell"

                                             > 
Agregamos <p:ajax>
<p:ajax event="cellEdit" listener="#{pagoseventualesSearchController.onCellEdit}" 
                                            update=":form:growl,:form:datatableImpuestos,:form:mensajes" 
                                            oncomplete="onCellEditTableComplete()"/>


En las columnas usamos <p:cellEditor>

  <p:column headerText="#{msg.pago}">
                                        <p:cellEditor>
                                            <f:facet name="output"><h:outputText value="#{item.pago}" /></f:facet>
                                            <f:facet name="input"><p:inputText value="#{item.pago}" style="width:100%" label="Year"/></f:facet>
                                        </p:cellEditor>
                                    </p:column>
                                    <p:column headerText="#{msg.exoneracion}">
                                        <p:cellEditor>
                                            <f:facet name="output"><h:outputText value="#{item.exoneracion}" /></f:facet>
                                            <f:facet name="input"><p:inputText value="#{item.exoneracion}" style="width:100%" label="Year"/></f:facet>
                                        </p:cellEditor>
                                    </p:column>





                                    <p:column>
                                        <f:facet name="header">
                                            <p:outputLabel value="#{msg.saldo}"/>
                                        </f:facet>
                                        <p:outputLabel value="#{item.saldo}" >
                                            <f:convertNumber type="number"   groupingUsed="true"
                                                             minFractionDigits="2" pattern="#0.00"/>
                                        </p:outputLabel>
                                    </p:column>


En el @NamedBeans creamos el metodo onCellEdit
obtiene le fila seleccionada
            selected = listRecibosdetalles.get(event.getRowIndex());

permite asignar valores a las columnas especificas
listRecibosdetalles.get(event.getRowIndex()).setPago(0.0);


 public void onCellEdit(CellEditEvent event) {
 try {

            selected = listRecibosdetalles.get(event.getRowIndex());

            Object oldValue = event.getOldValue();
            Object newValue = event.getNewValue();
            if (newValue != null && !newValue.equals(oldValue)) {
             if (selected.getPago() < 0) {
                    JSFUtil.warningDialog(rf.getMensajeArb("info.message"), rf.getMensajeArb("info.valornegativo"));
                    listRecibosdetalles.get(event.getRowIndex()).setPago(0.0);
                    selected.setPago(0.0);
                    listRecibosdetalles.get(event.getRowIndex()).setSaldo(selected.getSaldoanterior() - selected.getPago() - selected.getExoneracion());
                }
}

AVBravo - November 12, 2014 11:20 PM
Java server Faces 2.3.0-m01-SNAPSHOT

Java Server Faces 2.3, traerá algunas cosas interesantes
Editamos el archivo pom.xml y especificamos la versión  2.3.0-m01-SNAPSHOT

Fuente

<dependency>
            <groupId>org.glassfish</groupId>
            <artifactId>javax.faces</artifactId>
            <version>2.3.0-m01-SNAPSHOT</version>
        </dependency>

Entre los avances que trae es que podemos usar CDI para UIViewRoot viewRoot y ExternalContext 

  





AVBravo - October 17, 2014 12:57 AM
Java Español- Norte America-Centro America-Sur America

En el día de hoy se dio una reunión organizada por nuestro amigo Alexis Lopez, cuyo objetivo fue reunir Jug-leaders, JavaChampions, miembros de las comunidades de Java en Español, a nivel del Continente Americano.


Esta reunión los participantes convocados:
Alexis Lopez - Colombia

Aristides Villarreal - Panamá
Cesar Hernandez - Guatemala
Diego Silva - Perú
Jorge Vargas - Mexico
Jose Díaz - Perú


El propósito es reforzar la presencia de la comunidad Java en Español, coordinar las actividades a nivel regional, establecer una organización común que reuna las diversas comunidades.
Sin lugar a dudas fue una gran experiencia, compartir con mis amigos en una videoconferencia muy amena donde se establecieron importantes lineamientos a seguir.
Pronto se estará convocando a otros Jugleaders y miembros de las comunidades a unirse a esta iniciativa.
Esta fue la primera reunión de Jugleaders de latinoamericana sobre Java en español.


AVBravo - September 23, 2014 02:44 PM
RemoteCommand primefaces

RemoteCommand de primefaces nos permite ejecutar los métodos de un Beans con JavaScript.
Podemos usarlo para varias actividades, en este ejemplo sencillo, para validar cuando se da Enter sobre una textField
  <p:remoteCommand  update="panel,growl,:form:barra:toolbar"
                                             name="remoteidnivel1" actionListener="#nivel1SearchController.load()}"/>

  <p:inputText id="idnivel1" size="35" value="#{nivel1Controller.nivel1.idnivel1}" title="#{msg.idnivel1}" required="true"
                                                     requiredMessage="#{msg.idnivel1} #{app['info.required']}"
                                                      onkeypress="if (event.keyCode == 13) {
                                                       remoteidnivel1();
                                                       return false;

                                                   }"/>


AVBravo - September 12, 2014 01:30 PM
NetBeans 8.0.1 en Español

NetBeans 8.0.1 disponible en español
http://bits.netbeans.org/netbeans/8.0.1/community/
Esta disponible NetBeans 8.0.1 en varios idiomas .


Puedes descargar la nueva versión y utilizar las nuevas características



AVBravo - September 10, 2014 03:19 PM
GlassFish 4.1

Disponible GlassFish 4.1 con soporte para Java 8
https://glassfish.java.net/download.html


GlassFish es un Servidor Java EE, que en su versión 4.1, liberado en el día de ayer soporta Java 8, CDI 1.2, WebSocket 1.1.

https://blogs.oracle.com/theaquarium/
como mencionaba en el post anterior esta integrado dentro de NetBeans 8.0.1

AVBravo - September 10, 2014 02:09 PM
NetBeans 8.01 Disponible

Ya esta disponible la versión 8.0.1 de NetBeans
https://netbeans.org/downloads/


Algunas características

  • Soporte Glassfish 4.1
  • Los iconos cambian dependiendo del tipo de archivos, esto ayuda a identificarlos más rápidamente.





AVBravo - September 05, 2014 02:54 AM
Primefaces Blueprints

Primefaces Blueprints
https://www.packtpub.com/application-development/primefaces-blueprints


Quiero dar las gracias al equipo de Pack Publishing ,y a los autores Sudheer Jonna, Ramkumar Pillai, por la oportunidad de participar en este proyecto.
Primefaces Blueprints un libro donde aprenderás a crear aplicaciones Java Server Faces utilizando Primefaces.
Si no tienes experiencia o eres un desarrollador experimentado , este libro es una excelente alternativa a tomar en cuenta.

AVBravo - August 27, 2014 04:28 PM
Recorriendo elementos con Lambda

Un ejemplo de recorrer elementos de un list y agregarlos a varios JComboBox
for(String texto:camposList){
                jComboBoxUsername.addItem(texto);
                 jComboBoxActivate.addItem(texto);
                 jComboBoxPassword.addItem(texto);
                     jComboBoxName.addItem(texto);
            }


Podemos utilizar Lambda para realizar la misma operación
  camposList.stream().map((texto) -> {
                jComboBoxUsername.addItem(texto);
                return texto;
            }).map((texto) -> {
                jComboBoxActivate.addItem(texto);
                return texto;
            }).map((texto) -> {
                jComboBoxPassword.addItem(texto);
                return texto;
            }).forEach((texto) -> {
                jComboBoxName.addItem(texto);
            });

AVBravo - August 20, 2014 01:29 AM
Jugando con Lambda JDK8

Jugando con Lambda JDK8
recorrer los elementos mediante forEach podemos crear una función o hacerlo directamente.
listEntity.forEach(p -> imprimir(p));

   private String imprimir(String f) {
       System.out.println(f);
       
    }

Ordenar
Collections.sort(Entity, (a, b) -> a.compareTo(b));

AVBravo - July 09, 2014 03:09 AM
Error al ejecutar Glassfish

Si tenemos error al ejecutar Glassfish


./asadmin start-domain domain1



There is a process already using the admin port 4848 -- it probably is another instance of a GlassFish server.
Command start-domain failed.


Para solucionarlo tenemos que indicar el hostname en el archivo /etc/hosts
Pasos:
1. Encontrar el nombre de hostname ejecutar el comando
  hostname
nos muestra el nombre


2. Editar el archivo hosts con el comando
sudo vim /etc/hosts
y agregar luego 127.0.0.1 el nombre del hostname myhost name

3. Ejecutar
./asadmin start-domain domain1


s.png

AVBravo - July 06, 2014 06:51 PM
Recuperar una revisión desde Bitbucket

Recuperar una revisión desde Bitbucket

Cuando deseamos recuperar una revisión de mercurial en bitbucket,

s.png


si deseamos recuperar la revisión 12a165b

Entramos al directorio

s.png

ejecutamos
hg update -r 12a165bls

con este comando actualizamos nuestro proyecto a esa revisión.

AVBravo - June 26, 2014 03:08 PM
Plugin UML desde codigo fuente

Plugin UML

Sitio Oficial

Requisitos:
1. NetBeans IDE
2. Subversion
    Para instalarlo en Ubuntu
    sudo apt-get install subversion subversion-tools

Pasos:
1. Desde NetBeans IDE-->Team-->Subversion-->Checkout
https://svn.java.net/svn/nb-uml-plugin~nb-umlplugin

uml1.png

2. Seleccionar el directorio

uml2.png

3. Abrir el proyecto
uml03.png

4. Seleccionar el proyecto
uml04.png

5. Clic derecho y seleccionar Package as -->NBM
packages.png


6. En el menú Tools-->Plugins-->pestaña Downloaded, presionar el botón Add Plugins...
add.png


7. Se generaran los modulos nbm en el directorio
NetBeansProjects->plugins->uml->trunk->nb-uml->UML->build->updates
Captura de pantalla de 2014-06-26 09:41:27.png

8. Seleccionamos los archivos
p.png

9.presionar el botón Install
install.png

10. Se muestran los módulos  a instalar
modulos.png
respondemos a los mensajes en los siguientes cuadros de diálogo.

11.Tenemos el plugin instalado listo para ser usado

plugin.png

AVBravo - June 24, 2014 02:08 PM
NetBeans IDE 8.0 Satisfaction Survey

Si utilizas NetBeans IDE, puedes dar tu opinión sobre el mismo y dejar tus comentarios sobre aspectos que te gustarían que fuesen mejorados.


Enlace a la encuesta

NetBeans IDE 8.0 Satisfaction Survey

AVBravo - June 22, 2014 07:33 PM
Como usar imagenes con < p :commandButton >

Como usar imágenes con <p:commandButton>


Agregamos la imagen de 16x16 en resources
c.png


Editar el archivo default.css
r.png


Agregar al archivo
.dolar-icon {
   background-image: url("#{facesContext.externalContext.request.contextPath}/resources/imagenes/dolar.png") !important;
}


d.png


Ahora podemos usar el icon =”dolar-icon” que definimos en el archivo default.css
 <p:commandButton
                       icon="dolar-icon"
                       title="#{app['title.searchregimen']}"
                       rendered="#{cc.attrs.nivel6BotonRender}"
                       oncomplete="PF('nivel6ComponentDialogVar').show();"/>

bo.png

AVBravo - June 22, 2014 04:47 PM
NetBeans Dream Team: Our Favorite NetBeans IDE Features!

Agradeciendo a Geertjan Wielenga y a Zoran Sevarac, por la oportunidad de participar en la entrevista

NetBeans Dream Team: Our Favorite NetBeans IDE Features!




AVBravo - June 17, 2014 04:28 PM
Configurar tu Servidor Mercurial Local

Configurar tu Servidor Mercurial Local
Fuente


Pasos:
1.  Crear un proyecto maven nuevo en NetBeans
 1.1 Crear la clase Main del proyecto


2. Con el proyecto seleccionado, Team->Mercurial->Initialize Repository...
Captura de pantalla de 2014-06-17 10:31:43.png


3.Dar ok en el dialogo
i.png


4. Clic derecho en el proyecto Mercurial->Add
5. Clic derecho en el proyecto Mercurial->Commit
v.png


7. Cerrar el proyecto
8. Desde el terminal entrar a la carpeta del proyecto
/home/avbravo/NetBeansProjects/tutorial/integrador


9. Ejecutar el servidor mercurial
 hg serve


10. Indica que esta escuchando en el puerto 8000
hg.png


11. Podemos consultarlo desde el browser
80.png


12. Desde terminal
  • Nos ubicamos en el directorio NetBeansProjects
cd NetBeansProjects


  • Crear el directorio integracion continua
mkdir integracioncontinua


  • Entrar al directorio
cd integracioncontinua


  • Clonamos el proyecto
hg clone http://localhost:8000/ recipes





13. Abrirlo desde NetBeans IDE
ide.png


Tenemos el proyecto clonado
t.png


  • Cambiamos cualquier linea de codigo
public class NewMain {


   /**
    * @param args the command line arguments
    */
   public static void main(String[] args) {
       // TODO code application logic here
       System.out.println("programa principal");
   }
   
}



14. Selecccionar proyecto dar clic derecho
  • Mercurial->Commit
cc.png


  • Mercurial-->Remote->Push Current Branch
ss.png


Verificamos en el browser
rr.png

AVBravo - June 15, 2014 10:47 PM
Columnas editables en un datatable con primefaces

Utilizar <p:cellEditor>, y un facet name=”output” para mostrar la salida mediante un  <p:outputLabel> y un     <f:facet name="input"> donde usaremos un <p:inputText> para obtener los datos de entrada.
<p:ajax event="cellEdit" listener="#{pagosfijosSearchController.onCellEdit}" update=":form:growl,:form:datatableImpuestos" />

<p:column>
                               <f:facet name="header">
                                   <p:outputLabel value="#{msg.exoneracion}"/>
                               </f:facet>
                               <p:cellEditor>  
                                   <f:facet name="output">
                                       <p:outputLabel value="#{item.exoneracion}" >
                                            <f:convertNumber type="number" locale="Locale.US" groupingUsed="true" minFractionDigits="2" pattern="#0.00"/>
                                       </p:outputLabel>
                                   </f:facet>
                                 
                                   <f:facet name="input">
                                       <p:inputText value="#{item.exoneracion}" >
                                                    <f:convertNumber type="number" locale="Locale.US" groupingUsed="true" minFractionDigits="2" pattern="#0.00"/>
                                       </p:inputText>
                                   </f:facet>  
                               </p:cellEditor>  

                           </p:column>

AVBravo - June 15, 2014 10:31 PM
Obtener el número de fila de un datatable en primefaces

Usar la propiedad   rowIndexVar="rowIndex" de datatable

    <p:dataTable id="datatableImpuestos"
                                    rows="10"
                                    value="#{pagosfijosSearchController.listRecibosdetalles}"
                                    rowIndexVar="rowIndex"
                                    var="item"
                                    paginator="true"
                                    rowKey="#{item.idnivel6}"
                                    selectionMode="single"
                                    emptyMessage="#{app['info.notienedeudapendiente']}"

                                    selection="#{pagosfijosSearchController.selected}"
                                    filteredValue="#{pagosfijosSearchController.filtered}"
                                    editable="true" editMode="cell"
                                    >

CommandLink pasamos como parametro
<p:fragment autoUpdate="true">
                                   <p:commandLink update=":form"
                                                  value="#{item.idnivel6.idnivel6}"
                                                  action="#{pagosfijosSearchController.mostrarImpuestosPagar(rowIndex)}"
                                                  oncomplete= "PF('detallerecibosComponentDialogVar').show()"                                                         
                                                  title="#{app['boton.detalle']}"
                                                  rendered="#{menuBeans.pagos.consultar}"
                                                  >

                                       <f:setPropertyActionListener value="#{item}" target="#{pagosfijosSearchController.selected}" />  
                                   </p:commandLink>  

                               </p:fragment>


En el método definimos un parámetro de tipo Integer que contendra el numero de fila.
public String mostrarImpuestosPagar(Integer row){
       fila = row;
       
       encontarImpuesto();
       varexoneracion = selected.getExoneracion();
       varpago = selected.getPago();
       varsaldo = selected.getSaldo();
       return null;
       

   }

AVBravo - June 14, 2014 02:19 AM
Formatear decimales en Java Server Faces

En algunas ocasiones deseamos formatear decimales, en nuestra aplicación Java Server Faces
Podemos usar    <f:convertNumber  e indicamos los paremtros que deseamos.
locale = localización especifica
pattern = patrón deseado
type= especificar number para indicar que sera numeros.

 <p:outputLabel value="#{pagosfijosSearchController.impuestos.idnivel6.valor}">
                     <f:convertNumber type="number" locale="Locale.US" groupingUsed="true" minFractionDigits="2" pattern="#0.00"/>

                </p:outputLabel>


APIDesign - Blogs - June 02, 2014 07:49 AM
Podcast related to Japanese Translation

--JaroslavTulach 07:49, 2 June 2014 (UTC)

AVBravo - May 31, 2014 11:47 PM
Instalacion de Mongodb

Instalacion de Mongodb

1. Descargarlo desde
o mendiante

2. Descomprimir el archivo y renombrar la carpeta como mongodb
mongo.png
estare en la ruta /home/avbravo/mongodb
3. Agregarlo al path en /etc/profile
  sudo gedit /etc/profile
  export PATH=$PATH:/home/avbravo/mongodb
Guardamos el archivo.

4. Desde la consola ejecutamos
export PATH=$PATH:/home/avbravo/mongodb


5. Crear el directorio data
sudo mkdir -p /data/db

6. Darle permisos de escritura a la carpeta
  sudo chmod 777 /data/db

7. Ejecutarlo

mongod
m.png
8. se muestra en la consola
f.png


9. Abrir otra ventana de consola
ejecutar
mongo
g.png


AVBravo - May 30, 2014 03:01 PM
Copiar la estructura de una tabla en MySQL desde NetBeans

Existen muchas formas de hacer este procedimiento, herramientas de migración, a través de script, en esta ocasión mostrare una utilidad dentro de NetBeans IDE, que te permite realizar la operación de manera sencilla.

Escenario:
 Tenemos un base de datos con una serie de tablas
Desde la pestaña de NetBeans, observamos la base de datos scrumweb



 Tenemos una base de datos llamada prueba

Deseamos copiar la estructura de la tabla gruposusuarios a la base de datos prueba.
Dar click derecho en gruposusuarios y seleccionar Grab Structure...


nos solicita el nombre del archivo 

nos ubicamos en la base de datos prueba, en tablas y selecionamos Recreate Table