Desarrollo WEB.


Las practicas de programación orientadas a la web son muy cambiantes en el tiempo. Es necesario conocer e implementar tecnologías, conocer lenguajes,integrar comunidades,usar Ides, etc, recientes, para responder al mercado que se acerca.

Mostrando entradas con la etiqueta JSF. Mostrar todas las entradas
Mostrando entradas con la etiqueta JSF. Mostrar todas las entradas

martes, 21 de enero de 2014

Capturar valor de un campo de búsqueda de una JDatatable

En ocasiones con JSF requerimos enviar valores con javascript de componentes html y pasarlos por parámetros al controlador, logrando así obtener información cargada en variables de sesión o en entidades EJB.

Una de esas ocasiones es cuando teniendo un campo de búsqueda principal de una JDatatable (plugin de jquery), se quiere llevar de él su valor de búsqueda, para enviar a un reporte ireport o a una consulta sql externa, entre otros casos.

Es decir busco por código, 504290, busca en el json y trae los valores, podría obtener esos valores leyendo el DOM de la tabla o con una función del plugin JDatatable para leer las filas del resultado de la búsqueda, pero lo que realmente requerimos es hacer llegar el criterio con el cual se busco.

Este es un proceso de programación sencillo, el lió se da es cuando se quiere obtener ese valor de la caja, porque esta no posee recurso de código alguno fuera del plugin donde editar este componente, entonces nos vamos  de esta la forma mas fácil.
   
          //En el Controlador
              string2 += "script type="text/javascript"";
              string2 += "  $(function() {";
              string2 += "      var oTableSP =  $('#TablaSeguimientoProduccion').dataTable({"
                    + "             \"bJQueryUI\": true,\n"
                    + "      \"bPaginate\": false\n"
                    + "      \"sScrollY\": '200px',\n"
                    + "      \"bPaginate\": false,\n"
                    + "      \"bScrollCollapse\": true\n"
                    + "        });";
              string2 += "  });";
              string2 += " $(document).ready(function() { "
                    + "     $('div#TablaSeguimientoProduccion_filter input').change(function() { "
                    + "         document.getElementById('formVisor:hiddengeneral').value = $('div#TablaSeguimientoProduccion_filter input').val();"
                    + "      }); "
                    += "  }); ";
              string2 += "/script";
              return string2;
            }
        //el setter y getter para gestionar la informacion de busqueda
            private String filtroGeneral;
            public String getFiltroGeneral(){
               return filtroGeneral;
            }
            public void setFiltroGeneral(String filtroGeneral){
               this.filtroGeneral=filtroGeneral
            }
    

                 //componente xhtml para pasarle el valor, es de tipo oculto no se necesitaria mostrar solo es para que el controlador sepa donde esta la informacion 
                 //y con javascript se pueda enviar.
                            h:inputHidden id="hiddengeneral" value="#{controllador.filtroGeneral}"/

lunes, 19 de agosto de 2013

Pasar parámetros desde cliente javascript a JSF

En ocasiones se hace necesario llevar desde nuestra capa de presentacion, valores de javascript a un controlador jsf y de una a un xhtml, lo importante aca no es como se hace llegar sino como se captura, se puede enviar mediante ajax, mediante una url, etc.

Con las nuevas actualizaciones de JSF 2.0 se puede hacer de una manera muy fácil.
  •  Enviar el parametro por url
  • Código en el .xhtml que espera el parámetro y muestra.
  • Código en el controlador que recoge y envia al .xhtml

Aplicación movil con primefaces, JSF, EJB y postgres

Cuando me encontré con la necesidad laboral de realizar una aplicación móvil según  requerimiento del sistema ERP que venimos desarrollando hace dos años, para una empresa multinacional en Panamá  empece a investigar a fondo cual seria la opción mas viable para integrar mecanismos de software para móviles que nos permitiera tomar parte de la lógica del negocio ya existente (EJB) , con un costo computacional bajo, tecnología multiplataforma y orientado a la web, tome la decision de usar los recursos de primefaces mobile.

