martes, 28 de julio de 2015

aplicación JSF 2.0

Guía de aprendizaje de herramientas JSF: construir una aplicación JSF 2.0

Resumen
En esta guía de aprendizaje construiremos y ejecutaremos una aplicación web de JSF 2.0, y resaltaremos las características proporcionadas por el proyecto de herramientas JSF.

Introducción

El proyecto Herramientas JSF proporciona herramientas que simplifican la construcción de aplicaciones web JSF 2.0. Estas incluyen un Editor de fuente HTML que proporciona asistencia de contenido y validación para códigos JSF. En esta guía de aprendizaje crearemos y ejecutaremos una aplicación web JSF 2.0. En la página Novedades destacables se indican todas las características de herramientas disponibles para dar soporte al desarrollo de una aplicación web JSF 2.0.

Configuración

Configurar la instancia del servidor Apache Tomcat

Configure una instancia del servidor Apache Tomcat con la información de la sección 'Configurar' de esta guía de aprendizaje Construir y ejecutar una aplicación web.

Cree un proyecto de JavaServer Faces

Cree una nueva aplicación de web dinámica con el nombre JSFFaceletsTutorial. Establezca el tiempo de ejecución de destino en Apache Tomcat 6.0
En la sección Configuración, pulse el botón Modificar y seleccione la faceta “JavaServer Faces 2.0”. Sáltese el panel siguiente para pasar a la página Posibilidades de JSF.



En la página Prestaciones de JSF, en el desplegable para el Tipo de biblioteca JSF, seleccione Biblioteca de usuario.



Pulse el icono Descargar biblioteca. Se visualiza el diálogo Descargar biblioteca con la lista de proveedores para los archivos JAR de implementación de JSF. Seleccione la biblioteca JSF 2.0 (Mojarra). Pulse Siguiente. Acepte la licencia y pulse Finalizar



La herramienta descarga los archivos JAR, crea una biblioteca de usuario JDT y la añade al proyecto actual. Seleccione el recuadro de selección para la nueva biblioteca si no está seleccionado. A continuación, seleccione el icono Gestionar bibliotecas.





Pulse en el botón Finalizar para crear la aplicación de JavaServer Faces. Puede que se le solicite que elija la perspectiva J2EE al terminar. Pulse Aceptar.

Se ha creado la aplicación JSF.



Crear páginas de plantillas de facelets

Ahora creará una página de plantilla de facelets. Cree una carpeta llamada templates en la carpeta WEB-INF. Utilice el asistente para crear una página de plantilla llamada BasicTemplate.xhtml bajo esta carpeta. Pulse con el botón derecho sobre la carpeta template, seleccione Nuevo > HTML para lanzar el asistente HTML. En la página Seleccionar plantillas del asistente, seleccione la plantilla Plantilla de facelet nueva. Pulse Finalizar.



















Edite el archivo de plantilla siguiendo las instrucciones de la plantilla. Creará e incluirá las plantillas de cabecera y pie de página. La plantilla final debería tener el aspecto siguiente.


BasicTemplate.xhtml

<!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">
<head>
  <title><ui:insert name="title">Guía de aprendizaje de facelets</ui:insert></title>
</head>

<body>

<div id="header">
    <ui:insert name="header">
        <ui:include src="/WEB-INF/templates/header.xhtml"/>
    </ui:insert>
</div>

<div id="content">
    <ui:insert name="content">
    </ui:insert>
</div>

<div id="footer">
    <ui:insert name="footer">
        <ui:include src="/WEB-INF/templates/footer.xhtml"/>
    </ui:insert>
</div>

</body>
</html>


Cree las plantilla de cabecera y pie de página bajo la carpeta template mediante el asistente HTML nuevo tal como se describe más arriba. En la página Seleccionar plantilla del asistente, elija los archivos de plantilla correspondientes, Cabecera de facelet nueva y Pie de página de facelet nuevo. Haga los cambios en las plantillas tal como se muestran más abajo.




Crear una página JSF

Cree una página JSF con códigos de facelets que utilizarán la plantilla creada en el paso anterior. Utilice el asistente de página HTML para crear una página llamada login.xhtml en la carpeta contenido web de la nueva aplicación. En la página Seleccionar plantillas del asistente, seleccione la plantilla Página de composición de facelet nueva. Pulse Finalizar.


login.xhtml

<!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:f="http://java.sun.com/jsf/core">

<ui:composition template="">
    <ui:define name="cabecera">
        Añada aquí su cabecera o suprima para utilizar el valor predeterminado
    </ui:define>
    <ui:define name="contenido">
        Añada aquí su contenido o suprima para utilizar el valor predeterminado
    </ui:define>
    <ui:define name="pie de página">
        Añada aquí su pie de página o suprima para utilizar el valor predeterminado
    </ui:define>
