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