Estas fueron mis opciones:

  • Opción 1: Aplicación móvil para Android
Tenia todos los recursos para conectividad con postgres, recursos gráficos y demás componentes del jdk de android, plataforma de desarrollo integrada en netbeans, ágil y fácil de instalar, pero a la hora de pensar en ¿si todos mis usuarios tendría android?, se callo en el dilema multiplataforma, pailas no había nada que hacer con android, muy bonito y todo, fácil de programar, pero nada que hacer a la hora de requerir sistema operativo especifico.
 
  • Opción 2: Aplicación web para móviles en Primefaces Mobile.
Con primefaces mobil tenia la útil herramienta que me brindaba componentes fáciles de integrar con mis controladores de sesión ya existentes, ademas me permitía usar como librería mi componente principal en la aplicación grande (ERP), Primefaces es un framework para aplicaciones web integrado con xhtml (JSF 2), su evolución es constante y posee una gran comunidad de foristas y blogeros
  • Opción 3: Windows móvil
Esta si que ni mente le gaste, iba a ser igual a la primera opción.

Definitivamente me quedaría con la opción 2, por ser la mas atractiva a cumplir mi requerimiento de multiplataforma, solo se necesitaría un navegador web para usar la interfaz y como todo SO en la actualidad tiene sus navegadores afines, entonces empece a desarrollar este cuento, después de esta historia les comparto la técnica y los recursos para que monten sus app móviles de manera rápida y oportuna.

  1. Librería primefaces mobile.
    1. Descargar la libreria de la pagina oficial del proyecto primefaces.org
  2. Themes
    1. no se requiere agregar libreria del tema visual pues  ya viene con uno por defecto
  3. Configuracion
    1.  en el archivo web xml ...
  4. Entidades ...
  5. Interfaces ...
  6. Controladores ...
  7. Vistas(xhtml) ...
 Imagenes.










domingo, 11 de agosto de 2013

Upload de archivos en una aplicación web con JSF 2.0

Upload con JSF 2.0
  • Carpeta destino
Es importante tener una carpeta definida en el contexto de la aplicación para crear los archivos subidos por el recurso java de fileupload y primefaces en jsf 2.0
nuestro directorio destino se encuentra en /modulos/rh/rhEmpleadoFoto/fotos

  • En el .xhtml

<h:form enctype="multipart/form-data" id="formfileupload" prependid="false">
     <!--aca neustro componente se ejecuta automaticamente apenas recibe el archivo-->
            <p:fileupload actualiza="" allowtypes="/(\.|\/)(gif|jpe?g|png)$/" auto="true" cancellabel="Cancelar" componente="" donde="" dragdropsupport="true" fileuploadlistener="#{rhEmpleadoFotoController.accionFileUpload}" foto="" grafico="" id="fileupload" imagen="" la="" label="Seleccionar" mi="" mode="advanced" rendered="true" renderiza="" se="" sizelimit="1000000" update=":formpersonal:idRhEmpleadoFoto" uploadlabel="Subir al servidor" xhtml="">
            </p:fileupload> 
            <!--
  para tener donde visualizar la imagen despues de ingresarse.
                El nombre en el contexto de la aplicacion para mi controlador es rhEmpleadoFotoController 
                -->
        <p:graphicimage cache="false" height="300" id="imagemTmp" style="margin: 0 auto;" value="#{rhEmpleadoFotoController.imagem}">
</p:graphicimage></h:form>
En nuestro xhtml ingresamos el anterior codigo, lo adaptamos de acuerdo al framework que estemos usando en mi caso primefaces.
  • Controlador
En el cuerpo de mi controlador ingreso estas funciones teniendo en cuenta que algunas propiedades se deben declarar como privadas en el controlador y se les debe crear métodos accesores y colocadores para que sean accedidos desde otros ámbitos de la aplicación en las .xhtml(UI)
    
