24679710 jboss richfaces capitulo 4 la aplicacion

Upload: pablo-lopez

Post on 16-Oct-2015

30 views

Category:

Documents


0 download

TRANSCRIPT

  • 4 La aplicacin

    En este captulo, vamos a comenzar a desarrollar nuestra aplicacin web rica! Vamos a explicar todos los pasos para construir un proyecto vaco de la nada (con seam-gen), que soporta todas las tecnologas que se necesitan para desarrollar una "verdadera" aplicacin JSF con Ajax. El objetivo de este libro no slo debe ser una descripcin de una tecnologa, sino tambin queremos que el lector aprenda sobre el marco RichFaces, mientras que desarrolla de una aplicacin real, de modo que puede estar listo para desarrollar su propia aplicacin. La aplicacin que hemos elegido es un administrador de contactos avanzada con una gran cantidad de "ricas" caractersticas que veremos en la siguiente seccin. Despus de crear el proyecto, vamos a empezar a buscar en las pginas y entender las pginas bsica generadas as como el formulario de entrada, mientras que vamos haciendo algunas modificaciones en ellos. Qu es el lo que vamos a desarrollar ? El ejemplo que hemos desarrollado en el captulo 3, primeros pasos fue bsica. Ahora, vamos a desarrollar una aplicacin avanzada de administracin de contactos con una gran variedad de funciones. Durante el desarrollo de todas las caractersticas de la aplicacin web, vamos a utilizar el marco Ajax RichFaces tanto como sea posible. Tambin vamos a utilizar los componentes ricos que pone a nuestra disposicin. La siguiente imagen muestra una maqueta simple de la aplicacin que queremos desarrollar:

  • Caractersticas Aqu est la descripcin de las caractersticas principales de la aplicacin Administrador Avanzado de Contactos. Administrador de Grupos Cada contacto se puede poner en uno o ms grupos para una mejor organizacin de sus datos. La lista de grupos de contacto que aparece dentro de una lista de colores con una herramienta de ventana de informacin emergente que muestra la descripcin del grupo. Subir archivos y notas El usuario ser capaz de asociar los archivos (por ejemplo CV) y notas con "texto enriquecido", a los contactos. La carga de archivos le permitir al usuario seleccionar ms de un archivo a la vez y aadir una descripcin de cada archivo mediante un asistente de panel modal. Bsqueda simple Una simple bsqueda siempre estar disponible para el usuario. l o ella ser capaz de buscar contactos, filtrar stos por su nombre y apellido. El tema del usuario Cada usuario de la aplicacin web puede elegir su propio tema y utilice durante el la sesion. Multilenguaje Nuestra aplicacin es real. Por lo tanto, aunque no tenga caractersticas de RichFaces (pero s caractersticas JSF/Seam), para dar soporte a diferentes idiomas.

  • La base de datos: diagrama E-R Este es el diagrama ER (Entidad-Relacin) de la base de datos que vamos a utilizar:

    Sobre el diagrama E-R Un diagrama Entidad-Relacin (ER), en definitiva, sirve para representar una base de datos relacional. En l se describe la informacin que se almacena en la base de datos en trminos de las entidades y las conexiones entre ellas (relaciones). Una entidad es un objeto (por ejemplo, una persona o un grupo) que pueden ser identificados de forma unvoca y es independiente (es decir, que pueden "vivir" solas). Una relacin se describe cmo dos o ms entidades relacionadas entre s.

  • Tanto las entidades y las relaciones pueden tener atributos. Para encontrar ms acerca de los diagramas ER, se puede leer ms en http://en.wikipedia.org/wiki/Entityrelationship_model. Como puede ver, es bastante simple, todo est en torno a la entidad de contacto. Cada contacto puede ser tambin un usuario de la aplicacin web (con un nombre de usuario y una contrasea establecida). Adems, los dems campos se puede asociar con un tipo diferente de campo personalizado (como direccin URL, correo electrnico, etc) y una etiqueta (casa, trabajo, etc, dependiendo del tipo). Un contacto puede tener una o ms direcciones asociadas con una etiqueta (como el hogar, el trabajo, y as sucesivamente). Los usuarios pueden crear uno o ms grupos de contactos con un color diferente para cada uno. Por ltimo, una lista de archivos (como un CV o de otro tipo) se puede asociar a cada contacto. La base de datos est lista, podemos pasar a crear la estructura del proyecto y la API de persistencia Java (JPA) con entidades vinculadas a las tablas de base de datos. Qu es la JPA ? Hemos hablado acerca de JBoss Seam y Facelets, pero esta es la primera vez que hemos hablado sobre JPA. La JPA es el acrnimo de Java Persistence API y es el estndar API de persistencia y mapeo objeto/relacional para la plataforma Java (SE y EE). Este es otro de los diversos conocimientos de tecnologa. Es muy til para administrar (consultar, insertar, actualizar) datos persistentes conectado a un DBMS de una forma sencilla. El concepto principal es la entidad, que es un POJO que normalmente representa una tabla en una base de datos, y cada instancia de la misma representa una fila individual de la tabla. Para dar un ejemplo, si desea insertar una nueva fila en una tabla de base de datos, slo tienes que crear una instancia de la clase de entidad que representa la tabla, a continuacin, rellene los campos de la entidad con los datos, y llamar al mtodo persistente para insertar una nueva fila en la base de datos. Usted no tiene que escribir una sola lnea de SQL (JPA va a hacer ese trabajo por usted). Adems, cuando se consulta la base de datos, se utiliza un lenguaje similar al SQL (llamado Java Persistence Query Language (JPQL)) y el resultado ser una lista de objetos (java.util.list), estos encajan perfectamente en una aplicacin JSF. La conexin con las entidades de las tablas es muy sencilla, utilizando anotaciones (dentro de la propia clase) o los archivos descriptor XML. Hay algunas buenas implementaciones de la JPA. Vamos a utilizar una de JBoss, puede que usted conozca: Hibernate. Fue un marco ORM antes de la existencia de la JPA (que tiene muchas ideas de l) y est incluido en el proyecto que la seam-gen genera para nosotros. Importar la base de datos En primer lugar, tenemos que crear una base de datos MySQL llamado advcm_db e importar el lenguaje de definicin de datos (DDL) que crea la estructura de base de datos que vamos a utilizar. El archivo DDL de SQL se llamar adv_contact_manager_create.sql y contiene: SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0; SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0; SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL'; CREATE SCHEMA IF NOT EXISTS `advcm_db` DEFAULT CHARACTER SET utf8 ; USE `advcm_db`;

  • -- ----------------------------------------------------- -- Table `advcm_db`.`contact` -- ----------------------------------------------------- CREATE TABLE IF NOT EXISTS `advcm_db`.`contact` ( `id` INT(11) NOT NULL AUTO_INCREMENT , `ContactOwner` INT(11) NULL DEFAULT NULL , `name` VARCHAR(45) NULL DEFAULT NULL , `surname` VARCHAR(45) NULL DEFAULT NULL , `email` VARCHAR(255) NULL DEFAULT NULL , `company` VARCHAR(255) NULL DEFAULT NULL , `username` VARCHAR(20) NULL DEFAULT NULL COMMENT 'null if the user has no access permission' , `password` VARCHAR(20) NULL DEFAULT NULL COMMENT 'null if the user has no access permission' , `createdOn` DATETIME NOT NULL , `lastUpdatedOn` DATETIME NOT NULL , `lastAccessOn` DATETIME NULL DEFAULT NULL COMMENT 'Only for user with access permissions (username not null)' , `note` TEXT NULL DEFAULT NULL , `active` TINYINT(1) NULL DEFAULT '0' , PRIMARY KEY (`id`) , INDEX `fk_contact_contact` (`ContactOwner` ASC) , INDEX `FK38B724204FF86D69` (`ContactOwner` ASC) , CONSTRAINT `FK38B724204FF86D69` FOREIGN KEY (`ContactOwner` ) REFERENCES `advcm_db`.`contact` (`id` ), CONSTRAINT `fk_contact_contact` FOREIGN KEY (`ContactOwner` ) REFERENCES `advcm_db`.`contact` (`id` ) ON DELETE NO ACTION ON UPDATE NO ACTION) ENGINE = InnoDB DEFAULT CHARACTER SET = utf8; -- ----------------------------------------------------- -- Table `advcm_db`.`contact_address` -- ----------------------------------------------------- CREATE TABLE IF NOT EXISTS `advcm_db`.`contact_address` ( `id` INT(11) NOT NULL AUTO_INCREMENT , `ContactId` INT(11) NOT NULL , `position` INT(11) NOT NULL DEFAULT '0' , `address1` VARCHAR(255) NULL DEFAULT NULL , `address2` VARCHAR(255) NULL DEFAULT NULL , `postCode` VARCHAR(50) NULL DEFAULT NULL , `city` VARCHAR(255) NULL DEFAULT NULL , `province` VARCHAR(50) NULL DEFAULT NULL , `country` VARCHAR(255) NULL DEFAULT NULL , `label` VARCHAR(255) NOT NULL COMMENT 'it is suggested but can be a free text' , `createdOn` DATETIME NOT NULL , `lastUpdatedOn` DATETIME NOT NULL , PRIMARY KEY (`id`) , INDEX `fk_ContactAddress_contact` (`ContactId` ASC) , INDEX `FK20846D5EA68B411` (`ContactId` ASC) , CONSTRAINT `FK20846D5EA68B411` FOREIGN KEY (`ContactId` ) REFERENCES `advcm_db`.`contact` (`id` ), CONSTRAINT `fk_ContactAddress_contact` FOREIGN KEY (`ContactId` ) REFERENCES `advcm_db`.`contact` (`id` ) ON DELETE NO ACTION ON UPDATE NO ACTION) ENGINE = InnoDB DEFAULT CHARACTER SET = utf8; -- ----------------------------------------------------- -- Table `advcm_db`.`contact_field` -- ----------------------------------------------------- CREATE TABLE IF NOT EXISTS `advcm_db`.`contact_field` (

  • `id` INT(11) NOT NULL AUTO_INCREMENT , `ContactId` INT(11) NOT NULL , `label` VARCHAR(255) NOT NULL COMMENT 'the suggestions on it dipend on type but it is a free field' , `value` VARCHAR(255) NOT NULL , `type` VARCHAR(255) NOT NULL COMMENT 'phone, url, email, etc.' , PRIMARY KEY (`id`) , INDEX `fk_ContactField_contact` (`ContactId` ASC) , INDEX `FK387E901BEA68B411` (`ContactId` ASC) , CONSTRAINT `FK387E901BEA68B411` FOREIGN KEY (`ContactId` ) REFERENCES `advcm_db`.`contact` (`id` ), CONSTRAINT `fk_ContactField_contact` FOREIGN KEY (`ContactId` ) REFERENCES `advcm_db`.`contact` (`id` ) ON DELETE NO ACTION ON UPDATE NO ACTION) ENGINE = InnoDB DEFAULT CHARACTER SET = utf8 COMMENT = 'It contains the value with a label'; -- ----------------------------------------------------- -- Table `advcm_db`.`contact_file` -- ----------------------------------------------------- CREATE TABLE IF NOT EXISTS `advcm_db`.`contact_file` ( `id` INT(11) NOT NULL AUTO_INCREMENT , `ContactId` INT(11) NOT NULL , `fileName` VARCHAR(255) NOT NULL , `fileType` VARCHAR(25) NOT NULL , `description` TINYTEXT NULL DEFAULT NULL , `createdOn` DATETIME NOT NULL , `lastUpdatedOn` DATETIME NOT NULL , PRIMARY KEY (`id`) , INDEX `fk_ContactFile_contact` (`ContactId` ASC) , INDEX `FK4C251E3BEA68B411` (`ContactId` ASC) , CONSTRAINT `FK4C251E3BEA68B411` FOREIGN KEY (`ContactId` ) REFERENCES `advcm_db`.`contact` (`id` ), CONSTRAINT `fk_ContactFile_contact` FOREIGN KEY (`ContactId` ) REFERENCES `advcm_db`.`contact` (`id` ) ON DELETE NO ACTION ON UPDATE NO ACTION) ENGINE = InnoDB DEFAULT CHARACTER SET = utf8; -- ----------------------------------------------------- -- Table `advcm_db`.`contact_group` -- ----------------------------------------------------- CREATE TABLE IF NOT EXISTS `advcm_db`.`contact_group` ( `id` INT(11) NOT NULL AUTO_INCREMENT , `ContactOwner` INT(11) NOT NULL , `name` VARCHAR(255) NOT NULL , `description` TINYTEXT NULL DEFAULT NULL , `color` VARCHAR(7) NULL DEFAULT NULL , `createdOn` DATETIME NOT NULL , `lastUpdatedOn` DATETIME NOT NULL , PRIMARY KEY (`id`) , INDEX `fk_ContactGroup_contact` (`ContactOwner` ASC) , INDEX `FK3890E5A04FF86D69` (`ContactOwner` ASC) , CONSTRAINT `FK3890E5A04FF86D69` FOREIGN KEY (`ContactOwner` ) REFERENCES `advcm_db`.`contact` (`id` ), CONSTRAINT `fk_ContactGroup_contact` FOREIGN KEY (`ContactOwner` ) REFERENCES `advcm_db`.`contact` (`id` ) ON DELETE NO ACTION ON UPDATE NO ACTION) ENGINE = InnoDB

  • DEFAULT CHARACTER SET = utf8; -- ----------------------------------------------------- -- Table `advcm_db`.`contact_in_group` -- ----------------------------------------------------- CREATE TABLE IF NOT EXISTS `advcm_db`.`contact_in_group` ( `Contact` INT(11) NOT NULL , `ContactGroup` INT(11) NOT NULL , `insertedOn` DATETIME NOT NULL , PRIMARY KEY (`ContactGroup`, `Contact`) , INDEX `fk_ContactInGroup_Contact` (`Contact` ASC) , INDEX `fk_ContactInGroup_ContactGroup` (`ContactGroup` ASC) , INDEX `FK85EAE8243BA12EF6` (`Contact` ASC) , INDEX `FK85EAE824DB2B7A8` (`ContactGroup` ASC) , CONSTRAINT `contact_in_group_ibfk_1` FOREIGN KEY (`ContactGroup` ) REFERENCES `advcm_db`.`contact_group` (`id` ) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT `FK85EAE8243BA12EF6` FOREIGN KEY (`Contact` ) REFERENCES `advcm_db`.`contact` (`id` ), CONSTRAINT `FK85EAE824DB2B7A8` FOREIGN KEY (`ContactGroup` ) REFERENCES `advcm_db`.`contact_group` (`id` ), CONSTRAINT `fk_ContactInGroup_Contact` FOREIGN KEY (`Contact` ) REFERENCES `advcm_db`.`contact` (`id` ) ON DELETE NO ACTION ON UPDATE NO ACTION) ENGINE = InnoDB DEFAULT CHARACTER SET = utf8; SET SQL_MODE=@OLD_SQL_MODE; SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS; SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS; Seam-gen leer la estructura de base de datos para generar las entidades JPA para nosotros. Vamos a ver cmo utilizar esta caracterstica al crear el proyecto. Crear el proyecto La creacin del proyecto es muy similar a la que hemos usado para el ejemplo en el captulo 3, la nica diferencia es que ahora se va a conectar nuestro proyecto para el DBMS MySQL. Por lo tanto, tenemos que configurar de una manera adecuada. Abra una ventana de terminal y ubquese en el directorio de la distribucin de JBoss Seam, ejecute el comando siguiente desde aqu, para Microsoft Windows y Unix/Linux/Mac OS X:

    Microsoft Windows Unix/Linux/Mac OS X seam setup ./seam setup

    Despus de que el texto de bienvenida, vamos a entrar en nuestro nuevo proyecto de datos de configuracin (seam-gen guardar los datos anteriores, por lo que no tiene que volver a escribir toda la informacin de configuracin): Pregunta Descripcin Respuesta Introduzca el lugar de trabajo para sus proyectos de Java (el directorio que contiene sus proyectos de Seam)

    Este es el directorio en el que queremos salvar nuestro nuevo proyecto (que depende de nuestro entorno y preferencias)

    Slo dar intro, ya que es el mismo que en proyecto de ejemplo.

  • Ingrese el directorio predeterminado de JBoss AS

    Es el directorio donde est instalado el servidor de aplicaciones JBoss

    (El directorio de JBoss)

    Introduzca el nombre del proyecto

    El nombre de la aplicacin AdvContactManager

    Quieres usar ICEfaces en lugar de RichFaces [n]?

    seam-gen tambin es compatible con ICEfaces (otro marco de componentes), pero queremos utilizar RichFaces, as que pulse Enter

    No

    Seleccione un tema para RichFaces [classic] (blueSky, [classic], deepMarine, DEFAULT, emeraldTown, japanCherry, ruby, wine)

    Tenemos la opcin de seleccionar cualquiera de los temas mostrados para nuestro proyecto, tambien podemos cambiarlo ms tarde, por ahora, el tema classic esta bien

    Solo presione Intro

    Este proyecto es empaquetado como un EAR (con componentes EJB) o un WAR (sin soporte EJB) [ear]

    Podemos generar un paquete WAR o un paquete EAR para nuestra aplicacin. Nos gustara una aplicacin completa EAR con soporte EJB

    Solo presione Intro

    Introduzca el nombre del paquete Java para el beans de sesin

    El nombre del paquete que contiene los beans de sesin (generado por seam-gen)

    book.richfaces.advcm

    Introduzca el nombre del paquete de Java para su beans de entidad

    El nombre del paquete que contiene los beans de entidad (generado por seam-gen)

    book.richfaces.advcm

    Introduzca el nombre del paquete Java para los casos de prueba

    El nombre del paquete que contiene los beans para nuestros casos de prueba

    book.richfaces.advcm.test

    Qu tipo de base de datos se utiliza?

    Por este simple ejemplo, no usamos ninguna base de datos

    mysql

    Introduzca el dialecto de Hibernate para la base de datos

    Dialecto de Hibernate org.hibernate.dialect.MySQLDialect

    Escriba la ruta del sistema para los controladores jar de JDBC

    Tiene que ser una ruta de acceso al archivo JAR del controlador JDBC de MySQL (si no lo tiene, puede descargarlo desde http://dev.mysql.com/downloads/connector/j/ (la versin actual es 5.1.10-bin.jar)).

    c:\ruta_controlador_mysql\mysql-connector-java-5.1.10-bin.jar

    Introduzca la clase para el controlador JDBC de la base de datos

    Clase del Driver JDBC para MySQL com.mysql.jdbc.Driver

    Introduzca la direccin URL de conexin JDBC de la base de datos

    URL de conexin a la base de datos jdbc:mysql://localhost:3306/advcm_db

    Introduzca el nombre de la base de datos

    Usuario de la bases de datos de la aplicacin

    root

    Introduzca la contrasea de la base de datos

    Contrasea de la base de datos de la aplicacin

    mysqlpass

    Introduzca el nombre del esquema de base de datos

    Nombre de la base de datos( est bien dejar este espacio en blanco)

    slo pulse Intro

    Introduzca el nombre de catlogo de base de datos

    (est bien dejar este espacio en blanco) slo pulse Intro

    Trabajar con las tablas que ya existen en la base

    Usar todas las tablas que estn en la base de datos?

    y

  • de datos? Quieres borrar y volver a crear las tablas de base de datos y los datos en Import.sql cada vez que se implante ?

    Borrar la base de datos en cada despliegue?

    N y Intro

    Muy bien, hemos hecho la configuracin, y veremos cmo configurarlo para la conexin a un DBMS MySQL en el siguiente captulo (cuando vamos a empezar a hacer la aplicacin real). Por ahora las respuestas que est bien utilizar la opcin predeterminada. Estamos dispuestos a crear el proyecto utilizando los siguientes comandos para Microsoft Windows y Unix / Linux / Mac OS X:

    Microsoft Windows Unix/Linux/Mac OS X seam create-project ./seam create-project

    Ahora vamos a crear las entidades de la JPA (nuestro modelo de datos de la aplicacin) de forma automtica mediante los siguientes comandos para Microsoft Windows y Unix/Linux/ Mac OS X:

    Microsoft Windows Unix/Linux/Mac OS X seam generate-model ./seam generate-model

    Si est utilizando el IDE de Eclipse, usted tiene que importar el proyecto en el rea de trabajo (que se describe cmo hacer que en el captulo 2, Introduccin). Con otros IDE (IntelliJ o NetBeans), slo se puede abrir desde la ubicacin en la que he dicho seam-gen para crearlo. El diagrama de clases El diagrama de clases siguiente muestra las clases entidad JPA generados por seam-gen:

  • Como puede ver, no se diferencia mucho del diagrama ER-de hecho, cada clase se corresponde con cada tabla en la base de datos. Este es un ejemplo generado de la clase entidad (la entidad ContactGroup). Hemos escrito algunas partes de la clase, slo para mostrar algunos puntos relevantes de JPA:

    @Entity @Table(name = "contact_group", catalog = "adv_contact_manager") public class ContactGroup implements java.io.Serializable { private Integer id; private Contact contact; private String name; private Set contactInGroups = new HashSet(0); // .@Id

    .. other fields, constructors, getters and setters ...

    @GeneratedValue(strategy = IDENTITY) @Column(name = "id", unique = true, nullable = false) public Integer getId() {

  • return this.id; } public void setId(Integer id) { this.id = id; } @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "ContactOwner", nullable = false) @NotNull public Contact getContact() { return this.contact; } public void setContact(Contact contact) { this.contact = contact; } @Column(name = "name", nullable = false) @NotNull public String getName() { return this.name; } public void setName(String name) { this.name = name; } @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "contactGroup") public Set getContactInGroups() { return this.contactInGroups; } public void setContactInGroups(Set contactInGroups) { this.contactInGroups = contactInGroups; } }

    Es slo una clase normal (con campos, accesores y modificadores) anotado por JPA (destacamos stas) que conectan la clase y sus campos con la tabla correspondiente en la base de datos. Usted puede anotar los campos o el accesor (como en este caso). En ambos casos, la anotacin tiene los mismos efectos. @NotNull y @Length son anotaciones de Hibernate Validator, que hemos visto en el captulo 2. Seam-gen pone algunas anotaciones bsicas de Hibernate Validator, pero hay que completarlas mediante la edicin de las clases de entidad (vamos a ver un ejemplo en el prrafo siguiente). Otra anotacin que debes conocer es JPA @OneToMany que administra la relacin con otras clases de entidad. Para hacer un ejemplo, la propiedad contactInGroups devuelve todas las instancias ContactInGroup que estn conectados a ContactGroup. De manera sencilla, si tengo una instancia de ContactGroup, puedo conseguir todos los contactos de ese grupo solo leyendo esa propiedad. Algunas modificaciones a las entidades El uso de la JPA tambin es conveniente ya que tiene ms funciones disponibles, como los validadores de Hibernate (hemos visto cmo funcionan en el primer ejemplo) y otras anotaciones tiles que nos ayudan a escribir cdigo limpio.

  • Seam-gen realiza mucho trabajo por nosotros, pero como toda herramienta automtica, no es perfecto y nos gustara aadir caractersticas a las clases generadas despus de la generacin de proyectos. En este caso, estamos agregando mas validadores Hibernate a nuestras clases de entidad. stos son algunos de utilidad incorporada en los:

    @Length(min=, max=): Comprueba si la longitud de la cadena coincide con valores mnimo y mximo

    @Max(value=): Comprueba si el valor es menor o igual al valor mximo @Min(value=): Comprueba si el valor es superior o igual al valor @NotNull: Comprueba si el valor del campo es nulo @Email: Comprueba si la cadena se ajusta a la especificacin de la direccin de correo

    electrnico @Range(min=, max=): Comprueba si el valor est entre los valores mnimo y mximo

    (incluido) @Future: Comprueba si la fecha est en futuro @Past: Comprueba si la fecha est en pasado @Pattern(regex="regexp", flag=): Comprueba si el que se corresponda con la

    expresin regular, habida cuenta de la bandera del partido (ver java.util.regex.Pattern para ms informacin)

    @Patterns( {@Pattern(...)} ): Al igual que @Pattern, pero para mltiples expresiones regulares

    Usted puede crear sus propios validadores de una manera sencilla. Consulte la documentacin Validadores de Hibernate para ver todas las caractersticas de este marco. Otra caracterstica til que nos gustara aadir a nuestras entidades es el representado por las anotaciones @PrePersist y @PreUpdate. Si un mtodo es anotado con una de estas anotaciones, ser invocado antes de la persistencia de la instancia en la base de datos y antes de su actualizacin. Aqu est el cdigo aadido para la clase de entidad de la seccin anterior (la entidad ContactGroup):

    /** * This method initializes the values before * the class is persisted */ @PrePersist public void prePersist() { setCreatedOn(new Date()); setLastUpdatedOn(new Date()); } /** * This method initializes the values before * the class is updated */ @PreUpdate public void preUpdate() { setLastUpdatedOn(new Date()); }

  • Aqu usamos las anotaciones @PrePersist y @PreUpdate que nos permiten configurar automticamente las propiedades createdOn y lastUpdatedOn (utilizando el setCreatedOn y mtodos setUpdatedOn) sin tener que hacer que cada vez que persisten o actualizacin de una entidad. Tambin los utilizan para hacer algo antes de que la entidad se conserva o actualizada. Tambin puede utilizar @PreRemove para anotar un mtodo que ser llamado despus de que se elimine la instancia correspondiente de la clase de entidad. Edicin de la pgina de plantilla Por ahora, nos limitaremos a la edicin de esta pgina para la transformar los componentes h:messages en RichFaces (rich:messages), que como hemos visto, la caja Ajax (rich:messages tambin tiene el mismo atributo como el de la JSF, por lo que no tiene que modificar nada ms). Para poder usarlo, tambin tenemos que agregar el espacio de nombres RichFaces que hemos visto. Por ahora, as se debe de ver la pgina template.xhtml (algunas partes se han omitido porque son los mismos que ya antes hemos visto):

    ... ...

    En el prximo captulo, vamos a aadir las funcionalidades de la plantilla de pgina, que queremos compartir a travs de las diferentes pginas. Como puede ver, el atributo rendered del componente rich:messages est controlada por la expresin EL #{showGlobalMessages!='false'}. showGlobalMessage es un parmetro Facelet que se puede pasar a la plantilla (recuerda el parmetro projectName pasados al men, anteriormente?) para forzar no visualizar el componente rich:messages.

  • La pgina de men Esta es una pgina incluida (como hemos visto) en la plantilla y es un rich:toolBar con dos instancias rich:toolBarGroup (uno en la izquierda y otro con alineacin a la derecha):

    Despus de la declaracin xmlns (utilizado por Facelets), podemos encontrar los dos grupos con algunos textos y enlaces dentro. El grupo de la derecha contiene el enlace de entrada al sistema si el usuario no est conectado, y la informacin del usuario y el enlace de desconexin si el usuario se encuentra conectado. Por lo tanto, cuando ningn usuario est conectado, la pgina es as:

  • Cuando un usuario est conectado, aparece como sigue:

    Como puede ver, la parte en la parte derecha de la barra de men cambia segn el estado de la variable identity.loggedIn. La pgina de inicio de sesin Seam-gen genera una pgina de inicio de sesin estndar que podemos personalizar. Se llama login.xhtml y usted lo puede encontrar en la ruta /view/. Utiliza las caractersticas de autenticacin de JBoss Seam, por lo que se ampliar para incluir a nuestro cdigo de acceso. Adems, utiliza la pgina template.xhtml que ya hemos visto. Veamos el cdigo:

    Login Please login here Username

  • Password Remember me Note - You may login with the username 'admin' and a blank password.

    Una vez ms, vemos DOCTYPE y el componente Facelets ui:composition que obtiene los contenidos que deben incluirse en otro Facelet. Como puede ver, de hecho, despus de las declaraciones xmlns, est la plantilla de atributo que apunta a la pgina template.xhtml que hemos visto y lo utiliza como una plantilla. Recuerda el punto de insercin en el cuerpo template.xhtml? Cmo insertar cdigo en ese momento? La respuesta es simple: slo tiene que utilizar la etiqueta y establecer el atributo de nombre como uno de los puntos de insercin:

    Lo podemos encontrar en nuestra pgina login.xhtml. Incluye la parte personalizada de la pgina login.xhtml, que es el que tiene el formulario de acceso. Podemos ver el cdigo al declarar y el componente dentro de l. Contiene las entradas para nombre de usuario y contrasea (y una casilla Recurdame). Debajo del panel, existe la etiqueta JSF estndar h:commandButton que llama a la accin de login. No queremos un inicio de sesin Ajax, as que est bien utilizar un componente de accin estndar que se redirigir a la pgina de inicio despus de la sesin se ha completado. De todos los componentes hay que apuntar a un componente Seam especial llamada identidad, que administra la fase de inicio de sesin. No vamos a editar mucho esta pgina, lo nico que se har es eliminar la seccin Note, ya que no se necesitar:

  • Note - You may login with the username 'admin' and a blank password.

    As es como aparece la pgina de inicio:

    La pgina de inicio La pgina de inicio (home.xhtml) es una pgina en blanco con un cuadro que muestra Powered by seam y Generated by seam-gen. Por ahora, simplemente borre el cdigo de la caja a fin de obtener una pgina en blanco, que se llenar en los captulos siguientes. El cdigo es el siguiente:

    Y esta es la forma en que aparece (se puede ver la barra de men que viene de la plantilla):

  • Resumen En este captulo, hemos creado las bases de nuestro proyecto para tener una idea de las tecnologas de nuestro lado para que sepamos, como construir buenas aplicaciones, mientras que empecemos a ser ms productivos y rpidos. Hemos visto el proyecto seam proyecto generado por seam-gen e incluye soporte para Ajax y los componentes ricos (con RichFaces). Adems, vimos las plantillas (con Facelets) y la autenticacin de JBoss Seam. Tambin hemos empezado a personalizar un poco las entidades (agregando anotaciones Hibernate Validator) y el cdigo XHTML. En el prximo captulo, vamos a profundizar en el desarrollo de la aplicacin utilizando componentes RichFaces.