</ui:composition>
</html>


Validación de atributos de código de facelets y asistencia de contenido

El proyecto de herramientas JSF añade soporte para validar los atributos de códigos de Facelets y también proporciona asistencias de contenido sobre ellos. Fíjese en el aviso sobre el atributo template del código <ui:composition>.




Sitúe el cursor entre las comillas del atributo template y pulse Control + Barra espaciadora para obtener la asistencia de contenido. Debería ver un cuadro emergente con una lista de los directorios bajo la carpeta WebContent. Seleccione /WEB-INF/templates/BasicTemplate.xhtml






Completar la página JSF

Suprima los códigos <ui:define> para la cabecera y el pie de página. La página obtendrá la cabecera y el pie de página de la plantilla. Añada los códigos para el inicio de sesión en la sección content tal como se muestra a continuación. Tenga en cuenta que el release actual del proyecto de herramientas JSF no soporta la representación visual de una página XHTML en el Editor de páginas web JSF. Sin embargo todas las características de productividad disponibles en la Página fuente del Editor de páginas Web para editar una página JSP están disponibles en el editor de fuente HTML para construir una página de facelets JSF en XHTML.


login.xhtml

<!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:f="http://java.sun.com/jsf/core">

<ui:composition template="/WEB-INF/templates/BasicTemplate.xhtml">
    <ui:define name="content">
        <h:form>
            <h:panelGrid columns="2">
                <h:outputText value="Name"></h:outputText>
                <h:inputText value="#{loginBean.name}"></h:inputText>
                <h:outputText value="Password"></h:outputText>
                <h:inputSecret value="#{loginBean.password}"></h:inputSecret>
            </h:panelGrid>
            <h:commandButton value="Login" action="login"></h:commandButton>
        </h:form>
    </ui:define>
</ui:composition>
</html>

Configurar el bean gestionado

En el Explorador de proyectos, expanda el nodo JSFFaceletsTutorial->WebContent. Efectúe una doble pulsación sobre faces-config.xml . Esto también iniciará el editor de configuración de Faces. Seleccione la pestaña ManagedBean.




Pulse el botón Añadir. Esto iniciará el asistente Nuevo bean gestionado. Seleccione la opción Crear una nueva clase Java. En el siguiente panel del asistente, especifique el paquete como com.tutorial y el Nombre de la clase como LoginBean . Pulse el botón Finalizar.
Esto creará la clase Java y la registrará como un bean gestionado. Guarde el editor de configuración de Faces. Para editar la clase Java, pulse en el hiperenlace Clase ManagedBean en la página Bean gestionado tal como se muestra en la siguiente imagen. Esto iniciará el editor de Java.





Edite la clase Java com.tutorial.LoginBean. Añada el siguiente código y guarde.

LoginBean.java

/**
 * LoginBean.java
 * 
 */

package com.tutorial;

public class LoginBean
{
    private String name;
    private String password;


    public String getName ()
    {
        return name;
    }


    public void setName (final String name)
    {
        this.name = name;
    }


    public String getPassword ()
    {
        return password;
    }


    public void setPassword (final String password)
    {
        this.password = password;
    }
}

Añadir otra página

Cree una página HTML welcome.xhtml nueva en WebContent con el contenido siguiente:

welcome.xhtml

<!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:f="http://java.sun.com/jsf/core">

<ui:composition template="/WEB-INF/templates/BasicTemplate.xhtml">
    <ui:define name="content">
        <h:outputLabel value="Welcome #{loginBean.name}"></h:outputLabel>
    </ui:define>
</ui:composition>
</html>

Configuración de reglas de navegación de página

Efectúe una doble pulsación sobre faces-config.xml para abrir el Editor de configuraciones Faces. Pulse la pestaña Regla de navegación. Ahora arrastre los archivos login.xhtml y welcome.xhtml del Explorador de proyectos a la cuadrícula Regla de navegación tal como se muestra.
 Pulse sobre la herramienta Enlazar en la paleta de la derecha. Ahora arrastre una flecha de login.xhtml a welcome.xhtml tal como se muestra.
 Ahora, pulse sobre la flecha y abra la vista Propiedades. Pulse sobre el botón con las elipses junto al campo “De resultado”

 Seleccione “Conexión” en este diálogo. Pulse Aceptar
 Nuestra regla de navegación está ahora configurada.

Ejecutar la página de facelets JSF