public void accionFileUpload(FileUploadEvent event) { //evento propio del framework
        try {
            file = event.getFile();
            byte[] foto = event.getFile().getContents();
            String nomeArquivo = event.getFile().getFileName();
            FacesContext facesContext = FacesContext.getCurrentInstance();
            ServletContext scontext = (ServletContext) facesContext.getExternalContext().getContext();
            String archivo = scontext.getRealPath("/modulos/rh/rhEmpleadoFoto/fotos/" + nomeArquivo); //guardar en ruta basica para luego mover
            crearArchivo(foto, archivo);
            imagem = new DefaultStreamedContent(event.getFile().getInputstream()); //agregar geter y seter para poder ser accedida desde otros xhtml
            
            selectedEntidad = new RhEmpleadoFoto(); //entidad para persistir en la base de datos
            selectedEntidad.setNombre(nomeArquivo);
            selectedEntidad.setIdRhEmpleado(idRhEmpleado);
            long peso = event.getFile().getSize();
            int x = (int) peso;
            selectedEntidad.setPeso(x);
            selectedEntidad.setRuta("/modulos/rh/rhEmpleadoFoto/fotos");
            selectedEntidad.setLlaveUnica(GenerarRandom().toString());
            selectedEntidad.setEstadoEliminado(Boolean.FALSE);
            getFacade().create(selectedEntidad); //crea el objeto(RhEmpleadoFoto) en la bd

     //dos objetos para hacer renombrado de archivo y copiado a carpetas
            RhEmpleadoFoto current = ejbFacade.findObjeto(selectedEntidad);
            RhEmpleadoFoto current2 = new RhEmpleadoFoto();
            RhEmpleadoFoto current2 = ejbFacade.findObjeto(selectedEntidad);
            
            
            if (renombrarArchivo(current2.getRuta() + "/" + current2.getNombre(), current2.getRuta() + "/" + (idRhEmpleado.getIdRhEmpleado() + ""))) {
                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Mensaje:", "Ingreso Exitoso"));
            } else {
                if (renombrarArchivo(current2.getRuta() + "/" + current2.getNombre(), current2.getRuta() + "/" + (idRhEmpleado.getIdRhEmpleado() + ""))) {
                    FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Mensaje:", "Ingreso Exitoso")); //para enviar el mensaje a la growl del framework
                } else {
                    FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Mensaje:", "" + current2.getRuta() + "/" + current2.getNombre() + " " + current2.getRuta()));
                }
            }

            recreateModel();
            FacesMessage msg = new FacesMessage("Succesful", file.getFileName() + " Fue Cargado Exitosamente.");
            FacesContext.getCurrentInstance().addMessage(null, msg);
            //cerrarPanelFoto(); //una funcion booleana para renderizar el contenido en el xhtml de acuerdo a lo sucedido
        } catch (Exception ex) {
            Logger.getLogger(IngenieriaProductoImagenController.class.getName()).log(Level.SEVERE, null, ex.getMessage());
            FacesMessage msg = new FacesMessage("Succesful", file.getFileName() + " Error en la carga:" + ex.getMessage());
            FacesContext.getCurrentInstance().addMessage(null, msg);
        }
    }
    
     /**
     * Funcion para mover y renombrar un archivo
     *
     * @param String archivo Archivo o directorio a renombrar
     * @param String directorio Directorio destino
     * @exception RCException Se genera una excepción genérica.
     * @return boolean
     */
    public boolean renombrarArchivo(String archivo, String directorio) {
        try {
            FacesContext facesContext = FacesContext.getCurrentInstance();
            ServletContext scontext = (ServletContext) facesContext.getExternalContext().getContext();
            String Sarchivo = scontext.getRealPath(archivo);
            File archivos = new File(Sarchivo);
            String Sdirectorio = scontext.getRealPath(directorio);
            File dir = new File(Sdirectorio);
            String name = archivos.getName();
            int j = name.indexOf(".");
            String newname = "" + GenerarRandom() + "" + name.substring(j, name.length());
            boolean semovio = archivos.renameTo(new File(dir, newname));
            if (!semovio) {
                System.out.print("El archivo no se ha Movido ...");
                return false;
            } else {
                current.setNombre(newname);
                current.setRuta("/modulos/rh/rhEmpleadoFoto/fotos/" + idRhEmpleado.getIdRhEmpleado()); //una carpeta con el id del objeto que lo contiene, en mi caso empleado
                ejbFacade.edit(current);
                System.out.print("Se Movio ...");
                return true;
            }
        } catch (Exception e) {
            System.out.print("" + e.getMessage());
            return false;
        }
    }

     /**
     * Funcion para crear un archivo
     *
     * @param byte[] bytes objeto
     * @param String archivo archivo
     * @exception RCException Se genera una excepción genérica.
     * @return void
     */
    
    public void crearArchivo(byte[] bytes, String archivo) {
        FileOutputStream fos;
        try {
            fos = new FileOutputStream(archivo);
            fos.write(bytes);
            fos.close();
        } catch (FileNotFoundException ex) {
            Logger.getLogger(IngenieriaProductoImagenController.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(IngenieriaProductoImagenController.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
  • Web.xml
Anexar estas lineas al archivo de configuración de la aplicación web, pero depende del framework usado, en mi caso primefaces.
   <filter>
        <filter-name>PrimeFaces FileUpload Filter</filter-name>
        <filter-class>org.primefaces.webapp.filter.FileUploadFilter</filter-class> //de mi framework
        <init-param>
            <param-name>thresholdSize</param->
<!--tamaño maximo de los archivos para el contexto de la aplicacion-->
            <param-value>512000</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>PrimeFaces FileUpload Filter</filter-name>
        <servlet-name>Faces Servlet</servlet-name>
    </filter-mapping>
    <filter>
        <mime-mapping>
        <extension>png</extension>
        <mime-type>image/png</mime-type>
    </mime-mapping>
  •  Librerías 
 usar la librería commons-fileupload-1.2.2.jar y sus librerías dependientes

 Para una opcion mas clara en lenguaje nativo descargue este ejemplo. >>

martes, 14 de mayo de 2013

Ireport y el error : net.sf.jasperreports.engine.fill.JRExpressionEvalException: Error evaluating expression

Cuando se usa la tecnología ireport para generar reportes, se presentan algunos detalles a tener en cuenta, cuando de su implementación en J2EE se trata.
  • Groovy es un lenguaje de desarrollo al igual que java.
  • Ireport contiene mecanismos para generar reportes en .pdf, .xls, etc. Su tecnología permite que las plantillas .xml que generan el contenido dinámico sea editadas en el ide en cualquier sistema operativo. Si no fuera así ireport no tendría versiones según el sistema operativo, es decir esa es una opción descartada en el proceso de test de fallos.
  • Ireport es un ide para editar plantillas xml que generan contenido en diferentes formatos
  • Jasperreport es la librería que permite transformar a partir de plantillas xml un archivo .pdf, .xls, etc.
  • Jaspersoft es la comunidad creadora de todo este cuento.

Mensaje de error enviado por el servidor sobre la excepción
 lanzada de ireport  cuando se trabaja con groovy.

[#|2013-05-14T15:53:21.684-0500|WARNING|glassfish3.1.2|javax.enterprise.resource
.webcontainer.jsf.lifecycle|_ThreadID=99;_ThreadName=Thread-2;|#{
controllerReporte.generarImpresion('reporte_comercial_pedidos.jasper',
comercialPedidoController.selected.idComercialPedido,'OF')}: 
net.sf.jasperreports.engine.JRRuntimeException: 
net.sf.jasperreports.engine.fill.JRExpressionEvalException: Error evaluating expression : 
Source text : new java.lang.Integer(1)
javax.faces.FacesException: 
#{controllerReporte.generarImpresion('reporte_comercial_pedidos.jasper',
comercialPedidoController.selected.idComercialPedido,'OF')}: 
net.sf.jasperreports.engine.JRRuntimeException: 
net.sf.jasperreports.engine.fill.JRExpressionEvalException: Error evaluating expression : 
Source text : new java.lang.Integer(1) at 
com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.
java:118)
at javax.faces.component.UICommand.broadcast(UICommand.java:315)
at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:794)
at javax.faces.component.UIViewRoot.processDecodes(UIViewRoot.java:935)
at 
com.sun.faces.lifecycle.ApplyRequestValuesPhase.execute(ApplyRequestValuesPhase.
java:78)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:593)
at 
org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1550)

