¿Qué ofrece Autentia?

Somos su empresa de
Soporte a Desarrollo Informático
Ese apoyo que siempre quiso tener ….

Desarrollo de componentes y proyectos a medida.

Auditoría de código y recomendaciones de mejora.

Arranque de proyectos basados en nuevas tecnologías.

Curso de Formación
Dirección de Proyectos Informáticos.
Gestión eficaz del Tiempo.
Arquitecturas de desarrollo Web: Web, J2EE, SOA, WebServices, BPM, etc.
Java/ J2EE a todos los niveles: JSPs, Servlets, EJBs, JMS, JNI, etc.
Análisis y diseño orientado a objeto.
UML y patrones de diseño.
Buenas prácticas en el desarrollo de aplicaciones
Técnicas avanzadas: Lucene, Hibernate, Spring, JSF, Struts, etc.

Nuestra mejor referencia son los conocimientos que
compartimos en nuestro web

www.adictosaltrabajo.com
Decenas de entidades cuentan ya con nosotros
Para más información visítenos en www.autentia.com
Tel. 91 675 33 06 - info@autentia.com

JEE6, haciéndolo fácil.

Página 1 de 25
E-mail:
Contraseña:

Deseo registrarme Entrar
He olvidado mis datos de
acceso
Inicio

Quiénes somos

Estás en:
Inicio Tutoriales

Tutoriales

Formación

Comparador de salarios

Nuestro libro

Charlas

Más

JEE6, haciéndolo fácil.
DESARROLLADO POR:

Catálogo de servicios
Autentia

Francisco Javier Martínez Páez

Consultor tecnológico de desarrollo de proyectos
informáticos.
Ingeniero Técnico en Telecomunicaciones
Puedes encontrarme en Autentia: Ofrecemos servicios
de soporte a desarrollo, factoría y formación
Somos expertos en Java/J2EE

Últimas Noticias

Fecha de publicación del tutorial: 2010-07-27
Share |

2
Regístrate para votar

JEE6, haciéndolo fácil.
Los fuentes
Lo primero es el enlace a los fuentes de este tutorial

Introducción
Ya estamos en el mes de julio y en Madrid hace un calor espantoso. A pesar de las inclemencias del
tiempo y de la dificultad que supone poner en marcha las neuronas en este momento, es una
ocasión ideal para ponerse a cacharrear con los nuevos juguetes que aparecen en escena en el
mundo Java. La nueva versión Enterprise de Java ya lleva unos cuantos meses con nosotros y es el
momentos de empezar a tantear un poco que nos trae o que se lleva. La versión anterior ya fué todo
un cambio en su planteamiento buscando sobre todo la sencillez en el desarrollo.
Ya hablé algo en tutoriales anteriores acerca de la versión de EJB 3.0 que me sorprendió gratamente
en su momento, y tengo que decir, que si bien la mayor parte de las nuevas incorporaciones de esta
versión y de la anterior no son ninguna novedad (ya que la mayor parte de ellas son incorporaciones
de ideas de otros frameworks), me satisface comprobar que los creadores de esta nueva versión han
sido lo bastante inteligentes y humildes para incorporar las mejores cosillas que ofrecen los demás
frameworks que hoy día chapotean en nuestro mundillo. Tras cacharrear, leer algún libro y mirar
mucho por la red, se puede resumir que:

Corto sobre
Metodologías Ágiles
Comentando el
Libro: Piensa, es
gratis de Joaquín
Lorente.
Problemas de
aspecto en
AdictosAlTrabajo.com:
Refresco de la hoja de
estilo.
Comentando el
libro: Lucro sucio de
Joseph Heath
Nuevo formato de
tutoriales podcast
con bolígrafo LiveScribe

Histórico de
NOTICIAS

Cosillas nuevas en JEE6
• Búsqueda de un framework más sencillo. Casi todo se puede hacer con anotaciones y
desaparece la necesidad de usar descriptores.
• Búsqueda de un framework más portable. Se incluyen especificaciones para normalizar los
nombres JNDI de los EJBs (lo que era siempre un problema entre servidores) y se incluye el
concepto de EmbeddedContainer para poder probar unitariamente los EJBs.

http://www.adictosaltrabajo.com/tutoriales/tutoriales.php?pagina=jee6

Últimos Tutoriales
Securizar Hudson
de una manera
sencilla

27/07/2010

. Últimas ofertas de empleo Configurando el entorno. la nueva versión únicamente ha definido el Web Profile (Perfil Web) que incluye JSF. Información Analista / Programador BARCELONA.. Lo primero que necesitamos es alguien que implemente todo esto. • Búsqueda de un framework más completo. lo he instalado buscando en el market place: http://www. JBoss. all. JAXR . • Búsqueda de un framework más ligero. Analizadores y más Instalación y configuración de Eclipse Galileo Activar Single Sign On en JBoss Icefaces. he aprovechado para instalar el Eclipse Helios (última versión de eclipse). Servlet. Se incluyen nuevas especificaciones como por ejemplo RESTFul Webservices (JAX-RS). Facebook Social Plugins Últimos Tutoriales del Autor Hibernate Search. Página 2 de 25 Envío de correo electrónico con el soporte de Jboss Seam. Este concepto aparecía en el servidor JBoss desde sus inicios (minimal. Ejemplo de arquitectura propuesta por Autentia Creación de servicios web RESTful con el soporte de RESTeasy de Jboss Seam. Maven2 y EJB3: Parte 4 Síguenos a través de: Lo único que hecho es descomprimirlo. Debido a la gran cantidad de especificaciones que se han de cumplir.) 2. 2010-06-25 Para el tutorial. 27/07/2010 .adictosaltrabajo. Por ahora. Profile (perfiles): Los servidores JEE incorporarán perfiles diferentes en función de la naturaleza de las aplicaciones que corran en nuestro servidor.X. Tenemos varias elecciones. pensando que incluiría el glassfish v3 en la pestaña de Servers. EL. Yo he escogido la versión OpenSource sin instalador (el zip) El enlace está aquí. JBoss.. JTA y Commons Annotations 3.. Así que finalmente.. default . Maven2 y EJB3: Parte 5 Icefaces. Sin más. JAX-RPC. JBoss 6 . JSP.JEE6. EJB Lite: es un subconjunto de las especificaciones más importantes de EJB para poder ser incluído por ejemplo en el Web Profile. probemos algunas cosas nuevas.. JPA. glassfish 3. haciéndolo fácil. EJB Lite. Pero no lo incluye. Han decidido incluir el concepto de Especificaciones que serán eliminadas (EJB 2.com/tutoriales/tutoriales. y como el movimiento se demuestra andando.). Esta vez toca glassfish: Descargando Glassfish v3 Como siempre hay versiones de todos los colores. Pruning: Esto sería algo parecido al deprecated. la nueva versión ha incorporado algunos conceptos nuevos para tratar de minimizar este impacto: 1.php?pagina=jee6 T. JSTL. Bridges.

