Este es el comienzo para mi blog

Mi día a día en el desarrolo de Software (JEE, Glassfish, JBoss EAP, Primefaces, Ajax, Android)

jueves, 5 de mayo de 2016

Incluir una hoja de estilos CSS en JSF, propiedad background

 Antecedente

Es de conocimiento para los desarrolladores que trabajan bajo el ambiente Web, que como buena práctica se debe incluir una hoja de estilos CSS en el proyecto en lugar de especificar los estilos en cada página html, Este archivo CSS contendrá todos los estilos que deseamos dar a nuestras páginas. Esto debido a que el mantenimiento, con esta práctica, se vuelve una tarea más fácil, sino imagínense que tengamos cien páginas html, y al título de estas le damos un estilo en común (Tipo de letra negrita y tamaño 15px), Con el pasar del tiempo, el cliente desea cambiar este estilo (Tipo de letra negrita y Arial y tamaño 20px), entonces bajo es nuevo requerimiento lo tendríamos que hacer en los cien archivos html; Si trabajamos con la practica mencionada anteriormente, este estilo lo definimos en una hoja de estilos CSS y lo referenciamos a cada una de las cien página html; con el nuevo requerimiento del cliente, el estilo se modificava unicamente en la hoja de estilos CSS, y con la referencia que tiene cada página html a este estilo, el cambio sería inmediato en las cien páginas html, ahorrándonos así un valioso tiempo que lo pudiéramos ocupar en otra tarea.

Problema

Alguna vez les ha ocurrido que si en una hoja de estilos CSS, se define un estilo que en la propiedad background tiene la referencia a una imagen que está incluida en nuestro proyecto JSF; y que al momento de desplegar nuestro proyecto, las páginas que tienen  la referencia a este estilo no muestran la imagen; entonces revisamos nuestra hoja de estilos CSS y verificamos si realizamos correctamente la referencia a la imagen en la propiedad background, una vez revisada la línea, vemos que la referencia a la imagen es correcta. Ahí es cuando nos preguntamos: ¿Qué pasa? ¿Por qué no se muestra la imagen?, y por más que le damos vueltas no encontramos la solución, y pasamos mucho tiempo con este problema...

Solución

Primeramente voy hacer referencia a la propiedad background de un estilo CSS y como se debe escribir la sentencia dentro de la hoja de estilos CSS.

La propiedad background establece algunas o todas las propiedades del color y/o imagen de fondo de un elemento.

La sentencia para especificar que la propiedad background haga referencia a una imagen que esta dentro de nuestro proyecto JSF es:
background: url("Ruta/imagen.extención");

Es decir, si en nuestro proyecto JSF tenemos una estructura así:



 La sentencia del estilo sería:
background: url("../images/banner.jpg");

Ahora bien, es hora de hacer referencia, en nuestra página JSF (index.xhtml), a la hoja de estilos CSS que está en nuestro proyecto; para esto, en html existe la sentencia:

<link href="Ruta/Archivo.css" rel="stylesheet" type="text/css" />

Y bajo la estructura que tiene nuestro proyecto JSF, la línea sería:

<link href="/resources/css/default.css" rel="stylesheet" type="text/css" />

Pero con esto no es suficiente, ya que al desplegar nuestro proyecto no se mostraría la imagen. Comparto la imagen de este caso en particular.



Pero, ¿porqué se da esto?, es algo que todos se preguntarán!
Esto se debe a que cuando se despliega la aplicación JSF, las referencias a los archivos (imágenes, .css, js) no se hacen en referencia a la estructura de archivos que tenemos en nuestro proyecto, si no se resuelven en función de las direcciones web reales que se publican; es decir, el archivo WAR (archivo que contiene todo nuestros archivos del proyecto) es nombrado de diferente manera al ser desplegado en el servidor, y nosotros no tenemos porqué saber  cuál es exactamente el nombre que se extraerá del servidor web.

Para solventar este inconveniente, JSF proporciona la siguiente sentencia que proporciona la ruta real de nuestro proyecto en el servidor web.

#{facesContext.externalContext.requestContextPath}

Y bajo este concepto la referencia a nuestra hoja de estilos CSS en una página JSF sería:

<link href="#{facesContext.externalContext.requestContextPath}/resources/css/default.css" 
rel="stylesheet" type="text/css" /> 