Para dar solución se configura el ireport para que su compilador sea java mas no groovy. igualmente a cada reporte se le configura su lenguaje como java no groovy.

Configuración de propiedades en el reporte.

lunes, 8 de abril de 2013

Lenguaje de Expresión en una pagina .xhtml en JSF

Usando primefaces muchas veces necesitamos renderizar o habilitar un componente, para ello requerimos en ocasiones usar EL(lenguaje de expresión)  en el interior de una propiedad del componente, esta propiedad se encuentra siempre sobre un archivo .xhtml. 

Estas son algunas de las opciones.

  • rendered="#{empty comprasOrdenController.selected.comprasOrdenDetallesList ? true : false}"
  • disabled="#{comprasOrdenController.actualizar eq 'si' ? true : false}"
  • value="#{comprasOrdenController.isHabilitado eq true ? 'SI' : 'NO'}"
  • value="#{itemt.idInventarioItem.codigoItem eq null ? '': itemt.idInventarioItem.codigoItem}"

miércoles, 3 de abril de 2013

Montar carpeta Windows para acceder desde linux SUSE 12.3 con Java

En ocasiones se hace necesario que nuestras aplicaciones java web acedan desde el servidor a una carpeta de un sistema operativo windows, bien sea porque necesitamos acceder a bases de datos access o a archivos de imágenes, documentos, etc.