Página 3 de 25 Lo configuramos en la pestaña de servers: Cuidado porque nos pedirá usar la JDK.JEE6.php?pagina=jee6 27/07/2010 . haciéndolo fácil.adictosaltrabajo. no vale con la JRE. http://www...com/tutoriales/tutoriales.

.com/tutoriales/tutoriales. ya que esto se podía hacer con operaciones en cascada en el otro lado de la relación...delete orphans is here.es cuestión de gustos • Tatatachán.. Página 4 de 25 Arrancamos y comprobamos que va bien la cosa.adictosaltrabajo.0 La nueva versión de JPA no supone un impacto con respecto a la anterior.. No entiendo entonces su aportación. Básicamente las incorporaciones más importantes: • API de generación de Queries dinámicas mediante POO.php?pagina=jee6 27/07/2010 .. haciéndolo fácil. • Se incluye el bloqueo pesimista (el select . En hibernate significaba que si sacas un elemento de la colección. No es igual.. Aquí es algo más parecido a un borrado en cascada. pero..¿ al estilo hibernate ? pues no.JEE6.. Vamos a comenzar con el modelo y el DAO: JPA 2.. se borraba automáticamente.. Yo prefiero usar JPQL.. for update) • Se aumenta la sintaxis de JPQL • API de caché de segundo nivel • La anotación @OrderColumn para mantener el orden de colecciones Vamos a crearnos un proyecto maven (webapp) que nos va a servir para los ejemplos usando el plugin IAM de eclipse: http://www.

Yo iba a elegir la implementación de http://www.sun..xml para que utilice los namespaces de la nueva versión: view plain copy to clipboard print ? <web-app xmlns="http://java.w3.Os dejo un enlace muy interesante con comparaciones entre las implementaciones más comunes.sun. Página 5 de 25 Debéis cambiar el web.com/xml/ns/javaee/web-app_2_5.com/xml/ns/javaee     http://java.JEE6.com/xml/ns/javaee"     xmlns:xsi="http://www.com/tutoriales/tutoriales.5">     <display-name>Aplicación Web JEE6 de Citas de Paco</display-name>   </web-app>   Ahora es momento de seleccionar una implementación de JPA.php?pagina=jee6 27/07/2010 .xsd"    version="2. haciéndolo fácil.org/2001/XMLSchema-instance"   xsi:schemaLocation="http://java.sun..adictosaltrabajo.

adictosaltrabajo.org/2001/XMLSc -instance"       xsi:schemaLocation="http://maven.10</version>               <scope>runtime</scope>           </dependency>           <dependency>               <groupId>org.2.com/tutoriales/tutoriales.n de Validaciones de Hibernate ->           <dependency>               <groupId>org.net</id>               <name>Java.xml: view plain copy to clipboard print ? <project xmlns="http://maven. pero ahora con más razón: Ver comparaciones JPA Configuremos el pom.net/maven/2 </url>               <layout>default</layout>           </repository>       </repositories>       <dependencies>           <!-- Test Unitarios -->           <dependency>               <groupId>junit</groupId>               <artifactId>junit</artifactId>               <version>4.net Repository for Maven 2</name>               <url>http://download.slf4j</groupId>   http://www.php?pagina=jee6 27/07/2010 .5.5.org/POM/4.0-SNAPSHOT</version>       <name>citas Maven Webapp</name>       <url>http://maven.n de JPA 2.0.org</url>       <properties>           <hibernate-version>3.0</modelVersion>       <groupId>citas</groupId>       <artifactId>citas</artifactId>       <packaging>war</packaging>       <version>1.xsd">       <modelVersion>4.dev.n de la especificaci&oacute.org/maven2</url>           </repository>           <!-- Repositorio donde encontrar el contenedor embebido de glassfish -->           <repository>               <id>java.apache.0 de Hibernate -->           <dependency>               <groupId>org.slf4j</groupId>               <artifactId>slf4j-api</artifactId>               <version>1.w3.jboss.0.java.java.org</id>               <name>JBoss Repository</name>               <url>http://repository.0" xmlns:xsi="http://www.5.apache.jboss.0.hibernate</groupId>               <artifactId>hibernate-validator</artifactId>               <version>${hibernate-validator-version}</version>           </dependency>           <!-- Necesarias para Hibernate -->           <dependency>               <groupId>org. Página 6 de 25 Hibernate antes de ver esto.slf4j</groupId>               <artifactId>jcl-over-slf4j</artifactId>               <version>1.apache.0 http://maven.8.org/maven -v4_0_0.10</version>               <scope>runtime</scope>           </dependency>           <dependency>               <groupId>org.apache.net/maven/glassfish</url>           </repository>           <repository>               <id>maven2-repository. haciéndolo fácil.0.net</id>               <name>Glassfish</name>               <url>http://download.GA</hibernate-validator-version>       </properties>       <repositories>           <repository>               <id>repository.hibernate</groupId>               <artifactId>hibernate-entitymanager</artifactId>               <version>${hibernate-version}</version>           </dependency>           <!- Implementaci&oacute.1-Final</hibernate-version>           <hibernate-validator-version>4.JEE6.java.1</version>               <scope>test</scope>           </dependency>           <!-- Implementaci&oacute.org/POM/4.

com/tutoriales/tutoriales.6</source>                       <target>1.adictosaltrabajo.xml en: src/main/resources/META-INF view plain copy to clipboard print ? <persistence xmlns="http://java.maven.glassfish</groupId>               <artifactId>javax.glassfish. haciéndolo fácil.0-b29</version>               <scope>provided</scope>           </dependency>                       <!-- Commons de apache para los equals y hashCode  -->           <dependency>               <groupId>commons-lang</groupId>               <artifactId>commons-lang</artifactId>               <version>2.JEE6.1-b11</version>               <scope>provided</scope>           </dependency>           <!-- API de JPA 2 -->           <dependency>               <groupId>org.extras</groupId>               <artifactId>glassfish-embedded-all</artifactId>               <version>3.com/xml/ns/persistence"   http://www.2</version>                   <configuration>                       <source>1.6</target>                   </configuration>               </plugin>               <!- Configuramos el clean plugin para borrar los temporales del Embedded Container ->               <plugin>                   <artifactId>maven-clean-plugin</artifactId>                   <version>2.1 -->           <dependency>               <groupId>org.4.0.apache.10</version>               <scope>runtime</scope>           </dependency>              <!-- Contenedor embebido de glassfish -->           <dependency>               <groupId>org.php?pagina=jee6 27/07/2010 .glassfish</groupId>               <artifactId>javax.plugins</groupId>                   <artifactId>maven-compiler-plugin</artifactId>                   <version>2.persistence</artifactId>               <version>3.sun.ejb</artifactId>               <version>3.1</version>               <scope>test</scope>           </dependency>           <!-- API de EJB 3.0.5</version>           </dependency>                   </dependencies>          <build>           <plugins>               <plugin>                   <groupId>org. Página 7 de 25             <artifactId>slf4j-log4j12</artifactId>               <version>1.1</version>                   <configuration>                                           <filesets>                           <fileset>                               <directory>${basedir}</directory>                               <includes>                               <include>gfembed*/**</include>                               </includes>                                                                   <followSymlinks>false</followSymlinks>                                                    </fileset>                       </filesets>                   </configuration>               </plugin>           </plugins>       </build>   </project>   Ahora configuraremos el fichero persistence.5.