Al hacer este cambio nuestra página JSF y volver a desplegar nuestra aplicación el resultado sería:

Espero haya sido de utilidad y no olviden dejar sus comentarios, hasta la próxima.

martes, 26 de abril de 2016

¿Cómo calcular el tiempo transcurrido entre dos horas en Java con JSF?

  Antecedente

 Este artículo lo escribo por petición de un lector (laura montoya) de mí post ¿Cómo calcular los meses entre dos fechas en Java? a la cual le agradezco por sugerir el tema.

Problema

En nuestro trabajo del día a día seguramente alguna vez nos hemos encontrado con el problema de calcular el tiempo transcurrido entre dos horas (horainicial:Date y horafinal:Date) y cuyo resultado lo debemos presentar en un tercer campo (tiempotranscurrido:Double) utilizando el Framework JSF.

Como hable en mi anterior post (¿Cómo sumar/restar días, meses o años a una fecha en Java?) es conocido para muchos desarrolladores Java que el trabajar con fechas (Date) es algo complicado.

Solución

Para calcular el tiempo transcurrido entre dos horas en Java debemos comprender como trabaja la clase Date de Java; es así que el manejo de horas en Java se lo hace a través de esta misma Clase, ya que esta almacena un instante específico en el tiempo, que incluye fecha y hora; así pues, un instante de tiempo puede ser el 10 de Agosto de 1810 a las 13:10:25.

Otro aspecto muy importante a considerar es la forma de cómo podemos realizar la resta de estos dos instantes de tiempo y almacenarlos en otra variable; para esto la clase Date de Java nos permite extraer el instante de tiempo almacenado en la variable mediante el método getTime(), este método devuelve una resultado de tipo long, y da el tiempo transcurrido, en milisegundos,  desde la fecha Enero 1 de 1970 a las 00:00:00 hasta la fecha con la que estamos trabajando; así pues obteniendo el valor de nuestros dos instantes de tiempo, horainicial y horafinal, podemos hacer la resta de estos dos con lo que obtendríamos el tiempo transcurrido entre estas dos variables, y lo podríamos guardar en una tercera variable.

Hasta el momento hemos conseguido restar los dos instantes de tiempo y almacenarlos en una tercera variable, lo que nos queda por hacer es interactuar con estas variables en el Front End y que el usuario final interactúe con el formulario. Esto lo hacemos con la ayuda del Framework JSF bajo la implementación PrimeFaces 5.0, el cual dicho sea de paso es parte del estándar de JEE. Como hable en mí post Ocultar/mostrar un componente JSF 2.0 en Primefaces 5.0 usando Ajax usaremos los conceptos del ciclo de vida de un componente JSF y adicionalmente los conceptos de eventos sobre los componentes JSF.

Implementación

Luego de haber analizado los problemas para calcular el tiempo transcurrido entre dos horas en Java, dejo el código de la implementación del algoritmo en lenguaje Java.

//3600000  es el valor en milisegundos de una hora.             
int tempresta = (int) (horafinal.getTime() - horainicial.getTime());
double tiempotranscurrido = Math.rint(((double) tempresta / 3600000) * 100) / 100;

Ahora bien, luego de tener ya el resultado del tiempo transcurrido entre las dos horas, trabajaremos en la capa de presentación utilizando la ayuda de un Backing Beean, el cual tiene las variables horainicial y horafinal, de tipo Date, y tiempotranscurrido, de tipo Double, estas variables interactuan mediate el método "seleccionHoras", el cual se ejecuta al momento de invocar al evento de cambio de valor de una variable, -campo en el formulario-, ya sea horainicial u horafinal, y lo almacena en la variable tiempotranscurrido para que finalmente, mediante ajax, este valor pueda ser mostrado en la página. Dejo el código fuente de la implementación.



Finalmente aquí está el componente xhtml.




Comparto unas imágenes de como se ve el resultado final.





Espero sea de utilidad. No olviden dejar sus comentarios.

viernes, 22 de abril de 2016

¿Cómo sumar/restar días, meses o años a una fecha en Java?

Problema

En nuestro trabajo del día a día seguramente que alguna vez nos hemos encontrado con el problema de sumar o restar un determinado número de meses a una fecha en el lenguaje Java, esto especialmente en el desarrollo de Sistemas de Información en los cuales el registro de fechas son un tema delicado de tratar. 