Es allí cuando se necesitan realizar puntos de montaje del directorio al que queremos acceder. he aquí en la imagen una forma de realizarlo a través de consola en linux suse 12.3

Se crea un directorio en /mnt/ con permisos de root, para montar la carpeta windows.
iproject@maya:/mnt# mkdir winsamba



 y en esta imagen una forma de hacerlo mediante shell linux a través de java.




viernes, 29 de marzo de 2013

Configurando Suse 12.3 para Desarrollo de Software

Este pequeño tutorial presenta una serie de pasos básicos para configurar un linux suse en su versión 12.3 y empezar a desarrollar aplicaciones web con netbeans 7.3, glassfish y postgres.
  • Después de instalar suse 12.3, ejecutar Actualización del Sistema. 
     
  • Configurar Internet. 


     
  • Instalar filezilla para accesos por ftp 
     
    • Descargar rpm 64 bit
    • Click derecho sobre el rpm - abrir con - añadir/quitar programas
  • Instalar navegador Google Chrome 
     
    • zypper ar http://dl.google.com/linux/chrome/rpm/stable/x86_64 Google-Chrome (para 64 bit)
    • zypper ref
    • zypper in google-chrome-stable
  •  Instalar postgres 


        
    • instalar unixODBC desde el gestor de software
    • Descargar la ultima versión de postgres desde aqui
    • ingrese a gestor de archivos modo super usuario
    • Click derecho sobre el archivo .run - propiedades - pestaña permisos - es ejecutable - aceptar
    • Espere un poco mientras abre el Instalador en modo gráfico.
    • Directorio de instalación /opt/PostgreSQL/9.2/
    • mediante stack builder instalar pgJDBC y psqlODBC
  • Instalar java SE 

     
    • descargar java jdk y java jre, ultima versión desde aqui
    • tener en cuenta descargar las versiones adecuadas.
    • Click derecho sobre el rpm - abrir con - añadir/quitar programas
    • tener en cuenta el siquiente post 
  • Instalar NetBeans 7.x 
     
    • Descargar ultima versión desde aqui
    • Click derecho sobre el archivo.sh - propiedades - pestaña permisos - es ejecutable - aceptar.
    • Ejecutar netbeans, activar plugins y actualizar.
  • Instalar XAMPP.  
     
    • descargar ultima versión desde aqui  
    • ingrese en una terminal en modo super usuario y descomprima usando tar xvfz xampp-linux-1.8.1.tar.gz -C /opt
    • Para arrancar simplemente use /opt/lampp/lampp start
    •   ...