Ahora ejecutaremos la página login.xhtml contra el servidor Apache Tomcat. Elija Ejecutar en servidor mediante el menú de contexto mientras selecciona la página login.xhtml en el navegador. Seleccione el servidor Apache Tomcat y configúrelo según sea necesario si no lo ha hecho aún. Pulse Finalizar. Debería ver en la vista Consola que se inicia el servidor Tomcat y, a continuación, debería ver la página de inicio de sesión ejecutándose aparecer en el navegador web tal como se muestra a continuación.


 
¡Felicidades! Ha creado y ejecutado su primera aplicación de facelets JSF.

JPA : OneToMany / ManyToOne

JPA : OneToMany / ManyToOne


Hasta el momento no lo habíamos mencionado, pero existen básicamente dos formas de asociación:
  • Las basadas en valores simples.
  • Las basadas en colecciones de valores.



Dentro de esas formas de asociación, existen cuatro formas de “mapeo”:
  • Relación One-To-One (valores simples). Este tema lo tratamos en un post anterior.
  • Relación Many-To-One (valores simples)
  • Relación One-To-Many (colecciones de valores)
  • Relación Many-To-Many (colecciones de valores)

En este post trataremos el tema de las relaciones One-to-Many y Many-to-One (caso típico de las aplicaciones que manejan cabecera y detalle).

Si este es el esquema de base de datos, observa que la orden tiene una llave foránea que es el CUST_ID (de la tabla TBCUSTOMER) para poder identificar de quien es la orden:



Las entidades respectivas tendrían el siguiente formato:


Es importante tener en cuenta que:

a) El lado “many-to-one” siempre es el lado “owner” de la relación. En consecuencia, la anotación @JoinColumn debe estar en dicho lado.
b) El lado “one-to-many” es el lado “inverso”, por lo que el elemento “mappedBy” debe ser utilizado en este lado.



El atributo "optional" en valor "false" indica que la relación siempre debe existir: es decir, no puede haber órdenes sin cliente asociado.

La anotación @JoinColumn especifica en el atributo "name" el nombre de la columna en la tabla "owner" de la relación. Mientras que el atributo "referencedColumnName" especifica el nombre de la columna en la tabla destino.

En la clase "Customer1" nota que existe un atributo "orders" que es una colección de órdenes que se cargarán de manera EAGER.

TIP: para evitar referenciar dentro de nuestros programas a cada atributo de la entidad, creamos un método "toString" que nos retorne la concatenación de los valores. Por ejemplo para la entidad "ORDERS" agregamos el método siguiente (aparte de los setter/getter ):
EJEMPLO 1: Fragmento de Programa main que lee desde el Cliente ( para la PK 1000 ) la relación One-To-Many. Este fragmento busca al cliente con PK = 1000 y al referenciar al atributo "orders", automáticamente jala las órdenes relacionadas.
EJEMPLO 2: Fragmento de Programa main que lee todas las órdenes para el cliente con  PK = 1000. Es la relación Many-To-One


Si observas la consola de tu IDE, verás las sentencias SQL que se ejecutan ( siempre que la opción de debug esté habilitada en tu persistence.xml ).

JPA : Generación de Llave Primaria

JPA : Generación de Llave Primaria

En este post comentaremos acerca de las modalidades para la generación de un PK simple ( ojo que también hay PK's compuestas ).

Además de la anotación @Id se emplea la anotación @GeneratedValued con el atributo "strategy". Básicamente hay cuatro valores para el atributo:
  • strategy=GenerationType.AUTO
  • strategy=GenerationType.TABLE
  • strategy=GenerationType.SEQUENCE
  • strategy=GenerationType.IDENTITY

El AUTO le dice a JPA que busque la mejor forma de generación de secuencias. Dependiendo de la base de datos a usar se puede manejar "secuencias" (oracle) o "autoincrementos" (MySQL). Para no complicarnos mucho, en este post sólo mencionaremos el uso de la opción TABLE, que es una buena alternativa cuando queremos controlar la generación de la secuencias en una tabla ( algo así como una tabla de correlativos ).

Forma de utilización #1:
Si sólo se especifica la anotación sin indicar la tabla, JPA busca (o genera ) una tabla llamada "sequence". La tabla requiere de dos columnas: una conteniendo el identificador para generar la secuencia y la otra columna contiene el último valor generado. Cada fila de la tabla es un generador diferente para los ID’s.

Ejemplo:



Forma de utilización #2:
¿ Qué sucede si deseamos indicar una tabla específica ?. Debemos agregar una anotación más:  @TableGenerator 
Ahora debemos indicar algunas características de la tabla (que si bien sigue manteniendo la estructura mencionada en la forma de uso #1 ), requiere el "mapeo" de algunas cosas:


A diferencia de la estrategia IDENTITY, en ésta estrategia el valor de la PK ya está disponible desde el momento en que se hace el persist.

¿ Que opinas ?

Por favor prueba las otras estrategias de generación de PK y coloca tus comentarios.