Como hable en mi anterior post (¿Cómo calcular los meses entre dos fechas en Java?) es conocido para muchos desarrolladores Java que el trabajar con fechas (Date) es algo complicado.

Solución

Para sumar/restar un determinado número de meses a una fecha en Java haremos uso de la clase Calendar de Java, la cual nos ayudará a realizar la suma/resta de meses a nuestra fecha con solo incluir unas pocas líneas de código.

La clase Calendar representa una fecha exacta en el tiempo, pero su principal característica es que esta sea mutable, es decir, permitir cambiar su valor sin generar un nuevo objeto (cosa que no permite Date). Para instanciar un objeto de tipo Calendar lo hacemos con su método getInstance(), el cual nos crea un objeto de la clase conteniendo la fecha de ese momento. Así es muy típico el uso: Calendar ahoramismo = Calendar.getInstance(). Del mismo modo, la clase Calendar nos permite modificar la fecha con la que es instanciada, para esto únicamente hacemos uso del metodo setTime(), su uso es el siguiente: ahoramismo.setTime(fechadeayer), donde fechadeayer debe estrictamente ser de tipo Date y representa la fecha que queremos que se almacene en nuestro objeto. Ahora bien para finalizar la suma/resta de un determinado número de meses a una fecha en Java, debemos conocer que la clase Calendar posee un  método que permite añadir (add) un determinado número de días (DAY_OF_MONTH), meses (MONTH) o años (YEAR) a nuestra fecha, esto se lo hace con la ayuda del método add; debiendole indicar al método, en sus argumentos, si deseamos que se lo haga a nivel de días, meses o años; y cuál es el número determinado que deseamos que se sume (el número debe estar en positivo ej. 3) o se reste (el número debería estar en negativo ej. -7).

Implementación

Luego de haber analizado los problemas para sumar/restar meses a una fecha en Java, pongo a disposición el código fuente  en lenguaje Java.

public static Calendar aniadirDias(Date fecha, int diasParaAniadir) {
        try {
            Calendar c1 = Calendar.getInstance();
            c1.setTime(fecha);
            System.out.println("--> " + c1.getTime());
            c1.add(Calendar.DAY_OF_MONTH, diasParaAniadir);
            System.out.println("--> + " + c1.getTime());
            return c1;
        } catch (Exception e) {
            return null;
        }
    }


Espero les haya ahorrado horas de investigación y de dolores de cabeza.
No olviden comentar el artículo.

viernes, 4 de marzo de 2016

Diseño de relación muchos a muchos en modelo entidad relacion

Muchas de las veces se presentan condiciones en las que el diseño entidad relación de nuestro modelo de datos debe contar con una/unas relación muchos a muchos, y ahí es cuando se complica la manera apropiada en la q debemos diseñar nuestra relación (muchos a muchos) para que cumpla con la lógica del negocio.
El problema principal que se presenta en las relaciones muchos a muchos del modelo de diseño de datos es como acceder a la información en forma bidireccional (en ambos sentidos) es decir
Para explicar de manera en la q puedan entender la relación muchos a muchos en el diseño del modelo de datos vamos a imaginar el caso en el que la carrera de Informática posee una serie de profesores que dictan una materia específica (Programación y Base de Datos); en particular el profesor de Programación posee un grupo de alumnos (Angel, Juan, María y Pedro) y el profesor de Base de Datos pose los alumnos (María, Pedro, Sebastián) pero así mismo por como se presentan las reglas del negocio, un alumno debe tener varios profesores en particular María y Pedro tienen profesor de Programación y Base de Datos, mientras q
(uno de Algebra, uno de Matemáticas, uno de Física, entre otros), aquí es cuando se
cuando se presenta esto 

jueves, 26 de noviembre de 2015

Convertir/Pasar números a letras en Java

Seguramente en alguna oportunidad han tenido la necesidad de convertir/pasar un número a su correspondiente en letras en java. La tarea que al parecer esta complicada termina siendo bastante sencilla.

La necesidad de convertir un número a letras aparece principalmente cuando se desarrollan Sistemas de Información Financieros, debido a que en dichos sistemas es mejor presentar al usuario final el valor de una cantidad en su correspondiente en letras.