Esto es todo hasta el momento, luego actualizare con otras cositas acerca de glassfish 3.x y netbeans 7.3

jueves, 28 de marzo de 2013

Primefaces y su evolución.!

En noviembre del 2011 conocí primefaces, y empecé de lleno en producción con él, un framework que va de maravilla con las aplicaciones web realizadas en JSF (java server faces), es muy fácil de implementar y sobre todo muy hermoso y con una documentación excelente, tiene infinidad de componentes visuales que se integran con controladores java, esto hace que la programación orientada a la web sea muy eficiente, sobre todo que su mantenimiento sea muy fácil y agradable para cualquier desarrollador de nuevas tecnologías.

Pero como todo lo bueno tiene su evolución, primefaces no es la excepción, cuando inicie, fue con la versión 3.0, ahora vamos en la 3.5, claro que aun estoy en la 3.4 debido a que los cambios en la 3.5 son muy críticos y se necesita mucho tiempo para realizar ajustes en los códigos.

Estas son algunas de las adaptaciones que se deben realizar para migrar a la versión 3.4
  • Diferenciar entre valores de la propiedad id y valores de propiedad widgetVar, deben ser diferentes.
  • Los selects con filtros deben tener altura (height)
  • Los selects normales deben tener  style="min-width: 120px;", es decir un ancho mínimo.
  • ... entre otros que iré colocando poco a poco a medida que me valla acordando.
Todavía no hay mucha eficiencia en los filtros de tablas cuando se trata de grandes cantidades de datos, pero con un poco de astucia indígena se pueden realizar filtros personalizados para búsquedas óptimas. 

El framework es libre pero con un poco de dinero se puede obtener una versión pro (licenciada) donde el soporte es su mayor fortaleza.

Muchas técnicas se van aprendiendo con el uso diario del framework, la idea es optar por uno y aprender a usarlo bien, con eso podemos brindar a nuestras empresas una herramienta segura para implementar aplicaciones java web empresariales o bien llamadas J2EE.

Para los iniciados en primefaces les recomiendo suscribirse al foro, la comunidad de primefaces es grande y hay moderadores del foro con prime que son unos excelentes colaboradores.


jueves, 21 de marzo de 2013

Blog Java.

Para lo seguidores del mundo java, este es un super blog con información muy importante para tener en cuenta en nuestras aplicaciones web empresariales.
Enlace. http://www.mkyong.com/

sábado, 1 de septiembre de 2012

Desplegar un EAR en glassfish

Glassfish en un potente servidor de aplicaciones j2ee, trae una excelente interfaz gráfica para la administración de recursos en el servidor., desde este panel  se pueden realizar la mayor cantidad de tareas asignadas a un administrador de servidor y llevar el control del rendimiento de las aplicaciones.

Netbeans es una herramienta muy practica para desarrollar aplicaciones empresariales j2ee. Este IDE nos permite realizar después de una ejecución el despliegue automático del EAR en un domain virtual de una manera muy fácil. Cuando queremos construir o reconstruir un EAR debemos simplemente accionar el modo debug para que el IDE fabrique nuevamente un EAR con los cambios mas recientes.
Para ingresar al modo de consola de glassfish, arranque el servidor por consola o desde Netbeans y use http://localhost:4848 para acceder al panel gráfico, si quiere permitir acceso a este panel de admin desde otro nodo en la red, active el dass para que puedan acceder de forma segura a través de https.



Para desplegar un EAR primero hay que saber bien que es?, que contiene? y que recursos necesita configurarle al servidor para que identifique los recursos de conexion a Motores de BD y de persistencia.