CascadeType.                @OneToMany (mappedBy="contacto". 43.hibernate.                private String apellidos. 49.nombre = nombre.persistence. 27.List. 20.hbm2ddl. 05.    import javax. 33.       import java. 46.    import javax. 51.util. 47. 09. 37. 34. 16. 48. 17. 41. 50.show_sql" value="true" />               <property name="hibernate. 07.persistence.    import javax.ElementCollection. 08. 15. 12. 18.orphanRemoval=true. 38.    import javax.        }           public void setNombre(String nombre) {            this.com/tutoriales/tutoriales.FetchType.sun.       @Entity   public class Contacto implements Serializable{           @Id       @GeneratedValue       private Long id.    import java. 28.DerbyDialect"             <property name="hibernate. Página 8 de 25     xmlns:xsi="http://www. 11.                @ElementCollection(fetch=FetchType.Entity.citas. 29. Como en sus sistema de citas: view plain 01.    import javax.        }           public String getApellidos() {            return apellidos.io.cascade=CascadeType.auto" value="create-drop" />           </properties>       </persistence-unit>   </persistence>   Nos creamos nuestras clases del modelo. 36.model.persistence.adictosaltrabajo. 52. 14.        }           public void setApellidos(String apellidos) {            this. 24.Serializable. 04.Contacto</class>           <properties>                          <property name="hibernate.citas.        }           public List<String> getTelefonos() {            return telefonos. 42.           public String getNombre() {            return nombre. 23.fetch=FetchTyp        private List<Cita> citas =new ArrayList<Cita>(0). 32.persistence. 02. 22. 40. 35.HibernatePersistence</provider>                 <jta-data-source>jdbc/citasDatabase</jta-data-source>                   <class>com.autentia.    import javax. 45.persistence.dialect" value="org.Cita</class>           <class>com. 19.persistence. 10.org/2001/XMLSchema-instance"       xsi:schemaLocation="http://java. 30. haciéndolo fácil.autentia. 31.xsd"        version="2.                private String nombre.                   @ElementCollection(fetch=FetchType.    import javax.JEE6. 06.w3.    import java.ejb.dialect. 21.        }    http://www.autentia.php?pagina=jee6 27/07/2010 . 26.model. copy to clipboard print ? package com.OneToMany. 25.LAZY)        private List<String> emails =new ArrayList<String>(0).0">       <persistence-unit name="citas" transaction-type="JTA">           <provider>org.model.PERSIST.hibernate. 44.GeneratedValue. 13.Id. 39.citas.persistence.LAZY)            private List<String> telefonos = new ArrayList<String>(0).util.sun.com/xml/ns/persistence/persistence_2_0.com/xml/ns/persistence         http://java.ArrayList.apellidos = apellidos. 03.

78. 61. 82. 107. 54.php?pagina=jee6 27/07/2010 . 92.contains(email)) {                emails. 86.setContacto(this).        }                public void addCita(Cita cita) {            citas.setContacto(null).add(email). 91.add(cita).            final Contacto other = (Contacto)obj.model. other.            if (getClass() != obj. 90. 79. 110.remove(telefono). 04.contains(email)) {                emails.contains(cita)) {                citas. 65. 56.            }        }                public void removeTelefono(String telefono) {            if(telefonos.             public List<String> getEmails() {            return emails. 59. 104. haciéndolo fácil. 71. 77. 97. 116.            return new EqualsBuilder(). 74.Entity. 66. 88.getClass()) return false. 94. 75.append(nombre). 03. 89.    import javax.        }              public Long getId() {            return id. 101.isEquals().                     }        }                public void removeEmails(String email) {            if(emails.            cita.        }           @Override       public boolean equals(Object obj) {            if (this == obj) return true.                  }        }                public void removeCita(Cita cita) {            if(citas.       import java. 99. 93.remove(email).remove(cita). 96. 64.JEE6. 100. 58.            }        }                public void addEmail(String email) {            if(!emails. 62. 76. 02. 113. 106. 102. 103.append(nombre.Serializable.        }                public void addTelefono(String telefono) {            if(!telefonos.        }            }   view plain 01.io.            if (obj == null) return false.    import java. 111. 55.toHashCode().contains(telefono)) {                telefonos. 115.nombre). 114. 84.append (apellidos. other.Date.                       }        }                @Override       public int hashCode() {            return new HashCodeBuilder(). 53. 73. 80.apellidos).contains(telefono)) {                telefonos. 60.adictosaltrabajo. 109.citas. 69. 85.add(telefono). 87. 95. 68. 72. 112. 81. 105. 67. 05.        }                   public List<Cita> getCitas() {            return citas. 63.append (apellidos). 83. 70. 57.    http://www.                cita. 108.persistence. Página 9 de 25 copy to clipboard print ? package com.util.com/tutoriales/tutoriales. 98.autentia.

34.1: EJB 3. Primero definimos el interfaz del Dao: view plain 01. 33. 07. 30. 14. 37. haciéndolo fácil.php?pagina=jee6 27/07/2010 . EJB QL. 10. No son obligatorios los interfaces locales y remotos en Session Beans Podemos desplegar EJBs en un war.citas. API Estandar para contenedores embebidos. 21.JEE6. Vamos ahora a crearnos un simple Dao para nuestro proyecto de citas con EJBs. 12. 32.. Lo que simplificará bastante nuestras pruebas unitarias de EJBs Por fin. 22.ManyToOne. Página 10 de 25 import javax.persistence.fecha = fecha. empezaremos con el DAO. Llamadas asíncronas a métodos de EJBs por fin.X..asunto = asunto.Interceptores y cosillas así. 16.        }           public Long getId() {            return id. 40. 36. JAX-RPC.. 45.                private String asunto. copy to clipboard print ? package com.. Probaremos algunas de estas cosas a lo largo del tutorial.    import javax. 50. Antes teníamos que montar un circo a través de colas. 49. 18.. 28.       http://www.autentia.        }           public void setAsunto(String asunto) {            this. 24.dao. 31.        }           public Contacto getContacto() {            return contacto. 26.           public String getAsunto() {            return asunto. 09.        }           public Date getFecha() {            return fecha. Esto definitivamente está muy bien. 06.1 La nueva versión de EJB da un salto más hacia la simplicidad. sobre todo la capacidad de scheduling. 08. 43. 38. es decir. 20. para una simple llamada no bloqueante.        }           public void setFecha(Date fecha) {            this. Entre las cosas más interesantes: • • • • • • • • • Se marcan para eliminar: Entity Bean 2.    import javax. 35. 41..GeneratedValue. AOP. mucho más con mucho menos.adictosaltrabajo. 48. pero para eso nos apoyaremos en EJB 3. 02. Estandarización de los nombres JNDI de los EJBs.. 46.        }       }   Una vez creado nuestro modelo. 29. 19.persistence. 39. 11. 25..       @Entity   public class Cita implements Serializable {        @Id       @GeneratedValue       private Long id.        }           void setContacto(Contacto contacto) {            this.                  private Date fecha. 15.persistence.Id. 47. MDBs etc. 13. 42. 27. 44.contacto = contacto.                @ManyToOne       private Contacto contacto..com/tutoriales/tutoriales. 23.el Singleton EJB Se amplía bastante el Timer Service. 17..

Tampoco hemos creado ningún proyecto diferente de tipo ejb o jar. 10.Serializable.NamingException.PersistenceContext.List.citas.    import org.getResultList().util.adictosaltrabajo.dao.createQuery(query).        public void create(T entity).       import java. copy to clipboard print ? package com. Creo el Test y una clase de Utilidades para levantar el contenedor: view plain 01.createQuery("select e from "+entityClass. copy to clipboard print ? package com.    import org. 25.       import java.junit.    import org. 36.List.io. 18. lo implementamos con JPA en un EJB: view plain 01. ni el interfaz ni en la clase @Remote ni @Local ni nada similar.merge(entity).    import java. Es decir.AfterClass. haciéndolo fácil.        }           public T findById(Class<T> entityClass. 13. 31.       @Stateless   public class JPADaoImpl<T> implements Dao<T>{           @PersistenceContext(unitName="citas")        private EntityManager manager.dao.citas.junit.remove(manager. 08. 16.Stateless. 04. 09. 26.    import java.merge(entity)). 34. 06.util. 11. 32.junit.JEE6. Serializable id). 14.io. 38. todo código que se precie debería se acompañado con una o varias pruebas unitarias que certifiquen que la cosa funciona. 12.php?pagina=jee6 27/07/2010 . 05. 22. 23.Calendar.entityClass). 12.persist(entity).        }           public List findByQuery(String query) {            return manager.EntityManager. 09.    }   A continuación.BeforeClass.junit.        public void delete(T entity). el EJB va a estar en el proyecto web.naming. Página 11 de 25 import java. 08.ejb. 29. 08.        public T update(T entity).Serializable. 06. 30. 11. 02.find(entityClass.    import org.    import javax.              }           public T update(T entity) {            return manager. 07. 03. 17. 33. 20.                }           public void delete(T entity) {            manager. 05. 28.persistence.autentia. 07. 21.        public T findById(Class<T> entityClass. 13.    import javax. 02. 24. 35. 06. 03.       public interface  Dao<T> {        public List<T> getAll(Class<T> entityClass).persistence. 37.com/tutoriales/tutoriales. 04. 04. 03.Test. 15. 19.getName() +" as e". 39. Ahora.    import javax. id).getResultList(). 07.    http://www.autentia. Serializable id) {                    return manager.        }           public void create(T entity) {            manager. 05.util. 10.    import javax.           public List<T> getAll(Class<T> entityClass) {            return manager.        public List findByQuery(String query).               }            }   Fijáos que no hemos marcado en ningún momento.Assert. 27.

create(contacto).                contacto.set(Calendar. 18. 17. 67.addEmail("fjmpaez@autentia.getAll(Contacto.. 47. 40. 12.addCita(cita2). Página 12 de 25 import com. 2012). 60. 59.Y usando el nombre             Dao dao =(Dao)Utils. haciéndolo fácil.addEmail("fjmpaez@acme.getTime()).model.com").class).setAsunto("Quedada en el parque con los niños").setNombre("Francisco Javier"). 62.MONTH.addTelefono("620999999").size()==0).lookup("java:global/citas/JPADaoImpl"). 33. 26.ctx. 51.                 cita2.addTelefono("915551111").size()==0). 68.                              Cita cita = new Cita().container==null) {                Utils. 41. 13. 19.            contacto.                    Assert.assertTrue(dao. 36.autentia.getAll(Cita.getAll(Cita. 28.                        // Usamos el contexto JNDI para buscar el EJB.getInstance(). 55. 46.                cal.utils.class).class). 09. 35. 63.            Assert. 72.                contacto. 15.assertTrue(dao.                cita. 42.com/tutoriales/tutoriales. 58. 32.JEE6. 45. 7).                             Cita cita2 = new Cita().        }            }   http://www. 70.            Contacto contacto = (Contacto) dao.size()==2).YEAR.get(0).startContainer().                     cita. 22. 57. 73. 10.adictosaltrabajo.       public class DaoTest {                  @BeforeClass       public static void initTests() throws Exception {                   if(Utils.php?pagina=jee6 27/07/2010 .nomb ()==2).delete(contacto).MONTH. 54.contacto contacto where contacto. 75. 31.Utils.                cal.                                       Assert. 20.autentia.                contacto.                cal. 53. 7). 24.setFecha(cal.class). 23.                        contacto.                        Assert.class).                contacto.setAsunto("Reunión de seguimiento proyecto ACME LA CAMA"). 29.addCita(cita). 37.                contacto.lookup("java:global/citas/JPADaoImpl").                        // El orphans delete entra en juego eliminado las citas            dao. 34.ctx.citas. 74. 39.set(Calendar. 50.model. 76.citas.                                       cal. 14.Cita. 77.getTime()).DAY_OF_MONTH. 21).getAll(Contacto.             }                        @Test       public void deletingAll() throws NamingException {            Dao dao =(Dao)Utils.Contacto.    import com. 2014).. 61. 43. 27.DAY_OF_MONTH. 21.                Calendar cal = Calendar.                                // Persistimos contacto y en cascada se persistirán las citas              dao.                        cita2.set(Calendar.set(Calendar.set(Calendar.                cal. 56.assertTrue(dao. 30.    import com. 38.            }        }                @Test       public void createCita() throws NamingException {                        Contacto contacto = new Contacto(). 71.assertTrue(dao.autentia.                contacto.getAll(Contacto.com").citas.                    Assert.size()==1).YEAR. 25. 64. 49. 48.findByQuery ("select cita from Cita cita inner join cita. 69. 11. 66.set(Calendar.                cal. 21). 52.assertTrue(dao. 65. 44.setApellidos("Martínez Páez"). 16.setFecha(cal.

aas.HashMap. 11.. 16.getContext().xml el datasource de nuestras citas. Os pongo únicamente lo que hay que incluir: view plain copy to clipboard print ? .io.naming. Incluye esto -->     <jdbc-resource pool-name="CitasPool" jndi-name="jdbc/citasDatabase" />      <!-- Nuestro datasource.xml. 26.                 container = EJBContainer.                    ctx=container.autentia.util. 27..1. 13. haciéndolo fácil.create=true" name="connectionAttributes" />   http://www.utils.util.m2\org\glassfish\extras\) Eso es lo que hice yo.                    Map<String.instanceRoot}/lib/databases/ejbtimer" name="databaseNam     <property value=". 03. 24.put(EJBContainer.com/tutoriales/tutoriales.Context. el fichero server.sql.citas. 18. 04.EJBContainer.put(EJBContainer.MODULES. 14.adictosaltrabajo. 02. 29.. 08. Object> properties = new HashMap<String. 22.XADataSource">       <property value="${com.0.             }                        public static void closeContainer() {                   container.. no le déis todavía al test que todavía hemos de configurar unas cosillas.    import java.php?pagina=jee6 27/07/2010 .EmbeddedXADataSource" restype="javax.            // Le decimos donde están los EJBs            properties. y para evitar una excepción.            // Le damos un nombre a la aplicación            properties.close(). 05..createEJBContainer(properties).       import java.       public class Utils {                public static EJBContainer container. 15. 23.File. 17. Página 13 de 25 copy to clipboard print ? package com.Map.    <resources>     <jdbc-resource pool-name="__TimerPool" jndi-name="jdbc/__TimerPool" objecttype="system-admin" />     <jdbc-resource pool-name="DerbyPool" jndi-name="jdbc/__default" />           <!-- Nuestro datasource.        }    }   Esperad.jar (lo tendréis en el repositorio local de maven en [RUTA_REPO]\.policy en las rutas de la imágen: Esos ficheros los podéis obtener de la instalación del glassfish que os habéis descargado o en el fichero: glassfish-embedded-all-3.        public static Context ctx. Para que el embedded container funcione correctamente necesitamos un fichero de configuración llamado domain.derby. Incluye esto -->           <jdbc-connection-pool name="__TimerPool" datasourceclassname="org.sun. view plain 01. 28...ejb. "citas").    import javax.APP_NAME. 30.                  public static void startContainer() throws Exception {                        // Inicializamos el EJB Container. 12. 20. 10.jdbc. new File("target/classes")). 19.. 09.embeddable.    import java. 21. Object>(). 06.apache. 07.    import javax. Ahora debemos configurar en el fichero domain.JEE6. Vosotros tenéis los del ejemplo. 25.

com/tutoriales/tutoriales.apache.managers. se despliegan los ejbs..derby. haciéndolo fácil. Página 14 de 25   </jdbc-connection-pool>     <jdbc-connection-pool is-isolation-levelguaranteed="false" name="DerbyPool" datasourceclassname="org...create=true" />     </jdbc-connection-pool>           <!-- Nuestro connection pool.create=true" name="connectionAttributes" />     </jdbc-connection-pool>             <!-- Nuestro connection pool.apache.citas.DataSource">       <property value="1527" name="PortNumber" />       <property value="APP" name="Password" />       <property value="APP" name="User" />       <property value="localhost" name="serverName" />       <property value="sun-appserv-samples" name="DatabaseName" />       <property value=".Calendar.jdbc.sun. Incluye esto -->            <jdbc-connection-pool datasourceclassname="org.jdbc.       import java.ClientDataSource" restype="javax..dale al botón de probar el DaoTest (con JUnit) .sql.aas.adictosaltrabajo. Incluye esto -->           </resources>   .autentia. Veréis como se levanta el contenedor embebido. 03..   Ahora sí.sql.XADataSource" name="CitasPool">       <property name="databaseName" value="${com.instanceRoot}/lib/databases/default     <property name="connectionAttributes" value=". Vamos a continuar haciendo un poco de negocio..EmbeddedXADataSource" restype="javax.    http://www. Éste nos servirá para probar algunas cosas nuevas: view plain 01.php?pagina=jee6 27/07/2010 . el datasource y se cierra al final del los tests: Y lo mejor es que funciona. Vamos a crearnos un Stateless y le llamaremos CitasManager.JEE6. 02.o bien desde la consola. copy to clipboard print ? package com.util.derby.

04.ejb.ejb.addCita(cita). 68.util.    import javax. 06.HOUR. 08. haciéndolo fácil. 33. 07. 15.                    cal.citas.ejb. new TimerConfig(cita. 27.Asynchronous. 36. 54.autentia.createSingleActionTimer(cal. 73.php?pagina=jee6 27/07/2010 .AsyncResult.Dao.Timeout.ejb. 18. 48.JEE6.class).Stateless.annotation.                    timerService. 16. 37. 58.create(contacto).addCita(cita). 70. 52.setTime(cita.      * @param cita        */       private void crearRecordatorio(Cita cita) {            // No uso DI para buscar el TimerService por problemas en el conten            TimerService timerService = null.citas.Timer.dao. 25. 29. 21. 46.        }                @SuppressWarnings("unchecked")        public Cita getCita(Long id) {            return (Cita) dao.Cita.                @Resource       private SessionContext ctx.getTimerService(). 74. 19. 49.adictosaltrabajo. Cita cita) {            if(contacto.    http://www. 72. 14. 09.    import javax.       @Stateless   public class CitasManager {                @EJB       private Dao dao.            } catch (Exception e) {                            }                        if(timerService!=null) {                Calendar cal = Calendar. 22. 50.        }                public void citarme(Contacto contacto.    import javax. 51. 30.List.TimerConfig. 34. 05.EJB.getInstance(). id).    import javax. 32. 56. 13.    import javax. 10.    import javax. 28.class.    import javax.                }                /**        * Método que crea un Timer de recordatorio de la cita una hora antes    61. 24.                @SuppressWarnings("unchecked")        public List<Cita> getAllCitas() {            return dao. 11.class. id). 57. 40. 60.AroundInvoke. Página 15 de 25 import java.update(contacto).getTime ().ejb.    import java.    import javax.findById(Contacto. 42. 71.                dao.                    cal.com/tutoriales/tutoriales.util. 63.model. 35.ejb.concurrent.    import javax.getFecha()).    import com.ejb. 69. true)).add(Calendar.ejb. 65.            try {                timerService = (TimerService) ctx.    import com.    import javax.interceptor.            }                        crearRecordatorio(cita).getAll(Cita. 75.    import com.Resource. 20. 55. 62.        }                @SuppressWarnings("unchecked")        public Contacto getContacto(Long id) {            return (Contacto) dao. 43. -1). 17. 31.autentia. 39.findById(Cita. 45. 76. 64. 53. 44.ejb. 59.    import javax.                dao.getId()!=null) {                dao.Contacto.model.    import javax. 66.autentia.SessionContext.InvocationContext.            } else {                contacto.                contacto.create(cita).TimerService. 23. 38.Future. 26.interceptor. 47. 41.citas. 67. 12.

109. 135. 127. 83. ni en producción... 94.                        // Ahora enviamos el correo al contacto de la cita y a mi.class). 138. es para probar esto. 142. 131.currentThread().. 81.                    }                /**        * Método asíncrono con respuesta        * @param c        */       @Asynchronous       public Future<Boolean> recuerdaleLaCitaAck(Cita c) {            // No lo hagáis en casa.contacto contacto where contacto. 77. 118.        }                /**        * Este método nos contará lo que tardan las cosas.            } catch (InterruptedException e) {                // TODO Auto-generated catch block                e. 85. 129. 126. ni en producción.printStackTrace().            return new AsyncResult<Boolean>(true). 90.        * @param timer        */       @Timeout       private void sendRecordatorio(Timer timer) {            Cita c = (Cita) timer. 144.. 125. 93. 145. 121. 146. 114..            try {                Thread.. 132.currentThread(). 99.            // Lo siento pero paso de hacer esto. 88. 104. 116.JEE6. 136.        * @param inv        * @return        */       @AroundInvoke   http://www. 89. 140. 95. 103. 105..pero es        }                   @SuppressWarnings("unchecked")        public List<Contacto> getAllContactos() {            return dao. es para probar esto. 97. 92. 122. 108. 139. 106. 86. 117.. 141. 143. 113. 82. 133.            } catch (InterruptedException e) {                // TODO Auto-generated catch block                e.sleep(10000)..sleep(10000). 87. 102. 96.            }                        // Aquí le mandamos un mail.getAll(Contacto..        }                 public List<Cita> getCitasWith(Contacto contacto) {            return dao. 137. 134.printStackTrace(). Página 16 de 25         }        }                /**        * Método de callback del timer.        }                /**        * Método asíncrono sin respuesta        * @param c        */       @Asynchronous       public void recuerdaleLaCita(Cita c) {            // No lo hagáis en casa. 100. 115. 98. 101.getId()).. 130.adictosaltrabajo. 80. 111.            // Y le decimos que OK              // Lo siento pero paso de hacer esto. 123. 107. 120.contacto. 91..            try {                Thread. haciéndolo fácil. 78.            }                        // Aquí le mandamos un mail. 84. 110.getInfo(). 112. 119..com/tutoriales/tutoriales.findByQuery ("select cita from Cita cita inner join cita. 128.. 79. 124.php?pagina=jee6 27/07/2010 .id = 1"                   .

Y usando el nombre             CitasManager manager =(CitasManager)Utils.printStackTrace(). 157.       import java. 40..    import com. 28. 47.             for(Contacto c:contactos) {                dao.println("La invocación a:"+inv. 09.autentia.BeforeClass.model.citas. 29.Cita.            }        }                @SuppressWarnings("unchecked")        @AfterClass       public static void releaseTests() throws Exception {                // Limpiamos la Base de datos para no interferir en otros tests            Dao dao =(Dao)Utils.. 36.            }                   }                @Test       public void createCitas() throws Exception {        //             // Usamos el contexto JNDI para buscar el EJB.                cal.                    System. 23. 147.autentia.citas.List.           http://www. 162. 16.utils.    import java.util. 44.getMethod()+" ha tardado: "+total+" ms").junit. 153.php?pagina=jee6 27/07/2010 .com/tutoriales/tutoriales.currentTimeMillis() - time1.getAll(Contacto. 46.Utils.                } catch (Exception e) {                    // TODO Auto-generated catch block                    e. 24.    import org. 19. 21).set(Calendar.JEE6.Future.autentia.dao.class). 149.lookup ("java:global/citas/CitasManager").    import java. 13.util.    import com. 14.. 7).set(Calendar. 42. 20. 18. 17. 15.            List<Contacto> contactos = dao. 05.junit.    import org.Test.                     cita. 148.ctx.MONTH. 33.out. 38. 25. 155.autentia. 154. 41. 08.AfterClass.setFecha(cal.DAY_OF_MONTH. 39.Dao. 04.citas.adictosaltrabajo.concurrent. 48.       public class CitasManagerTest {                        @BeforeClass       public static void initTests() throws Exception {                   if(Utils. 21.getTime()). 49.    import org.startContainer(). 161.set(Calendar.junit. 10. 150.Calendar.                } finally {                    long total = System.citas. 43. 159.delete(c). 152.citas.                cita. haciéndolo fácil. copy to clipboard print ? package com. 26.junit. 45. view plain 01. 156.autentia. 12.currentTimeMillis(). 31..    import com.    import org.                    return null. 22. 06. 02. 35.                        Cita cita = new Cita().proceed().                Calendar cal = Calendar.Assert. Página 17 de 25     private Object cronometro(InvocationContext inv) {            long time1 = System.ctx. 2014).container==null) {                Utils. 11.setAsunto("Quedada en el parque con los niños").Contacto. 07. 158.util. 27.    import com.lookup("java:global/citas/JPADaoImpl"). 151. 32. 160.                }               }                    }   Ahora haremos un test para probarlo. 03. 37.                cal.getInstance().model.YEAR. 30.getTarget()+">"+inv. 34.managers.                cal.                try {                    return inv.

            Assert.                contacto. 92.adictosaltrabajo.get().                        manager.                         Cita cita2 = new Cita().assertTrue(manager.                        long time3 = System.size()==2). 81. 87. 100. 83.            Assert. 90.size()==1).getAllContactos().com/tutoriales/tutoriales. 63. 61.com").            manager.DAY_OF_MONTH. LO ha debido diseñar Doc el de            long time1 = System.size()==2). haciéndolo fácil. 95. 89.                contacto. los métodos asíncronos.                        Assert.                contacto.: http://www.citarme(contacto.setAsunto("Reunión de seguimiento proyecto ACME LA CAMA"). 58. 74.assertTrue(manager.                  // Hay también una versión con espera activa: futuro. AOP con el @AroundInvoke (mirad las trazas).. 72.php?pagina=jee6 27/07/2010 . 21). 53. 57.currentTimeMillis().                            manager. 7). 73. También he incluido un ejemplo de crear un recordatorio de citas usando Timers.getAllCitas().                        Assert.            Future<Boolean> futuro = manager.currentTimeMillis().size()==1). 64. etc. 86. 62. 85. La ruta (por si no lo encontráis es [RUTA_GLASSFISH] \domains\domain1\config) Una vez hecho esto. ahora tenemos que empezar con la vista. 55.getCitasWith(contacto).set(Calendar.getTime()).assertTrue(manager. 78. 67.size()==1).get (timeout.                        // Ahora se bloquea esperando respuesta.getAllCitas(). 106.set(Calendar. 71.ctx. En esta primera parte únicamente desplegaremos la aplicación en el glassfish y comprobaremos que se despliega bien.            Assert. 93.assertTrue(manager.lookup ("java:global/citas/CitasManager").xml de vuestra instalación tal y cómo lo hemos hecho en el de los tests. 2012). 51.currentTimeMillis(). 50.setNombre("Francisco Javier"). 75.com").YEAR. 76. 96. 52. 68.            Assert. 79..                                    // Probamos cita con contacto ya existente            cal. 91.                contacto. 94. 66.            // A mi esto del futuro me da miedo. 105. 97.addTelefono("620999999"). cita2). 88.ctx. 60. 54.getAllContactos(). Ahora lo ejecuto desde la consola de maven: Bueno. 104.getCitasWith(contacto). 98.        }                @Test(timeout=9000)        public void recuerda1() throws Exception {            CitasManager manager =(CitasManager)Utils.            long time2 = System. 101. 70.JEE6.addEmail("fjmpaez@autentia.addTelefono("915551111"). Seleccionad el servidor glassfish. Antes de eso.lookup ("java:global/citas/CitasManager").                 cita2.assertTrue(manager.MONTH.                        cita2.        }                @Test       public void recuerda2() throws Exception {            CitasManager manager =(CitasManager)Utils. 84.setFecha(cal.recuerdaleLaCitaAck(null).size()==1). cita).assertTrue(result). 69. 77. 103. 99.setApellidos("Martínez Páez").                contacto.assertTrue((time2-time1)< 9000 ).            cal.assertTrue(manager.recuerdaleLaCita(null). 82. 65. basta con agregar nuestra aplicación en la pestaña servers.            Assert.                contacto.set(Calendar. pulsad el botón derecho y ejecutad Add and Remove. 102.assertTrue((time3-time1)>= 10000 ).                    Boolean result = futuro. 59. 56. Página 18 de 25                         Contacto contacto = new Contacto().            cal. unit)             }               }   Ejecutadlo y veréis como todo esto funciona.citarme(contacto. debemos configurar también el datasource en el fichero domain.            Assert.addEmail("fjmpaez@acme.            Assert. 80. la inyección de dependencias con @EJB.

adictosaltrabajo. Soporte nativo para Ajax. aunque supongo que se habrán inspirado en RichFaces) Os recomiendo el tutorial de Alex antes de empezar.. css. No sólo plantillas sino además componentes por composición. Página 19 de 25 Ahora arrancar el servidor pulsando en start: Vamos a comprobar que se ha desplegado bien.php?pagina=jee6 27/07/2010 . adios a los descriptores (o hasta luego. porque yo no me voy a entretener tanto a explicar las cosas: JSF 2 Vamos primero a incluir en el pom.JEE6.. no se eliminan). Desde la consola usaremos las herramientas de administración de glassfish: [RUTA_GLASSFISH]\bin] Ejecutamos: Y comprobamos que nuestra aplicación es: ejb y web.0 + Facelets.com/tutoriales/tutoriales. Ã mbitos nuevos para los controladores (View y Component). es decir. haciéndolo fácil. Hola a nuevas anotaciones. Entre las cosas nuevas de JSF 2: • • • • • Facelets ya forma parte de JSF.) desde el classpath (En wuija hacíamos lo mismo. js . Se incluye un nuevo mecanismo para recuperar recursos (imágenes. Podemos entrar ahora en http://localhost:8080/citas/ y veréis la página que nos creó el arquetipo de maven: Hello World Vamos con la vista Para la vista usaremos evidentemente JSF 2.xml la dependencia a JSF 2 y alguna más: http://www.

05. 07.xml view plain 01. haciéndolo fácil. Allowed values: Production. 09.                 UnitTest.JEE6.faces. 06. 34.com/tutoriales/tutoriales.PROJECT_STAGE</param-name>           <param-value>Development</param-value>       </context-param>               <!-- El servlet front controller de JSF -->       <servlet>           <servlet-name>Faces Servlet</servlet-name>           <servlet-class>javax.php?pagina=jee6 27/07/2010 . 23. 10.com/xml/ns/javaee"              xmlns:xsi="http://www. 16. 02. Este fichero está en resources view plain 01.sun.citas.faces. 05. 13. tal y como lo hicimos para el contenedor embebido. Extension.xsd"        version="2. copy to clipboard print ? <web-app xmlns="http://java.sun. 15.servlet</groupId>               <artifactId>servlet-api</artifactId>               <version>2.0</version>               <scope>provided</scope>                 </dependency>                       <!-- Para el Listener -->           <dependency>               <groupId>javax.autentia.PopulatorListener</listener -class>         </listener>          </web-app>   En el código del listener podréis comprobar que rellena datos si no hay. 03. Default value is Production. 35.            </description>           <param-name>javax. 20.webapp.faces pasar&aacute. 25.l -->       <servlet-mapping>           <servlet-name>Faces Servlet</servlet-name>           <url-pattern>*. 11. Ahora necesitamos el faces-config. 24. Development. 11. SystemTest. 12. 29. view plain 01. 07. 32. 30.com/xml/ns/javaee              http://java.5">       <display-name>Aplicación Web JEE6 de Citas de Paco</display-name>               <!-- Estamos en desarrollo -->       <context-param>           <description>               Define the value returned by Application. 16. 31. 03. copy to clipboard print ?    http://www.5</version>               <scope>provided</scope>           </dependency>              Ahora configuraremos JSF en el web. 08. 27. 13.faces</url-pattern>       </servlet-mapping>               <!-- Nos creamos un Listener que rellene de datos la agenda -->       <listener>           <listener-class>com. 19. 14.org/2001/XMLSchema-instance"            xsi:schemaLocation="http://java.getProjectStage ().adictosaltrabajo.com/xml/ns/javaee/web-app_2_5. 28.. 33. 26. 08.. copy to clipboard Página 20 de 25 print ? <!--  API de JSF 2 -->           <dependency>               <groupId>javax. 15. Recordad que cuando despleguéis la aplicación debemos tener configurado en el servidor el datasource que estamos usando. 12.utils. 17.w3. 21. 18. 09. 10.sun. 14.FacesServlet</servlet-class>           <load-on-startup>1</load-on-startup>       </servlet>          <!- El mapping. por &eacute.xml donde configuraremos el fichero de mensajes i18n. 22. 04. 06. 04. todo lo que acabe en . 02. 36.faces</groupId>               <artifactId>jsf-api</artifactId>               <version>2.

sun. 09. 19.citas. Le llamamos CitasController y le decimos que tiene ámbito de session: view plain 01. 30.autentia. 17.faces.        }                        public List<Contacto> getAllContactos() {                 return mgr. 06.org/2001/XMLSchema-instance"      xsi:schemaLocation="http://java. 43. 15.    import javax.faces. 48. 05.        }    http://www.    import javax. 52.    import com.    import javax. 21. 07. 02.sun.citas.contacto = contacto. 20. 45.autentia. 14.                public List<Cita> getAllCitas() {            return mgr. 33.xhtml". 11. 04. 03.managers. 34. 11.       import java. 39.        }              public void setCita(Cita cita) {            this.model.bean.citas. 15. 51. 22.        }              public String newCita() {            cita = new Cita(). 27.getAllContactos(). 13.autentia.Cita. 23.com/tutoriales/tutoriales. 18. 50.        }           public Contacto getContacto() {            return contacto. 38. 16. 40.com/xml/ns/javaee/web-facesconfig_2_0.    import com.EJB. 02.    import com. 35.citas. 09.com/xml/ns/javaee"      xmlns:xsi="http://www.        }           public void setContacto(Contacto contacto) {            this.com/xml/ns/javaee            http://java. 46. 36. 05. 06.php?pagina=jee6 27/07/2010 .xsd"       version="2. 53. 44. haciéndolo fácil.w3.        }                        public Cita getCita() {            return cita.bean.view. 47.                  @EJB       private CitasManager mgr. 28. 10.                private Contacto contacto.ejb.adictosaltrabajo.Contacto. 03. 08.cita = cita. 31. 24. 29. 49. 41. 16.       @ManagedBean   @SessionScoped   public class CitasController {                private Cita cita.util. 14. 42. 37. copy to clipboard print ? package com.CitasManager.model. 07. 25. 17.0">      <application>      <!-- Configuramos la i18n -->       <locale-config>           <default-locale>es</default-locale>                 </locale-config>       <resource-bundle>           <base-name>messages</base-name>           <var>msg</var>       </resource-bundle>          </application>       </faces-config>   Ahora nos vamos a crear un view helper en formato ManagedBean (que es el apropiado en estos charcos).autentia.sun.SessionScoped. 12.JEE6. 32. 26. 08. 04. Página 21 de 25 <faces-config xmlns="http://java.getAllCitas().ManagedBean.                  return "newCita. 10.List. 12. 13.

allCitas}" var="cita" border="1">                   <h:column>                       <f:facet name="header">                                               #{msg['cita. 56. 36. 55.fecha}" >                           <f:convertDateTime dateStyle="full" />                       </h:outputText>                                       </h:column>                   <h:column>                       <f:facet name="header">                           #{msg['cita. Plantilla maestra que dará estructura a nuestras páginas.xhtml". por estos lares nos sentimos especialmente españoles): http://www. 30.fecha']}                        </f:facet>                       <h:outputText value="#{cita. 17. 39.php?pagina=jee6 27/07/2010 .sun.contacto. copy to clipboard print ? <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1. 02. 05. 08.citarme(contacto.            return "home. 59. 14.asunto}" />                   </h:column>                   <h:column>                       <f:facet name="header">                           #{msg['cita. Será nuestra página de inicio y usará la plantilla anterior. 23.newCita}" value="# {msg['cita. cita).asunto']}                        </f:facet>                       <h:outputText value="#{cita. haciéndolo fácil. 28. 20.org/TR/xhtml1/DTD/xhtml1-transitional.        }            }   Ahora nos creamos nuestras primeras páginas: • /WEB-INF/templates/defaultLayout. Creamos una forma sencilla con cabecera. cuerpo y pie. 11.nombre} # {cita. 22. Página 22 de 25             public String saveCita() {            mgr.new']}" />                           </h:form>       </ui:define>      </ui:composition>   </html>   Si desplegamos la aplicación y navegamos a ella. 24. 09.com/jsf/facelets"       xmlns:h="http://java. 34. 25. 21. es que desde que España ha ganado el mundial.xhtml">            <ui:define name="content">           <h:form>               <h:dataTable id="citas" value="# {citasController.org/1999/xhtml"       xmlns:ui="http://java. 03.adictosaltrabajo. 58. 54. 57. 60. 16.xhtml. 33. 26.w3.JEE6. 31.w3.com/jsf/core">      <ui:composition template="/WEB-INF/templates/defaultLayout. 18. 35.apellidos}" />                                           </h:column>               </h:dataTable>               <h:commandButton action="#{citasController. 06.jsp para apuntar a la home. 27. Os muestro nuestra home: view plain 01.contacto']}                        </f:facet>                       <h:outputText value="#{cita.contacto. 15.xhtml . 19.sun. 38.com/jsf/html"       xmlns:f="http://java. 04.dtd">      <html xmlns="http://www.sun. 12. • /home. 37. • Cambiamos index. 10.com/tutoriales/tutoriales. 13. mostrará: (si. 29. 07. 32.0 Transitional//EN"         "http://www.

13.w3. 12. 11. 02. 16. 05.xhtml">            <ui:define name="content">           <h:form>                <h:panelGrid columns="2">                                <h:outputLabel value="#{msg['cita. 23. 29.nombre} # {contacto.asunto}" required="true"/>                   <h:outputLabel value="#{msg['cita. 20.asunto']}"/>                   <h:inputText value="# {citasController.com/jsf/html"       xmlns:f="http://java. 25. 07.sun.sun. Si pulsamos sobre "Crear una nueva Cita": http://www. haciéndolo fácil. 22. 19.sun. 17.dtd">      <html xmlns="http://www. 03.saveCita}" value="# {msg['cita.com/jsf/core">      <ui:composition template="/WEB-INF/templates/defaultLayout. 08.com/tutoriales/tutoriales. Página 23 de 25 Vamos a continuar creando la página de entrada de una cita: view plain 01. Este converter lo he cogido del tutorial de JSF de Alex que os indicaba arriba.org/TR/xhtml1/DTD/xhtml1-transitional.contacto']}"/>                   <h:selectOneListbox required="true" value="# {citasController. 24.adictosaltrabajo.cita. 28.w3.org/1999/xhtml"       xmlns:ui="http://java. 10. 27.allContactos}" itemLabel="#{contacto. 21.contacto}" converter="selectItemsConverter">                        <f:selectItems  value="# {citasController. 06.cita. 14.com/jsf/facelets"       xmlns:h="http://java. 18. copy to clipboard print ? <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.php?pagina=jee6 27/07/2010 . 15.fecha}" required="true">                            <f:convertDateTime pattern="dd/MM/yyyy HH:mm" />                   </h:inputText>                   <h:outputLabel value="#{msg['cita. 26. 09.0 Transitional//EN"         "http://www.pattern']}"/>                     <h:inputText value="# {citasController.save']}" />                                  </h:form>       </ui:define>      </ui:composition>   </html>    También hemos usado el converter "selectItemsConverter".fecha']} #{msg ['cita.JEE6.apellidos}" var="contacto"/>                                                         </h:selectOneListbox>                         </h:panelGrid>                               <h:commandButton action="#{citasController. 04.

Aunque la cosa es que ya me empieza resultar tentador. Página 24 de 25 Si guardamos: Conclusiones En cuanto a lo visto a JEE6 me gusta lo que va apareciendo. En cuanto al primero he encontrado el problema de la falta de documentación.php?pagina=jee6 27/07/2010 . He encontrado algunos problemas a la hora de usar el contenedor embebido y el plugin de glassfish para eclipse.com/tutoriales/tutoriales.JEE6. Todavía sigo pensando que prefiero usar Hibernate + Spring para el Dao y el negocio que me aportan lo que realmente se necesita para hacer la mayor parte de las aplicaciones Web y me basta un tomcat para desplegarlo. ya que se agiliza bastante el desarrollo. supongo que se irá afinando en futuras versiones del mismo. Anímate y coméntanos lo que pienses sobre este TUTORIAL: Puedes opinar o comentar cualquier sugerencia que quieras comunicarnos sobre este tutorial. haciéndolo fácil.adictosaltrabajo. En cuanto a lo segundo. con tu ayuda.. podemos ofrecerte un mejor servicio.. 5 6 Enviar comentario (Sólo para usuarios registrados) http://www.

com/tutoriales/tutoriales.php?pagina=jee6 27/07/2010 . Página 25 de 25 » Registrate y accede a esta y otras ventajas « COMENTARIOS Esta obra está licenciada bajo licencia Creative Commons de Reconocimiento-No comercial-Sin obras derivadas 2.JEE6.5 Copyright 2003-2010 © All Rights Reserved | Texto Contacto legal y condiciones de uso | Banners | Powered by Autentia | http://www. haciéndolo fácil.adictosaltrabajo.

Sign up to vote on this title
UsefulNot useful