Puntos a tomar en concideración

1.- En este proceso (Convertir/Pasar números a letras en Java) se toma en cuenta el redondeo de las cifras decimales (2 cifras decimales), es decir si tenemos el número 22.258 al aplicar el redondeo de dos cifras tendremos el valor de 22.26.

2.- El número que se puede ingresar para el proceso de transformación a su correspondiente en letras debe tener como máximo nueve cifras enteras y sin que este número sea mayor que 999999998.

3.- El número que se pasa como parámetro al método debe estar expresado como una cadena de texto o su vez debe ser un objeto BigDecimal. Eje. convertNumberToLetter("999999998.789") ó convertNumberToLetter(new BigDecimal("999999998.789")).

3.- La palabra que describe la moneda es por omisión "Dólares", pero esta se la puede modificar a su necesidad.

Implementación

Luego de haber puesto en consideración los puntos tratados anteriormente dejo a su disposición el código que realiza el proceso de cambio/transformación/conversión de un número a su correspondiente en letras/texto.



Espero sea de ayuda!
No olviden dejar sus comentarios.

¿Cómo conectarse con dos bases de datos distintas con JPA?

Para quienes estamos día a día en el desarrollo de aplicaciones empresariales Java, nos es recurrente el encontrarnos con el problema de como accedera a la información de distintas Bases de Datos con el Standar JPA (independientemente de su implementación), ya que como ocurre en la vida real, hay diferentes repositorios de información de los cuales debemos obtener sus datos para poder continuar con el desarrollo del sistema de información encomendado a nosostros.

Acabe de mencionar que esto es independiente de la implementación de JPA (Hibernate, EclipseLink, TopLink...) ya que para estas herramientas es transparente el hacer uso del Standar JEE6; JPA proporciona los lineamientos de como se deben realizar los procesos, y los fabricantes lo realizan.

El conectarse a dos Bases de Datos con JPA no es nada dificil, pero hay que tener muy claro los conceptos que ha detras de esto; para lo cual mencionaré algunos aspectos muy importantes a tomar en cuenta.


jueves, 22 de octubre de 2015

¿Cómo otorgar privilegios de ejecución sobre un procedimiento almacenado en Oracle?

Problema

En el día a día de nuestro trabajo seguramente nos hemos encontrado con el problema de que un usuario de la Base de Datos (Oracle) no puede ejecutar un procedimiento almacenado creado por otro usuario (Oracle).

Solución

Para otorgar privilegios de ejecución sobre un procedimiento almacenado a un usuario no propietario del objeto en la Base de Datos (Oracle), debemos tomar en consideración estos puntos importantes.

1.- En este proceso intervienen dos tipos de usuario de la Base de Datos (Oracle), el usuario propietario del objeto (procedimiento almacenado), y el usuario ejecutor del objeto (procedimiento almacenado.)

2.- El usuario propietario del procedimiento almacenado debe otorgar, al usuario ejecutor, el privilegio de ejecución sobre este objeto.

3.- El usuario ejecutor, una vez otorgado el privilegio de ejecución sobre el objeto (procedimiento almacenado Oracle), debe crear un sinónimo (normalmente es el mismo nombre del procedimiento almacenado del usuario propietario) para poderlo ejecutar.
  • Si al sinónimo lo llaman de manera distinta al que le dio el usuario propietario al procedimiento almacenado, al momento de ejecutar el mismo, deben hacerlo con el nombre correspondiente al sinónimo creado (esto solo para el usuario ejecutor).

Implementación

Luego de haber analizado los puntos críticos que se deben tomar en cuenta para la otorgación de privilegios de ejecución sobre un procedimiento almacenado en la Base de Datos (Oracle), este es el script para su implementación:

Desde el usuario propietario:
GRANT execute ON NOMBRE_DEL_PROCEDIMIENTO_ALMACENADO TO USER_EJECUTOR


Desde el usuario ejecutor (o usuario DBA):
CREATE SYNONYM USER_EJECUTOR.NOMBRE_DEL_SINONIMO FOR USER_PROPIETARIO.NOMBRE_DEL_PROCEDIMIENTO_ALMACENADO

Espero sea de ayuda!
No olviden dejar sus comentarios.