Como ya sabemos un EAR es un paquete donde se encuentran compresos todos los módulos que comprenden una aplicación j2ee, en su interior existe una carpeta llamada lib, la cual es la contenedora de todas las librerías que se usen en los diferentes módulos incluyendo los drivers de conexión para java y X motor de base de datos.

  • Despliegue de un EAR


    • Configuración del pool de conexión.
    • Configuración del JDBC
    • Despliegue del EAR
      • Desde un archivo local a servidor local
      • desde un archivo local en el servidor al glassfish en el servidor
      • Re despliegue del EAR
      • Respaldo a archivos físicos construidos previamente después del despliegue anterior.


lunes, 5 de diciembre de 2011

Aplicacion WEB JSF Multi-Idioma

Las aplicaciones java web, específicamente las desarrolladas bajo un framework JSF, nos proporciona de forma optima la configuración y creación de un archivo de idioma para cada país o región donde se ejecute nuestra aplicación. 


Es decir podremos configurar nuestra aplicación para que sea usada en otros países y en otro idioma sin la necesidad de acudir al código de las interfaces de la aplicación para realizar las modificaciones en cada etiqueta de texto.
Claro este beneficio nos obliga a ser meticulosos y organizados en el desarrollo.

Debemos Iniciar y encapsular cada valor de etiqueta en un parámetro de la aplicación, estos parámetros los almacenaremos en un archivo llamado Bundle.properties. que se ubicara en nuestro paquete de recursos .java

Archivo bundle.properties y su ubicacion (Click para ver la imagen original)
luego, para usarlo solo se invoca el nombre del archivo, siendo este su apuntador que invoca a una propiedad parametro:

implementación del archivo bundle.properties (Click para ver la imagen original)
Cuando hacemos el proceso de generación de código usando una herramienta como netbeans 8.x, el IDE nos prepara un archivo bundle.properties por defecto. Este se localiza en el directorio que muestran las imágenes anteriores, debemos hacer una copia de este archivo y realizar las diferentes traducciones.

Ahora configuramos nuestro archivo faces-config.xml para que la aplicación quede a la escucha del cliente.

Archivo bundle.properties y su ubicacion (Click para ver la imagen original)
 
Una mejor forma de configurar y de llenar nos ofrece el netbeans 8.x

Archivo bundle.properties y su ubicacion (Click para ver la imagen original)


Al usar netbeans 8.x podremos ir desde el archivo en uso donde se contiene la etiqueta traducida y dar CONTROL + Click sobre el codigo para ir directamente a la propiedad o el método en el caso de ser otro tipo de archivo como un controlador. 


sábado, 13 de agosto de 2011

JSF (Java Server Faces)

JSF es uno de los frameworks java mas robustos para la realizacion de aplicaciones WEB con interfaces de usuario ricas y eficientes, sobre todo la ventaja esta cuando usamos un IDE como Netbeans 6.x que ya nos permite a partir de un buen esquema de base de datos  realizar toda la generacion de codigo para las operaciones basicas conocidas como CRUD (crear, eliminar, actualizar y visualizar).
Los componentes de JSF son aquellos mismos componentes HTML pero evolucionados, que con una configuracion minima se adaptan mejor a nuestras necesidades actuales de desarrollo cuando ya usamos tecnicas como AJAX.
Ejemplo si antes teniamos un:
<form method="get" action="servlet">
<input type="submit" value="Enviar" />
</form>
ahora con JSF queda :


<h:form>
<h:inputtext action="#{controlador.accion}" ajax="true" 
update="contenedordemensajes" value="enviar"> </h:inputtext>
</h:form>


JSF tiene una gran cantidad de componentes muy elegantes y cuando lo integramos con un paquete de widgets como Icefaces o Primefaces se vuelve muy potente visualmente y sobre todo a la hora de desarrollar proyectos java es la mejor solucion para obtener beneficios en costo para el tiempo de programacion.

Cuando desarrollamos bajo componentes JSF tenemos que olvidarnos por completo de una perspectiva visual de nuestras paginas a travez de dreamweaver o cualquier otro editor HTML.
Existe en la actualidad un IDE llamada Jdeveloper 11 g de la Casa de Oracle la cual nos permite realizar una edicion visual de nuestros proyectos JSF. aqui su evolucion se llama ADF que sera tema para otro post.