<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-4718168423716602728</id><updated>2011-11-12T06:56:47.538-08:00</updated><category term='Tomcat'/><category term='WebServices'/><category term='JPA'/><category term='Apache Commons'/><category term='iReport'/><category term='Maven'/><category term='Seam'/><category term='Eclipse'/><category term='Jboss'/><category term='jBPM'/><category term='Eventos'/><category term='JSF'/><category term='Utilidades'/><category term='Facelets'/><category term='JSON'/><category term='EJB 3'/><category term='RichFaces'/><title type='text'>Tecnologías Java</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://tecnologiasjava.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4718168423716602728/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://tecnologiasjava.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Paola A. Grajeda</name><uri>http://www.blogger.com/profile/03183842695664105951</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/-yyp-u1Rz7hw/Tc8P46eAvVI/AAAAAAAAAm0/0Aubx8YUTHo/s220/avatar.JPG'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>22</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-4718168423716602728.post-7312748636644091613</id><published>2011-04-21T10:39:00.000-07:00</published><updated>2011-04-21T10:42:35.361-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='EJB 3'/><category scheme='http://www.blogger.com/atom/ns#' term='Eventos'/><category scheme='http://www.blogger.com/atom/ns#' term='WebServices'/><category scheme='http://www.blogger.com/atom/ns#' term='JSF'/><category scheme='http://www.blogger.com/atom/ns#' term='Seam'/><category scheme='http://www.blogger.com/atom/ns#' term='Jboss'/><category scheme='http://www.blogger.com/atom/ns#' term='RichFaces'/><category scheme='http://www.blogger.com/atom/ns#' term='JPA'/><title type='text'>Charla: Desarollo de Aplicaciones JavaEE 5 con Productos JBoss</title><content type='html'>&lt;a href="http://4.bp.blogspot.com/-B5M2hvOZs9g/TbBqM2HuIvI/AAAAAAAAABs/Sko4-2RbbPM/s1600/header_charla_Jboss.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 470px; height: 130px;" src="http://4.bp.blogspot.com/-B5M2hvOZs9g/TbBqM2HuIvI/AAAAAAAAABs/Sko4-2RbbPM/s1600/header_charla_Jboss.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;Epidata Consulting&lt;/b&gt; los invita a participar de la charla &lt;b&gt;"Desarrollo de aplicaciones JavaEE 5 con productos JBoss"&lt;/b&gt;, que tendrá lugar el próximo miércoles 4 de mayo, de 18.30 a 20.30hs en la &lt;b&gt;Facultad de Ingeniería de la UBA (FIUBA)&lt;/b&gt;, sita en Paseo Colón 850.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;La actividad tendrá como objetivo presentar la &lt;b&gt;arquitectura de una aplicación JavaEE tipo y mostrar cuáles son algunos de los componentes, especificaciones y tecnologías que se suelen utilizar en cada capa&lt;/b&gt;. Puntualmente, al hablar de especificaciones se hará hincapié en JavaEE 5 y en cuanto a implementaciones el foco estará puesto en productos de desarrollo de JBoss. La charla será dictada por &lt;b&gt;Adrián Paredes&lt;/b&gt;, arquitecto de software de &lt;b&gt;Epidata Consulting&lt;/b&gt;.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;La charla está dirigida a Desarrolladores Java y a Programadores interesados en esta tecnología, y será de índole conceptual e introductoria.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;h2&gt;Orador&lt;/h2&gt;&lt;b&gt;Ing. Adrián Paredes&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Adrián Paredes es &lt;b&gt;Ingeniero en Informática (FIUBA)&lt;/b&gt; y se desempeña como arquitecto de software y desarrollador en &lt;b&gt;Epidata Consulting&lt;/b&gt;. Cuenta con 3 años de experiencia en proyectos JavaEE. Actualmente se encuentra trabajando en un proyecto de migración de aplicaciones internas de &lt;b&gt;Swiss Medical&lt;/b&gt;, como partner de &lt;b&gt;Red Hat&lt;/b&gt;, utilizando la &lt;b&gt;SOA Platform&lt;/b&gt; de &lt;b&gt;JBoss&lt;/b&gt; y &lt;b&gt;Seam&lt;/b&gt; para las aplicaciones web.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;h2&gt;Detalles&lt;/h2&gt;&lt;div style="text-align: left;"&gt;Miércoles 4 de mayo de 2011&lt;/div&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;18.30 a 20.30 hs&lt;/div&gt;&lt;div style="text-align: left;"&gt;Facultad de Ingeniería de la UBA&lt;/div&gt;&lt;div style="text-align: left;"&gt;Paseo Colón 850, Salón del consejo&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;b&gt;&lt;span class="Apple-style-span"&gt;Capacitación gratuita y abierta al público&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;b&gt;Inscripciones:&lt;/b&gt; &lt;a href="http://bit.ly/e4Bwhl"&gt;http://bit.ly/e4Bwhl&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;Vía: &lt;a href="http://www.epidataconsulting.com/site/pages/noticia/Desarrollo-de-aplicaciones-JEE5-con-JBoss"&gt;http://www.epidataconsulting.com/site/pages/noticia/Desarrollo-de-aplicaciones-JEE5-con-JBoss&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4718168423716602728-7312748636644091613?l=tecnologiasjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tecnologiasjava.blogspot.com/feeds/7312748636644091613/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4718168423716602728&amp;postID=7312748636644091613' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4718168423716602728/posts/default/7312748636644091613'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4718168423716602728/posts/default/7312748636644091613'/><link rel='alternate' type='text/html' href='http://tecnologiasjava.blogspot.com/2011/04/charla-desarollo-de-aplicaciones-javaee.html' title='Charla: Desarollo de Aplicaciones JavaEE 5 con Productos JBoss'/><author><name>Adrián M. Paredes</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-P1c9EUmSSmY/TdXHEG6IUWI/AAAAAAAAAB0/jPPvsvhr5IE/s220/avatar18.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-B5M2hvOZs9g/TbBqM2HuIvI/AAAAAAAAABs/Sko4-2RbbPM/s72-c/header_charla_Jboss.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4718168423716602728.post-5710068418883763372</id><published>2010-02-01T04:47:00.000-08:00</published><updated>2010-02-01T09:35:51.646-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JSON'/><title type='text'>JSON (JavaScript Object Notation)</title><content type='html'>JSON (JavaScript Object Notation) es un formato ligero para el intercambio de datos. Es un subconjunto de la notación literal de objetos de JavaScript. JSON es sencillo de escribir, sencillo de leer, sencillo de manipular, y en la mayoría de los casos es mucho más liviano que XML.&lt;br /&gt;&lt;br /&gt;JSON maneja dos estructuras básicas:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Colección de pares nombre/valor, conocidas en varios lenguajes como Objetos, Registros, Estructuras, Diccionarios, Mapas, Arrays Asociativos&lt;/li&gt;&lt;li&gt;Lista ordenada de valores, conocidas en varios lenguajes como Arrays, Vectores, Listas, Secuencias&lt;/li&gt;&lt;/ul&gt;  Para facilitar la comprensión, llamaremos a las primeras &lt;span style="font-weight: bold;"&gt;Mapas&lt;/span&gt; u &lt;span style="font-weight: bold;"&gt;Objetos&lt;/span&gt;, indistintamente, y a las segundas &lt;span style="font-weight: bold;"&gt;Listas&lt;/span&gt; o &lt;span style="font-weight: bold;"&gt;Arrays&lt;/span&gt;. En Java los Mapas se pueden corresponder con instancias concretas de la clase &lt;span style="font-weight: bold;"&gt;java.util.Map&lt;/span&gt; o con simples &lt;span style="font-weight: bold;"&gt;Java Beans&lt;/span&gt; (objetos Java sin métodos y con setters y getters para cada uno de los atributos). A la vez, las Listas se pueden asociar con instancias concretas de la clase &lt;span style="font-weight: bold;"&gt;java.util.List&lt;/span&gt; o meros &lt;span style="font-weight: bold;"&gt;Arrays&lt;/span&gt; que mantienen ordenados sus elementos.&lt;br /&gt;&lt;br /&gt;En la notación JSON los Mapas comienzan con llave de apertura "{" y terminan con llave de cierre "}". Tanto los Mapas como las Listas son colecciones de elementos. En el primer caso los elementos son pares nombre/valor; en el segundo, solamente valores. Los dos elementos de un par (nombre y valor) están separados por dos puntos ":" y los nombres, o claves para seguir con la terminología de Mapas, siempre tienen que ser del tipo String.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_Q43CNgNBt9Y/S2bN10IIcNI/AAAAAAAAB7g/Dx8phxfnPJs/s1600-h/json_01.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 76px;" src="http://4.bp.blogspot.com/_Q43CNgNBt9Y/S2bN10IIcNI/AAAAAAAAB7g/Dx8phxfnPJs/s400/json_01.jpg" alt="" id="BLOGGER_PHOTO_ID_5433256324878594258" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Las Listas comienzan con corchete de apertura "[" y terminan con corchete de cierre "]" y sus elementos, como mencioné antes, están separados por comas ",".&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_Q43CNgNBt9Y/S2bNzBLxsJI/AAAAAAAAB7Y/yk0Wir8F32Q/s1600-h/json_02.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 76px;" src="http://2.bp.blogspot.com/_Q43CNgNBt9Y/S2bNzBLxsJI/AAAAAAAAB7Y/yk0Wir8F32Q/s400/json_02.jpg" alt="" id="BLOGGER_PHOTO_ID_5433256276843933842" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Por último, los valores pueden ser del tipo string, number, object (Mapa), array (Lista), booleano (true/false) o null.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_Q43CNgNBt9Y/S2bNvfdFjbI/AAAAAAAAB7Q/FLhF0iDRLjg/s1600-h/json_03.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 186px;" src="http://3.bp.blogspot.com/_Q43CNgNBt9Y/S2bNvfdFjbI/AAAAAAAAB7Q/FLhF0iDRLjg/s400/json_03.jpg" alt="" id="BLOGGER_PHOTO_ID_5433256216250125746" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Veamos algunos ejemplos.&lt;br /&gt;&lt;br /&gt;Definamos la clase &lt;span style="font-weight: bold;"&gt;Persona&lt;/span&gt; con sus atributos "nombre", "apellido", "fechaNacimiento", "soltero", "cantHijos":&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="font-weight: bold;"&gt;public class&lt;/span&gt; Persona {&lt;br /&gt;&lt;br /&gt;   &lt;span style="font-weight: bold;"&gt;private&lt;/span&gt; String nombre; &lt;br /&gt;&lt;br /&gt;   &lt;span style="font-weight: bold;"&gt;private&lt;/span&gt; String apellido;  &lt;br /&gt;&lt;br /&gt;   &lt;span style="font-weight: bold;"&gt;private&lt;/span&gt; Date fechaNacimiento;  &lt;br /&gt;&lt;br /&gt;   &lt;span style="font-weight: bold;"&gt;private&lt;/span&gt; Boolean soltero;  &lt;br /&gt;&lt;br /&gt;   &lt;span style="font-weight: bold;"&gt;private&lt;/span&gt; Integer cantHijos;&lt;br /&gt;&lt;br /&gt;   // ... Los setters y getters para cada atributo ...&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;Carguemos un objeto &lt;span style="font-weight: bold;"&gt;Persona&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;   Persona persona = &lt;span style="font-weight: bold;"&gt;new&lt;/span&gt; Persona();&lt;br /&gt;   persona.setNombre("Adrian");&lt;br /&gt;   persona.setApellido("Paredes");     &lt;br /&gt;   persona.setFechaNacimiento(parseDate("03/06/82", "dd/MM/yy"));&lt;br /&gt;   persona.setSoltero(&lt;span style="font-weight: bold;"&gt;false&lt;/span&gt;);&lt;br /&gt;   persona.setCantHijos(0);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Una forma equivalente de guardar este objeto sería en un &lt;span style="font-weight: bold;"&gt;HashMap&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;   Map&lt;string,&gt; persona = &lt;span style="font-weight: bold;"&gt;new&lt;/span&gt; HashMap&lt;string,&gt;();&lt;br /&gt;   persona.put("nombre", "Adrian");&lt;br /&gt;   persona.put("apellido", "Paredes");&lt;br /&gt;   persona.put("fechaNacimiento", parseDate("03/06/82", "dd/MM/yy"));&lt;br /&gt;   persona.put("soltero", false);&lt;br /&gt;   persona.put("cantHijos", 0);&lt;br /&gt;&lt;/string,&gt;&lt;/string,&gt;&lt;/pre&gt;&lt;br /&gt;Dejemos de lado por un momento el campo "fechaNacimiento" y veamos cómo se representaría este Mapa en formato JSON, repito: sin la fecha de nacimiento:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;{&lt;br /&gt;   "nombre" : "Adrian",&lt;br /&gt;   "apellido" : "Paredes",&lt;br /&gt;   "cantHijos" : 0,&lt;br /&gt;   "soltero" : false&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Ahora agreguemos el atributo "fechaNacimiento":&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;{&lt;br /&gt;   "nombre" : "Adrian",&lt;br /&gt;   "apellido" : "Paredes",&lt;br /&gt;   "cantHijos" : 0,&lt;br /&gt;   "soltero" : false,&lt;br /&gt;   "fechaNacimiento" : {&lt;br /&gt;       "year" : 82&lt;br /&gt;       "month" : 5,&lt;br /&gt;       "day" : 4,&lt;br /&gt;       "date" : 3,&lt;br /&gt;       "hours" : 0,&lt;br /&gt;       "minutes" : 0,&lt;br /&gt;       "seconds" : 0,&lt;br /&gt;       "time" : 391921200000,&lt;br /&gt;       "timezoneOffset" : 180,&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;El atributo "fechaNacimiento" es del tipo &lt;span style="font-weight: bold;"&gt;java.util.Date&lt;/span&gt;, por lo tanto, lo que estamos viendo en el JSON es un Mapa dentro del Mapa principal que es Persona. Los campos "year", "month", "day", "date", "hours", "minutes", "seconds", "time" y "timezoneOffset" son los atributos de la clase &lt;span style="font-weight: bold;"&gt;java.util.Date&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Hay algunas bibliotecas de JSON que serializan los objetos &lt;span style="font-weight: bold;"&gt;java.util.Date&lt;/span&gt; de formas más compacta. Estas formas escapan al estándar de JSON. Por ejemplo, &lt;a href="http://jabsorb.org/"&gt;jabsorb&lt;/a&gt;, un broker que sirve como framework liviano para aplicaciones Ajax/Web 2.0, escribiría el JSON de Persona de esta manera:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;{&lt;br /&gt;   "nombre" : "Adrian",&lt;br /&gt;   "apellido" : "Paredes",&lt;br /&gt;   "cantHijos" : 0,&lt;br /&gt;   "soltero" : false,&lt;br /&gt;   "fechaNacimiento" : {&lt;br /&gt;       "javaClass" : "java.util.Date",&lt;br /&gt;       "time" : 391921200000&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Como &lt;span style="font-weight: bold;"&gt;jabsorb&lt;/span&gt; es un broker diseñado para transportar datos a tavés de una red, esta forma de serializar los objetos Date es beneficiosa, ya que suprime la información redundante.&lt;br /&gt;&lt;br /&gt;Para hacer un poco más interesante esta introducción a JSON, vamos a agregarle dos atributos a la clase Persona:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="font-weight: bold;"&gt;   private&lt;/span&gt; Direccion direccion;&lt;br /&gt;&lt;br /&gt;   &lt;span style="font-weight: bold;"&gt;private&lt;/span&gt; List&lt;string&gt; nombreHijos;&lt;br /&gt;&lt;br /&gt;   // Y agregamos los setters y getters...&lt;br /&gt;&lt;/string&gt;&lt;/pre&gt;&lt;br /&gt;La clase &lt;span style="font-weight: bold;"&gt;Direccion&lt;/span&gt; está definida de esta forma:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="font-weight: bold;"&gt;public class&lt;/span&gt; Direccion {&lt;br /&gt;&lt;br /&gt;   &lt;span style="font-weight: bold;"&gt;private&lt;/span&gt; String calle;&lt;br /&gt;&lt;br /&gt;   &lt;span style="font-weight: bold;"&gt;private&lt;/span&gt; Integer numero;&lt;br /&gt;&lt;br /&gt;   // ... Los setters y getters para cada atributo ...&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;Supongamos que la Persona "Adrián Paredes" esta vez sí tiene hijos y tiene tres: "Marco", "Polo" y "Lolita":&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;   Persona persona = &lt;span style="font-weight: bold;"&gt;new&lt;/span&gt; Persona();&lt;br /&gt;   persona.setNombre("Adrian");&lt;br /&gt;   persona.setApellido("Paredes");     &lt;br /&gt;   persona.setFechaNacimiento(parseDate("03/06/82", "dd/MM/yy"));&lt;br /&gt;   persona.setSoltero(&lt;span style="font-weight: bold;"&gt;false&lt;/span&gt;);&lt;br /&gt;   persona.setCantHijos(3);&lt;br /&gt;  &lt;br /&gt;   List&lt;string&gt; nombres = &lt;span style="font-weight: bold;"&gt;new&lt;/span&gt; ArrayList&lt;string&gt;();&lt;br /&gt;   nombres.add("Marco");&lt;br /&gt;   nombres.add("Polo");&lt;br /&gt;   nombres.add("Lolita");&lt;br /&gt;   persona.setNombreHijos(nombres);&lt;br /&gt;  &lt;br /&gt;   Direccion direccion = &lt;span style="font-weight: bold;"&gt;new&lt;/span&gt; Direccion();&lt;br /&gt;   direccion.setCalle("Av. Siempre Viva");&lt;br /&gt;   direccion.setNumero(2012);&lt;br /&gt;   persona.setDireccion(direccion);&lt;br /&gt;&lt;/string&gt;&lt;/string&gt;&lt;/pre&gt;&lt;br /&gt;Lo que en el lenguaje de Mapas y Listas sería:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;   Map&lt;string,&gt; persona = &lt;span style="font-weight: bold;"&gt;new&lt;/span&gt; HashMap&lt;string,&gt;();&lt;br /&gt;   persona.put("nombre", "Adrian");&lt;br /&gt;   persona.put("apellido", "Paredes");&lt;br /&gt;   persona.put("fechaNacimiento", parseDate("03/06/82", "dd/MM/yy"));&lt;br /&gt;   persona.put("soltero", false);&lt;br /&gt;   persona.put("cantHijos", 3);&lt;br /&gt;  &lt;br /&gt;   List&lt;string&gt; nombres = &lt;span style="font-weight: bold;"&gt;new&lt;/span&gt; ArrayList&lt;string&gt;();&lt;br /&gt;   nombres.add("Marco");&lt;br /&gt;   nombres.add("Polo");&lt;br /&gt;   nombres.add("Lolita");&lt;br /&gt;   persona.put("nombreHijos", nombres);&lt;br /&gt;  &lt;br /&gt;   Map&lt;string,&gt; direccion = &lt;span style="font-weight: bold;"&gt;new&lt;/span&gt; HashMap&lt;string,&gt;();&lt;br /&gt;   direccion.put("calle", "Av. Siempre Viva");&lt;br /&gt;   direccion.put("numero", 2012);&lt;br /&gt;   persona.put("direccion", direccion);&lt;br /&gt;&lt;/string,&gt;&lt;/string,&gt;&lt;/string&gt;&lt;/string&gt;&lt;/string,&gt;&lt;/string,&gt;&lt;/pre&gt;&lt;br /&gt;Serializado a JSON este objeto quedaría:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;{&lt;br /&gt;   "nombre" : "Adrian",&lt;br /&gt;   "apellido" : "Paredes",&lt;br /&gt;   "fechaNacimiento" : {&lt;br /&gt;       "year" : 82&lt;br /&gt;       "month" : 5,&lt;br /&gt;       "day" : 4,&lt;br /&gt;       "date" : 3,&lt;br /&gt;       "hours" : 0,&lt;br /&gt;       "minutes" : 0,&lt;br /&gt;       "seconds" : 0,&lt;br /&gt;       "time" : 391921200000,&lt;br /&gt;       "timezoneOffset" : 180,&lt;br /&gt;   },&lt;br /&gt;   "cantHijos" : 3,&lt;br /&gt;   "nombreHijos" : ["Marco", "Polo", "Lolita"],&lt;br /&gt;   "soltero" : false,&lt;br /&gt;   "direccion" : {&lt;br /&gt;       "calle" : "Av. Siempre Viva",&lt;br /&gt;       "numero" : 2012&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;  &lt;h2&gt;JSONLint (Validador de JSON)&lt;br /&gt;&lt;/h2&gt;  &lt;a href="http://www.jsonlint.com/"&gt; JSONLint&lt;/a&gt; es un validador de JSON on-line. Muy útil para cuando queremos verificar si un JSON está bien formado o no. Cuando un JSON es muy grande, la población de llaves y corchetes puede crecer bastante. Si nos olvidamos algún corchete de cierre, alguna llave de apertura, algunas comillas, JSONLint nos indicará en qué línea está el problema, simplemente copiando y pegando la cadena JSON y presionando el botón &lt;span style="font-weight: bold;"&gt;Validate&lt;/span&gt;.&lt;br /&gt;&lt;h2&gt;JSON-lib&lt;br /&gt;&lt;/h2&gt;  Lo más práctico de JSON es que es muy fácil de parsear. Al final de la &lt;a href="http://www.json.org/"&gt;página oficial de JSON&lt;/a&gt; hay una lista de bibliotecas útiles para usar en distintos lenguajes (Java, C#, Delphi, Lisp, Phyton, Ruby, etc). Siendo Java tan popular, hay muchas herramientas que sirven para este lenguaje. Una de ellas es &lt;a href="http://json-lib.sourceforge.net/"&gt;JSON-lib&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;JSON-lib es una poderosa biblioteca que permite transformar Java Beans, Mapas, Colecciones, Arrays y XML a JSON y viceversa. Hasta convierte de JSON a DynaBeans de Apache Commons, si no necesitamos crear una clase. También soporta algunas funcionalidades que no entran dentro del estándar como la serialización y deserialización de funciones JavaScript.&lt;br /&gt;&lt;br /&gt;Usar esta librería es muy fácil. Si estás usando Maven2, la dependencia a incluir es:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;dependency&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;groupId&amp;gt;net.sf.json-lib&amp;lt;/groupId&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;artifactId&amp;gt;json-lib&amp;lt;/artifactId&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;version&amp;gt;2.3&amp;lt;/version&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;classifier&amp;gt;jdk15&amp;lt;/classifier&amp;gt;&lt;br&gt;&amp;lt;dependency&amp;gt;&lt;br&gt;&lt;/pre&gt;&lt;br /&gt;Sino, debes incluir en el classpath estas librerías:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;jakarta commons-lang 2.4&lt;/li&gt;&lt;li&gt;jakarta commons-beanutils 1.7.0&lt;/li&gt;&lt;li&gt;jakarta commons-collections 3.2&lt;/li&gt;&lt;li&gt;jakarta commons-logging 1.1.1&lt;/li&gt;&lt;li&gt;ezmorph 1.0.6&lt;/li&gt;&lt;/ul&gt;  Además del mismo jar de JSON-lib, por supuesto.&lt;br /&gt;&lt;br /&gt;A la hora de parsear una cadena JSON, JSON-lib lo que hace es almacenar los Objetos y los Arrays en Mapas y Listas. Un objeto JSON es volcado en una instancia de la clase &lt;a href="http://json-lib.sourceforge.net/apidocs/jdk15/net/sf/json/JSONObject.html"&gt;JSONObject&lt;/a&gt; y un array JSON a una instancia de la clase &lt;a href="http://json-lib.sourceforge.net/apidocs/jdk15/net/sf/json/JSONArray.html"&gt;JSONArray&lt;/a&gt;. Ambas clases implementan las interfaces &lt;span style="font-weight: bold;"&gt;java.util.Map&lt;/span&gt; y &lt;span style="font-weight: bold;"&gt;java.util.List&lt;/span&gt; respectivamente.&lt;br /&gt;&lt;br /&gt;Pasar de Java Bean, Mapa o Lista a JSONObject es casi trivial. Simplemente usamos el método estático de &lt;span style="font-weight: bold;"&gt;fromObject&lt;/span&gt; de &lt;span style="font-weight: bold;"&gt;JSONObject&lt;/span&gt; o &lt;span style="font-weight: bold;"&gt;JSONArray&lt;/span&gt; según corresponda.&lt;br /&gt;&lt;br /&gt;Por ejemplo, si queremos pasar un objeto &lt;span style="font-weight: bold;"&gt;Persona&lt;/span&gt; a &lt;span style="font-weight: bold;"&gt;JSON&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;   Persona persona = &lt;span style="font-weight: bold;"&gt;new&lt;/span&gt; Persona();&lt;br /&gt;   persona.setNombre("Adrian");&lt;br /&gt;   persona.setApellido("Paredes");&lt;br /&gt;   persona.setFechaNacimiento(parseDate("03/06/82", "dd/MM/yy"));&lt;br /&gt;   persona.setSoltero(&lt;span style="font-weight: bold;"&gt;false&lt;/span&gt;);&lt;br /&gt;   persona.setCantHijos(3);&lt;br /&gt;  &lt;br /&gt;   List&lt;string&gt; nombres = &lt;span style="font-weight: bold;"&gt;new&lt;/span&gt; ArrayList&lt;string&gt;();&lt;br /&gt;   nombres.add("Marco");&lt;br /&gt;   nombres.add("Polo");&lt;br /&gt;   nombres.add("Lolita");&lt;br /&gt;   persona.setNombreHijos(nombres);&lt;br /&gt;  &lt;br /&gt;   Direccion direccion = &lt;span style="font-weight: bold;"&gt;new&lt;/span&gt; Direccion();&lt;br /&gt;   direccion.setCalle("Av. Siempre Viva");&lt;br /&gt;   direccion.setNumero(2012);&lt;br /&gt;   persona.setDireccion(direccion);&lt;br /&gt;&lt;br /&gt;   &lt;span style="font-weight: bold;"&gt;JSONObject jsonObj = JSONObject.fromObject(persona);&lt;/span&gt;&lt;br /&gt;   System.out.println(jsonObj);&lt;br /&gt;&lt;/string&gt;&lt;/string&gt;&lt;/pre&gt;&lt;br /&gt;La salida del &lt;span style="font-weight: bold;"&gt;System.out.println&lt;/span&gt; de este código va a ser sencillamente el string JSON:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;{&lt;br /&gt;   "nombre" : "Adrian",&lt;br /&gt;   "apellido" : "Paredes",&lt;br /&gt;   "fechaNacimiento" : {&lt;br /&gt;       "year" : 82&lt;br /&gt;       "month" : 5,&lt;br /&gt;       "day" : 4,&lt;br /&gt;       "date" : 3,&lt;br /&gt;       "hours" : 0,&lt;br /&gt;       "minutes" : 0,&lt;br /&gt;       "seconds" : 0,&lt;br /&gt;       "time" : 391921200000,&lt;br /&gt;       "timezoneOffset" : 180,&lt;br /&gt;   },&lt;br /&gt;   "cantHijos" : 3,&lt;br /&gt;   "nombreHijos" : ["Marco", "Polo", "Lolita"],&lt;br /&gt;   "soltero" : false,&lt;br /&gt;   "direccion" : {&lt;br /&gt;       "calle" : "Av. Siempre Viva",&lt;br /&gt;       "numero" : 2012&lt;br /&gt;   }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;Esto es así, ya que el objeto &lt;span style="font-weight: bold;"&gt;JSONObject&lt;/span&gt; tiene sobrecargado el &lt;span style="font-weight: bold;"&gt;toString()&lt;/span&gt; para que escupa el mapa en formato JSON. Así de sencillo.&lt;br /&gt;&lt;br /&gt;Si queremos pasar de &lt;span style="font-weight: bold;"&gt;HashMap &lt;/span&gt;a &lt;span style="font-weight: bold;"&gt;JSON&lt;/span&gt;, el código es exactamente igual:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;   Map&lt;string,&gt; persona = &lt;span style="font-weight: bold;"&gt;new&lt;/span&gt; HashMap&lt;string,&gt;();&lt;br /&gt;   persona.put("nombre", "Adrian");&lt;br /&gt;   persona.put("apellido", "Paredes");&lt;br /&gt;   persona.put("fechaNacimiento", parseDate("03/06/82", "dd/MM/yy"));&lt;br /&gt;   persona.put("soltero", false);&lt;br /&gt;   persona.put("cantHijos", 3);&lt;br /&gt;  &lt;br /&gt;   List&lt;string&gt; nombres = &lt;span style="font-weight: bold;"&gt;new&lt;/span&gt; ArrayList&lt;string&gt;();&lt;br /&gt;   nombres.add("Marco");&lt;br /&gt;   nombres.add("Polo");&lt;br /&gt;   nombres.add("Lolita");&lt;br /&gt;   persona.put("nombreHijos", nombres);&lt;br /&gt;  &lt;br /&gt;   Map&lt;string,&gt; direccion = &lt;span style="font-weight: bold;"&gt;new&lt;/span&gt; HashMap&lt;string,&gt;();&lt;br /&gt;   direccion.put("calle", "Av. Siempre Viva");&lt;br /&gt;   direccion.put("numero", 2012);&lt;br /&gt;   persona.put("direccion", direccion);&lt;br /&gt;&lt;br /&gt;   &lt;span style="font-weight: bold;"&gt;JSONObject jsonObj = JSONObject.fromObject(persona);&lt;/span&gt;&lt;br /&gt;   System.out.println(jsonObj);&lt;br /&gt;&lt;/string,&gt;&lt;/string,&gt;&lt;/string&gt;&lt;/string&gt;&lt;/string,&gt;&lt;/string,&gt;&lt;/pre&gt;&lt;br /&gt;El &lt;span style="font-weight: bold;"&gt;fromObject&lt;/span&gt; puede recibir prácticamente cualquier cosa. Ya vimos que podemos mandarle un Bean y un HashMap, cualquier cosa que pueda convertirse en Mapa de JSON. Por supuesto, también puede recibir un String JSON. De esta forma, podemos deserealizar objetos:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;String jsonStringPersona = "{" +&lt;br /&gt;       "\"apellido\":\"Paredes\"," +         &lt;br /&gt;       "\"nombre\":\"Adrian\"," +         &lt;br /&gt;       "\"direccion\":{" +         &lt;br /&gt;           "\"calle\":\"Av. Siempre Viva\"," +         &lt;br /&gt;           "\"numero\":2012" +         &lt;br /&gt;       "}," +         &lt;br /&gt;       "\"soltero\":false," +         &lt;br /&gt;       "\"nombreHijos\":[\"Marco\",\"Polo\",\"Lolita\"]," +         &lt;br /&gt;       "\"cantHijos\":3," +         &lt;br /&gt;       "\"fechaNacimiento\":{" +         &lt;br /&gt;           "\"date\":3," +         &lt;br /&gt;           "\"day\":4," +         &lt;br /&gt;           "\"hours\":0," +         &lt;br /&gt;           "\"minutes\":0," +         &lt;br /&gt;           "\"month\":5," +         &lt;br /&gt;           "\"seconds\":0," +         &lt;br /&gt;           "\"time\":391921200000," +         &lt;br /&gt;           "\"timezoneOffset\":180," +         &lt;br /&gt;           "\"year\":82" +         &lt;br /&gt;       "}" +&lt;br /&gt;   "}";      &lt;br /&gt;&lt;br /&gt;   &lt;span style="font-weight: bold;"&gt;JSONObject jsonPersona = JSONObject.fromObject(jsonStringPersona);&lt;/span&gt;&lt;br /&gt;   String nombre = jsonPersona.getString("nombre");&lt;br /&gt;   String apellido = jsonPersona.getString("apellido");&lt;br /&gt;   JSONObject jsonDireccion = jsonPersona.getJSONObject("direccion");&lt;br /&gt;   String calle = jsonDireccion.getString("calle");&lt;br /&gt;   Integer numero = jsonDireccion.getInt("numero");&lt;br /&gt;   JSONArray jsonArray = jsonPersona.getJSONArray("nombreHijos");&lt;br /&gt;   String hijo1 = jsonArray.getString(0);&lt;br /&gt;   String hijo2 = jsonArray.getString(1);&lt;br /&gt;   String hijo3 = jsonArray.getString(2);&lt;br /&gt;&lt;br /&gt;   System.out.println(nombre + " " + apellido);&lt;br /&gt;   System.out.println("Vive en: " + calle + " " + numero);&lt;br /&gt;   System.out.println("Sus hijos se llaman: " + hijo1 + ", " + hijo2 + " y " + hijo3);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Recordemos que un &lt;span style="font-weight: bold;"&gt;JSONObject&lt;/span&gt; implementa la interfaz &lt;span style="font-weight: bold;"&gt;java.util.Map&lt;/span&gt;, por lo que al levantar el string JSON en un objeto &lt;span style="font-weight: bold;"&gt;JSONObject&lt;/span&gt; ya tenemos un Mapa con el que podemos manipular los datos.&lt;br /&gt;&lt;br /&gt;Si quisiéramos volcar el &lt;span style="font-weight: bold;"&gt;JSONObject&lt;/span&gt; en el Java Bean &lt;span style="font-weight: bold;"&gt;Persona&lt;/span&gt; podríamos hacer:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;Persona persona = (Persona) JSONObject.toBean(jsonPersona, Persona.&lt;span style="font-weight: bold;"&gt;class&lt;/span&gt;);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Si miramos lo que tiene &lt;span style="font-weight: bold;"&gt;persona&lt;/span&gt;, vemos que la deserealización se ha realizado con éxito:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;System.out.println(ReflectionToStringBuilder.toString(persona));&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Otra funcionalidad muy interesante de JSON-lib es que permite pasar de JSON a XML y de XML a JSON. Por ejemplo, si quisiéramos serializar el &lt;span style="font-weight: bold;"&gt;jsonPersona&lt;/span&gt; a XML, tendríamos que hacer:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;XMLSerializer xmlSerializer = &lt;span style="font-weight: bold;"&gt;new&lt;/span&gt; XMLSerializer();&lt;br /&gt;String xml = xmlSerializer.write(jsonPersona);&lt;br /&gt;System.out.println(xml);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Para pasar de XML a JSON es un poco más complicado (tampoco tanto). A quien le interese explorar esta funcionalidad, la documentación de la biblioteca nos recomienda &lt;a href="http://www.xml.com/pub/a/2006/05/31/converting-between-xml-and-json.html"&gt;este tutorial&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Cabe aclarar que para que funcione el &lt;span style="font-weight: bold;"&gt;XMLSerializer&lt;/span&gt; en tiempo de ejecución se necesita una dependencia no mencionada en la documentación y no incluida en el pom.xml de JSON-lib:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;dependency&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;groupId&amp;gt;xom&amp;lt;/groupId&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;artifactId&amp;gt;xom&amp;lt;/artifactId&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;version&amp;gt;1.1&amp;lt;/version&amp;gt;&lt;br&gt;&amp;lt;/dependency&amp;gt;&lt;/pre&gt;&lt;h2&gt;JSON-RPC&lt;/h2&gt;  &lt;a href="http://json-rpc.org/"&gt;JSON-RPC&lt;/a&gt; es un protocolo de llamadas a procedimientos remotos similar a &lt;a href="http://www.xmlrpc.com/"&gt;XML-RPC&lt;/a&gt;, pero más liviano. Como dice la especificación, &lt;span style="font-weight: bold;"&gt;fue diseñado para ser simple&lt;/span&gt;. Se trata de un protocolo para un mecanismo típico de RPC en donde hay un cliente y un servidor que establecen una conexión. El cliente invoca métodos remotos publicados por el servidor enviando un &lt;span style="font-weight: bold;"&gt;request&lt;/span&gt; con el nombre del método y sus parámetros. El servidor contesta con un &lt;span style="font-weight: bold;"&gt;response&lt;/span&gt; que contiene los datos de respuesta. Tanto los request como los response son paquetes HTTP cuyo recurso (información transmitida) son objetos JSON.&lt;br /&gt;&lt;br /&gt;El objeto request contiene tres propiedades:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;method:&lt;/span&gt; un String que contiene el nombre del método a invocar&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;params:&lt;/span&gt; una Lista de Objetos para pasar como argumento del método&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;id:&lt;/span&gt; un identificador que se usa para matchear el request con el response&lt;/li&gt;&lt;/ul&gt;  El objeto response contiene tres propiedades:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;result:&lt;/span&gt; el Objeto resultado que retorna la invocación del método (debe ser nulo si hubo un error en la invocación)&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;error:&lt;/span&gt; un Objeto error que será nulo si no hubo error en la invocación del método&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;id:&lt;/span&gt; el mismo identificador del request&lt;/li&gt;&lt;/ul&gt;  Las &lt;span style="font-weight: bold;"&gt;notificaciones&lt;/span&gt; son peticiones especiales que no reciben una respuesta. El objeto de notificación tiene las mismas dos primeras propiedades que un objeto request (&lt;span style="font-weight: bold;"&gt;method&lt;/span&gt; y &lt;span style="font-weight: bold;"&gt;params&lt;/span&gt;) y la propiedad &lt;span style="font-weight: bold;"&gt;id&lt;/span&gt; debe ser nula.&lt;br /&gt;&lt;br /&gt;Un ejemplo de request podría ser:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;{ "method" : "echo", "params" : ["Hello JSON-RPC"], "id" : 1 }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Lo que equivaldría a la invocación remota:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;service.echo("Hello JSON-RPC")&lt;/pre&gt;&lt;br /&gt;Un ejemplo de response sin error para esta invocación podría ser:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;{ "result" : "Hello JSON-RPC", "error" : null, "id" : 1 }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Un response con error:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;{ "error" : { "message" : "Se ha producido un error de comunicación.", "code" : 15}, "id" : 1 }&lt;br /&gt;&lt;/pre&gt;  &lt;h2&gt;jabsorb (Java to JavaScript Object Request Broker)&lt;br /&gt;&lt;/h2&gt;  &lt;a href="http://jabsorb.org/"&gt;jabsorb&lt;/a&gt; es un framework Ajax/Web 2.0 simple y liviano. Permite realizar llamadas a métodos de objetos Java alojados en un servidor de aplicaciones web desde código JavaScript de forma transparente, como si el código de los objetos residiera en el browser cliente. Encapsula por completo la serialización y deserealización de los objetos y usa como protocolo de transporte el recién mencionado JSON-RPC.&lt;br /&gt;&lt;br /&gt;Lamentablemente parece que la gente que desarrolla este broker nunca subió una distribución al repositorio público de Maven. De todas formas, yo lo he encontrado para bajar en un repositorio de Apache exclusivo del proyecto &lt;a href="http://tuscany.apache.org/"&gt;Apache Tuscany&lt;/a&gt;. Esto sirve para "zafar", pero bajo ningún punto de vista es una solución buena, porque dependemos de que la gente de Apache Tuscany mantenga este servidor y de que si aparece una nueva versión la actualicen. Por otra parte, no veo a la gente de jabsorb con intención de subir la biblioteca a un repositorio de Maven en un futuro cercano, considerando que esto está reportado como bug de prioridad media y continúa abierto desde el 16 de enero de 2008 (&lt;a href="http://issues.jabsorb.org/show_bug.cgi?id=40"&gt;Ver Bug #40&lt;/a&gt;). Así que, para los que usamos Maven, tenemos que conformarnos con descargar la dependencia de algún repositorio de un proyecto público que encontremos o bajar el jar desde la página de jabsorb, a la antigua, y subirlo a un repositorio local que tengamos en nuestra empresa o usarlo directamente del repositorio local de nuestra máquina.&lt;br /&gt;&lt;br /&gt;Si quieren descargar la dependencia desde el repositorio del proyecto Apache Tuscany, pueden agregar el servidor en el &lt;span style="font-weight: bold;"&gt;settings.xml&lt;/span&gt; de Maven:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;repository&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;id&amp;gt;tuscany.apache.org&amp;lt;/id&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;name&amp;gt;Apache Tuscany&amp;lt;/name&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;url&amp;gt;http://svn.apache.org/repos/asf/tuscany/maven&amp;lt;/url&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;layout&amp;gt;default&amp;lt;/layout&amp;gt;&lt;br&gt;&amp;lt;/repository&amp;gt;&lt;br&gt;&lt;/pre&gt;&lt;br /&gt;Y luego agregar la siguiente dependencia en &lt;span style="font-weight: bold;"&gt;pom.xml&lt;/span&gt; del proyecto:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;dependency&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;groupId&amp;gt;org.jabsorb&amp;lt;/groupId&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;artifactId&amp;gt;jabsorb&amp;lt;/artifactId&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;version&amp;gt;1.3.1&amp;lt;/version&amp;gt;&lt;br&gt;&amp;lt;/dependency&amp;gt;&lt;br&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Veamos un ejemplo de uso muy sencillo, así entendemos la potencia de este mecanismo de RPC.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Dado que nuestro objetivo es comunicar código JavaScript que corre del lado del cliente con código Java que corre del lado del servidor, para probar jabsorb tendremos que armar una aplicación web. Si desean crear un proyecto de aplicación web para Eclipse y Tomcat usando un arquetipo de Maven2 y no saben cómo, pueden consultar los post &lt;a href="http://tecnologiasjava.blogspot.com/2008/09/helloservlet-web-application-con-maven2.html"&gt;HelloServlet Web Application con Maven2&lt;/a&gt; y &lt;a href="http://tecnologiasjava.blogspot.com/2008/09/plugin-de-maven2-para-sysdeo.html"&gt;Eclipse y Plugin de Maven2 para Sysdeo&lt;/a&gt; de este mismo blog.&lt;br /&gt;&lt;br /&gt;La biblioteca expone sólo dos componentes: &lt;span style="font-weight: bold;"&gt;JSONRPCBridge&lt;/span&gt; y &lt;span style="font-weight: bold;"&gt;JSONRPCServlet&lt;/span&gt;. Para registrar el &lt;span style="font-weight: bold;"&gt;JSONRPCServlet&lt;/span&gt;, quien maneja las peticiones HTTP, tendremos que agregar el mapeo en el &lt;span style="font-weight: bold;"&gt;web.xml&lt;/span&gt; de la aplicación:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;servlet&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;servlet-name&amp;gt;JSONRPCServlet&amp;lt;/servlet-name&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;servlet-class&amp;gt;org.jabsorb.JSONRPCServlet&amp;lt;/servlet-class&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;init-param&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;param-name&amp;gt;gzip_threshold&amp;lt;/param-name&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;param-value&amp;gt;200&amp;lt;/param-value&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/init-param&amp;gt;&lt;br&gt;&amp;lt;/servlet&amp;gt;&lt;br&gt;&amp;lt;servlet-mapping&amp;gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;servlet-name&amp;gt;JSONRPCServlet&amp;lt;/servlet-name&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;url-pattern&amp;gt;/JSON-RPC&amp;lt;/url-pattern&amp;gt;&lt;br&gt;&amp;lt;/servlet-mapping&amp;gt;&lt;br&gt;&lt;/pre&gt;&lt;br /&gt;El &lt;span style="font-weight: bold;"&gt;JSONRPCBridge&lt;/span&gt; mantiene las referencias a los &lt;span style="font-weight: bold;"&gt;objetos exportados&lt;/span&gt;, los objetos a los que se le pueden ejecutar invocaciones remotas. Tiene como responsabilidad decodificar las llamadas a los métodos, localizar el objeto y realizar la ejecución. Para que una única instancia de &lt;span style="font-weight: bold;"&gt;JSONRPCBridge&lt;/span&gt; esté disponible durante la conexión entre el cliente y el servidor, debemos crearla y guardarla en la sesión del servidor.&lt;br /&gt;&lt;br /&gt;Por ejemplo, si estamos usando JSP para escribir los servlets podemos hacer:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;jsp:useBean id="JSONRPCBridge" scope="session" class="org.jabsorb.JSONRPCBridge" /&amp;gt;&lt;br&gt;&lt;/pre&gt;&lt;br /&gt;Luego, creamos una clase Java bien simple con el código que queremos ejecutar desde JavaScript. Por ejemplo:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="font-weight: bold;"&gt;package &lt;/span&gt;com.blogspot.tecnologiasjava.jarsorb.pruebas;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;br /&gt;public&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;class&lt;/span&gt; Hello {&lt;br /&gt;   &lt;span style="font-weight: bold;"&gt;public&lt;/span&gt; String sayHello(String who) {&lt;br /&gt;       &lt;span style="font-weight: bold;"&gt;return&lt;/span&gt; "hello " + who;&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Luego tendremos que registrar una instancia de la clase &lt;span style="font-weight: bold;"&gt;Hello&lt;/span&gt; en el bridge:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;% JSONRPCBridge.registerObject("hello", hello); %&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Listo. De esta forma tan simple hemos publicado todos los métodos públicos de la clase &lt;span style="font-weight: bold;"&gt;Hello&lt;/span&gt; para que puedan ser ejecutados de forma remota desde un navegador.&lt;br /&gt;&lt;br /&gt;Veamos ahora el código JavaScript necesario para el lado del cliente:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="font-weight: bold;"&gt;var &lt;/span&gt;jsonrpc;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;br /&gt;function&lt;/span&gt; onLoad() {&lt;br /&gt;   jsonrpc = &lt;span style="font-weight: bold;"&gt;new&lt;/span&gt; JSONRpcClient("/JSON-RPC");&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;function&lt;/span&gt; clickHello() {&lt;br /&gt;   &lt;span style="font-weight: bold;"&gt;var&lt;/span&gt; whoNode = document.getElementById("who");&lt;br /&gt;   &lt;span style="font-weight: bold;"&gt;var&lt;/span&gt; result = jsonrpc.hello.sayHello(whoNode.value);&lt;br /&gt;   alert("The server replied: " + result);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Veamos el jsp &lt;span style="font-weight: bold;"&gt;hello.jsp&lt;/span&gt; completo:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;"http://www.w3.org/TR/html4/loose.dtd"&amp;gt;&lt;br&gt;&lt;br&gt;&amp;lt;jsp:useBean id="JSONRPCBridge" scope="session"&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;class="org.jabsorb.JSONRPCBridge"/&amp;gt;&lt;br&gt;&lt;br&gt;&amp;lt;jsp:useBean id="hello" scope="session"&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;class="com.blogspot.tecnologiasjava.jarbsorb.pruebas.Hello"/&amp;gt;&lt;br&gt;&lt;br&gt;&amp;lt;%JSONRPCBridge.registerObject("hello", hello);%&amp;gt;&lt;br&gt;&lt;br&gt;&amp;lt;html&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;head&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;script type="text/javascript" src="jsonrpc.js"&amp;gt;&amp;lt;/script&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;script type="text/javascript" src="hello.js"&amp;gt;&amp;lt;/script&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;title&amp;gt;jabsorb Hello&amp;lt;/title&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/head&amp;gt;&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;body bgcolor="#ffffff" onLoad="onLoad()"&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;h2&amp;gt;jabsorb Hello&amp;lt;/h2&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;p&amp;gt;The jabsorb &amp;lt;em&amp;gt;Hello World&amp;lt;/em&amp;gt; application.&amp;lt;/p&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;p&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;strong&amp;gt;Who:&amp;lt;/strong&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;input type="text" id="who" size="30" value="Adrian"/&amp;gt;&amp;amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;input type="button" value="Say Hello" onclick="clickHello()"/&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/p&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/body&amp;gt;&lt;br&gt;&amp;lt;/html&amp;gt;&lt;br&gt;&lt;/pre&gt;&lt;br /&gt;Si queremos ejecutar este ejemplo, debemos bajarnos el ZIP de la &lt;a href="http://jabsorb.org/Download"&gt;página de descarga de jabsorb&lt;/a&gt;. Este ejemplo de &lt;span style="font-weight: bold;"&gt;Hello&lt;/span&gt; viene dentro. Pero no sólo por eso es importante bajarlo, además necesitamos el cliente JSON-RPC de jabsorb escrito en JavaScript, el archivo &lt;span style="font-weight: bold;"&gt;jsonrpc.js&lt;/span&gt;, que podemos copiar de la carpeta &lt;span style="font-weight: bold;"&gt;webapps/jsonrpc&lt;/span&gt; directo a la carpeta &lt;span style="font-weight: bold;"&gt;webapp&lt;/span&gt; de nuestro proyecto.&lt;br /&gt;&lt;br /&gt;Con los archivos &lt;span style="font-weight: bold;"&gt;hello.js&lt;/span&gt;, &lt;span style="font-weight: bold;"&gt;hello.jsp&lt;/span&gt; y &lt;span style="font-weight: bold;"&gt;jsonrpc.js&lt;/span&gt; en nuestra carpeta &lt;span style="font-weight: bold;"&gt;webapp&lt;/span&gt; y la clase &lt;span style="font-weight: bold;"&gt;Hello.java&lt;/span&gt; en el paquete &lt;span style="font-weight: bold;"&gt;com.blogspot.tecnologiasjava.jarbsorb.pruebas&lt;/span&gt;, estamos listos para levantar el Tomcat (o el servidor de aplicaciones web que tengamos) y, si todo salió bien, cuando hagamos click en el botón de &lt;span style="font-weight: bold;"&gt;Say Hello&lt;/span&gt; del formulario de prueba de &lt;a href="http://localhost:8080/jabsorb_pruebas/hello.jsp"&gt;http://localhost:8080/jabsorb_pruebas/hello.jsp&lt;/a&gt;, el alert nos saludará con el texto &lt;span style="font-weight: bold;"&gt;The server replied: hello Adrian&lt;/span&gt;, o el nombre que hayamos escrito en el input text.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_Q43CNgNBt9Y/S2bNsXNwvNI/AAAAAAAAB7I/CFUxITeZpzk/s1600-h/json_04.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 352px; height: 274px;" src="http://2.bp.blogspot.com/_Q43CNgNBt9Y/S2bNsXNwvNI/AAAAAAAAB7I/CFUxITeZpzk/s400/json_04.JPG" alt="" id="BLOGGER_PHOTO_ID_5433256162498755794" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;La línea más importante para analizar en el código es ésta:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="font-weight: bold;"&gt;var&lt;/span&gt; result = jsonrpc.hello.sayHello(whoNode.value);&lt;/pre&gt;&lt;br /&gt;Aquí es donde toda la magia de &lt;span style="font-weight: bold;"&gt;jabsorb&lt;/span&gt; y &lt;span style="font-weight: bold;"&gt;JSON-RPC&lt;/span&gt; muestra su esplendor. Una línea de código JavaScript que ejecuta un método de una clase Java ubicada en el servidor. Los paquetes JSON-RPC van por debajo, son invisibles para el programador.&lt;br /&gt;&lt;br /&gt;Si nos ponemos a pensar un poco, este mecanismo de RPC transparente que proporciona &lt;span style="font-weight: bold;"&gt;jabsorb&lt;/span&gt; tiene bastantes similitudes con los mecanismos de RPC que proveen otros frameworks bastante más pesados, como por ejemplo &lt;a href="http://tecnologiasjava.blogspot.com/search/label/EJB%203"&gt;EJB3&lt;/a&gt;. Claro que EJB3 es una plataforma y provee muchas más funcionalidades que obviamente JSON-RPC no provee, ni intenta proveer, pero lo asombroso es que, con tan poco y con tanta simpleza, las funcionalidades provistas por &lt;span style="font-weight: bold;"&gt;jabsorb&lt;/span&gt; y otras tecnologías livianas basadas en JSON resultan muy poderosas.&lt;br /&gt;&lt;h2&gt;Referencias&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.json.org/"&gt;http://www.json.org/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.jsonlint.com/"&gt;http://www.jsonlint.com/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://json-lib.sourceforge.net/index.html"&gt;http://json-lib.sourceforge.net/index.html&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://json-rpc.org/"&gt;http://json-rpc.org/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://jabsorb.org/"&gt;http://jabsorb.org/&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4718168423716602728-5710068418883763372?l=tecnologiasjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tecnologiasjava.blogspot.com/feeds/5710068418883763372/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4718168423716602728&amp;postID=5710068418883763372' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4718168423716602728/posts/default/5710068418883763372'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4718168423716602728/posts/default/5710068418883763372'/><link rel='alternate' type='text/html' href='http://tecnologiasjava.blogspot.com/2010/02/json-javascript-object-notation.html' title='JSON (JavaScript Object Notation)'/><author><name>Adrián Paredes</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-rCR9tdvy1zQ/AAAAAAAAAAI/AAAAAAAADik/eHxEpx8CVa0/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_Q43CNgNBt9Y/S2bN10IIcNI/AAAAAAAAB7g/Dx8phxfnPJs/s72-c/json_01.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4718168423716602728.post-4722787103642621457</id><published>2009-11-09T05:15:00.000-08:00</published><updated>2009-11-09T06:22:07.015-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Facelets'/><category scheme='http://www.blogger.com/atom/ns#' term='JSF'/><category scheme='http://www.blogger.com/atom/ns#' term='Tomcat'/><category scheme='http://www.blogger.com/atom/ns#' term='RichFaces'/><title type='text'>JSF 1.2: Los Values de los InputText Number y Boolean que Deberían ser Null</title><content type='html'>Cuando uno define un &lt;span style="font-weight: bold;"&gt;input-text&lt;/span&gt; en JSF (que no es requerido) para un valor que debería ser un Number (Integer, Double, etc) o un Boolean, y al correrlo el usuario lo deja vacío, podemos ver, con desagrado, que el valor de esa variable se ha convertido en &lt;span style="font-weight: bold;"&gt;cero&lt;/span&gt; o &lt;span style="font-weight: bold;"&gt;false&lt;/span&gt;, respectivamente. &lt;span style="font-weight: bold;"&gt;En la mayoría de los casos, este comportamiento no es el deseado cuando estamos trabajando con objetos y no con primitivas.&lt;/span&gt; Queremos que el valor permanezca en &lt;span style="font-weight: bold;"&gt;null&lt;/span&gt; y no que se le asigne un valor incorrecto.&lt;br /&gt;&lt;br /&gt;Aunque cueste creerlo, éste no es realmente un bug de JavaServer Faces directamente, sino del servidor de aplicaciones que se esté usando. A partir de la versión 1.2, JSF utilizará la implementación del ELParser provista por el servidor web para evaluar las expresiones JSF. Por lo tanto, dependiendo del servidor que estén usando puede que nunca se hayan topado con este bug (de hecho el bug es totalmente dependiente de la plataforma en la que se esté corriendo). Este problema es muy común en los Apache Tomcat de la versión 6.0.16 para arriba. (Yo uso la 6.0.20 y me pasa.)&lt;br /&gt;&lt;br /&gt;Para solucionarlo, no se rompan la cabeza destrozando el código, agregando converters horribles que sólo lo van a hacer sentir peores programadores a ustedes, o lo que sea. Si usan Tomcat, basta con agregar este argumento a la Java Virtual Machine (JVM) cuando vayan a ejecutar el startup:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;-Dorg.apache.el.parser.COERCE_TO_ZERO=false&lt;/pre&gt;&lt;br /&gt;(No sé a quién se le pudo ocurrir que por defecto fuera &lt;span style="font-weight: bold;"&gt;true&lt;/span&gt;.)&lt;br /&gt;&lt;br /&gt;Si están levantando el Tomcat desde una consola de Linux, deben agregarle el argumento a la variable &lt;span style="font-weight: bold;"&gt;JAVA_OPTS&lt;/span&gt; en el &lt;span style="font-weight: bold;"&gt;catalina.sh&lt;/span&gt; de la carpeta &lt;span style="font-weight: bold;"&gt;lib&lt;/span&gt;. Por ejemplo, yo tengo:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;if [ -z "$LOGGING_MANAGER" ]; then&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;JAVA_OPTS="$JAVA_OPTS -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Dorg.apache.el.parser.COERCE_TO_ZERO=false"&lt;br /&gt;else&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;JAVA_OPTS="$JAVA_OPTS $LOGGING_MANAGER"&lt;br /&gt;fi&lt;/pre&gt;&lt;br /&gt;Si usan Windows deberán hacer lo mismo con la variable de entorno &lt;span style="font-weight: bold;"&gt;JAVA_OPTS&lt;/span&gt;, pero en el &lt;span style="font-weight: bold;"&gt;catalina.bat&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;IMPORTANTE: Si levantan el Tomcat desde el Eclipse (usando el plugin Sysdeo) tienen que agregarlo como JVM Parameter. Para eso van a Window --&gt; Preferences --&gt; Tomcat --&gt; JVM Settings --&gt; Append to JVM Parameters y escriben&lt;/span&gt;  &lt;span style="font-weight: bold;"&gt;-Dorg.apache.el.parser.COERCE_TO_ZERO=false como indiqué más arriba.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;¡Ya está! Si todo salió bien, la próxima vez que levanten el Tomcat y corran la aplicación, los values de los input-text no agregarán más ceros en los Numbers, ni false en los Booleans.&lt;br /&gt;&lt;br /&gt;------------------------------------------&lt;br /&gt;&lt;a href="http://forums.sun.com/thread.jspa?threadID=5359447"&gt;http://forums.sun.com/thread.jspa?threadID=5359447&lt;/a&gt;&lt;br /&gt;&lt;a href="https://jsp-spec-public.dev.java.net/issues/show_bug.cgi?id=183"&gt;https://jsp-spec-public.dev.java.net/issues/show_bug.cgi?id=183&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4718168423716602728-4722787103642621457?l=tecnologiasjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tecnologiasjava.blogspot.com/feeds/4722787103642621457/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4718168423716602728&amp;postID=4722787103642621457' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4718168423716602728/posts/default/4722787103642621457'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4718168423716602728/posts/default/4722787103642621457'/><link rel='alternate' type='text/html' href='http://tecnologiasjava.blogspot.com/2009/11/jsf-12-los-values-de-los-inputtext.html' title='JSF 1.2: Los Values de los InputText Number y Boolean que Deberían ser Null'/><author><name>Adrián Paredes</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-rCR9tdvy1zQ/AAAAAAAAAAI/AAAAAAAADik/eHxEpx8CVa0/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4718168423716602728.post-4597730960022785596</id><published>2009-08-09T12:12:00.000-07:00</published><updated>2009-08-09T14:40:40.822-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Facelets'/><category scheme='http://www.blogger.com/atom/ns#' term='Eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='Maven'/><category scheme='http://www.blogger.com/atom/ns#' term='Tomcat'/><category scheme='http://www.blogger.com/atom/ns#' term='RichFaces'/><title type='text'>Construir una aplicación Web (JSF, RichFaces y Facelets) con Maven</title><content type='html'>En este post nos proponemos construir una aplicacion web JSF utilizando el arquetipo &lt;span style="font-weight:bold;"&gt;maven-archetype-jsfwebapp&lt;/span&gt; disponible para Maven. En el sitio oficial de RichFaces existe un tutorial para utilizar este arquetipo. Nuestra contribución es realizar algunas modificaciones a la aplicacion resultante para integrar Facelets.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Versiones Utilizadas&lt;/span&gt;&lt;br /&gt;Maven2&lt;br /&gt;Eclipse Ganymede&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Que es un arquetipo?&lt;/span&gt; &lt;span style="font-style: italic;"&gt;Un arquetipo es la plantilla que se utilizara para crear la estructura y archivos base necesarios para obtener un proyecto funcional. En este caso una aplicacion jsf.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Paso 1) Agregar repositorios al archivo settings.xml de Maven&lt;/span&gt;&lt;br /&gt;Agregamos al archivo DIRECTORIO_INSTALACION_MAVEN/conf/settings.xml el siguiente profile que contiene los repositorios de RichFaces.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;   &lt;code&gt;&lt;br /&gt;&lt;font color="#000000"&gt;&amp;lt;profile&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;id&amp;gt;jsf-app-profile&amp;lt;/id&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;repositories&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;repository&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;releases&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;enabled&amp;gt;&lt;/font&gt;&lt;font color="#000000"&gt;true&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;/enabled&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;/releases&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;snapshots&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;enabled&amp;gt;&lt;/font&gt;&lt;font color="#000000"&gt;true&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;/enabled&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;updatePolicy&amp;gt;always&amp;lt;/updatePolicy&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;/snapshots&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;id&amp;gt;snapshots.jboss.org&amp;lt;/id&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;name&amp;gt;Snapshot&amp;nbsp;Jboss&amp;nbsp;Repository&amp;nbsp;for&amp;nbsp;Maven&amp;lt;/name&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;url&amp;gt;http://snapshots.jboss.org/maven2/&amp;lt;/url&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;layout&amp;gt;&lt;/font&gt;&lt;font color="#000000"&gt;default&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;/layout&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;/repository&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;repository&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;releases&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;enabled&amp;gt;&lt;/font&gt;&lt;font color="#000000"&gt;true&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;/enabled&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;/releases&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;snapshots&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;enabled&amp;gt;&lt;/font&gt;&lt;font color="#000000"&gt;true&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;/enabled&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;updatePolicy&amp;gt;always&amp;lt;/updatePolicy&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;/snapshots&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;id&amp;gt;repository.jboss.com&amp;lt;/id&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;name&amp;gt;Jboss&amp;nbsp;Repository&amp;nbsp;for&amp;nbsp;Maven&amp;lt;/name&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;url&amp;gt;http://repository.jboss.com/maven2/&amp;lt;/url&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;layout&amp;gt;&lt;/font&gt;&lt;font color="#000000"&gt;default&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;/layout&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;/repository&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;/repositories&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#000000"&gt;&amp;lt;/profile&amp;gt;&lt;/font&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Paso 2) Agregar el perfil a los perfiles activos&lt;/span&gt;&lt;br /&gt;Para que el perfil que agregamos sea visible para Maven, el tag activeProfiles del settings.xml debe quedar asi:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;    &lt;code&gt;&lt;br /&gt;&lt;font color="#000000"&gt;&amp;lt;activeProfiles&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;activeProfile&amp;gt;jsf-app-profile&amp;lt;/activeProfile&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#000000"&gt;&amp;lt;/activeProfiles&amp;gt;&lt;/font&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Paso 3) Crear el Proyecto&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;En una consola tipeamos:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;&lt;font color="#000000"&gt;mvn&amp;nbsp;archetype:generate&amp;nbsp;-DarchetypeGroupId=org.richfaces.cdk&amp;nbsp;-DarchetypeArtifactId=maven-archetype-jsfwebapp&amp;nbsp;-DarchetypeVersion=&lt;/font&gt;&lt;font color="#990000"&gt;3.3.1&lt;/font&gt;&lt;font color="#000000"&gt;-SNAPSHOT&amp;nbsp;-DgroupId=com.blogspot.tecnologiasjava.controller&amp;nbsp;-DartifactId=AppWeb&lt;/font&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Donde  &lt;span style="font-weight: bold;"&gt;DgroupId&lt;/span&gt; es el package de los Managed Beans y  &lt;span style="font-weight: bold;"&gt;DartifactId&lt;/span&gt; el nombre del proyecto.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Paso 4) Agregar Dependencias&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Con el comando anterior se creo una carpeta llamada AppWeb que contiene la estructura del proyecto. Ahora debemos agregar unas dependencias al pom.xml del proyecto para que compile.&lt;br /&gt;Dentro  del pom.xml  buscamos el tag dependencies, este deberia quedar como:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;dependencies&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;dependency&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;groupId&amp;gt;junit&amp;lt;/groupId&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;artifactId&amp;gt;junit&amp;lt;/artifactId&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;version&amp;gt;&lt;/font&gt;&lt;font color="#990000"&gt;3.8.1&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;/version&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;scope&amp;gt;test&amp;lt;/scope&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;/dependency&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;dependency&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;groupId&amp;gt;javax.servlet&amp;lt;/groupId&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;artifactId&amp;gt;servlet-api&amp;lt;/artifactId&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;version&amp;gt;&lt;/font&gt;&lt;font color="#990000"&gt;2.4&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;/version&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;scope&amp;gt;provided&amp;lt;/scope&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;/dependency&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;dependency&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;groupId&amp;gt;javax.servlet&amp;lt;/groupId&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;artifactId&amp;gt;jsp-api&amp;lt;/artifactId&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;version&amp;gt;&lt;/font&gt;&lt;font color="#990000"&gt;2.0&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;/version&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;scope&amp;gt;provided&amp;lt;/scope&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;/dependency&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;dependency&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;groupId&amp;gt;jstl&amp;lt;/groupId&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;artifactId&amp;gt;jstl&amp;lt;/artifactId&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;version&amp;gt;&lt;/font&gt;&lt;font color="#990000"&gt;1.1.2&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;/version&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;/dependency&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;dependency&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;groupId&amp;gt;javax.servlet.jsp&amp;lt;/groupId&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;artifactId&amp;gt;jsp-api&amp;lt;/artifactId&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;version&amp;gt;&lt;/font&gt;&lt;font color="#990000"&gt;2.1&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;/version&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;scope&amp;gt;provided&amp;lt;/scope&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;/dependency&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;dependency&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;groupId&amp;gt;javax.faces&amp;lt;/groupId&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;artifactId&amp;gt;jsf-api&amp;lt;/artifactId&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;version&amp;gt;&lt;/font&gt;&lt;font color="#990000"&gt;1.2&lt;/font&gt;&lt;font color="#000000"&gt;_12&amp;lt;/version&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;/dependency&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;dependency&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;groupId&amp;gt;javax.faces&amp;lt;/groupId&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;artifactId&amp;gt;jsf-impl&amp;lt;/artifactId&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;version&amp;gt;&lt;/font&gt;&lt;font color="#990000"&gt;1.2&lt;/font&gt;&lt;font color="#000000"&gt;_12&amp;lt;/version&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;/dependency&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;dependency&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;groupId&amp;gt;javax.el&amp;lt;/groupId&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;artifactId&amp;gt;el-api&amp;lt;/artifactId&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;version&amp;gt;&lt;/font&gt;&lt;font color="#990000"&gt;1.0&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;/version&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;scope&amp;gt;provided&amp;lt;/scope&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;/dependency&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;dependency&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;groupId&amp;gt;el-impl&amp;lt;/groupId&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;artifactId&amp;gt;el-impl&amp;lt;/artifactId&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;version&amp;gt;&lt;/font&gt;&lt;font color="#990000"&gt;1.0&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;/version&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;scope&amp;gt;provided&amp;lt;/scope&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;/dependency&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;dependency&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;groupId&amp;gt;javax.annotation&amp;lt;/groupId&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;artifactId&amp;gt;jsr250-api&amp;lt;/artifactId&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;version&amp;gt;&lt;/font&gt;&lt;font color="#990000"&gt;1.0&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;/version&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;/dependency&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;!--&amp;nbsp;RichFaces&amp;nbsp;libraries&amp;nbsp;--&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;dependency&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;groupId&amp;gt;org.richfaces.framework&amp;lt;/groupId&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;artifactId&amp;gt;richfaces-api&amp;lt;/artifactId&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;version&amp;gt;&lt;/font&gt;&lt;font color="#990000"&gt;3.3.1&lt;/font&gt;&lt;font color="#000000"&gt;-SNAPSHOT&amp;lt;/version&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;/dependency&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;dependency&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;groupId&amp;gt;org.richfaces.framework&amp;lt;/groupId&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;artifactId&amp;gt;richfaces-impl&amp;lt;/artifactId&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;version&amp;gt;&lt;/font&gt;&lt;font color="#990000"&gt;3.3.1&lt;/font&gt;&lt;font color="#000000"&gt;-SNAPSHOT&amp;lt;/version&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;/dependency&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;dependency&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;groupId&amp;gt;org.richfaces.ui&amp;lt;/groupId&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;artifactId&amp;gt;richfaces-ui&amp;lt;/artifactId&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;version&amp;gt;&lt;/font&gt;&lt;font color="#990000"&gt;3.3.1&lt;/font&gt;&lt;font color="#000000"&gt;-SNAPSHOT&amp;lt;/version&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;/dependency&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;!--&amp;nbsp;Facelets&amp;nbsp;--&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;dependency&amp;gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;groupId&amp;gt;com.sun.facelets&amp;lt;/groupId&amp;gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;artifactId&amp;gt;jsf-facelets&amp;lt;/artifactId&amp;gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;version&amp;gt;&lt;/font&gt;&lt;font color="#990000"&gt;1.1.14&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;/version&amp;gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;/dependency&amp;gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;/dependencies&amp;gt;&lt;/font&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Paso 5) Compilar, empaquetar e instalar&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Dentro de la carpeta del proyecto ejecutamos el comando &lt;span style="font-weight:bold;"&gt;mvn install&lt;/span&gt; para que el proyecto compile, se empaquete y sea instalado en el repositorio local.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_UD9wqJsJiww/Sn8knWGLRTI/AAAAAAAAAJs/Bi8XKb-XT7Y/s1600-h/tut-mavenjsf-1.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 66px;" src="http://2.bp.blogspot.com/_UD9wqJsJiww/Sn8knWGLRTI/AAAAAAAAAJs/Bi8XKb-XT7Y/s400/tut-mavenjsf-1.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5368049539213903154" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Paso 6) Convertir el proyecto  en un proyecto eclipse&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Ejecutamos el comando &lt;span style="font-weight:bold;"&gt;mvn eclipse:eclipse&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Paso 7)  Convertir el proyecto en un proyecto tomcat&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Ejecutamos el comando &lt;span style="font-weight:bold;"&gt;mvn sysdeo-tomcat:generate&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Paso 8) Incluyendo los jars &lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Ejecutamos el comando &lt;span style="font-weight:bold;"&gt;mvn war:inplace&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Para desplegar la aplicación vamos a utilizar el pluging de Sysdeo Eclipse Tomcat . Lo podes descargar desde &lt;a href="http://www.eclipsetotale.com/tomcatPlugin.html#A3"&gt;http://www.eclipsetotale.com/tomcatPlugin.html#A3&lt;/a&gt;. Se descomprime el zip y se copia la carpeta com.sysdeo.eclipse.tomcat_3.2.1 a la carpeta plugins del Eclipse. Reiniciamos el IDE para que tome los cambios. Ultimo Paso, configurar el tomcat que vamos a utilizar. En el menu Windows/Preferences/Tomcat configuramos el path y la versión de Tomcat &lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_UD9wqJsJiww/Sn8nDoplOhI/AAAAAAAAAJ8/m_2q2-RHR9I/s1600-h/tut-mavenjsf-2.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 278px;" src="http://1.bp.blogspot.com/_UD9wqJsJiww/Sn8nDoplOhI/AAAAAAAAAJ8/m_2q2-RHR9I/s320/tut-mavenjsf-2.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5368052224253835794" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Paso 8) Importar el proyecto en eclipse&lt;/span&gt;&lt;br /&gt;Importamos el proyecto haciendo click en la opción Import... del menú File.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_UD9wqJsJiww/Sn8qFeaIF9I/AAAAAAAAAKM/2zMGmOHMA2g/s1600-h/tut-mavenjsf-4.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 282px;" src="http://3.bp.blogspot.com/_UD9wqJsJiww/Sn8qFeaIF9I/AAAAAAAAAKM/2zMGmOHMA2g/s320/tut-mavenjsf-4.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5368055554399279058" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Hacemos click en Existing Projects into Workspace y seleccionamos la carpeta del proyecto.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_UD9wqJsJiww/Sn8qfQYDkRI/AAAAAAAAAKU/OR0D89Fpvog/s1600-h/tut-mavenjsf-5.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 286px;" src="http://2.bp.blogspot.com/_UD9wqJsJiww/Sn8qfQYDkRI/AAAAAAAAAKU/OR0D89Fpvog/s320/tut-mavenjsf-5.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5368055997309096210" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;&lt;br /&gt;Importante:&lt;/span&gt; Si te falta la variable M2_REPO el proyecto no va a compilar. Para definirla hace click sobre el menu Windows/Preferences/Java/Build Path/Classpath Variables.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_UD9wqJsJiww/Sn8o0liXPZI/AAAAAAAAAKE/Ez94rA0zxQ4/s1600-h/tut-mavenjsf-3.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 167px;" src="http://3.bp.blogspot.com/_UD9wqJsJiww/Sn8o0liXPZI/AAAAAAAAAKE/Ez94rA0zxQ4/s320/tut-mavenjsf-3.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5368054164743470482" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Paso 9) Modificar el web.xml&lt;/span&gt;&lt;br /&gt;Reemplazamos el contenido del web.xml por el siguiente que tiene configurado RichFaces y Facelets&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;    &lt;code&gt;&lt;br /&gt;&lt;font color="#000000"&gt;&amp;lt;?xml&amp;nbsp;version=&lt;/font&gt;&lt;font color="#2a00ff"&gt;&amp;#34;1.0&amp;#34;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;encoding=&lt;/font&gt;&lt;font color="#2a00ff"&gt;&amp;#34;UTF-8&amp;#34;&lt;/font&gt;&lt;font color="#000000"&gt;?&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#000000"&gt;&amp;lt;web-app&amp;nbsp;version=&lt;/font&gt;&lt;font color="#2a00ff"&gt;&amp;#34;2.4&amp;#34;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;xmlns=&lt;/font&gt;&lt;font color="#2a00ff"&gt;&amp;#34;http://java.sun.com/xml/ns/j2ee&amp;#34;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;xmlns:xsi=&lt;/font&gt;&lt;font color="#2a00ff"&gt;&amp;#34;http://www.w3.org/2001/XMLSchema-instance&amp;#34;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;xsi:schemaLocation=&lt;/font&gt;&lt;font color="#2a00ff"&gt;&amp;#34;http://java.sun.com/xml/ns/j2ee&amp;nbsp;http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd&amp;#34;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;display-name&amp;gt;Greeter&amp;lt;/display-name&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;!--&amp;nbsp;AJAX&amp;nbsp;View&amp;nbsp;handlers&amp;nbsp;--&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;context-param&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;param-name&amp;gt;org.ajax4jsf.VIEW_HANDLERS&amp;lt;/param-name&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;param-value&amp;gt;com.sun.facelets.FaceletViewHandler&amp;lt;/param-value&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;/context-param&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;!--&amp;nbsp;Rich&amp;nbsp;Faces&amp;nbsp;--&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;context-param&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;param-name&amp;gt;org.richfaces.SKIN&amp;lt;/param-name&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;param-value&amp;gt;blueSky&amp;lt;/param-value&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;/context-param&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;!--&amp;nbsp;Making&amp;nbsp;the&amp;nbsp;RichFaces&amp;nbsp;skin&amp;nbsp;spread&amp;nbsp;to&amp;nbsp;standard&amp;nbsp;HTML&amp;nbsp;controls&amp;nbsp;--&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;context-param&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;param-name&amp;gt;org.richfaces.CONTROL_SKINNING&amp;lt;/param-name&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;param-value&amp;gt;enable&amp;lt;/param-value&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;/context-param&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;context-param&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;param-name&amp;gt;javax.faces.STATE_SAVING_METHOD&amp;lt;/param-name&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;param-value&amp;gt;server&amp;lt;/param-value&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;/context-param&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;!--&amp;nbsp;Faces&amp;nbsp;Servlet&amp;nbsp;--&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;context-param&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;param-name&amp;gt;javax.faces.DEFAULT_SUFFIX&amp;lt;/param-name&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;param-value&amp;gt;.xhtml&amp;lt;/param-value&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;/context-param&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;filter&amp;gt;&amp;nbsp;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;display-name&amp;gt;RichFaces&amp;nbsp;Filter&amp;lt;/display-name&amp;gt;&amp;nbsp;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;filter-name&amp;gt;richfaces&amp;lt;/filter-name&amp;gt;&amp;nbsp;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;filter-class&lt;/font&gt;&lt;font color="#000000"&gt;&amp;gt;org.ajax4jsf.Filter&amp;lt;/filter-class&lt;/font&gt;&lt;font color="#000000"&gt;&amp;gt;&amp;nbsp;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;init-param&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;param-name&amp;gt;createTempFiles&amp;lt;/param-name&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;param-value&amp;gt;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;false&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;/param-value&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;/init-param&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;init-param&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;param-name&amp;gt;maxRequestSize&amp;lt;/param-name&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;param-value&amp;gt;&lt;/font&gt;&lt;font color="#990000"&gt;1000000&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;/param-value&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;/init-param&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;/filter&amp;gt;&amp;nbsp;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;filter-mapping&amp;gt;&amp;nbsp;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;filter-name&amp;gt;richfaces&amp;lt;/filter-name&amp;gt;&amp;nbsp;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;servlet-name&amp;gt;Faces&amp;nbsp;Servlet&amp;lt;/servlet-name&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;dispatcher&amp;gt;REQUEST&amp;lt;/dispatcher&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;dispatcher&amp;gt;FORWARD&amp;lt;/dispatcher&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;dispatcher&amp;gt;INCLUDE&amp;lt;/dispatcher&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;/filter-mapping&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;listener&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;listener-&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;class&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;gt;com.sun.faces.config.ConfigureListener&amp;lt;/listener-class&lt;/font&gt;&lt;font color="#000000"&gt;&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;/listener&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;servlet&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;servlet-name&amp;gt;Faces&amp;nbsp;Servlet&amp;lt;/servlet-name&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;servlet-class&lt;/font&gt;&lt;font color="#000000"&gt;&amp;gt;javax.faces.webapp.FacesServlet&amp;lt;/servlet-class&lt;/font&gt;&lt;font color="#000000"&gt;&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;load-on-startup&amp;gt;&lt;/font&gt;&lt;font color="#990000"&gt;1&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;/load-on-startup&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;/servlet&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;!--&amp;nbsp;Faces&amp;nbsp;Servlet&amp;nbsp;Mapping&amp;nbsp;--&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;servlet-mapping&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;servlet-name&amp;gt;Faces&amp;nbsp;Servlet&amp;lt;/servlet-name&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;url-pattern&amp;gt;*.xhtml&amp;lt;/url-pattern&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;/servlet-mapping&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;welcome-file-list&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;welcome-file&amp;gt;index.xhtml&amp;lt;/welcome-file&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;/welcome-file-list&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;/web-app&amp;gt;&lt;/font&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Paso 10) Crear template.xhtml&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Este archivo sera la base para todas las páginas de la aplicación web. Incluimos un peque;o menu y definimos el tag ui:include  que nos permitira incluir dentro de esta plantilla lo que definamos dentro del campo ui:define name="body" de los otros archivos.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;font color="#000000"&gt;&amp;lt;!DOCTYPE&amp;nbsp;html&amp;nbsp;PUBLIC&amp;nbsp;&lt;/font&gt;&lt;font color="#2a00ff"&gt;&amp;#34;-//W3C//DTD&amp;nbsp;XHTML&amp;nbsp;1.0&amp;nbsp;Transitional//EN&amp;#34;&amp;nbsp;&amp;nbsp;&amp;#34;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&amp;#34;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#000000"&gt;&amp;lt;html&amp;nbsp;xmlns=&lt;/font&gt;&lt;font color="#2a00ff"&gt;&amp;#34;http://www.w3.org/1999/xhtml&amp;#34;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;xmlns:ui=&lt;/font&gt;&lt;font color="#2a00ff"&gt;&amp;#34;http://java.sun.com/jsf/facelets&amp;#34;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;xmlns:h=&lt;/font&gt;&lt;font color="#2a00ff"&gt;&amp;#34;http://java.sun.com/jsf/html&amp;#34;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;xmlns:f=&lt;/font&gt;&lt;font color="#2a00ff"&gt;&amp;#34;http://java.sun.com/jsf/core&amp;#34;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;xmlns:a4j=&lt;/font&gt;&lt;font color="#2a00ff"&gt;&amp;#34;http://richfaces.org/a4j&amp;#34;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;xmlns:rich=&lt;/font&gt;&lt;font color="#2a00ff"&gt;&amp;#34;http://richfaces.org/rich&amp;#34;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#000000"&gt;&amp;lt;head&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#000000"&gt;&amp;lt;title&amp;gt;&amp;lt;h:outputText&amp;nbsp;value=&lt;/font&gt;&lt;font color="#2a00ff"&gt;&amp;#34;aplicacion&amp;nbsp;JSF&amp;#34;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;/&amp;gt;&amp;lt;/title&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#000000"&gt;&amp;lt;meta&amp;nbsp;http-equiv=&lt;/font&gt;&lt;font color="#2a00ff"&gt;&amp;#34;Content-Type&amp;#34;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;content=&lt;/font&gt;&lt;font color="#2a00ff"&gt;&amp;#34;text/html;&amp;nbsp;charset=iso-8859-1&amp;#34;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;/&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#000000"&gt;&amp;lt;/head&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#000000"&gt;&amp;lt;body&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#000000"&gt;&amp;lt;f:view&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;a4j:form&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;rich:toolBar&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;rich:dropDownMenu&amp;nbsp;value=&lt;/font&gt;&lt;font color="#2a00ff"&gt;&amp;#34;Productos&amp;#34;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;rich:menuItem&amp;nbsp;submitMode=&lt;/font&gt;&lt;font color="#2a00ff"&gt;&amp;#34;none&amp;#34;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;h:outputLink&amp;nbsp;value=&lt;/font&gt;&lt;font color="#2a00ff"&gt;&amp;#34;listar-productos.xhtml&amp;#34;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;h:outputText&amp;nbsp;value=&lt;/font&gt;&lt;font color="#2a00ff"&gt;&amp;#34;Listar&amp;nbsp;Productos&amp;#34;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;/&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;/h:outputLink&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;/rich:menuItem&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;/rich:dropDownMenu&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;/rich:toolBar&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;/a4j:form&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;rich:spacer&amp;nbsp;height=&lt;/font&gt;&lt;font color="#2a00ff"&gt;&amp;#34;20&amp;#34;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;/&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#000000"&gt;&amp;lt;/f:view&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#000000"&gt;&amp;lt;p&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;ui:insert&amp;nbsp;name=&lt;/font&gt;&lt;font color="#2a00ff"&gt;&amp;#34;body&amp;#34;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;/&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#000000"&gt;&amp;lt;/p&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#000000"&gt;&amp;lt;/body&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#000000"&gt;&amp;lt;/html&amp;gt;&lt;/font&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Paso 11) Reescribimos el index.xhtml&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;  &lt;code&gt;&lt;br /&gt;&lt;font color="#000000"&gt;&amp;lt;!DOCTYPE&amp;nbsp;html&amp;nbsp;PUBLIC&amp;nbsp;&lt;/font&gt;&lt;font color="#2a00ff"&gt;&amp;#34;-//W3C//DTD&amp;nbsp;XHTML&amp;nbsp;1.0&amp;nbsp;Transitional//EN&amp;#34;&amp;nbsp;&amp;#34;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&amp;#34;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#000000"&gt;&amp;lt;html&amp;nbsp;xmlns=&lt;/font&gt;&lt;font color="#2a00ff"&gt;&amp;#34;http://www.w3.org/1999/xhtml&amp;#34;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;xmlns:ui=&lt;/font&gt;&lt;font color="#2a00ff"&gt;&amp;#34;http://java.sun.com/jsf/facelets&amp;#34;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;xmlns:h=&lt;/font&gt;&lt;font color="#2a00ff"&gt;&amp;#34;http://java.sun.com/jsf/html&amp;#34;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;xmlns:f=&lt;/font&gt;&lt;font color="#2a00ff"&gt;&amp;#34;http://java.sun.com/jsf/core&amp;#34;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;xmlns:s=&lt;/font&gt;&lt;font color="#2a00ff"&gt;&amp;#34;http://jboss.com/products/seam/taglib&amp;#34;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;xmlns:rich=&lt;/font&gt;&lt;font color="#2a00ff"&gt;&amp;#34;http://richfaces.org/rich&amp;#34;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#000000"&gt;&amp;lt;body&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#000000"&gt;&amp;lt;ui:composition&amp;nbsp;template=&lt;/font&gt;&lt;font color="#2a00ff"&gt;&amp;#34;/template.xhtml&amp;#34;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;ui:define&amp;nbsp;name=&lt;/font&gt;&lt;font color="#2a00ff"&gt;&amp;#34;body&amp;#34;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;/ui:define&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#000000"&gt;&amp;lt;/ui:composition&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#000000"&gt;&amp;lt;/body&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#000000"&gt;&amp;lt;/html&amp;gt;&lt;/font&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Paso 12) Más Páginas&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Agregamos otra página que es utilizada por el menú definido en el template.xhtml llamada listar-productos.xhmtl&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;  &lt;code&gt;&lt;br /&gt;&lt;font color="#000000"&gt;&amp;lt;!DOCTYPE&amp;nbsp;html&amp;nbsp;PUBLIC&amp;nbsp;&lt;/font&gt;&lt;font color="#2a00ff"&gt;&amp;#34;-//W3C//DTD&amp;nbsp;XHTML&amp;nbsp;1.0&amp;nbsp;Transitional//EN&amp;#34;&amp;nbsp;&amp;#34;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&amp;#34;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#000000"&gt;&amp;lt;html&amp;nbsp;xmlns=&lt;/font&gt;&lt;font color="#2a00ff"&gt;&amp;#34;http://www.w3.org/1999/xhtml&amp;#34;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;xmlns:ui=&lt;/font&gt;&lt;font color="#2a00ff"&gt;&amp;#34;http://java.sun.com/jsf/facelets&amp;#34;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;xmlns:h=&lt;/font&gt;&lt;font color="#2a00ff"&gt;&amp;#34;http://java.sun.com/jsf/html&amp;#34;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;xmlns:f=&lt;/font&gt;&lt;font color="#2a00ff"&gt;&amp;#34;http://java.sun.com/jsf/core&amp;#34;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;xmlns:s=&lt;/font&gt;&lt;font color="#2a00ff"&gt;&amp;#34;http://jboss.com/products/seam/taglib&amp;#34;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;xmlns:rich=&lt;/font&gt;&lt;font color="#2a00ff"&gt;&amp;#34;http://richfaces.org/rich&amp;#34;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#000000"&gt;&amp;lt;body&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#000000"&gt;&amp;lt;ui:composition&amp;nbsp;template=&lt;/font&gt;&lt;font color="#2a00ff"&gt;&amp;#34;/template.xhtml&amp;#34;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;ui:define&amp;nbsp;name=&lt;/font&gt;&lt;font color="#2a00ff"&gt;&amp;#34;body&amp;#34;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;h:outputText&amp;nbsp;value=&lt;/font&gt;&lt;font color="#2a00ff"&gt;&amp;#34;Productos&amp;#34;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;/&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;/ui:define&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#000000"&gt;&amp;lt;/ui:composition&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#000000"&gt;&amp;lt;/body&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#000000"&gt;&amp;lt;/html&amp;gt;&lt;/font&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;&lt;br /&gt;Paso 13) Actualizar el contexto del tomcat&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Para que el tomcat despliegue la aplicación, debemos actualizar el contexto del mismo. Abrimos el menú contextual del proyecto y hacemos click sobre la opción Tomcat Project/Update context definition&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_UD9wqJsJiww/Sn8vkIMN-gI/AAAAAAAAAKc/uCPUDOtjJF8/s1600-h/tut-mavenjsf-6.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 89px;" src="http://3.bp.blogspot.com/_UD9wqJsJiww/Sn8vkIMN-gI/AAAAAAAAAKc/uCPUDOtjJF8/s400/tut-mavenjsf-6.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5368061578569447938" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;&lt;span style="font-weight:bold;"&gt;Importante:&lt;/span&gt; Para no tener problemas de librerías tenemos que deshabilitar el DevLoader, en otro post hablaremos de esta funcionalidad. En el menú contextual del proyecto buscamos la opción Properties. Dentro de la ventana Properties hacemos click en Tomcat.&lt;br /&gt;Una de las tres pestañas se llama DevLoader Classpath. En esta pestaña desactivar el checkbox.&lt;br /&gt;&lt;/span&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_UD9wqJsJiww/Sn8xbhKKWNI/AAAAAAAAAKk/HYtVDWJfs3w/s1600-h/tut-mavenjsf-7.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 168px;" src="http://2.bp.blogspot.com/_UD9wqJsJiww/Sn8xbhKKWNI/AAAAAAAAAKk/HYtVDWJfs3w/s400/tut-mavenjsf-7.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5368063629676140754" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Paso 14) Desplegar la aplicación&lt;br /&gt;&lt;/span&gt;Hacemos click sobre el icono del tomcat para levantarlo. &lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_UD9wqJsJiww/Sn8yGr1kWNI/AAAAAAAAAKs/ngHeYbzeEpI/s1600-h/tut-mavenjsf-8.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 202px; height: 79px;" src="http://4.bp.blogspot.com/_UD9wqJsJiww/Sn8yGr1kWNI/AAAAAAAAAKs/ngHeYbzeEpI/s400/tut-mavenjsf-8.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5368064371276929234" /&gt;&lt;/a&gt;&lt;br /&gt;Abrimos un navegador y tipeamos http:localhost:8008/AppWeb, si todo salio bien deberíamos ver nuesta aplicación, ahora un poco vacia.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_UD9wqJsJiww/Sn8zHgf2ObI/AAAAAAAAAK8/_aCXKRNbmfk/s1600-h/tut-mavenjsf-9.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 101px;" src="http://2.bp.blogspot.com/_UD9wqJsJiww/Sn8zHgf2ObI/AAAAAAAAAK8/_aCXKRNbmfk/s320/tut-mavenjsf-9.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5368065484924533170" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4718168423716602728-4597730960022785596?l=tecnologiasjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tecnologiasjava.blogspot.com/feeds/4597730960022785596/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4718168423716602728&amp;postID=4597730960022785596' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4718168423716602728/posts/default/4597730960022785596'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4718168423716602728/posts/default/4597730960022785596'/><link rel='alternate' type='text/html' href='http://tecnologiasjava.blogspot.com/2009/08/construir-una-aplicacion-web-jsf_09.html' title='Construir una aplicación Web (JSF, RichFaces y Facelets) con Maven'/><author><name>Paola A. Grajeda</name><uri>http://www.blogger.com/profile/03183842695664105951</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/-yyp-u1Rz7hw/Tc8P46eAvVI/AAAAAAAAAm0/0Aubx8YUTHo/s220/avatar.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_UD9wqJsJiww/Sn8knWGLRTI/AAAAAAAAAJs/Bi8XKb-XT7Y/s72-c/tut-mavenjsf-1.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4718168423716602728.post-4782009377239711222</id><published>2009-06-24T10:58:00.000-07:00</published><updated>2009-06-24T11:38:01.651-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Eclipse'/><title type='text'>Eclipse Galileo</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_Q43CNgNBt9Y/SkJpezm-wwI/AAAAAAAABRE/2ZdAhrEQI4Q/s1600-h/galileologo.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 247px;" src="http://2.bp.blogspot.com/_Q43CNgNBt9Y/SkJpezm-wwI/AAAAAAAABRE/2ZdAhrEQI4Q/s400/galileologo.png" alt="" id="BLOGGER_PHOTO_ID_5350955285240267522" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Ha salido una nueva versión del IDE más popular del mundo: Eclipse 3.5. La noticia fue anunciada hoy mismo por la &lt;span style="font-style: italic;"&gt;Eclipse Foundation&lt;/span&gt; y nosotros nos hemos enterado por esta nota en &lt;a href="http://www.infoq.com/"&gt;InfoQ&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;"The Eclipse Foundation today &lt;/span&gt;&lt;a style="font-style: italic;" href="http://www.eclipse.org/org/press-release/20090624_galileo.php"&gt;announced the release&lt;/a&gt;&lt;span style="font-style: italic;"&gt; of &lt;/span&gt;&lt;a style="font-style: italic;" href="http://www.eclipse.org/galileo/"&gt;Eclipse Galileo&lt;/a&gt;&lt;span style="font-style: italic;"&gt;, the simultaneous release of &lt;/span&gt;&lt;a style="font-style: italic;" href="http://www.eclipse.org/galileo/projects.php"&gt;33 projects&lt;/a&gt;&lt;span style="font-style: italic;"&gt;, including the venerable Eclipse &lt;/span&gt;&lt;a style="font-style: italic;" href="http://www.eclipse.org/jdt/"&gt;JDT&lt;/a&gt;&lt;span style="font-style: italic;"&gt;. As well as the &lt;/span&gt;&lt;a style="font-style: italic;" href="http://www.infoq.com/news/2009/06/galileo"&gt;new features covered by InfoQ already&lt;/a&gt;&lt;span style="font-style: italic;"&gt;, the Galileo release includes the &lt;/span&gt;&lt;a style="font-style: italic;" href="http://www.eclipse.org/pdt/"&gt;PHP Development Tools Project&lt;/a&gt;&lt;span style="font-style: italic;"&gt;, as well as stalwarts like &lt;/span&gt;&lt;a style="font-style: italic;" href="http://www.eclipse.org/modeling/"&gt;modelling packages&lt;/a&gt;&lt;span style="font-style: italic;"&gt; and the persistence layer &lt;/span&gt;&lt;a style="font-style: italic;" href="http://www.eclipse.org/eclipselink/"&gt;EclipseLink&lt;/a&gt;&lt;span style="font-style: italic;"&gt; (formerly known as Oracle's TopLink).&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic;"&gt;For component developers, the Galileo release also adds the latest OSGi Declarative Services to the standard &lt;/span&gt;&lt;a style="font-style: italic;" href="http://www.eclipse.org/equinox/"&gt;Equinox&lt;/a&gt;&lt;span style="font-style: italic;"&gt; runtime, which is included in the &lt;/span&gt;&lt;a style="font-style: italic;" href="http://www.infoq.com/news/2009/06/www.eclipse.org/rcp/"&gt;RCP&lt;/a&gt;&lt;span style="font-style: italic;"&gt; client. The Mac OS X runtime is also given a boost, as the new Eclipse is based on Cocoa (rather than the older Carbon based APIs) which give new features such as dialog sheets as well as a 64-bit version capable of running on the latest Intel 64-bit Java 6.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Despite originally been known by its namesake Java IDE, the Eclipse platform has grown far beyond its humble beginnings and provides the basis of many languages (&lt;/span&gt;&lt;a style="font-style: italic;" href="http://www.eclipse.org/cdt/"&gt;C&lt;/a&gt;&lt;span style="font-style: italic;"&gt;, &lt;/span&gt;&lt;a style="font-style: italic;" href="http://www.eclipse.org/pdt/"&gt;PHP&lt;/a&gt;&lt;span style="font-style: italic;"&gt;, &lt;/span&gt;&lt;a style="font-style: italic;" href="http://www.eclipse.org/webtools/"&gt;HTML, JavaScript&lt;/a&gt;&lt;span style="font-style: italic;"&gt;, and other &lt;/span&gt;&lt;a style="font-style: italic;" href="http://www.eclipse.org/dltk/"&gt;Dynamic languages&lt;/a&gt;&lt;span style="font-style: italic;"&gt;, not to mention other IDEs developed outside of the Eclipse Foundation like &lt;/span&gt;&lt;a style="font-style: italic;" href="http://www.scala-lang.org/node/94"&gt;Scala&lt;/a&gt;&lt;span style="font-style: italic;"&gt; and &lt;/span&gt;&lt;a style="font-style: italic;" href="http://pydev.sourceforge.net/"&gt;Python&lt;/a&gt;&lt;span style="font-style: italic;"&gt;). The &lt;/span&gt;&lt;a style="font-style: italic;" href="http://www.eclipse.org/rt/"&gt;Eclipse Runtime&lt;/a&gt;&lt;span style="font-style: italic;"&gt; project provides not only the base Equinox OSGi runtime, but also generic communication framework &lt;/span&gt;&lt;a style="font-style: italic;" href="http://www.eclipse.org/ecf"&gt;ECF&lt;/a&gt;&lt;span style="font-style: italic;"&gt;, which is used by the update mechanism &lt;/span&gt;&lt;a style="font-style: italic;" href="http://wiki.eclipse.org/Equinox_p2"&gt;P2&lt;/a&gt;&lt;span style="font-style: italic;"&gt; to download bundles from HTTP (or other services like &lt;/span&gt;&lt;a style="font-style: italic;" href="http://www.eclipse.org/downloads/?tab=torrents"&gt;Bitorrent&lt;/a&gt;&lt;span style="font-style: italic;"&gt; or &lt;/span&gt;&lt;a style="font-style: italic;" href="http://eclipsesource.com/blogs/2009/06/15/google-wave-and-ecf/"&gt;in future&lt;/a&gt;&lt;span style="font-style: italic;"&gt; communicate with services like &lt;/span&gt;&lt;a style="font-style: italic;" href="http://www.waveprotocol.org/"&gt;Google Wave&lt;/a&gt;&lt;span style="font-style: italic;"&gt;).&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;a style="font-style: italic;" href="http://eclipsesource.com/blogs/author/irbull/"&gt;Ian Bull&lt;/a&gt;&lt;span style="font-style: italic;"&gt; of &lt;/span&gt;&lt;a style="font-style: italic;" href="http://eclipsesource.com/"&gt;EclipseSource&lt;/a&gt;&lt;span style="font-style: italic;"&gt; has been publishing a top ten feature list:&lt;/span&gt; &lt;ol style="font-style: italic;"&gt;&lt;li&gt;&lt;a href="http://eclipsesource.com/blogs/2009/06/24/eclipse-galileo-feature-top-10-list-number-1/"&gt;P2 provisioning&lt;/a&gt; which provides for a more efficient update process for Eclipse&lt;/li&gt;&lt;li&gt;&lt;a href="http://eclipsesource.com/blogs/2009/06/23/eclipse-galileo-feature-top-10-list-number-2/"&gt;OSGi Declarative Services&lt;/a&gt;, which allow OSGi services to be configured and installed based on XML prior to the start of the bundle's service&lt;/li&gt;&lt;li&gt;&lt;a href="http://eclipsesource.com/blogs/2009/06/22/eclipse-galileo-feature-top-10-list-number-3/"&gt;Improved target platform management&lt;/a&gt;, which allows the runtime platform to be configured easier&lt;/li&gt;&lt;li&gt;&lt;a href="http://eclipsesource.com/blogs/2009/06/21/eclipse-galileo-feature-top-10-list-number-4/"&gt;Mylyn WikiText&lt;/a&gt;, which can be used to edit bugs via Mylyn or transform into other documentation formats like DocBook&lt;/li&gt;&lt;li&gt;&lt;a href="http://eclipsesource.com/blogs/2009/06/20/eclipse-galileo-feature-top-10-list-number-5/"&gt;The addition of the Eclipse Memory Analyser&lt;/a&gt;, which can analyse the JVM's heap usage&lt;/li&gt;&lt;li&gt;&lt;a href="http://eclipsesource.com/blogs/2009/06/19/eclipse-galileo-feature-top-10-list-number-6/"&gt;Install into Self&lt;/a&gt;, which allows plugins to be developed and installed into the currently running Eclipse platform&lt;/li&gt;&lt;li&gt;&lt;a href="http://eclipsesource.com/blogs/2009/06/18/eclipse-galileo-feature-top-10-list-number-7/"&gt;Eclipse Modeling Project refinements&lt;/a&gt;, which reduces the size of the EMF runtime requirements&lt;/li&gt;&lt;li&gt;&lt;a href="http://eclipsesource.com/blogs/2009/06/17/eclipse-galileo-feature-top-10-list-number-8/"&gt;Improved RAP styles&lt;/a&gt; to allow your RAP based application to be customised&lt;/li&gt;&lt;li&gt;&lt;a href="http://eclipsesource.com/blogs/2009/06/16/eclipse-galileo-feature-top-10-list-number-9/"&gt;Enhanced JAvaScript bridge&lt;/a&gt;, which allows embedding of widgets like Google Maps into an SWT browser&lt;/li&gt;&lt;li&gt;&lt;a href="http://eclipsesource.com/blogs/2009/06/16/eclipse35-my-top-10-list-number-10/"&gt;Java compare editor enhancements&lt;/a&gt; which allow JavaDoc hovers, hyperlinking and other goodness from the compare page&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;&lt;span style="font-style: italic;"&gt;A number of presentations on  &lt;/span&gt;&lt;a style="font-style: italic;" href="http://www.eclipse.org/galileo/galileoinaction.php"&gt;Galileo in action&lt;/a&gt;&lt;span style="font-style: italic;"&gt; are being organised for June 26, as well as a number of &lt;/span&gt;&lt;a style="font-style: italic;" href="http://wiki.eclipse.org/Eclipse_DemoCamps_Galileo_2009"&gt;DemoCamps&lt;/a&gt;&lt;span style="font-style: italic;"&gt; across the globe, demonstrating new features."&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Fuente: &lt;a href="http://www.infoq.com/news/2009/06/eclipse-galileo-released"&gt;http://www.infoq.com/news/2009/06/eclipse-galileo-released&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4718168423716602728-4782009377239711222?l=tecnologiasjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tecnologiasjava.blogspot.com/feeds/4782009377239711222/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4718168423716602728&amp;postID=4782009377239711222' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4718168423716602728/posts/default/4782009377239711222'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4718168423716602728/posts/default/4782009377239711222'/><link rel='alternate' type='text/html' href='http://tecnologiasjava.blogspot.com/2009/06/eclipse-galileo.html' title='Eclipse Galileo'/><author><name>Adrián Paredes</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-rCR9tdvy1zQ/AAAAAAAAAAI/AAAAAAAADik/eHxEpx8CVa0/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_Q43CNgNBt9Y/SkJpezm-wwI/AAAAAAAABRE/2ZdAhrEQI4Q/s72-c/galileologo.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4718168423716602728.post-6639197120480686764</id><published>2009-04-23T13:40:00.000-07:00</published><updated>2009-04-23T13:48:01.295-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='EJB 3'/><title type='text'>El Futuro de Java EE: EJB 3.1</title><content type='html'>La especificación Java EE 6 está por quedar terminada, y la mayoría de las tecnologías que abarca están llegando a su versión final, todo con altas expectativas. &lt;span style="font-weight: bold;"&gt;Definitivamente 2009 va a ser un año importante para Java EE.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Muchas características y nuevas oportunidades surgen con EJB 3.1. EJB 3.1 le permite a los arquitectos y a los desarrolladores contar con un conjunto rico de nuevas funcionalidades, permitiendo extender la cantidad de desafíos que puede cubrir esta tecnología. Esta nueva versión demuestra mucha madurez, y hará que Java tenga una posición más sólida que nunca en el lado del servidor.&lt;br /&gt;&lt;br /&gt;Algunas de las mejoras y nuevos features que EJB 3.1 especifica son:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Vistas sin interfaz:&lt;/span&gt; SessionBeans sin necesidad de escribir interfaz. Una Vista expone todos los métodos públicos de un bean de la misma forma que en EJB 3.0 lo hacía una interfaz Local o Remota.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Singleton Session Beans:&lt;/span&gt; Ahora hay tres tipos de Session Beans: stateless, stateful y singleton. Los nuevos SessionBeans son Singletons que se instancian una única vez por aplicación y se comparten entre todos los clientes, permitiendo que el contenedor maneje su ciclo de vida y los accesos concurrentes.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Invocaciones asincrónicas:&lt;/span&gt; Usando &lt;span style="font-style: italic;"&gt;@Asynchronous&lt;/span&gt; y la interfaz Future&lt;v&gt; de Java5, puede utilizarse en todos los tipos de beans, en todas las vistas. Puede aplicarse a un método o a una clase.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Nombres JNDI globales:&lt;/span&gt; La especificación ahora define nombres JNDI globales para registrar a los EJB. ¡Ahora tenemos nombres JNDI portables! En EJB 3.0 los nombres JNDI son específicos de cada contenedor.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Timer-Service:&lt;/span&gt; Posibilidad de agregar Timers declarativos, con anotaciones o descriptores (hasta ahora la interfaz &lt;span style="font-style: italic;"&gt;TimerService&lt;/span&gt; sólo era programática).&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;EJB Lite:&lt;/span&gt; Sub-conjunto estándar de EJB para aplicaciones que no necesitan del conjunto completo del API.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Empaquetado de EJB simplificado:&lt;/span&gt; EJB 3.1 permite empaquetar EJBs dentro de un archivo war.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Contenedores EJB embebibles:&lt;/span&gt; Un cliente Java SE ahora puede instanciar un contenedor EJB (clase &lt;span style="font-style: italic;"&gt;EJBContainer&lt;/span&gt;) que se ejecuta dentro de su propia JVM y classloader. Este contenedor embebible provee un conjunto básico de servicios (EJB Lite) que le permiten al cliente beneficiarse del uso de EJBs sin necesitar de un contenedor Java EE.&lt;/li&gt;&lt;/ul&gt;Todo esto lo saqué de este excelente artículo publicado hoy mismo por &lt;span style="font-weight: bold;"&gt;Leonardo De Seta&lt;/span&gt; en &lt;a href="http://www.dosideas.com/"&gt;DosIdeas&lt;/a&gt; y en español:&lt;br /&gt;&lt;a href="http://www.dosideas.com/java/528-ejb-31-un-paso-importante-hacia-la-madurez.html"&gt;http://www.dosideas.com/java/528-ejb-31-un-paso-importante-hacia-la-madurez.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;En el artículo se explica cada uno de los features con detalle y se muestran varios ejemplos. &lt;span style="font-weight: bold;"&gt;Es altamente recomendable.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;El artículo está basado en el artículo:&lt;br /&gt;&lt;a href="http://www.theserverside.com/tt/articles/article.tss?l=EJB3-1Maturity"&gt;http://www.theserverside.com/tt/articles/article.tss?l=EJB3-1Maturity&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Me enteré de este post, a través de javaHispano:&lt;br /&gt;&lt;a href="http://www.javahispano.org/contenidos/es/lo_nuevo_en_ejb_3_1/?utm_source=feed&amp;amp;utm_medium=feed&amp;amp;utm_campaign=feed"&gt;http://www.javahispano.org/contenidos/es/lo_nuevo_en_ejb_3_1/?utm_source=feed&amp;amp;utm_medium=feed&amp;amp;utm_campaign=feed&lt;br /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4718168423716602728-6639197120480686764?l=tecnologiasjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tecnologiasjava.blogspot.com/feeds/6639197120480686764/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4718168423716602728&amp;postID=6639197120480686764' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4718168423716602728/posts/default/6639197120480686764'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4718168423716602728/posts/default/6639197120480686764'/><link rel='alternate' type='text/html' href='http://tecnologiasjava.blogspot.com/2009/04/el-futuro-de-java-ee-ejb-31.html' title='El Futuro de Java EE: EJB 3.1'/><author><name>Adrián Paredes</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-rCR9tdvy1zQ/AAAAAAAAAAI/AAAAAAAADik/eHxEpx8CVa0/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4718168423716602728.post-461548456414182499</id><published>2009-03-08T09:18:00.000-07:00</published><updated>2009-03-08T09:42:22.636-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Apache Commons'/><title type='text'>Apache Commons. Api BeanUtils</title><content type='html'>&lt;span style="font-weight: bold;"&gt;Links &lt;/span&gt;&lt;br /&gt;&lt;a href="http://commons.apache.org/"&gt;http://commons.apache.org/&lt;br /&gt;&lt;/a&gt;&lt;a href="http://commons.apache.org/lang/"&gt;&lt;/a&gt;&lt;a href="http://commons.apache.org/beanutils/"&gt;http://commons.apache.org/beanutils/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://oreilly.com/catalog/9780596007065/"&gt;http://oreilly.com/catalog/9780596007065/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://commons.apache.org/beanutils/v1.8.0/apidocs/index.html"&gt;http://commons.apache.org/beanutils/v1.8.0/apidocs/index.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Que harían si tuvieran que copiar las propiedades de un objeto a otro? Opción 1: Ejecutar getters y setters para cada propiedad del objeto. Opción 2: Utilizar reflection para crear un método genérico que sirva para copiar objetos de cualquier clase.&lt;br /&gt;&lt;br /&gt;La segunda opción resulta mas apropiada, ya que podríamos encapsularlo en una clase Util para utilizarlo en nuestros proyectos. Sin embargo.. esta api existe, y es BeanUtils.&lt;br /&gt;&lt;br /&gt;Que condiciones deben cumplir los objetos que serán "procesados" utilizando con esta api? Los mismos que un JavaBean, deben tener un constructor sin argumentos y sus propiedades deben ser accesibles mediante métodos get y set que siguen una convención de nomenclatura estándar.&lt;br /&gt;&lt;br /&gt;Claramente BeanUtils ofrece mayores utilidades que la de copiar un bean, también permite clonarlos, invocar métodos de forma dinámica, crear beans dinámicos en runtime, etc... para implementar todas utilidades, BeanUtils hace uso de la api reflections.&lt;br /&gt;&lt;br /&gt;Una aclaración importante de las utilidades copiar y clonar, es que si el objeto a copiar/clonar referencia a otro objeto, entonces cuando se quiera copiar esta propiedad, solo se creara una referencia al mismo objeto.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Copiar las propiedades de un bean a otro bean de la misma clase&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Por ejemplo si tenemos la clase Person&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;package &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;com.blogspot.tecnologiasjava;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;import &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;org.apache.commons.lang.builder.ReflectionToStringBuilder;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;public class &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Person &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;  &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;  &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;private &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;String name;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;  &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;private &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;int &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;age;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;  &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;private &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Date birthDay;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;  &lt;/span&gt;&lt;span style="color: rgb(63, 95, 191);"&gt;/** Omito los getter/setters para mayor legibilidad */&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;  &lt;/span&gt;&lt;span style="color: rgb(100, 100, 100);"&gt;@Override&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;  &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;public &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;String toString&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;() {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;    &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;return &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;ReflectionToStringBuilder.toString&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;  &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;Y el siguiente test&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;public class &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Test &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;   &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;public static &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;void &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;main&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;String&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;[] &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;args&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;) &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;throws &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;IllegalAccessException, InvocationTargetException &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;     &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;       &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Person personOne = &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;new &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Person&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;()&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;       &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Person personTwo = &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;new &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Person&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;()&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;     &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;       &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;personOne.setName&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(42, 0, 255);"&gt;"Adrian"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;       &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;personOne.setAge&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(153, 0, 0);"&gt;26&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;       &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;personOne.setBirthDay&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;new &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Date&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;())&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;       &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;BeanUtils.copyProperties&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;personTwo, personOne&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;       &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;System.out.println&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(42, 0, 255);"&gt;"PersonOne: "&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;+personOne&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;       &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;System.out.println&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(42, 0, 255);"&gt;"PersonTwo: "&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;+personTwo&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;   &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Lo que obtenemos como resultado, es que las propiedades de PersonOne se copiaron en PersonTwo, por eso tenemos la siguiente salida.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;PersonOne: com.blogspot.tecnologiasjava.model.Person@16897b2[name=Adrian,age=26,birthDay=Sun Mar 08 13:22:03 ARST 2009]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;PersonTwo: com.blogspot.tecnologiasjava.model.Person@a401c2[name=Adrian,age=26,birthDay=Sun Mar 08 13:22:03 ARST 2009]&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Copiar las propiedades de un bean a otro bean de otra clase.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;En este caso cabe aclarar que solo se copian las propiedades que tengan en común los dos objetos, aca no estoy hablando de herencia, solo digo que si una clase X y otra clase Y tienen color como atributo en comun, entonces ese es el atributo que se copiara.&lt;br /&gt;&lt;br /&gt;Por ejemplo, sumamos a nuestro modelo la clase Alien&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;public class &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Alien&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;   &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;private &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;String name;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;   &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;private &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;int &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;age;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;   &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;public &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;String color;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;  &lt;/span&gt;&lt;span style="color: rgb(63, 95, 191);"&gt;/** Omito los getter/setters para mayor legibilidad */&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;   &lt;/span&gt;&lt;span style="color: rgb(100, 100, 100);"&gt;@Override&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;   &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;public &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;String toString&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;() {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;       &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;return &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;ReflectionToStringBuilder.toString&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;   &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Como podemos ver, la clase Alien tiene en común con la clase Person los atributos &lt;span style="font-weight: bold;"&gt;name&lt;/span&gt; y &lt;span style="font-weight: bold;"&gt;age&lt;/span&gt;. Entonces, si ejecutamos el siguiente test.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;public class &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Test &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;  &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;public static &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;void &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;main&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;String&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;[] &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;args&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;) &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;throws &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;IllegalAccessException, InvocationTargetException &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;   &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;      &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Person person = &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;new &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Person&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;()&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;      &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Alien alien = &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;new &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Alien&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;()&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;   &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;      &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;person.setName&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(42, 0, 255);"&gt;"Adrian"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;      &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;person.setAge&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(153, 0, 0);"&gt;26&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;      &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;person.setBirthDay&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;new &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Date&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;())&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;      &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;BeanUtils.copyProperties&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;alien, person&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;      &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;System.out.println&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(42, 0, 255);"&gt;"person: "&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;+person&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;      &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;System.out.println&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(42, 0, 255);"&gt;"alien: "&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;+alien&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;  &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Obtenemos como resultado&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;person: com.blogspot.tecnologiasjava.model.Person@16f8cd0[name=Adrian,age=26,birthDay=Sun Mar 08 13:30:28 ARST 2009]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;alien: com.blogspot.tecnologiasjava.model.Alien@15fea60[name=Adrian,age=26,color=&lt;null&gt;&lt;/null&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;]&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Aca podemos ver que los atributos en común fueron copiados del objeto origen al objeto destino, mientras que color que era propio de la clase &lt;span style="font-weight: bold;"&gt;Alien&lt;/span&gt; quedo en null.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Clonar beans&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;En este caso tenemos la restricción que el objeto clonado va a ser un objeto de la misma clase que el objeto que se desea clonar.&lt;br /&gt;&lt;br /&gt;Por ejemplo, si ejecutamos el siguiente test&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;public class &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Test &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;  &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;public static &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;void &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;main&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;String&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;[] &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;args&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;) &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;throws &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;IllegalAccessException, InstantiationException, InvocationTargetException, NoSuchMethodException &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;   &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;      &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Person person = &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;new &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Person&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;()&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;      &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;person.setName&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(42, 0, 255);"&gt;"Adrian"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;      &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;person.setAge&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(153, 0, 0);"&gt;26&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;      &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;person.setBirthDay&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;new &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Date&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;())&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;   &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;      &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Person clone = &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Person&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;BeanUtils.cloneBean&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;person&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;      &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;System.out.println&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(42, 0, 255);"&gt;"person: "&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;+person&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;      &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;System.out.println&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(42, 0, 255);"&gt;"clone: "&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;+clone&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;  &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;Obtenemos en consola:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;person: com.blogspot.tecnologiasjava.model.Person@55571e[name=Adrian,age=26,birthDay=Sun Mar 08 13:36:10 ARST 2009]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;clone: com.blogspot.tecnologiasjava.model.Person@1201a25[name=Adrian,age=26,birthDay=Sun Mar 08 13:36:10 ARST 2009]&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Como pueden ver, la dirección de memoria del objeto clonado es distinta a la del objeto original.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Crear un bean dinámico en Runtime&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;En ocasiones quizá no queramos llenar nuestro código con clases que solo serán utilizadas una vez, y a la cual no le vemos cabida en nuestro modelo de datos.  En estos casos y seguramente en muchos mas, tendrán la necesidad de crear una clase dinámicamente. Por ejemplo, crearemos un dinamic bean similar a nuestra clase &lt;span style="font-weight: bold;"&gt;Person&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;public class &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Test &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;  &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;public static &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;void &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;main&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;String&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;[] &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;args&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;) &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;throws &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;IllegalAccessException, InstantiationException &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;   &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;      &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;DynaProperty&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;[] &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;beanProperties = &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;new &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;DynaProperty&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;[]{&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;              &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;new &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;DynaProperty&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(42, 0, 255);"&gt;"name"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;, String.&lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;class&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;,&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;              &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;new &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;DynaProperty&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(42, 0, 255);"&gt;"age"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;, Integer.&lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;class&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;,&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;              &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;new &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;DynaProperty&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(42, 0, 255);"&gt;"birthDay"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;, Date.&lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;class&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;      &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;}&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;   &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;      &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;BasicDynaClass personClass = &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;new &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;BasicDynaClass&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(42, 0, 255);"&gt;"Person"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;, BasicDynaBean.class, beanProperties&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;      &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;DynaBean person = personClass.newInstance&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;( )&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;   &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;      &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;person.set&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;( &lt;/span&gt;&lt;span style="color: rgb(42, 0, 255);"&gt;"name"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;, &lt;/span&gt;&lt;span style="color: rgb(42, 0, 255);"&gt;"Adrian" &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;      &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;person.set&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;( &lt;/span&gt;&lt;span style="color: rgb(42, 0, 255);"&gt;"age"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;, &lt;/span&gt;&lt;span style="color: rgb(153, 0, 0);"&gt;26 &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;      &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;person.set&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;( &lt;/span&gt;&lt;span style="color: rgb(42, 0, 255);"&gt;"birthDay"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;, &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;new &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Date&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;() )&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;      &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;System.out.println&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;person.get&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(42, 0, 255);"&gt;"name"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;))&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;      &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;System.out.println&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;person.get&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(42, 0, 255);"&gt;"age"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;))&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;   &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;  &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;La clase BasicDynaClass es una clase básica, mirando la &lt;a href="http://commons.apache.org/beanutils/v1.8.0/apidocs/org/apache/commons/beanutils/package-summary.html"&gt;documentación de BeanUtils&lt;/a&gt; también encontraran la clase ResultSetDynaClass, que permite poder tratar los resultados de un select como si fueran javabeans.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Connection conn = ...;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Statement stmt = conn.createStatement&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;()&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;ResultSet rs = stmt.executeQuery&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(42, 0, 255);"&gt;"select account_id, name from customers"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Iterator rows = &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;new &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;ResultSetDynaClass&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;rs&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;))&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;.iterator&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;()&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;while &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;rows.hasNext&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;()) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;  &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;DynaBean row = &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;DynaBean&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;) &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;rows.next&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;()&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;  &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;System.out.println&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(42, 0, 255);"&gt;"Account number is " &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;+row.get&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(42, 0, 255);"&gt;"account_id"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;) &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;+&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;      &lt;/span&gt;&lt;span style="color: rgb(42, 0, 255);"&gt;" and name is " &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;+ row.get&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(42, 0, 255);"&gt;"name"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;))&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;rs.close&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;()&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;stmt.close&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;()&lt;/span&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;y en caso que la conexión se haya cerrado, directamente pueden solicitar una lista de bean dinámicos que representen los  resultados.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Connection conn = ...;  &lt;/span&gt;&lt;span style="color: rgb(63, 127, 95);"&gt;// Acquire connection from pool&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Statement stmt = conn.createStatement&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;()&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;ResultSet rs = stmt.executeQuery&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(42, 0, 255);"&gt;"SELECT ..."&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;RowSetDynaClass rsdc = &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;new &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;RowSetDynaClass&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;rs&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;rs.close&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;()&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;stmt.close&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;()&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;...;                    &lt;/span&gt;&lt;span style="color: rgb(63, 127, 95);"&gt;// Return connection to pool&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;List rows = rsdc.getRows&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;()&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;...;                   &lt;/span&gt;&lt;span style="color: rgb(63, 127, 95);"&gt;// Process the rows as desired&lt;/span&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4718168423716602728-461548456414182499?l=tecnologiasjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tecnologiasjava.blogspot.com/feeds/461548456414182499/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4718168423716602728&amp;postID=461548456414182499' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4718168423716602728/posts/default/461548456414182499'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4718168423716602728/posts/default/461548456414182499'/><link rel='alternate' type='text/html' href='http://tecnologiasjava.blogspot.com/2009/03/apache-commons-api-beanutils.html' title='Apache Commons. Api BeanUtils'/><author><name>Paola A. Grajeda</name><uri>http://www.blogger.com/profile/03183842695664105951</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/-yyp-u1Rz7hw/Tc8P46eAvVI/AAAAAAAAAm0/0Aubx8YUTHo/s220/avatar.JPG'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4718168423716602728.post-688318724901201196</id><published>2009-02-18T11:40:00.000-08:00</published><updated>2009-03-08T07:23:59.181-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Apache Commons'/><title type='text'>Apache Commons. Api Lang.</title><content type='html'>Apache commons en un conjunto de apis diseñadas para simplificar nuestro código, y sobre todo para no reinventar la rueda. Por ejemplo cuando necesitamos convertir un xml a un objeto, no tenemos que lidiar con dom4j, porque ya existe Digester (el cual tratare en un post posterior). Esta api permite que muchas lineas de código se simplifiquen haciendo el código simple y legible.&lt;br /&gt;&lt;br /&gt;A continuación, en este y los siguientes post,comentaré las funcionalidades que uso diariamente en mi trabajo y otras que me llamaron la atención cuando me puse a leer la documentación y el libro Jakarta Commons Cookbook, este último esta un poco desactualizado por lo cual quizá encuentren cosas que ahora pueden hacer nativamente con java.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Links &lt;/span&gt;&lt;br /&gt;&lt;a href="http://commons.apache.org/"&gt;http://commons.apache.org/&lt;br /&gt;&lt;/a&gt;&lt;a href="http://commons.apache.org/lang/"&gt;http://commons.apache.org/lang/&lt;br /&gt;&lt;/a&gt;&lt;a href="http://oreilly.com/catalog/9780596007065/"&gt;http://oreilly.com/catalog/9780596007065/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;LANG&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Esta api extiende la funcionalidad de las clases incluidas en java.lang. Por ejemplo, tenemos un util para las clases String, Boolean, Integer, etc. También tenemos clases que nos ayudaran a trabajar con Fracciones por ejemplo.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Automatizar implementación de ToString&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Definamos una clase Person&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;package &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;com.blogspot.tecnologiasjava;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;import &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;org.apache.commons.lang.builder.ReflectionToStringBuilder;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;public class &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Person &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;  &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;  &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;private &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;String name;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;  &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;private &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;int &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;age;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;  &lt;/span&gt;&lt;span style="color: rgb(63, 95, 191);"&gt;/** Omito los getter/setters para mayor legibilidad */&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;  &lt;/span&gt;&lt;span style="color: rgb(100, 100, 100);"&gt;@Override&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;  &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;public &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;String toString&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;() {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;    &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;return &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;ReflectionToStringBuilder.toString&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;  &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Si ejecutamos un pequeño test&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;  &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;public static &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;void &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;main&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;String&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;[] &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;args&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;    &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;    &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Person person = &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;new &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Person&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;()&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;    &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;person.setName&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(42, 0, 255);"&gt;"Adrian"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;    &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;person.setAge&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(153, 0, 0);"&gt;26&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;    &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;System.out.println&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;person&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;  &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;En consola tendremos&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;com.blogspot.tecnologiasjava.Person@addbf1[name=Adrian,age=26]&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Obviamente a simple vista es una pavada, pero muy simple y rápido de implementar cuando estamos haciendo debugging.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Automatizar hashCode y equals&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Bueno esto es muy interesante, cuando se implementa el método equals, tenemos que devolver true si un objeto es igual a otro y false en caso contrario. Pero que implica que un objeto sea igual a otro, no depende de su dirección de memoria sino de sus atributos. Supongamos que tenemos nuestra clase Person y suponemos que dos instancias de person son iguales si tienen el mismo nombre, entonces con esta api podríamos definir en la clase Person.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;  &lt;/span&gt;&lt;span style="color: rgb(100, 100, 100);"&gt;@Override&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;  &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;public &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;boolean &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;equals&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Object obj&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;    &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;obj==&lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;null &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;|| !Person.&lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;class&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;.isAssignableFrom&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;obj.getClass&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;())){&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;      &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;return false&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;    &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;    &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Person p = &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Person&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;obj;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;    &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;return &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;new &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;EqualsBuilder&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;()&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;.append&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;.name, p.name&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;))&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;.isEquals&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;()&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;  &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;en caso que dos personas sean iguales si tienen el mismo nombre y la misma edad deberiamos agregar al metodo append del EqualsBuilder&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;  &lt;/span&gt;&lt;span style="color: rgb(100, 100, 100);"&gt;@Override&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;  &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;public &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;boolean &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;equals&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Object obj&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;    &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;obj==&lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;null &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;|| !Person.&lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;class&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;.isAssignableFrom&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;obj.getClass&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;())){&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;      &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;return false&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;    &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;    &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Person p = &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Person&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;obj;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;    &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;return &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;new &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;EqualsBuilder&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;()&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;.append&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;.name, p.name&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;.append&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;.age, p.age&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;))&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;.isEquals&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;()&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;  &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Por último, si necesitamos  sobrecargar el método hashCode podemos escribir los siguiente.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;  &lt;/span&gt;&lt;span style="color: rgb(100, 100, 100);"&gt;@Override&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;  &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;public &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;int &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;hashCode&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;() {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;    &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;return new &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;HashCodeBuilder&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(153, 0, 0);"&gt;17&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;,&lt;/span&gt;&lt;span style="color: rgb(153, 0, 0);"&gt;37&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;.append&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;name&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;.append&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;age&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;.toHashCode&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;()&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;  &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Utilidades para Arrays&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;ArrayUtils dispone de varios métodos para trabajar con arrays nativos, por ejemplo:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;   &lt;br /&gt;&lt;code&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;    &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;[] &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;intArray = &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;new &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;[]{&lt;/span&gt;&lt;span style="color: rgb(153, 0, 0);"&gt;1&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;,&lt;/span&gt;&lt;span style="color: rgb(153, 0, 0);"&gt;2&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;,&lt;/span&gt;&lt;span style="color: rgb(153, 0, 0);"&gt;3&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;,&lt;/span&gt;&lt;span style="color: rgb(153, 0, 0);"&gt;4&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;,&lt;/span&gt;&lt;span style="color: rgb(153, 0, 0);"&gt;5&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;}&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;    &lt;/span&gt;&lt;span style="color: rgb(63, 95, 191);"&gt;/** Consulta si el array contiene el numero 5 */&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;    &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;System.out.println&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;ArrayUtils.contains&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;intArray, &lt;/span&gt;&lt;span style="color: rgb(153, 0, 0);"&gt;5&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;))&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;    &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;    &lt;/span&gt;&lt;span style="color: rgb(63, 95, 191);"&gt;/** Crea un nuevo array con el 6 agregado*/&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;    &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;[] &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;intArrayWithSix =ArrayUtils.add&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;intArray,&lt;/span&gt;&lt;span style="color: rgb(153, 0, 0);"&gt;6&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;    &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;    &lt;/span&gt;&lt;span style="color: rgb(63, 95, 191);"&gt;/** Clona el array */&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;    &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;[] &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;intArrayClone = ArrayUtils.clone&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;intArray&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;De que nos ahorramos? y básicamente de escribir uno o varios for. Ya que están encapsulados en la api.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Trabajar con Fracciones&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Disponemos de una clase Fraction que incluye las operaciones básicas. Interesante, aunque no le encontré una utilidad.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;  &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Fraction fractionOne = Fraction.getFraction&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(153, 0, 0);"&gt;5&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;, &lt;/span&gt;&lt;span style="color: rgb(153, 0, 0);"&gt;4&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;  &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Fraction fractionTwo = Fraction.FOUR_FIFTHS;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;    &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;  &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Fraction result =fractionOne.add&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;fractionTwo&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;  &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;System.out.println&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;result&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Crear un String random.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Tampoco se me ocurre una utilidad en este momento para esta clase. Básicamente crea un string random con la longitud indicada al método e incluye números y letras según nosotros decidamos.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;    &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;System.out.println&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;RandomStringUtils.random&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(153, 0, 0);"&gt;23&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;,true,true&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;))&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;; &lt;/span&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Resultado: kiqUv0dIYlWtrjQCmNrzlpj&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;En el próximo post comentare la api BeanUtils.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4718168423716602728-688318724901201196?l=tecnologiasjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tecnologiasjava.blogspot.com/feeds/688318724901201196/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4718168423716602728&amp;postID=688318724901201196' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4718168423716602728/posts/default/688318724901201196'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4718168423716602728/posts/default/688318724901201196'/><link rel='alternate' type='text/html' href='http://tecnologiasjava.blogspot.com/2009/02/apache-commons-api-lang.html' title='Apache Commons. Api Lang.'/><author><name>Paola A. Grajeda</name><uri>http://www.blogger.com/profile/03183842695664105951</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/-yyp-u1Rz7hw/Tc8P46eAvVI/AAAAAAAAAm0/0Aubx8YUTHo/s220/avatar.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4718168423716602728.post-1690860927984761817</id><published>2009-02-15T06:18:00.000-08:00</published><updated>2009-02-15T08:28:40.575-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Maven'/><category scheme='http://www.blogger.com/atom/ns#' term='Jboss'/><title type='text'>El Problema de las Dependencias Transitivas de Maven y Cómo Excluirlas</title><content type='html'>Esta semana, un pequeño problemita con Maven y, particularmente, con la librería &lt;a href="http://jabsorb.org/"&gt;jabsorb&lt;/a&gt;, que provee una implementación del protocolo &lt;a href="http://json-rpc.org/"&gt;JSON-RPC&lt;/a&gt;, me ha traído uno de esos pequeños-grandes dolores de cabeza que todos los programadores bien conocemos.&lt;br /&gt;&lt;br /&gt;Resulta que no encontré un repositorio de Maven que contenga la librería de jabsorb, así que tuve que subirla a mano a un repositorio local de mi empresa. Como el &lt;a href="http://jabsorb.org/Download"&gt;source de jabsorb&lt;/a&gt; provee un pom.xml, me confié en que todo estaba ok y subí el jar y el pom con el comando &lt;span style="font-weight: bold;"&gt;deploy:deploy-file&lt;/span&gt;. Se puede encontrar &lt;a href="http://docs.codehaus.org/display/MAVENUSER/Deploying+3rd+Party+Jars+With+WebDAV"&gt;información aquí&lt;/a&gt; sobre este comando.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;# mvn deploy:deploy-file -DgroupId=com.blogspot.tecnologiasjava.proyecto -DartifactId=Proyecto -Dversion=1.1.1-SNAPSHOT -Dpackaging= jar -Dfile=[Path del jabosorb.jar] -DpomFile=[Path del pom del jabsorb] -Durl=scpexe://maven2-repo -DrepositoryId=maven2-repo-local&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Al armar mi pom.xml, ingenuamente incluí la dependencia del jabsorb de esta forma:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;&amp;lt;dependency&amp;gt;&lt;br /&gt;  &amp;lt;groupid&amp;gt;org.jabsorb&amp;lt;/groupid&amp;gt;&lt;br /&gt;  &amp;lt;artifactid&amp;gt;jabsorb&amp;lt;/artifactid&amp;gt;&lt;br /&gt;  &amp;lt;version&amp;gt;1.3&amp;lt;/version&amp;gt;&lt;br /&gt;&amp;lt;/dependency&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Al armar el proyecto de Eclipse y compilar no hubo problemas. Yo uso el &lt;a href="http://tecnologiasjava.blogspot.com/2008/09/helloservlet-web-application-con-maven2.html"&gt;plugin de Eclipse para Tomcat, Sysdeo&lt;/a&gt;, y el &lt;a href="http://tecnologiasjava.blogspot.com/2008/09/plugin-de-maven2-para-sysdeo.html"&gt;plugin de Maven, sysdeo-tomcat&lt;/a&gt;, para generar un proyecto de Tomcat con Sysdeo, así que ningún problema.&lt;br /&gt;&lt;br /&gt;Es más, la aplicación la corrí sin problemas desde mi navegador web y todo funcionó perfecto.&lt;br /&gt;&lt;br /&gt;Cuando deployé el war de mi proyecto en un servidor JBoss compartido con otras aplicaciones, donde hay otros wars deployados, todo se vino abajo. El compilador &lt;a href="http://en.wikipedia.org/wiki/Tomcat_Jasper#Jasper"&gt;Jasper&lt;/a&gt; que provee el JBoss Web para compilar JSP se hizo pedazos y todas las páginas JSP que albergaba el contenedor de aplicaciones escupían este error y no se podían mostrar:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;java.lang.LinkageError: Class javax/el/ExpressionFactory violates loader constraints&lt;br /&gt;  java.lang.ClassLoader.defineClass1(Native Method)&lt;br /&gt;  java.lang.ClassLoader.defineClass(Unknown Source)&lt;br /&gt;  java.security.SecureClassLoader.defineClass(Unknown Source)&lt;br /&gt;org.apache.catalina.loader.WebappClassLoader.findClassInternal(WebappClassLoader.java:1817)&lt;br /&gt;  org.apache.catalina.loader.WebappClassLoader.findClass(WebappClassLoader.java:872)&lt;br /&gt;  org.jboss.web.tomcat.service.WebAppClassLoader.findClass(WebAppClassLoader.java:139)&lt;br /&gt;  org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1325)&lt;br /&gt;  org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1204)&lt;br /&gt;  java.lang.ClassLoader.loadClassInternal(Unknown Source)&lt;br /&gt;org.apache.jasper.runtime.JspApplicationContextImpl.getExpressionFactory(JspApplicationContextImpl.java:80)&lt;br /&gt;  org.apache.jsp.WEB_002dINF.jsp.usuarios.loginHB_jsp._jspInit(loginHB_jsp.java:46)&lt;br /&gt;  org.apache.jasper.runtime.HttpJspBase.init(HttpJspBase.java:52)&lt;br /&gt;  org.apache.jasper.servlet.JspServletWrapper.getServlet(JspServletWrapper.java:159)&lt;br /&gt;  org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:323)&lt;br /&gt;  org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:320)&lt;br /&gt;  org.apache.jasper.servlet.JspServlet.service(JspServlet.java:266)&lt;br /&gt;  javax.servlet.http.HttpServlet.service(HttpServlet.java:803)&lt;br /&gt;...&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Como cualquier &lt;span style="font-style: italic;"&gt;Error/Exception&lt;/span&gt; de este tipo, el &lt;span style="font-style: italic;"&gt;stack&lt;/span&gt; seguía hasta el infinito.&lt;br /&gt;&lt;br /&gt;Tardé un tiempo para darme cuenta de que el problema era que mi war estaba incluyendo las librerías de &lt;span style="font-weight: bold;"&gt;jsp-2.1-6.16.jar&lt;/span&gt;, &lt;span style="font-weight: bold;"&gt;jsp-api-2.1-6.16.jar&lt;/span&gt; y &lt;span style="font-weight: bold;"&gt;servlet-api-2.5.6.16.jar&lt;/span&gt; de vaya a saber qué implementación. Si prestamos atención al &lt;span style="font-style: italic;"&gt;Error&lt;/span&gt; lanzado por el &lt;span style="font-style: italic;"&gt;application container&lt;/span&gt; nos damos cuenta de que hay un problema de compatibilidad en la implementación de la clase &lt;span style="font-style: italic;"&gt;javax.el.ExpressionFactory&lt;/span&gt;. Si hacemos una búsqueda en &lt;a href="http://tecnologiasjava.blogspot.com/2008/10/findjarcom.html"&gt;findJar&lt;/a&gt; vemos que, gualá, &lt;a href="http://www.findjar.com/class/javax/el/ExpressionFactory.html"&gt;la clase está en el jar de jsp-api&lt;/a&gt;. Era obvio que mi war, al incluir el &lt;span style="font-weight: bold;"&gt;jsp-api-2.1-6.16.jar&lt;/span&gt; entre sus librerías, estaba reemplazando el &lt;span style="font-weight: bold;"&gt;jsp-api&lt;/span&gt; de Jasper que JBoss usa para compilar los archivos JSP. El &lt;span style="font-style: italic;"&gt;ClassLoader&lt;/span&gt; de JBoss estaba cargando la clase &lt;span style="font-style: italic;"&gt;ExpressionFactory&lt;/span&gt; de mi jar y no de su propia carpeta de librerías. Y lo peor era que la usaba para todas las aplicaciones deployadas en el servidor. Por alguna razón le daba prioridad a mi &lt;span style="font-weight: bold;"&gt;jsp-api&lt;/span&gt;, antes que a los demás que hubiere en su repositorio de librerías compartidas entre aplicaciones.&lt;br /&gt;&lt;br /&gt;Pero quién estaba incluyendo esos jars. Era obvio que yo no. Sí estaba incluyendo &lt;span style="font-weight: bold;"&gt;servlet-api&lt;/span&gt; para poder compilar mi código, pero lo hacía utilizando el &lt;span style="font-style: italic;"&gt;scope&lt;/span&gt; de &lt;span style="font-style: italic;"&gt;provided&lt;/span&gt;, que para Maven significa: &lt;span style="font-style: italic;"&gt;incluí el jar para que mi proyecto compile, pero al deployar, no lo incluyas entre las librerías requeridas, ya que el application server ya provee estas clases.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;&amp;lt;dependency&amp;gt;&lt;br /&gt;    &amp;lt;groupid&amp;gt;javax.servlet&amp;lt;/groupid&amp;gt;&lt;br /&gt;    &amp;lt;artifactid&amp;gt;servlet-api&amp;lt;/artifactid&amp;gt;&lt;br /&gt;    &amp;lt;version&amp;gt;2.4&amp;lt;/version&amp;gt;&lt;br /&gt;    &amp;lt;scope&amp;gt;provided&amp;lt;/scope&amp;gt;&lt;br /&gt;&amp;lt;/dependency&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Para más información sobre los &lt;span style="font-style: italic;"&gt;scopes&lt;/span&gt; de las dependencias, &lt;a href="http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html"&gt;se puede consultar esta referencia&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Tardé un rato en darme cuenta de que el problema lo tenía al incluir la dependencia de &lt;span style="font-style: italic;"&gt;jabsorb&lt;/span&gt;. Y era &lt;span style="font-style: italic;"&gt;jabsorb&lt;/span&gt; el que me traía esas dependencias transitivas que me estaban molestando. Al abrir el &lt;span style="font-style: italic;"&gt;pom&lt;/span&gt; de &lt;span style="font-style: italic;"&gt;jabsorb&lt;/span&gt; vi que en efecto las dependencias ahí estaban:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;&amp;lt;!-- Test dependencies --&amp;gt;&lt;br /&gt;&amp;lt;dependency&amp;gt;&lt;br /&gt;    &amp;lt;groupid&amp;gt;org.mortbay.jetty&amp;lt;/groupid&amp;gt;&lt;br /&gt;    &amp;lt;artifactid&amp;gt;jetty&amp;lt;/artifactid&amp;gt;&lt;br /&gt;    &amp;lt;version&amp;gt;6.1.6&amp;lt;/version&amp;gt;&lt;br /&gt;    &amp;lt;scope&amp;gt;test&amp;lt;/scope&amp;gt;&lt;br /&gt;&amp;lt;/dependency&amp;gt;&lt;br /&gt;&amp;lt;dependency&amp;gt;&lt;br /&gt;    &amp;lt;groupid&amp;gt;org.mortbay.jetty&amp;lt;/groupid&amp;gt;&lt;br /&gt;    &amp;lt;artifactid&amp;gt;jsp-2.1&amp;lt;/artifactid&amp;gt;&lt;br /&gt;    &amp;lt;version&amp;gt;6.1.6&amp;lt;/version&amp;gt;&lt;br /&gt;&amp;lt;/dependency&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;La primera no molestaba porque tenía el &lt;span style="font-style: italic;"&gt;scope&lt;/span&gt; de &lt;span style="font-style: italic;"&gt;test&lt;/span&gt;, así que no iba a ser incluída en el war final, pero la segunda era la conflictiva &lt;span style="font-weight: bold;"&gt;jsp-2.1&lt;/span&gt; del servidor &lt;a href="http://www.mortbay.org/jetty/"&gt;jetty&lt;/a&gt;, la que terminaba trayendo &lt;span style="font-weight: bold;"&gt;jsp-api-2.1&lt;/span&gt; mediante otra dependencia transitiva y terminaba reemplazando la implementación de jasper, el compilador de JSPs, de JBoss Web por la implementación de Jetty.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Solución:&lt;/span&gt; remover la dependencia &lt;span style="font-weight: bold;"&gt;jsp-2.1&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Una forma de implementar la Solución:&lt;/span&gt; Agregándole el scope &lt;span style="font-weight: bold;"&gt;provided&lt;/span&gt; o &lt;span style="font-weight: bold;"&gt;test&lt;/span&gt; a la dependencia de &lt;span style="font-weight: bold;"&gt;jsp-2.1&lt;/span&gt; de jetty en el pom de jabsorb:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;&amp;lt;dependency&amp;gt;&lt;br /&gt;    &amp;lt;groupid&amp;gt;org.mortbay.jetty&amp;lt;/groupid&amp;gt;&lt;br /&gt;    &amp;lt;artifactid&amp;gt;jsp-2.1&amp;lt;/artifactid&amp;gt;&lt;br /&gt;    &amp;lt;version&amp;gt;6.1.6&amp;lt;/version&amp;gt;&lt;br /&gt;    &amp;lt;scope&amp;gt;provided&amp;lt;/scope&amp;gt;&lt;br /&gt;&amp;lt;/dependency&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Subimos de vuelta el &lt;span style="font-style: italic;"&gt;pom&lt;/span&gt; y el &lt;span style="font-style: italic;"&gt;jar&lt;/span&gt; al repositorio de maven y chau problema.&lt;br /&gt;&lt;br /&gt;Pero no siempre podemos modificar de esta forma el &lt;span style="font-style: italic;"&gt;pom&lt;/span&gt; de la dependencia. Quizá la solución más sana sería la segunda:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Otra forma de implementar la Solución:&lt;/span&gt; Al incluir la dependencia de &lt;span style="font-style: italic;"&gt;jabsorb&lt;/span&gt;, &lt;span style="font-weight: bold;"&gt;excluir la dependencia transitiva de jsp-2.1&lt;/span&gt;, de la siguiente forma:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;&amp;lt;dependency&amp;gt;&lt;br /&gt;    &amp;lt;groupid&amp;gt;org.jabsorb&amp;lt;/groupid&amp;gt;&lt;br /&gt;    &amp;lt;artifactid&amp;gt;jabsorb&amp;lt;/artifactid&amp;gt;&lt;br /&gt;    &amp;lt;version&amp;gt;1.3&amp;lt;/version&amp;gt;    &lt;br /&gt;    &amp;lt;exclusions&amp;gt;&lt;br /&gt;        &amp;lt;exclusion&amp;gt;&lt;br /&gt;            &amp;lt;groupid&amp;gt;org.mortbay.jetty&amp;lt;/groupid&amp;gt;&lt;br /&gt;            &amp;lt;artifactid&amp;gt;jsp-2.1&amp;lt;/artifactid&amp;gt;&lt;br /&gt;        &amp;lt;/exclusion&amp;gt;&lt;br /&gt; &amp;lt;/exclusions&amp;gt;        &lt;br /&gt;&amp;lt;/dependency&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Referencias:&lt;/span&gt;&lt;br /&gt;&lt;a href="http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html"&gt;http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html&lt;/a&gt;&lt;br /&gt;&lt;a href="http://docs.codehaus.org/display/MAVENUSER/Deploying+3rd+Party+Jars+With+WebDAV"&gt;http://docs.codehaus.org/display/MAVENUSER/Deploying+3rd+Party+Jars+With+WebDAV&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4718168423716602728-1690860927984761817?l=tecnologiasjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tecnologiasjava.blogspot.com/feeds/1690860927984761817/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4718168423716602728&amp;postID=1690860927984761817' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4718168423716602728/posts/default/1690860927984761817'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4718168423716602728/posts/default/1690860927984761817'/><link rel='alternate' type='text/html' href='http://tecnologiasjava.blogspot.com/2009/02/el-problema-de-las-dependencias.html' title='El Problema de las Dependencias Transitivas de Maven y Cómo Excluirlas'/><author><name>Adrián Paredes</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-rCR9tdvy1zQ/AAAAAAAAAAI/AAAAAAAADik/eHxEpx8CVa0/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4718168423716602728.post-5367543619458341747</id><published>2009-01-25T15:23:00.000-08:00</published><updated>2009-01-25T15:50:32.208-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WebServices'/><title type='text'>HOWTO: Testear la funcionalidad de un WebService con SOAPUI</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_UD9wqJsJiww/SXz1P9lg4lI/AAAAAAAAAI8/bCKEU-n3Yz0/s1600-h/tutsoapui1_1.gif"&gt;&lt;/a&gt;&lt;span style="font-weight: bold;"&gt;Versiones utilizadas: &lt;/span&gt;soapui 2.5&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Pagina de internet:&lt;/span&gt; &lt;a href="http://www.soapui.org/index.html"&gt;http://www.soapui.org/index.html&lt;/a&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Servicio de feriados:&lt;/span&gt; &lt;a href="http://www.mininterior.gov.ar/servicio/wsferiados.asp"&gt;http://www.mininterior.gov.ar/servicio/wsferiados.asp&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;HowTo:&lt;/span&gt; Testear la funcionalidad de un WebService con SOAPUI&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Objetivo:&lt;/span&gt; SoapUI es una interfaz gráfica escrita en java que nos permite testear WebServices y nos facilita la generación de clientes de WebService. El objetivo de este post es testear la funcionalidad de un WebService en este caso será el  servicio de feriados del Ministerio del Interior.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Paso 1:&lt;/span&gt; Iniciar la aplicación mediante el script &lt;span style="font-weight: bold;"&gt;soapui.sh&lt;/span&gt; que se encuentra en la carpeta bin&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Paso 2&lt;/span&gt;: Crear un nuevo proyecto&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_UD9wqJsJiww/SXz1P9lg4lI/AAAAAAAAAI8/bCKEU-n3Yz0/s1600-h/tutsoapui1_1.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 318px; height: 129px;" src="http://2.bp.blogspot.com/_UD9wqJsJiww/SXz1P9lg4lI/AAAAAAAAAI8/bCKEU-n3Yz0/s400/tutsoapui1_1.gif" alt="" id="BLOGGER_PHOTO_ID_5295376916459610706" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Paso 3: &lt;/span&gt;Seleccionar el archivo wsdl del servicio. La opción &lt;span style="font-weight: bold;"&gt;"Create sample request for all operations? "&lt;/span&gt; nos creará request para todas las operaciones incluidas en el wsdl.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_UD9wqJsJiww/SXz1PHbvH_I/AAAAAAAAAI0/OwbKwpk791k/s1600-h/tutsoapui1_2.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 200px;" src="http://2.bp.blogspot.com/_UD9wqJsJiww/SXz1PHbvH_I/AAAAAAAAAI0/OwbKwpk791k/s400/tutsoapui1_2.png" alt="" id="BLOGGER_PHOTO_ID_5295376901923086322" border="0" /&gt;&lt;/a&gt;&lt;span style="font-weight: bold;"&gt;feriados.wsdl&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br /&gt;&amp;lt;wsdl:definitions name="MyService" targetNamespace="http://tempuri.org/"&lt;br /&gt; xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"&lt;br /&gt; xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"&lt;br /&gt; xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata"&lt;br /&gt; xmlns:tns="http://tempuri.org/" xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing"&lt;br /&gt; xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy" xmlns:wsap="http://schemas.xmlsoap.org/ws/2004/08/addressing/policy"&lt;br /&gt; xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msc="http://schemas.microsoft.com/ws/2005/12/wsdl/contract"&lt;br /&gt; xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/"&lt;br /&gt; xmlns:wsa10="http://www.w3.org/2005/08/addressing" xmlns:wsx="http://schemas.xmlsoap.org/ws/2004/09/mex"&amp;gt;&lt;br /&gt; &amp;lt;wsdl:types&amp;gt;&lt;br /&gt;  &amp;lt;xsd:schema targetNamespace="http://tempuri.org/Imports"&amp;gt;&lt;br /&gt;   &amp;lt;xsd:import&lt;br /&gt;    schemaLocation="http://webservices.mininterior.gov.ar/Feriados/Service.svc?xsd=xsd0"&lt;br /&gt;    namespace="http://tempuri.org/" /&amp;gt;&lt;br /&gt;   &amp;lt;xsd:import&lt;br /&gt;    schemaLocation="http://webservices.mininterior.gov.ar/Feriados/Service.svc?xsd=xsd1"&lt;br /&gt;    namespace="http://schemas.microsoft.com/2003/10/Serialization/" /&amp;gt;&lt;br /&gt;   &amp;lt;xsd:import&lt;br /&gt;    schemaLocation="http://webservices.mininterior.gov.ar/Feriados/Service.svc?xsd=xsd2"&lt;br /&gt;    namespace="http://tempuri.org/FeriadoDS.xsd" /&amp;gt;&lt;br /&gt;   &amp;lt;xsd:import&lt;br /&gt;    schemaLocation="http://webservices.mininterior.gov.ar/Feriados/Service.svc?xsd=xsd3" /&amp;gt;&lt;br /&gt;  &amp;lt;/xsd:schema&amp;gt;&lt;br /&gt; &amp;lt;/wsdl:types&amp;gt;&lt;br /&gt; &amp;lt;wsdl:message name="IMyService_FeriadosEntreFechas_InputMessage"&amp;gt;&lt;br /&gt;  &amp;lt;wsdl:part name="parameters" element="tns:FeriadosEntreFechas" /&amp;gt;&lt;br /&gt; &amp;lt;/wsdl:message&amp;gt;&lt;br /&gt; &amp;lt;wsdl:message name="IMyService_FeriadosEntreFechas_OutputMessage"&amp;gt;&lt;br /&gt;  &amp;lt;wsdl:part name="parameters" element="tns:FeriadosEntreFechasResponse" /&amp;gt;&lt;br /&gt; &amp;lt;/wsdl:message&amp;gt;&lt;br /&gt; &amp;lt;wsdl:message name="IMyService_FeriadosEntreFechasAsXml_InputMessage"&amp;gt;&lt;br /&gt;  &amp;lt;wsdl:part name="parameters" element="tns:FeriadosEntreFechasAsXml" /&amp;gt;&lt;br /&gt; &amp;lt;/wsdl:message&amp;gt;&lt;br /&gt; &amp;lt;wsdl:message name="IMyService_FeriadosEntreFechasAsXml_OutputMessage"&amp;gt;&lt;br /&gt;  &amp;lt;wsdl:part name="parameters" element="tns:FeriadosEntreFechasAsXmlResponse" /&amp;gt;&lt;br /&gt; &amp;lt;/wsdl:message&amp;gt;&lt;br /&gt; &amp;lt;wsdl:portType name="IMyService"&amp;gt;&lt;br /&gt;  &amp;lt;wsdl:operation name="FeriadosEntreFechas"&amp;gt;&lt;br /&gt;   &amp;lt;wsdl:input wsaw:Action="http://tempuri.org/IMyService/FeriadosEntreFechas"&lt;br /&gt;    message="tns:IMyService_FeriadosEntreFechas_InputMessage" /&amp;gt;&lt;br /&gt;   &amp;lt;wsdl:output&lt;br /&gt;    wsaw:Action="http://tempuri.org/IMyService/FeriadosEntreFechasResponse"&lt;br /&gt;    message="tns:IMyService_FeriadosEntreFechas_OutputMessage" /&amp;gt;&lt;br /&gt;  &amp;lt;/wsdl:operation&amp;gt;&lt;br /&gt;  &amp;lt;wsdl:operation name="FeriadosEntreFechasAsXml"&amp;gt;&lt;br /&gt;   &amp;lt;wsdl:input wsaw:Action="http://tempuri.org/IMyService/FeriadosEntreFechasAsXml"&lt;br /&gt;    message="tns:IMyService_FeriadosEntreFechasAsXml_InputMessage" /&amp;gt;&lt;br /&gt;   &amp;lt;wsdl:output&lt;br /&gt;    wsaw:Action="http://tempuri.org/IMyService/FeriadosEntreFechasAsXmlResponse"&lt;br /&gt;    message="tns:IMyService_FeriadosEntreFechasAsXml_OutputMessage" /&amp;gt;&lt;br /&gt;  &amp;lt;/wsdl:operation&amp;gt;&lt;br /&gt; &amp;lt;/wsdl:portType&amp;gt;&lt;br /&gt; &amp;lt;wsdl:binding name="BasicHttpBinding_IMyService" type="tns:IMyService"&amp;gt;&lt;br /&gt;  &amp;lt;soap:binding transport="http://schemas.xmlsoap.org/soap/http" /&amp;gt;&lt;br /&gt;  &amp;lt;wsdl:operation name="FeriadosEntreFechas"&amp;gt;&lt;br /&gt;   &amp;lt;soap:operation soapAction="http://tempuri.org/IMyService/FeriadosEntreFechas"&lt;br /&gt;    style="document" /&amp;gt;&lt;br /&gt;   &amp;lt;wsdl:input&amp;gt;&lt;br /&gt;    &amp;lt;soap:body use="literal" /&amp;gt;&lt;br /&gt;   &amp;lt;/wsdl:input&amp;gt;&lt;br /&gt;   &amp;lt;wsdl:output&amp;gt;&lt;br /&gt;    &amp;lt;soap:body use="literal" /&amp;gt;&lt;br /&gt;   &amp;lt;/wsdl:output&amp;gt;&lt;br /&gt;  &amp;lt;/wsdl:operation&amp;gt;&lt;br /&gt;  &amp;lt;wsdl:operation name="FeriadosEntreFechasAsXml"&amp;gt;&lt;br /&gt;   &amp;lt;soap:operation&lt;br /&gt;    soapAction="http://tempuri.org/IMyService/FeriadosEntreFechasAsXml"&lt;br /&gt;    style="document" /&amp;gt;&lt;br /&gt;   &amp;lt;wsdl:input&amp;gt;&lt;br /&gt;    &amp;lt;soap:body use="literal" /&amp;gt;&lt;br /&gt;   &amp;lt;/wsdl:input&amp;gt;&lt;br /&gt;   &amp;lt;wsdl:output&amp;gt;&lt;br /&gt;    &amp;lt;soap:body use="literal" /&amp;gt;&lt;br /&gt;   &amp;lt;/wsdl:output&amp;gt;&lt;br /&gt;  &amp;lt;/wsdl:operation&amp;gt;&lt;br /&gt; &amp;lt;/wsdl:binding&amp;gt;&lt;br /&gt; &amp;lt;wsdl:service name="MyService"&amp;gt;&lt;br /&gt;  &amp;lt;wsdl:port name="BasicHttpBinding_IMyService" binding="tns:BasicHttpBinding_IMyService"&amp;gt;&lt;br /&gt;   &amp;lt;soap:address&lt;br /&gt;    location="http://webservices.mininterior.gov.ar/Feriados/Service.svc" /&amp;gt;&lt;br /&gt;  &amp;lt;/wsdl:port&amp;gt;&lt;br /&gt; &amp;lt;/wsdl:service&amp;gt;&lt;br /&gt;&amp;lt;/wsdl:definitions&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Paso 4&lt;/span&gt;: Hacer doble click sobre &lt;span style="font-weight: bold;"&gt;Request 1&lt;/span&gt;, que se trata del request generado automáticamente para la operación &lt;span style="font-weight: bold;"&gt;feriadosEntreFechas&lt;/span&gt;. Esto nos abrirá el editor de request.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_UD9wqJsJiww/SXz1C1k84vI/AAAAAAAAAIk/_Nc2ZoFb_hQ/s1600-h/tutsoapui1_3.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 280px; height: 132px;" src="http://2.bp.blogspot.com/_UD9wqJsJiww/SXz1C1k84vI/AAAAAAAAAIk/_Nc2ZoFb_hQ/s400/tutsoapui1_3.png" alt="" id="BLOGGER_PHOTO_ID_5295376690971468530" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Paso 5&lt;/span&gt;: Para pasarle parametros al servicio deben reemplazar los signos de interrogación.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_UD9wqJsJiww/SXz1CkNnWyI/AAAAAAAAAIc/jOBWiIdFn7A/s1600-h/tutsoapui1_4.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 149px;" src="http://4.bp.blogspot.com/_UD9wqJsJiww/SXz1CkNnWyI/AAAAAAAAAIc/jOBWiIdFn7A/s400/tutsoapui1_4.png" alt="" id="BLOGGER_PHOTO_ID_5295376686310185762" border="0" /&gt;&lt;/a&gt;&lt;span style="font-weight: bold;"&gt;Paso 6: &lt;/span&gt;En este caso, tenemos que ingresar atributos de tipo &lt;span style="font-weight: bold;"&gt;datetime&lt;/span&gt;, para ingresar el rango de fechas de los feriados que necesitamos. Es importante respetar el formato para que no tengamos una excepcion de transformacion. Para ejecutar la invocacion al webservice hacemos click sobre el botón verde de play.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_UD9wqJsJiww/SXz1CMbbUEI/AAAAAAAAAIU/JEDFdlqSeOs/s1600-h/tutsoapui1_5.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 138px;" src="http://2.bp.blogspot.com/_UD9wqJsJiww/SXz1CMbbUEI/AAAAAAAAAIU/JEDFdlqSeOs/s400/tutsoapui1_5.png" alt="" id="BLOGGER_PHOTO_ID_5295376679925665858" border="0" /&gt;&lt;/a&gt;&lt;span style="font-weight: bold;"&gt;Paso 7&lt;/span&gt;: En la ventana de al lado se puede visualizar el resultado de la invocación del webservice.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_UD9wqJsJiww/SXz1Bqc9jSI/AAAAAAAAAIM/S-CYPsoWXZk/s1600-h/tutsoapui1_6.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 233px;" src="http://2.bp.blogspot.com/_UD9wqJsJiww/SXz1Bqc9jSI/AAAAAAAAAIM/S-CYPsoWXZk/s400/tutsoapui1_6.png" alt="" id="BLOGGER_PHOTO_ID_5295376670805298466" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4718168423716602728-5367543619458341747?l=tecnologiasjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tecnologiasjava.blogspot.com/feeds/5367543619458341747/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4718168423716602728&amp;postID=5367543619458341747' title='4 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4718168423716602728/posts/default/5367543619458341747'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4718168423716602728/posts/default/5367543619458341747'/><link rel='alternate' type='text/html' href='http://tecnologiasjava.blogspot.com/2009/01/howto-testear-la-funcionalidad-de-un.html' title='HOWTO: Testear la funcionalidad de un WebService con SOAPUI'/><author><name>Paola A. Grajeda</name><uri>http://www.blogger.com/profile/03183842695664105951</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/-yyp-u1Rz7hw/Tc8P46eAvVI/AAAAAAAAAm0/0Aubx8YUTHo/s220/avatar.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_UD9wqJsJiww/SXz1P9lg4lI/AAAAAAAAAI8/bCKEU-n3Yz0/s72-c/tutsoapui1_1.gif' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4718168423716602728.post-6432624625357784535</id><published>2008-12-26T03:36:00.000-08:00</published><updated>2009-01-15T15:08:08.345-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jBPM'/><title type='text'>HowTo: Invocar un Workflow desde otro Workflow usando Process-States con jbpm</title><content type='html'>Versiones Utilizadas: jbpm 3.3.0-GA&lt;br /&gt;&lt;br /&gt;Según la Wikipedia: &lt;i style="font-style: italic;"&gt;"Se llama &lt;b&gt;Business Process Management&lt;/b&gt;&lt;/i&gt;&lt;span style="font-style: italic;"&gt; (&lt;/span&gt;&lt;a style="font-style: italic;" href="http://es.wikipedia.org/wiki/Business_Process_Management"&gt;BPM&lt;/a&gt;&lt;span style="font-style: italic;"&gt;) a la metodología empresarial cuyo objetivo es mejorar la eficiencia a través de la gestión sistemática de los &lt;/span&gt;&lt;a style="font-style: italic;" href="http://es.wikipedia.org/wiki/Procesos_de_negocio" title="Procesos de negocio" class="mw-redirect"&gt;procesos de negocio&lt;/a&gt;&lt;span style="font-style: italic;"&gt;, que se deben modelar, autom&lt;/span&gt;&lt;span style="font-style: italic;"&gt;atizar, integrar, monitorizar y optimizar de forma continua."&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;a href="http://www.jboss.org/jbossjbpm/"&gt;jBPM&lt;/a&gt; es la implementación BPM de JBoss. Como toda implementación de BPM, sirve para modelar procesos. Si bien lo ideal sería que estos procesos puedan modelarse de forma visual, jBPM no cuenta aún con muy buen soporte para esto. El único modelador de procesos visual oficial es el &lt;a href="http://www.jboss.org/jbossjbpm/gpd/"&gt;GPD&lt;/a&gt;, un plug-in para Eclipse que sinceramente me ha dado muchos dolores de cabeza (porque es bastante &lt;span style="font-style: italic;"&gt;anti-user-friendly&lt;/span&gt; y porque está bastante &lt;span style="font-style: italic;"&gt;buggeado&lt;/span&gt;). Pero GPD no provee una solución gráfica para las vastas funcionalidades que provee el lenguaje &lt;a href="http://www.jboss.org/jbossjbpm/jpdl/"&gt;jPDL&lt;/a&gt; (lenguaje basado en XML), que jbpm implementa, con lo cual, cuando alguien tiene que verse obligado a modelar un workflow un poco fuera de lo común (como me vi obligado yo), tiene que sí o sí tocar el XML.&lt;br /&gt;&lt;br /&gt;No voy a detenerme en la teoría de jBPM, ya que de eso se ha encargado &lt;a href="http://salaboy.wordpress.com/"&gt;Salaboy&lt;/a&gt; que ha dedicado (y sigue dedicando) &lt;a href="http://salaboy.wordpress.com/category/jboss-jbpm/"&gt;muchísimos posts cla&lt;/a&gt;&lt;a href="http://salaboy.wordpress.com/category/jboss-jbpm/"&gt;ros y concretos a esta tecnología&lt;/a&gt;. Aconsejo fuertemente leer todos estos posts si se quiere o necesita dar los primeros pasos en jBPM. También los puede ayudar la &lt;a href="http://docs.jboss.com/jbpm/v3.2/userguide/html/index.html"&gt;guía de usuario oficial&lt;/a&gt; del sitio de JBoss. El motor y la &lt;span style="font-style: italic;"&gt;suite&lt;/span&gt;&lt;span style="font-style: italic;"&gt; &lt;/span&gt;completa de jBPM se puede descargar de la &lt;a href="http://www.jboss.org/jbossjbpm/jpdl_downloads/"&gt;página de descarga oficial&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;HowTo:&lt;/span&gt; Invocar un Workflow desde otro Workflow usando Process-States.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Descripción: &lt;/span&gt;El objetivo es usar el nodo Process-State para ejecutar un sub-workflow. Esto puede resultar muy útil para la reutilización de secuencias de procesos, de la misma forma que en programación se puede reutilizar una subrutina, función o método.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Objetivo: &lt;/span&gt;Dados dos workflows: &lt;span style="font-weight: bold;"&gt;WorkflowA&lt;/span&gt; y &lt;span style="font-weight: bold;"&gt;WorkflowB,&lt;/span&gt; se desea que el &lt;span style="font-weight: bold;"&gt;WorkflowB &lt;/span&gt;invoque al &lt;span style="font-weight: bold;"&gt;WorkflowA&lt;/span&gt; en el medio de su ejecución, usando un nodo del tipo &lt;a href="http://docs.jboss.com/jbpm/v3.2/userguide/html/jpdl.html#processstate.element"&gt;&lt;span style="font-weight: bold;"&gt;process-state&lt;/span&gt;&lt;/a&gt;.&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;br /&gt;WorkflowA:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_Q43CNgNBt9Y/SVVQQQ3UtqI/AAAAAAAAAxg/68_B2PRqNA8/s1600-h/WorkflowA.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 168px; height: 289px;" src="http://1.bp.blogspot.com/_Q43CNgNBt9Y/SVVQQQ3UtqI/AAAAAAAAAxg/68_B2PRqNA8/s400/WorkflowA.jpg" alt="" id="BLOGGER_PHOTO_ID_5284217978124285602" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;ProcessDefinition.xml&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&amp;lt;?xml version="1.0" encoding="UTF- 8"?&amp;gt;&lt;br&gt;&amp;lt;process-definition&amp;nbsp;xmlns="urn:jbpm.org:jpdl-3.2"&amp;nbsp; name="WorkflowA"&amp;gt;&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;start-state name="start-state1"&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;transition to="node1"&amp;gt;&amp;lt;/transition&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/start-state&amp;gt;&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;node name="node1"&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;action class="com.sample.action.Action1" name="action1"&amp;gt;&amp;lt;/action&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;transition to="end-state1"&amp;gt;&amp;lt;/transition&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/node&amp;gt;&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;end-state name="end-state1"&amp;gt;&amp;lt;/end-state&amp;gt;&lt;br&gt;&amp;lt;/process-definition&amp;gt;&lt;br&gt;&lt;br /&gt;&amp;nbsp;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;WorkflowB:&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_Q43CNgNBt9Y/SVVQdMEQrLI/AAAAAAAAAxo/XLxIJi2v1fY/s1600-h/WorkflowB.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 155px; height: 385px;" src="http://4.bp.blogspot.com/_Q43CNgNBt9Y/SVVQdMEQrLI/AAAAAAAAAxo/XLxIJi2v1fY/s400/WorkflowB.jpg" alt="" id="BLOGGER_PHOTO_ID_5284218200174668978" border="0" /&gt;&lt;/a&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;ProcessDefinition.xml:&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&amp;lt;?xml version="1.0" encoding="UTF- 8"?&amp;gt;&lt;br&gt;&amp;lt;process-definition&amp;nbsp;xmlns="urn:jbpm.org:jpdl-3.2"&amp;nbsp; name="WorkflowB"&amp;gt;&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;start-state name="start-state1"&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;transition to="node1"&amp;gt;&amp;lt;/transition&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/start-state&amp;gt;&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;node name="node1"&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;action class="com.sample.action.Action2" name="action2"&amp;gt;&amp;lt;/action&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;transition to="process-state1"&amp;gt;&amp;lt;/transition&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/node&amp;gt;&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;process-statename="process-state1"&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;sub-process name="WorkflowB" /&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;variable name="a" access="read,write" mapped-name= "aa" /&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;variable name="b" access="read" mapped-name= "bb" /&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;transitionto="node2"&amp;gt;&amp;lt;transition&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/process-state&amp;gt;&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;node name="node2"&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;action class="com.sample.action.Action3"name="action3"&amp;gt;&amp;lt;/action&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;transition to="end-state1"&amp;gt;&amp;lt;/transition&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/node&amp;gt;&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;end-state name="end-state1"&amp;gt;&amp;lt;/end-state&amp;gt;&lt;br&gt;&amp;lt;/process-definition&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Invocación: &lt;/span&gt;&lt;/span&gt;A continuación, un ejemplo de un código cliente que podría funcionar en una aplicación de consola &lt;span style="font-style: italic;"&gt;stand-alone&lt;/span&gt; de JavaSE:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;&lt;font color="#3f7f5f"&gt;//&amp;nbsp;Se&amp;nbsp;leen&amp;nbsp;los&amp;nbsp;XML&amp;nbsp;de&amp;nbsp;processDefinition&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#000000"&gt;ProcessDefinition&amp;nbsp;processDef&amp;nbsp;=&amp;nbsp;ProcessDefinition.parseXmlResource&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#2a00ff"&gt;&amp;#34;WorkflowB/processdefinition.xml&amp;#34;&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;&lt;font color="#000000"&gt;ProcessDefinition&amp;nbsp;subProcessDefinition&amp;nbsp;=&lt;/font&gt;&lt;br /&gt;&lt;font color="#000000"&gt;ProcessDefinition.parseXmlResource&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#2a00ff"&gt;&amp;#34;WorkflowA/processdefinition.xml&amp;#34;&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#3f7f5f"&gt;//&amp;nbsp;Se&amp;nbsp;obtiene&amp;nbsp;el&amp;nbsp;nodo&amp;nbsp;del&amp;nbsp;tipo&amp;nbsp;process-state&amp;nbsp;del&amp;nbsp;WorkflowB&lt;/font&gt;&lt;br /&gt;&lt;font color="#3f7f5f"&gt;//&amp;nbsp;y&amp;nbsp;se&amp;nbsp;le&amp;nbsp;setea&amp;nbsp;la&amp;nbsp;definici&amp;oacute;n&amp;nbsp;del&amp;nbsp;WorkflowA&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#000000"&gt;ProcessState&amp;nbsp;processState&amp;nbsp;=&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;ProcessState&lt;/font&gt;&lt;font color="#000000"&gt;)&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;processDef.getNode&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#2a00ff"&gt;&amp;#34;process-state1&amp;#34;&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;&lt;font color="#000000"&gt;processState.setSubProcessDefinition&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;subProcessDefinition&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#3f7f5f"&gt;//&amp;nbsp;Se&amp;nbsp;instancia&amp;nbsp;el&amp;nbsp;WorkflowB&lt;/font&gt;&lt;br /&gt;&lt;font color="#000000"&gt;ProcessInstance&amp;nbsp;processInstance&amp;nbsp;=&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;new&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;ProcessInstance&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;processDef&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#3f7f5f"&gt;//&amp;nbsp;Se&amp;nbsp;setean&amp;nbsp;en&amp;nbsp;el&amp;nbsp;contexto&amp;nbsp;tres&amp;nbsp;variables&lt;/font&gt;&lt;br /&gt;&lt;font color="#000000"&gt;ContextInstance&amp;nbsp;context&amp;nbsp;=&amp;nbsp;processInstance.getContextInstance&lt;/font&gt;&lt;font color="#000000"&gt;()&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#000000"&gt;context.setVariable&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#2a00ff"&gt;&amp;#34;a&amp;#34;&lt;/font&gt;&lt;font color="#000000"&gt;,&amp;nbsp;&lt;/font&gt;&lt;font color="#2a00ff"&gt;&amp;#34;Variable&amp;nbsp;a&amp;nbsp;compartida&amp;#34;&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;&lt;font color="#000000"&gt;context.setVariable&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#2a00ff"&gt;&amp;#34;b&amp;#34;&lt;/font&gt;&lt;font color="#000000"&gt;,&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;new&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;Integer&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#990000"&gt;15&lt;/font&gt;&lt;font color="#000000"&gt;))&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#000000"&gt;context.setVariable&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#2a00ff"&gt;&amp;#34;redondo&amp;#34;&lt;/font&gt;&lt;font color="#000000"&gt;,&amp;nbsp;&lt;/font&gt;&lt;font color="#2a00ff"&gt;&amp;#34;PATRICIO&amp;nbsp;REY&amp;nbsp;Y&amp;nbsp;SUS&amp;nbsp;REDONDITOS&amp;nbsp;DE&amp;nbsp;RICOTA&amp;#34;&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#3f7f5f"&gt;//&amp;nbsp;Se&amp;nbsp;larga&amp;nbsp;la&amp;nbsp;corrida&amp;nbsp;del&amp;nbsp;WorkflowB&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#000000"&gt;System.out.println&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#2a00ff"&gt;&amp;#34;---&amp;nbsp;Inicio&amp;nbsp;del&amp;nbsp;workflow!&amp;nbsp;---&amp;#34;&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;&lt;font color="#000000"&gt;processInstance.signal&lt;/font&gt;&lt;font color="#000000"&gt;()&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;&lt;font color="#000000"&gt;System.out.println&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#2a00ff"&gt;&amp;#34;---&amp;nbsp;Fin&amp;nbsp;del&amp;nbsp;workflow!&amp;nbsp;---&amp;#34;&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#3f7f5f"&gt;//&amp;nbsp;Se&amp;nbsp;imprime&amp;nbsp;el&amp;nbsp;estado&amp;nbsp;de&amp;nbsp;las&amp;nbsp;variables&amp;nbsp;del&amp;nbsp;contexto&lt;/font&gt;&lt;br /&gt;&lt;font color="#000000"&gt;System.out.println&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;context.getVariable&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#2a00ff"&gt;&amp;#34;a&amp;#34;&lt;/font&gt;&lt;font color="#000000"&gt;))&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#000000"&gt;System.out.println&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;context.getVariable&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#2a00ff"&gt;&amp;#34;b&amp;#34;&lt;/font&gt;&lt;font color="#000000"&gt;))&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;&lt;font color="#000000"&gt;System.out.println&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;context.getVariable&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#2a00ff"&gt;&amp;#34;redondo&amp;#34;&lt;/font&gt;&lt;font color="#000000"&gt;))&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;span style="font-family:monospace;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;Para demostrar cómo funciona el pasaje de variables de contexto en un &lt;span style="font-weight: bold;"&gt;process-state&lt;/span&gt; definí tres Actions (clases que implementan la interfaz &lt;span style="font-style: italic;"&gt;ActionHandler&lt;/span&gt; de jbpm y el método abstracto &lt;span style="font-style: italic;"&gt;execute&lt;/span&gt;). El más interesante es el Action1, que es el que se ejecuta en el WorkflowA (el sub-workflow):&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;&lt;font color="#646464"&gt;@Override&lt;/font&gt;&lt;br /&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;public&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;void&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;execute&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;ExecutionContext&amp;nbsp;context&lt;/font&gt;&lt;font color="#000000"&gt;)&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;throws&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;Exception&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;{&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;System.out.println&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#2a00ff"&gt;&amp;#34;ACTION&amp;nbsp;1&amp;nbsp;FROM&amp;nbsp;NODE&amp;nbsp;1&amp;#34;&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#3f7f5f"&gt;//&amp;nbsp;Se&amp;nbsp;imprimen&amp;nbsp;las&amp;nbsp;variables&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;System.out.println&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;context.getVariable&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#2a00ff"&gt;&amp;#34;aa&amp;#34;&lt;/font&gt;&lt;font color="#000000"&gt;))&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;System.out.println&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;context.getVariable&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#2a00ff"&gt;&amp;#34;bb&amp;#34;&lt;/font&gt;&lt;font color="#000000"&gt;))&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;System.out.println&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;context.getVariable&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#2a00ff"&gt;&amp;#34;redondo&amp;#34;&lt;/font&gt;&lt;font color="#000000"&gt;))&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#3f7f5f"&gt;//&amp;nbsp;Se&amp;nbsp;modifican&amp;nbsp;aa&amp;nbsp;y&amp;nbsp;bb&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;String&amp;nbsp;aa&amp;nbsp;=&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;String&lt;/font&gt;&lt;font color="#000000"&gt;)&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;context.getVariable&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#2a00ff"&gt;&amp;#34;aa&amp;#34;&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;aa&amp;nbsp;=&amp;nbsp;&lt;/font&gt;&lt;font color="#2a00ff"&gt;&amp;#34;Variable&amp;nbsp;modificada&amp;nbsp;por&amp;nbsp;subworkflow&amp;nbsp;A&amp;#34;&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;context.setVariable&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#2a00ff"&gt;&amp;#34;aa&amp;#34;&lt;/font&gt;&lt;font color="#000000"&gt;,&amp;nbsp;aa&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;Integer&amp;nbsp;bb&amp;nbsp;=&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;Integer&lt;/font&gt;&lt;font color="#000000"&gt;)&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;context.getVariable&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#2a00ff"&gt;&amp;#34;bb&amp;#34;&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;bb&amp;nbsp;+=&amp;nbsp;&lt;/font&gt;&lt;font color="#990000"&gt;10&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;context.setVariable&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#2a00ff"&gt;&amp;#34;bb&amp;#34;&lt;/font&gt;&lt;font color="#000000"&gt;,&amp;nbsp;bb&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;System.out.println&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;context.getVariable&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#2a00ff"&gt;&amp;#34;aa&amp;#34;&lt;/font&gt;&lt;font color="#000000"&gt;))&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;System.out.println&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;context.getVariable&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#2a00ff"&gt;&amp;#34;bb&amp;#34;&lt;/font&gt;&lt;font color="#000000"&gt;))&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;context.leaveNode&lt;/font&gt;&lt;font color="#000000"&gt;()&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;span style="font-family:monospace;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;Los demás Action lo único que hacen es imprimir en la consola un mensaje para indicar que se están ejecutando.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Salida: &lt;/span&gt;Al ejecutar este código de ejemplo por consola, obtenemos la siguiente salida:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;--- Inicio del workflow! ---&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;ACTION 2 FROM NODE 2&lt;br /&gt;ACTION 1 FROM NODE 1&lt;br /&gt;Variable a compartida&lt;br /&gt;15&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;null&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;Variable modificada por subworkflow A&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;25&lt;br /&gt;ACTION 3 FROM NODE 3&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;--- Fin del workflow! ---&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;Variable modificada por subworkflow A&lt;br /&gt;15&lt;br /&gt;PATRICIO REY Y SUS REDONDITOS DE RICOTA&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Lo interesante de ver acá es que el sub-workflow se ejecutó y que, de las tres variables de contexto que había ("a", "b" y "redondo"), la primera fue modificada por el &lt;span style="font-weight: bold;"&gt;WorkflowA&lt;/span&gt; (esto fue posible ya que tenía acceso de lectura y escritura), la segunda fue recibida por el &lt;span style="font-weight: bold;"&gt;WorkflowA&lt;/span&gt; pero no fue modificada (el valor se perdió al terminar la ejecución del workflow porque era de sólo lectura) y la tercera variable, el String "redondo", conservó su valor y no pudo ser accedida desde el &lt;span style="font-weight: bold;"&gt;WorkflowA&lt;/span&gt; (noten que el valor dentro del Action1 era &lt;span style="font-weight: bold;"&gt;null&lt;/span&gt;; la variable no fue copiada del contexto del &lt;span style="font-weight: bold;"&gt;WorkflowB&lt;/span&gt; al contexto del &lt;span style="font-weight: bold;"&gt;WorkflowA&lt;/span&gt;).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Referencias:&lt;/span&gt;&lt;br /&gt;&lt;a href="http://docs.jboss.com/jbpm/v3.2/userguide/html/processmodelling.html#processcomposition"&gt;http://docs.jboss.com/jbpm/v3.2/userguide/html/processmodelling.html#processcomposition&lt;/a&gt;&lt;br /&gt;&lt;a href="http://salaboy.wordpress.com/category/jboss-jbpm/"&gt;http://salaboy.wordpress.com/category/jboss-jbpm/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://kickjava.com/src/org/jbpm/graph/node/ProcessStateTest.java.htm"&gt;http://kickjava.com/src/org/jbpm/graph/node/ProcessStateTest.java.htm&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.workflowpatterns.com/"&gt;http://www.workflowpatterns.com/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://docs.jboss.com/jbpm/v3/demos/movies/jbpm-overview.htm"&gt;http://docs.jboss.com/jbpm/v3/demos/movies/jbpm-overview.htm&lt;/a&gt;&lt;br /&gt;&lt;a href="http://docs.jboss.org/jbpm/v3/javadoc/"&gt;http://docs.jboss.org/jbpm/v3/javadoc/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4718168423716602728-6432624625357784535?l=tecnologiasjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tecnologiasjava.blogspot.com/feeds/6432624625357784535/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4718168423716602728&amp;postID=6432624625357784535' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4718168423716602728/posts/default/6432624625357784535'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4718168423716602728/posts/default/6432624625357784535'/><link rel='alternate' type='text/html' href='http://tecnologiasjava.blogspot.com/2008/12/howto-invocar-un-workflow-desde-otro.html' title='HowTo: Invocar un Workflow desde otro Workflow usando Process-States con jbpm'/><author><name>Adrián Paredes</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-rCR9tdvy1zQ/AAAAAAAAAAI/AAAAAAAADik/eHxEpx8CVa0/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_Q43CNgNBt9Y/SVVQQQ3UtqI/AAAAAAAAAxg/68_B2PRqNA8/s72-c/WorkflowA.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4718168423716602728.post-1062338692202641778</id><published>2008-12-16T04:22:00.000-08:00</published><updated>2009-01-14T17:11:54.892-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='RichFaces'/><title type='text'>HowTo: Cerrar ModalPanel cuando no existen mensajes de error.</title><content type='html'>Versiones Utilizadas: RichFaces 3.2.2&lt;br /&gt;&lt;br /&gt;El Modal Panel es un componente de RichFaces que básicamente es una ventana que se superpone a la ventana principal. La ventana principal se desactiva mientras este el modal panel en uso.&lt;br /&gt;&lt;br /&gt;Aquí pueden ver la documentación oficial de RichFaces:&lt;br /&gt;&lt;a href="http://www.jboss.org/file-access/default/members/jbossrichfaces/freezone/docs/devguide/en/html/modalPanel.html"&gt;Guia para programadores&lt;/a&gt;.&lt;br /&gt;&lt;a href="http://http//livedemo.exadel.com/richfaces-demo/richfaces/modalPanel.jsf?c=modalPanel&amp;amp;tab=usage"&gt;RichFaces Live Demo&lt;/a&gt; (Ejemplos de ModalPanel)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;HowTo:&lt;/span&gt; Cerrar ModalPanel cuando no existen mensajes de error.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Descripción: &lt;/span&gt;El objetivo es tener un modal panel con un botón que ejecute una acción. Una vez ejecutada la acción, si no existen errores en el FacesContext , el Modal Panel deberá cerrarse automáticamente.&lt;br /&gt;&lt;br /&gt;Por ejemplo tenemos dos métodos en un controller, uno genera un error y el otro no.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;public void executeAction(){&lt;br /&gt; log.info("execute action");&lt;br /&gt; String errorMessage = "Ocurrio un error en executeAction";&lt;br /&gt; FacesMessage message = new&lt;br /&gt;FacesMessage(FacesMessage.SEVERITY_ERROR,errorMessage,errorMessage);&lt;br /&gt; FacesContext.getCurrentInstance().addMessage("actionform:executeactionbutton",&lt;br /&gt;message);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public void executeActionTwo(){&lt;br /&gt; log.info("execute action two");&lt;br /&gt;    }&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Habra tres botones, uno que ejecuta el método que agrega un error al FacesContext, otro que no hace nada y un tercero que se usa para cerrar el modal panel:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_UD9wqJsJiww/SUfy51yah_I/AAAAAAAAAHE/9Mo7bYvCVX4/s1600-h/richfaces_tut1.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 189px;" src="http://3.bp.blogspot.com/_UD9wqJsJiww/SUfy51yah_I/AAAAAAAAAHE/9Mo7bYvCVX4/s400/richfaces_tut1.png" alt="" id="BLOGGER_PHOTO_ID_5280456163620194290" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&amp;lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&amp;gt;&lt;br /&gt;&amp;lt;html xmlns="http://www.w3.org/1999/xhtml"&lt;br /&gt;xmlns:ui="http://java.sun.com/jsf/facelets"&lt;br /&gt;xmlns:h="http://java.sun.com/jsf/html"&lt;br /&gt;xmlns:f="http://java.sun.com/jsf/core"&lt;br /&gt;xmlns:s="http://jboss.com/products/seam/taglib"&lt;br /&gt;xmlns:rich="http://richfaces.org/rich"&lt;br /&gt;xmlns:a4j="http://richfaces.org/a4j"&amp;gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;ui:composition template="/template.xhtml"&amp;gt;&lt;br /&gt;&amp;lt;ui:define name="body"&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;table&amp;gt;&lt;br /&gt;  &amp;lt;tr&amp;gt;&lt;br /&gt;   &amp;lt;td class="contTitulo"&amp;gt;&amp;lt;h:outputText value="Demo RichFaces"/&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;  &amp;lt;/tr&amp;gt;&lt;br /&gt; &amp;lt;/table&amp;gt;&lt;br /&gt; &amp;lt;div class="hrdot"&amp;gt;&amp;lt;img src="images/1x1.gif" /&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;!-- Boton que abre el modal panel --&amp;gt;&lt;br /&gt; &amp;lt;h:outputLink value="#" id="link"&amp;gt;&lt;br /&gt;  Abrir Modal Panel&lt;br /&gt;  &amp;lt;rich:componentControl for="panel" attachTo="link" operation="show" event="onclick"/&amp;gt;&lt;br /&gt; &amp;lt;/h:outputLink&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;!-- Codigo Modal Panel --&amp;gt;&lt;br /&gt; &amp;lt;rich:modalPanel id="panel" width="500" height="400"&amp;gt;&lt;br /&gt;  &amp;lt;f:facet name="header"&amp;gt;&lt;br /&gt;   &amp;lt;h:panelGroup&amp;gt;&amp;lt;h:outputText value="Modal Panel"&amp;gt;&amp;lt;/h:outputText&amp;gt;&amp;lt;/h:panelGroup&amp;gt;&lt;br /&gt;  &amp;lt;/f:facet&amp;gt;&lt;br /&gt;  &amp;lt;h:outputText value="Al hacer click sobre el botón se ejecutara la acción, sino existen errores el modal panel se ocultará. Sino mostrará    el error"&amp;gt;&amp;lt;/h:outputText&amp;gt;&lt;br /&gt;  &amp;lt;a4j:form id="actionform"&amp;gt;&lt;br /&gt;   &amp;lt;table&amp;gt;&lt;br /&gt;   &amp;lt;tr&amp;gt;&lt;br /&gt;    &amp;lt;td&amp;gt;&lt;br /&gt;     &amp;lt;a4j:commandButton id="executeactionbutton" value="Ejecutar accion Con Error" action="#{userctrl.executeAction}"       oncomplete="if (#{empty facesContext.maximumSeverity}) #{rich:component('panel')}.hide();"/&amp;gt;&lt;br /&gt;     &amp;lt;rich:message for="executeactionbutton"/&amp;gt;&lt;br /&gt;    &amp;lt;/td&amp;gt;&lt;br /&gt;   &amp;lt;/tr&amp;gt;&lt;br /&gt;   &amp;lt;tr&amp;gt;&lt;br /&gt;    &amp;lt;td&amp;gt;&lt;br /&gt;     &amp;lt;a4j:commandButton value="Ejecutar accion Sin error " action="#{userctrl.executeActionTwo}" &lt;br /&gt;      oncomplete="if(#{empty facesContext.maximumSeverity}) #{rich:component('panel')}.hide();"/&amp;gt;&lt;br /&gt;    &amp;lt;/td&amp;gt;&lt;br /&gt;   &amp;lt;/tr&amp;gt;&lt;br /&gt;   &amp;lt;tr&amp;gt;&lt;br /&gt;    &amp;lt;td&amp;gt;&lt;br /&gt;     &amp;lt;a4j:commandButton value="Cerrar" oncomplete="#{rich:component('panel')}.hide();"/&amp;gt;&lt;br /&gt;    &amp;lt;/td&amp;gt;&lt;br /&gt;   &amp;lt;/tr&amp;gt;&lt;br /&gt;   &amp;lt;/table&amp;gt;&lt;br /&gt;  &amp;lt;/a4j:form&amp;gt;&lt;br /&gt; &amp;lt;/rich:modalPanel&amp;gt;&lt;br /&gt;&amp;lt;/ui:define&amp;gt;&lt;br /&gt;&amp;lt;/ui:composition&amp;gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Lo importante de este código es la linea&lt;span style="font-weight: bold;"&gt; oncomplete="if (#{empty facesContext.maximumSeverity}) #{rich:component('panel')}.hide();"&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_UD9wqJsJiww/SUfyzHAI2pI/AAAAAAAAAG8/esFmWN77AEM/s1600-h/richfaces_tut2.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 156px;" src="http://2.bp.blogspot.com/_UD9wqJsJiww/SUfyzHAI2pI/AAAAAAAAAG8/esFmWN77AEM/s400/richfaces_tut2.png" alt="" id="BLOGGER_PHOTO_ID_5280456047982074514" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;ui:composition template="/template.xhtml"&gt;&lt;ui:define name="body"&gt;&lt;h:outputlink value="#" id="link"&gt;&lt;rich:modalpanel id="panel" width="500" height="400"&gt;&lt;f:facet nam=""&gt;&lt;ui:composition template="/template.xhtml"&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Otras soluciones encontradas:&lt;/span&gt;&lt;br /&gt;&lt;a href="http://jboss.com/index.html?module=bb&amp;amp;op=viewtopic&amp;amp;t=134933"&gt;http://jboss.com/index.html?module=bb&amp;amp;op=viewtopic&amp;amp;t=134933&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.martinahrer.at/blog/2008/03/05/keep-rich-faces-modal-panel-open-when-form-validation-errors-occur/"&gt;http://www.martinahrer.at/blog/2008/03/05/keep-rich-faces-modal-panel-open-when-form-validation-errors-occur/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.jboss.org/community/docs/DOC-11435"&gt;http://www.jboss.org/community/docs/DOC-11435&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.jboss.com/index.html?module=bb&amp;amp;op=viewtopic&amp;amp;p=4061517"&gt;http://www.jboss.com/index.html?module=bb&amp;amp;op=viewtopic&amp;amp;p=4061517&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/ui:composition&gt;&lt;/f:facet&gt;&lt;/rich:modalpanel&gt;&lt;/h:outputlink&gt;&lt;/ui:define&gt;&lt;/ui:composition&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4718168423716602728-1062338692202641778?l=tecnologiasjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tecnologiasjava.blogspot.com/feeds/1062338692202641778/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4718168423716602728&amp;postID=1062338692202641778' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4718168423716602728/posts/default/1062338692202641778'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4718168423716602728/posts/default/1062338692202641778'/><link rel='alternate' type='text/html' href='http://tecnologiasjava.blogspot.com/2008/12/howto-cerrar-modalpanel-cuando-no.html' title='HowTo: Cerrar ModalPanel cuando no existen mensajes de error.'/><author><name>Paola A. Grajeda</name><uri>http://www.blogger.com/profile/03183842695664105951</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/-yyp-u1Rz7hw/Tc8P46eAvVI/AAAAAAAAAm0/0Aubx8YUTHo/s220/avatar.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_UD9wqJsJiww/SUfy51yah_I/AAAAAAAAAHE/9Mo7bYvCVX4/s72-c/richfaces_tut1.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4718168423716602728.post-7071970305305402230</id><published>2008-11-16T06:45:00.000-08:00</published><updated>2009-01-13T04:11:35.624-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Utilidades'/><title type='text'>Jep - Parser Java de Expresiones Matematicas</title><content type='html'>En un trabajo practico de la Facultad me pedían la parametrización de una función, tenia dos opciones crear el parser o buscar alguna librería que lo tuviera encapsulado. Optamos por buscar la librería y asi fue como, a través, de un compañero conocí JEP. La pagina oficial es &lt;a href="http://www.singularsys.com/jep/"&gt;http://www.singularsys.com/jep/&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Este parser es muy sencillo de utilizar, al menos para lo que yo necesitaba, sin embargo se pueden crear funciones complejas con muchas variables y a su vez con muchas funciones, en este post usaremos de ejemplo un función con una variable.&lt;br /&gt;&lt;br /&gt;Los operadores Aritméticos que se pueden utilizar son:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;+ Suma&lt;/li&gt;&lt;li&gt;- Resta&lt;/li&gt;&lt;li&gt;/ División&lt;br /&gt;&lt;/li&gt;&lt;li&gt;* Multiplicacion&lt;/li&gt;&lt;li&gt;% Modulo&lt;/li&gt;&lt;li&gt;^ Potencia&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Pero también soporta operadores lógicos por lo que dispondremos del &amp;amp;&amp;amp; (AND),  || (OR), ! (NOT),  &gt;, &lt;, &gt;=, &lt;=, == (EQUALS), entre otros.  Este parser a su vez dispone de funciones standart para ser utilizadas, en el código tendremos que habilitarlas con la linea &lt;span style="font-weight: bold;"&gt;jep.addStandardFunctions();&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;sin(x): Seno&lt;/li&gt;&lt;li&gt;cos(x): Coseno&lt;/li&gt;&lt;li&gt;tan(x): Tangente&lt;/li&gt;&lt;li&gt;asin(x): ArcoSeno&lt;/li&gt;&lt;li&gt;acos(x): ArcoCoseno &lt;/li&gt;&lt;li&gt;atan(x): ArcoTangente&lt;/li&gt;&lt;li&gt;sinh(x): Seno Hiperbolico     &lt;/li&gt;&lt;li&gt;cosh(x): Coseno Hiperbolico&lt;/li&gt;&lt;li&gt;tanh(x): Tangente Hiperbolica&lt;/li&gt;&lt;li&gt;ln(x): Logaritmo Natura&lt;/li&gt;&lt;li&gt;log(x): Logaritmo en base 10&lt;/li&gt;&lt;li&gt;lg(x): Logaritmo en base 2&lt;/li&gt;&lt;li&gt;exp(x): exponencial&lt;/li&gt;&lt;/ul&gt;Para habilitar las constantes debemos agregar al codigo jep.addStandardConstants()&lt;br /&gt;&lt;br /&gt;La función que vamos a utilizar es  80 * sin(-((x/40)^(1/2))) para que no nos tire una excepción &lt;span style="font-weight: bold;"&gt;org.nfunk.jep.ParseException: Syntax Error (implicit multiplication not enabled)&lt;/span&gt; provocado por al falta del operador multiplicación entre el signo menos y el valor que se calculo entre los paréntesis, podemos cambiar la función a  80 * sin((-1) * ((x/40)^(1/2))) o habilitar la multiplicación explicita con jep.setImplicitMul(true);.&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;package com.blogspot.tecnologiasjava.test;&lt;br /&gt;&lt;br /&gt;import org.nfunk.jep.JEP;&lt;br /&gt;import org.nfunk.jep.Node;&lt;br /&gt;import org.nfunk.jep.ParseException;&lt;br /&gt;importorg.nfunk.jep.function.Sine;&lt;br /&gt;&lt;br /&gt;public class Test {&lt;br /&gt;&lt;br /&gt;    private static String funcion ="80*sin(-((x/40)^(1/2)))";&lt;br /&gt;   &lt;br /&gt;    public static void main(String[] args) {&lt;br /&gt;   &lt;br /&gt;       JEP jep =new JEP();&lt;br /&gt;       jep.setImplicitMul(true);&lt;br /&gt;       jep.addStandardFunctions();&lt;br /&gt;       &lt;br /&gt;        /** Le damos un valor a la variable */&lt;br /&gt;       jep.addVariable("x", 5.0);&lt;br /&gt;       double resultado =0.0;&lt;br /&gt;       try {&lt;br /&gt;           /** Parseamos la funcion */&lt;br /&gt;           Node expresion = jep.parse(funcion);&lt;br /&gt;           /** Evaluamos la expresion */&lt;br /&gt;           resultado = (Double)jep.evaluate(expresion);&lt;br /&gt;        } catch (ParseException e) {&lt;br /&gt;           System.out.println("Error al parsear la funcion :"+funcion);&lt;br /&gt;           e.printStackTrace();&lt;br /&gt;        }&lt;br /&gt;       System.out.println(resultado);&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4718168423716602728-7071970305305402230?l=tecnologiasjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tecnologiasjava.blogspot.com/feeds/7071970305305402230/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4718168423716602728&amp;postID=7071970305305402230' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4718168423716602728/posts/default/7071970305305402230'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4718168423716602728/posts/default/7071970305305402230'/><link rel='alternate' type='text/html' href='http://tecnologiasjava.blogspot.com/2008/11/jep-parser-java-de-expresiones.html' title='Jep - Parser Java de Expresiones Matematicas'/><author><name>Paola A. Grajeda</name><uri>http://www.blogger.com/profile/03183842695664105951</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/-yyp-u1Rz7hw/Tc8P46eAvVI/AAAAAAAAAm0/0Aubx8YUTHo/s220/avatar.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4718168423716602728.post-577354834943807844</id><published>2008-10-21T15:02:00.000-07:00</published><updated>2008-10-21T15:42:50.821-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Eclipse'/><title type='text'>¿Por qué un corrector ortográfico en Eclipse?</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_Q43CNgNBt9Y/SP5a3q67NII/AAAAAAAAAfs/cWKodTsOXQo/s1600-h/eclipse.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_Q43CNgNBt9Y/SP5a3q67NII/AAAAAAAAAfs/cWKodTsOXQo/s400/eclipse.jpg" alt="" id="BLOGGER_PHOTO_ID_5259741327276061826" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Ya todos habrán visto o se habrán enterado que las últimas versiones de Eclipse vienen con un corrector ortográfico al mejor estilo procesador de texto, que al escribir los comentarios va subrayando las palabras mal escritas, del mismo modo que se subraya lo que no compila.&lt;br /&gt;&lt;br /&gt;Lo primero que pensé cuando lo vi fue: &lt;span style="font-style: italic;"&gt;"Qué porquería! Cómo lo desactivo?"&lt;/span&gt;, como le habrá pasado a la mayoría de los programadores imagino. Como si no fuera pesada ya la compilación &lt;span style="font-style: italic;"&gt;on the fly&lt;/span&gt; (que es bastante útil, pero si tenemos un buen fierro), se le agrega otro proceso más que corre en &lt;span style="font-style: italic;"&gt;background&lt;/span&gt; inspeccionando los comentarios.&lt;br /&gt;&lt;br /&gt;Creo que el primer impulso de cualquier programador es desactivarlo. Y eso es fácil. Vamos a: &lt;span style="font-style: italic; font-weight: bold;"&gt;Window&lt;/span&gt;&lt;span style="font-weight: bold;"&gt; -&gt; &lt;/span&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt;Preferences&lt;/span&gt;&lt;span style="font-weight: bold;"&gt; -&gt; &lt;/span&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt;General&lt;/span&gt;&lt;span style="font-weight: bold;"&gt; -&gt; &lt;/span&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt;Editors&lt;/span&gt;&lt;span style="font-weight: bold;"&gt; -&gt; &lt;/span&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt;Text Editors&lt;/span&gt;&lt;span style="font-weight: bold;"&gt; -&gt; &lt;/span&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt;Spelling&lt;/span&gt; y desde aquí podemos personalizar a gusto el corrector o inhabilitarlo por completo.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_Q43CNgNBt9Y/SP5TT5FIU5I/AAAAAAAAAfY/zu4VmZaJvrY/s1600-h/eclipse_spelling.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_Q43CNgNBt9Y/SP5TT5FIU5I/AAAAAAAAAfY/zu4VmZaJvrY/s400/eclipse_spelling.jpg" alt="" id="BLOGGER_PHOTO_ID_5259733016020276114" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Ahora, reflexionando un poco, y dejando de lado nuestros viejos instintos primitivos de sentarse a programar todo un método gigante de una, sin respirar, sin diseño ni nada. &lt;span style="font-weight: bold;"&gt;¿Por qué un corrector ortográfico en Eclipse? ¿Hacemos bien en desactivarlo?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;En el caso en que tengamos 1 Gb de RAM (o menos) yo opino que sí. Lo mismo si estamos escribiendo comentarios en castellano. ¿De qué sirve un corrector que subraya todas las palabras porque están en otro idioma?&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Pero si estamos escribiendo código en inglés, con comentarios en inglés, y tenemos una máquina que se lo banque. ¿Por qué no?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Si algo nos están enseñando las nuevas metodologías ágiles de desarrollo es que la escritura de código es un arte iterativo. Al igual que un escultor, vamos refactoreando nuestro código, vamos perfeccionándolo, minimizándolo, clarificándolo.&lt;br /&gt;&lt;br /&gt;Un buen programador es aquel que escribe código legible, eficiente, reutilizable. Javadoc, por ejemplo, nos provee la posibilidad de incluir la documentación en el código. &lt;span style="font-weight: bold;"&gt;Y si escribimos buena documentación, es mejor que no tenga errores ortográficos.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Yo creo que por ese lado viene la idea de la gente de Eclipse de incorporar un corrector ortográfico en un IDE de programación. Las metodologías ágiles fomentan la escritura de documentación dentro del mismo código.&lt;br /&gt;&lt;br /&gt;Por otro lado, también tenemos filosofías como la de &lt;a href="http://www.domaindrivendesign.org/"&gt;&lt;span style="font-style: italic;"&gt;Domain-Driven Design&lt;/span&gt;&lt;/a&gt;, que fomentan escribir un código verboso, muy claro y orientado al dominio. Mediante el lenguaje ubicuo podemos escribir código que a la vez sirva como documentación. Los nombres de los atributos, de las clases y de los servicios pueden ser escogidos para que un experto de dominio sea capaz de comprender a alto nivel como funciona la aplicación.&lt;br /&gt;&lt;br /&gt;Todo tiende a que, como programadores, tengamos que &lt;span style="font-style: italic;"&gt;switchear&lt;/span&gt; lo menos posible entre un documento de Word y el IDE. ¿Para qué? Si podemos tener todo en un lugar solo. A esto apunta la decisión de un corrector ortográfico en los comentarios.&lt;br /&gt;&lt;br /&gt;Igual, cada día creo más que es mejor un código verboso, con claros y efectivos &lt;span style="font-style: italic;"&gt;unit tests&lt;/span&gt;, que líneas y líneas de comentarios o de Javadoc para explicar que estamos recorriendo un array o estamos aumentando el valor de una variable, o peor:&lt;span style="font-weight: bold;"&gt; para explicar qué hace un método y qué tiene que recibir y devolver, cuando la misma firma, con su nombre, sus parámetros y su tipo de retorno ya lo indica.&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;Un código claro debería entenderse por sí solo.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4718168423716602728-577354834943807844?l=tecnologiasjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tecnologiasjava.blogspot.com/feeds/577354834943807844/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4718168423716602728&amp;postID=577354834943807844' title='4 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4718168423716602728/posts/default/577354834943807844'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4718168423716602728/posts/default/577354834943807844'/><link rel='alternate' type='text/html' href='http://tecnologiasjava.blogspot.com/2008/10/por-qu-un-corrector-ortogrfico-en.html' title='¿Por qué un corrector ortográfico en Eclipse?'/><author><name>Adrián Paredes</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-rCR9tdvy1zQ/AAAAAAAAAAI/AAAAAAAADik/eHxEpx8CVa0/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_Q43CNgNBt9Y/SP5a3q67NII/AAAAAAAAAfs/cWKodTsOXQo/s72-c/eclipse.jpg' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4718168423716602728.post-5072489153917581051</id><published>2008-10-09T18:57:00.000-07:00</published><updated>2008-10-09T19:48:35.070-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Utilidades'/><title type='text'>findJAR.com</title><content type='html'>Uno de los obstáculos más comunes para un programador que recién comienza a adentrarse en el mundo de Java es la resolución de dependencias. La vida sería mucho más sencilla si cada &lt;span style="font-weight: bold;"&gt;import &lt;/span&gt;se resolviera solo (por la &lt;span style="font-style: italic;"&gt;virtual machine&lt;/span&gt;, el compilador o quien sea), si alguna herramienta, aumáticamente, buscara (en algún lado) el archivo JAR donde vive esa clase (ese &lt;span style="font-weight: bold;"&gt;.class&lt;/span&gt;) que estamos tratando de importar, y se agregara solito al &lt;span style="font-weight: bold;"&gt;classpath&lt;/span&gt; sin problemas.&lt;br /&gt;&lt;br /&gt;Hay algunos IDEs como &lt;a href="http://www.eclipse.org/"&gt;Eclipse&lt;/a&gt; o &lt;a href="http://www.netbeans.org/"&gt;NetBeans&lt;/a&gt; que nos ayudan un poco en esta tarea, o tecnologías modernas como &lt;a href="http://maven.apache.org/"&gt;Maven2&lt;/a&gt;, que día a día gana más adeptos.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Pero la&lt;/span&gt;&lt;span style="font-weight: bold;"&gt; verdad es que a la hora de importar una clase que no conocemos, ni tenemos la somera idea de dónde empezar a buscar, puede traernos un pequeño dolor de cabeza.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Por eso hoy me puse bastante contento cuando conocí &lt;a href="http://www.findjar.com/"&gt;esta página&lt;/a&gt; por medio de un compañero de trabajo. Se llama &lt;a href="http://www.findjar.com/"&gt;findJAR&lt;/a&gt; y lo que hace justamente es, a partir del nombre de una clase o paquete, busca en su extensa base de datos para contarnos dónde podemos encontrar alguna implementación de esa bendita clase que estamos buscando.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_Q43CNgNBt9Y/SO7AMuqxwiI/AAAAAAAAAcc/5zyuVHTv0H0/s1600-h/findJAR.com.01.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_Q43CNgNBt9Y/SO7AMuqxwiI/AAAAAAAAAcc/5zyuVHTv0H0/s400/findJAR.com.01.png" alt="" id="BLOGGER_PHOTO_ID_5255349140106363426" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Además, como si no fuera ya suficiente utilidad el que podamos localizar el nombre del JAR que estábamos buscando, la página nos da información sobre la URL de donde viene la librería, las demás clases y paquetes que se pueden encontrar ahí dentro, y lo mejor: &lt;span style="font-weight: bold;"&gt;el link para descargarnos el JAR&lt;/span&gt; desde &lt;a href="http://mirrors.ibiblio.org/pub/mirrors/"&gt;&lt;span style="font-style: italic;"&gt;ibiblio&lt;/span&gt;&lt;/a&gt;, uno de los repositorios de mirrors más populares que usan muchas aplicaciones y proyectos, como Maven o &lt;a href="http://tecnologiasjava.blogspot.com/search/label/Maven"&gt;Maven2&lt;/a&gt;, por ejemplo.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_Q43CNgNBt9Y/SO7ABDnY8VI/AAAAAAAAAcU/9fgro5bG2AY/s1600-h/findJAR.com.02.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_Q43CNgNBt9Y/SO7ABDnY8VI/AAAAAAAAAcU/9fgro5bG2AY/s400/findJAR.com.02.png" alt="" id="BLOGGER_PHOTO_ID_5255348939570868562" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Sin lugar a dudas, una herramienta fundamental para el trabajo diario, digna de adjuntar a mis &lt;span style="font-style: italic;"&gt;Bookmarks&lt;/span&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4718168423716602728-5072489153917581051?l=tecnologiasjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tecnologiasjava.blogspot.com/feeds/5072489153917581051/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4718168423716602728&amp;postID=5072489153917581051' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4718168423716602728/posts/default/5072489153917581051'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4718168423716602728/posts/default/5072489153917581051'/><link rel='alternate' type='text/html' href='http://tecnologiasjava.blogspot.com/2008/10/findjarcom.html' title='findJAR.com'/><author><name>Adrián Paredes</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-rCR9tdvy1zQ/AAAAAAAAAAI/AAAAAAAADik/eHxEpx8CVa0/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_Q43CNgNBt9Y/SO7AMuqxwiI/AAAAAAAAAcc/5zyuVHTv0H0/s72-c/findJAR.com.01.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4718168423716602728.post-3298324291296678758</id><published>2008-09-28T10:05:00.000-07:00</published><updated>2009-01-14T16:34:52.767-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='EJB 3'/><category scheme='http://www.blogger.com/atom/ns#' term='Eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='Jboss'/><title type='text'>Desarrollo de un EJB 3.0 en Eclipse</title><content type='html'>&lt;span style="font-weight: bold;"&gt;Objetivo&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;A) Desarrollar un EJB 3.0 en eclipse.&lt;br /&gt;B) Desplegar un EJB en JBOSS&lt;br /&gt;C) Desarrollar un cliente para invocar un metodo del EJB.&lt;br /&gt;&lt;p&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt; &lt;/p&gt; &lt;p style="margin-bottom: 0cm; font-weight: bold;"&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style="margin-bottom: 0cm; font-weight: bold;"&gt;Versiones utilizadas: &lt;/p&gt;  &lt;p style="margin-bottom: 0cm;"&gt; Eclipse 3.4 para JavaEE con los plugins de Jboss Tools 2.1.2 (http://www.jboss.org/tools/) Jboss 4.2.3&lt;/p&gt;&lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-weight: bold;"&gt;A) Desarrollar un EJB 3.0 en eclipse.&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;Primero creamos un proyecto EJB Project. &lt;span style="font-weight: bold;"&gt;File/New&lt;/span&gt;, seleccionamos en el desplegable &lt;span style="font-weight: bold;"&gt;Others&lt;/span&gt;. Ahora buscamos&lt;span style="font-weight: bold;"&gt; EJB/EJB Project&lt;/span&gt;.   Al proyecto lo llamamos EJB3-Project.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_UD9wqJsJiww/SN-7wT-gfRI/AAAAAAAAAGU/9WRcnett6pA/s1600-h/tuteclipseejbjboss1_1.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_UD9wqJsJiww/SN-7wT-gfRI/AAAAAAAAAGU/9WRcnett6pA/s400/tuteclipseejbjboss1_1.png" alt="" id="BLOGGER_PHOTO_ID_5251122129207852306" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Ahora vamos a crear un Session Bean , en este caso sera Stataless y Remoto. Vamos a &lt;span style="font-weight: bold;"&gt;File/New/EJB/&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_UD9wqJsJiww/SN-7pFpANKI/AAAAAAAAAGM/zsUOQFv3aKo/s1600-h/tuteclipseejbjboss1_2.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_UD9wqJsJiww/SN-7pFpANKI/AAAAAAAAAGM/zsUOQFv3aKo/s400/tuteclipseejbjboss1_2.png" alt="" id="BLOGGER_PHOTO_ID_5251122005100475554" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;El Session Bean se llamara HelloWorldBean y la interface HelloWorld. Aceptamos.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_UD9wqJsJiww/SN-7kknD7WI/AAAAAAAAAGE/a8COgEh1j5U/s1600-h/tuteclipseejbjboss1_3.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_UD9wqJsJiww/SN-7kknD7WI/AAAAAAAAAGE/a8COgEh1j5U/s400/tuteclipseejbjboss1_3.png" alt="" id="BLOGGER_PHOTO_ID_5251121927514484066" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Podemos observar que al proyecto se agregaron las dos clases, pero tenemos algunos de paquetes. Esto es porque tenemos que agregarle la libreria de jboss. Boton secundario sobre el proyecto, Build Path, Configure Build Path, pesta;a Libraries. Hacemos click sobre &lt;span style="font-weight: bold;"&gt;Add&lt;/span&gt; y seleccionamos Jboss EJB3 Libraries.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_UD9wqJsJiww/SN-7e-l3ukI/AAAAAAAAAF8/kIKz9cQQCt4/s1600-h/tuteclipseejbjboss1_4.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_UD9wqJsJiww/SN-7e-l3ukI/AAAAAAAAAF8/kIKz9cQQCt4/s400/tuteclipseejbjboss1_4.png" alt="" id="BLOGGER_PHOTO_ID_5251121831409596994" border="0" /&gt;&lt;/a&gt;Hacemos click en &lt;span style="font-weight: bold;"&gt;Next&lt;/span&gt;. Si todavía no definieron a Jboss como un Server, en este paso se les solicitara que lo creen. Hacemos click en &lt;span style="font-weight: bold;"&gt;CREATE A JBOSS SERVER&lt;/span&gt;. En nuestro caso estamos trabajando con la version 4.2 de JBoss, por lo que seleccionamos en el listado JBoss AS 4.2 y en Server Name ingresamos JBoss4.2&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_UD9wqJsJiww/SN-7a8GhlxI/AAAAAAAAAF0/QncRDCbiLLc/s1600-h/tuteclipseejbjboss1_5.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_UD9wqJsJiww/SN-7a8GhlxI/AAAAAAAAAF0/QncRDCbiLLc/s400/tuteclipseejbjboss1_5.png" alt="" id="BLOGGER_PHOTO_ID_5251121762021775122" border="0" /&gt;&lt;/a&gt;En la pantalla siguiente ingresamos la ruta de nuestro JBoss y por ahora dejamos seleccionado Default en Configuration.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_UD9wqJsJiww/SN-7U4JU2PI/AAAAAAAAAFs/F-bvTn8y6h4/s1600-h/tuteclipseejbjboss1_6.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_UD9wqJsJiww/SN-7U4JU2PI/AAAAAAAAAFs/F-bvTn8y6h4/s400/tuteclipseejbjboss1_6.png" alt="" id="BLOGGER_PHOTO_ID_5251121657880566002" border="0" /&gt;&lt;/a&gt;En la pantalla siguiente se nos pide la clave y password de JMX-Console. Ingresen admin,admin que son los valores por defecto. Hacemos click en finish. Volvimos al punto de la seleccion de la librería de Jboss. Ahora hacemos click sobre JBoss 4.2 Server y hacemos click en &lt;span style="font-weight: bold;"&gt;Finish&lt;/span&gt; nuevamente. Y para finalizar &lt;span style="font-weight: bold;"&gt;OK&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Ahora Agregamos el método getHelloWorld a nuestras clases. Estas son las clases finales del bean.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;import&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;javax.ejb.Stateless;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&lt;/font&gt;&lt;br /&gt;&lt;font color="#3f5fbf"&gt;/**&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&lt;/font&gt;&lt;font color="#3f5fbf"&gt;*&amp;nbsp;Session&amp;nbsp;Bean&amp;nbsp;implementation&amp;nbsp;class&amp;nbsp;HelloWorldBean&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&lt;/font&gt;&lt;font color="#3f5fbf"&gt;*/&lt;/font&gt;&lt;br /&gt;&lt;font color="#646464"&gt;@Stateless&lt;/font&gt;&lt;br /&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;public&amp;nbsp;class&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;HelloWorldBean&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;implements&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;HelloWorld&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;{&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;public&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;String&amp;nbsp;getHelloWorld&lt;/font&gt;&lt;font color="#000000"&gt;(){&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;return&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#2a00ff"&gt;&amp;#34;Hola&amp;nbsp;EJB&amp;nbsp;3.0&amp;#34;&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&lt;/font&gt;&lt;br /&gt;&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&lt;/font&gt;&lt;br /&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;package&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;com.blogspot.tecnologiasjava.ejb;&lt;/font&gt;&lt;br /&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;import&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;javax.ejb.Remote;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&lt;/font&gt;&lt;br /&gt;&lt;font color="#646464"&gt;@Remote&lt;/font&gt;&lt;br /&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;public&amp;nbsp;interface&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;HelloWorld&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;{&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;public&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;String&amp;nbsp;getHelloWorld&lt;/font&gt;&lt;font color="#000000"&gt;()&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;B) Desplegar un EJB en JBOSS &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Para desplegar el EJB HelloWord en JBoss, hacemos click con el botón secundario del mouse sobre el proyecto. Seleccionamos &lt;span style="font-weight: bold;"&gt;Run As/Run On Server&lt;/span&gt;. Se nos pedira seleccionar el server donde queremos desplegarlo. Seleccionamos JBoss4.2 Server que es nuestra única opción por ahora :P. Hacemos click sobre &lt;span style="font-weight: bold;"&gt;Finish&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_UD9wqJsJiww/SN-7QfXeEzI/AAAAAAAAAFk/HS6zLR3NCDo/s1600-h/tuteclipseejbjboss1_7.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_UD9wqJsJiww/SN-7QfXeEzI/AAAAAAAAAFk/HS6zLR3NCDo/s400/tuteclipseejbjboss1_7.png" alt="" id="BLOGGER_PHOTO_ID_5251121582509527858" border="0" /&gt;&lt;/a&gt;En la consola podemos ver el log de Jboss. Afortunadamente nuestro EJB se desplegó correctamente.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_UD9wqJsJiww/SN-7KyDhvrI/AAAAAAAAAFc/n-ztcqobmLE/s1600-h/tuteclipseejbjboss1_8.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_UD9wqJsJiww/SN-7KyDhvrI/AAAAAAAAAFc/n-ztcqobmLE/s400/tuteclipseejbjboss1_8.png" alt="" id="BLOGGER_PHOTO_ID_5251121484446940850" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;3) Desarrollar un cliente para invocar un método del EJB. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Ahora haremos un sencillo cliente que buscara el EJB mediante JNDI e invocara el método getHelloWorld del Bean.&lt;br /&gt;&lt;br /&gt;Primero creamos un nuevo proyecto Java en este caso lo llamamos TestEJB&lt;br /&gt;Agregamos a este proyecto el proyecto anterior.  Click con el botón secundario sobre el proyecto. Seleccionar Java Build Path. En la pestaña &lt;span style="font-weight: bold;"&gt;Projects&lt;/span&gt; hacer click sobre &lt;span style="font-weight: bold;"&gt;Add&lt;/span&gt; y seleccionar el proyecto EJB3-Project.&lt;br /&gt;También tenemos que agregar jbossall-client.jar que esta en la carpeta de instalación de jboss/client/&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_UD9wqJsJiww/SN-7GRLb2NI/AAAAAAAAAFU/eYVApFnx9e0/s1600-h/tuteclipseejbjboss1_9.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_UD9wqJsJiww/SN-7GRLb2NI/AAAAAAAAAFU/eYVApFnx9e0/s400/tuteclipseejbjboss1_9.png" alt="" id="BLOGGER_PHOTO_ID_5251121406902261970" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Creamos una clase llamada Test por ejemplo con el siguiente código.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;&lt;font color="#7f0055"&gt;&lt;b&gt;package&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;com.blogspot.tecnologiasjava.test;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;import&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;java.util.Properties;&lt;/font&gt;&lt;br /&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;import&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;javax.naming.Context;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;import&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;javax.naming.InitialContext;&lt;/font&gt;&lt;br /&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;import&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;javax.naming.NamingException;&lt;/font&gt;&lt;br /&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;import&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;com.blogspot.tecnologiasjava.ejb.HelloWorld;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&lt;/font&gt;&lt;br /&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;public&amp;nbsp;class&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;Test&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;{&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;public&amp;nbsp;static&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;void&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;main&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;String&lt;/font&gt;&lt;font color="#000000"&gt;[]&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;args&lt;/font&gt;&lt;font color="#000000"&gt;)&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;throws&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;Exception&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;{&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;Properties&amp;nbsp;properties&amp;nbsp;=&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;new&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;Properties&lt;/font&gt;&lt;font color="#000000"&gt;()&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;properties.put&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#2a00ff"&gt;&amp;#34;java.naming.factory.initial&amp;#34;&lt;/font&gt;&lt;font color="#000000"&gt;,&lt;/font&gt;&lt;font color="#2a00ff"&gt;&amp;#34;org.jnp.interfaces.NamingContextFactory&amp;#34;&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;properties.put&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#2a00ff"&gt;&amp;#34;java.naming.factory.url.pkgs&amp;#34;&lt;/font&gt;&lt;font color="#000000"&gt;,&lt;/font&gt;&lt;font color="#2a00ff"&gt;&amp;#34;=org.jboss.naming:org.jnp.interfaces&amp;#34;&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;properties.put&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#2a00ff"&gt;&amp;#34;java.naming.provider.url&amp;#34;&lt;/font&gt;&lt;font color="#000000"&gt;,&amp;nbsp;&lt;/font&gt;&lt;font color="#2a00ff"&gt;&amp;#34;localhost:1099&amp;#34;&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;Context&amp;nbsp;ctx&amp;nbsp;=&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;new&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;InitialContext&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;properties&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;HelloWorld&amp;nbsp;hello&amp;nbsp;=&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;null&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;try&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;{&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;hello&amp;nbsp;=&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;HelloWorld&lt;/font&gt;&lt;font color="#000000"&gt;)&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;ctx.lookup&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#2a00ff"&gt;&amp;#34;HelloWorldBean/remote&amp;#34;&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;}&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;catch&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;NamingException&amp;nbsp;e&lt;/font&gt;&lt;font color="#000000"&gt;)&amp;nbsp;{&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;e.printStackTrace&lt;/font&gt;&lt;font color="#000000"&gt;()&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;System.out.println&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;hello.getHelloWorld&lt;/font&gt;&lt;font color="#000000"&gt;())&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#000000"&gt;}&amp;nbsp;&lt;/font&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Al ejecutar el test deberíamos ver el mensaje HOLA EJB 3.0.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_UD9wqJsJiww/SN-7AJ-7N_I/AAAAAAAAAFE/k-QNL82H4t0/s1600-h/tuteclipseejbjboss1_10.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_UD9wqJsJiww/SN-7AJ-7N_I/AAAAAAAAAFE/k-QNL82H4t0/s400/tuteclipseejbjboss1_10.png" alt="" id="BLOGGER_PHOTO_ID_5251121301891528690" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4718168423716602728-3298324291296678758?l=tecnologiasjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tecnologiasjava.blogspot.com/feeds/3298324291296678758/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4718168423716602728&amp;postID=3298324291296678758' title='10 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4718168423716602728/posts/default/3298324291296678758'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4718168423716602728/posts/default/3298324291296678758'/><link rel='alternate' type='text/html' href='http://tecnologiasjava.blogspot.com/2008/09/desarrollo-de-un-ejb-30-en-eclipse.html' title='Desarrollo de un EJB 3.0 en Eclipse'/><author><name>Paola A. Grajeda</name><uri>http://www.blogger.com/profile/03183842695664105951</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/-yyp-u1Rz7hw/Tc8P46eAvVI/AAAAAAAAAm0/0Aubx8YUTHo/s220/avatar.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_UD9wqJsJiww/SN-7wT-gfRI/AAAAAAAAAGU/9WRcnett6pA/s72-c/tuteclipseejbjboss1_1.png' height='72' width='72'/><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4718168423716602728.post-4207695035574158982</id><published>2008-09-23T20:54:00.000-07:00</published><updated>2009-01-14T16:58:28.919-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='Maven'/><category scheme='http://www.blogger.com/atom/ns#' term='Tomcat'/><title type='text'>Plugin de Maven2 para Sysdeo</title><content type='html'>En el post anterior de &lt;a href="http://tecnologiasjava.blogspot.com/2008/09/helloservlet-web-application-con-maven2.html"&gt;HelloServlet Web Application con Maven2 y Eclipse&lt;/a&gt;, mencioné al pasar que existía un plugin para Maven (un &lt;a href="http://mojo.codehaus.org/"&gt;&lt;span style="font-style: italic;"&gt;Mojo&lt;/span&gt;&lt;/a&gt;) que ya resolvía el problema que yo quería resolver. El plugin es de &lt;a href="http://codehaus.org/"&gt;&lt;span style="font-style: italic;"&gt;Codehaus&lt;/span&gt;&lt;/a&gt;, un espacio colaborativo donde se construyen proyectos &lt;span style="font-style: italic;"&gt;open source&lt;/span&gt;, y se llama &lt;a href="http://mojo.codehaus.org/sysdeo-tomcat-maven-plugin/index.html"&gt;sysdeo-tomcat-maven-plugin&lt;/a&gt;. Su uso es realmente muy sencillo y, si lo que quieren es ahorrarse un dolor de cabeza, recomiendo que lo usen.&lt;br /&gt;&lt;br /&gt;Como cualquier mojo de Maven, se descarga solito la primera vez que lo invocamos.&lt;br /&gt;&lt;br /&gt;Paso primero, abrimos una consola y hacemos lo mismo que hicimos en el &lt;a href="http://tecnologiasjava.blogspot.com/2008/09/helloservlet-web-application-con-maven2.html"&gt;post anterior&lt;/a&gt; para crear un proyecto web vacío. Escribimos:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;$ mvn archetype:create -DgroupId=com.blogspot.tecnologiasjava.helloservletmaven2 -DartifactId=HelloServletMaven2 -DarchetypeArtifactId=maven-archetype-webapp&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Recuerden que el &lt;span style="font-style: italic;"&gt;archetype&lt;/span&gt; &lt;span style="font-style: italic;"&gt;maven-archetype-webapp&lt;/span&gt; es el que ya nos genera un proyecto web con sus correspondientes carpetas de &lt;span style="font-weight: bold;"&gt;/src/main/java&lt;/span&gt;, la ruta por default para tirar el código, &lt;span style="font-weight: bold;"&gt;/src/main/resources&lt;/span&gt;, la ruta por default para tirar los recursos, y &lt;span style="font-weight: bold;"&gt;/src/main/webapp&lt;/span&gt;, que servirá como &lt;span style="font-style: italic;"&gt;root&lt;/span&gt; de la aplicación web, con un &lt;span style="font-weight: bold;"&gt;index.jsp&lt;/span&gt; y una carpeta &lt;span style="font-weight: bold;"&gt;WEB-INF&lt;/span&gt; con su &lt;span style="font-weight: bold;"&gt;web.xml&lt;/span&gt; para registrar &lt;span style="font-style: italic;"&gt;servlets&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Lo siguiente que tenemos que hacer es convertir el proyecto a un proyecto Eclipse. Para eso, como ya vimos, ejecutamos:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;mvn eclipse:eclipse&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;Esto nos generará el &lt;span style="font-weight: bold;"&gt;.project&lt;/span&gt; y el &lt;span style="font-weight: bold;"&gt;.classpath&lt;/span&gt; que el IDE necesita para importar el proyecto como si fuera propio.&lt;br /&gt;&lt;br /&gt;Pero momento! No importaremos el proyecto todavía. Nos falta hacer una cosa más.&lt;br /&gt;&lt;br /&gt;Abrimos el &lt;span style="font-weight: bold;"&gt;pom.xml&lt;/span&gt; y en el tag &lt;span style="font-weight: bold;"&gt;&amp;lt;build&amp;gt;&lt;/span&gt; debajo de &lt;span style="font-weight: bold;"&gt;&amp;lt;finalname&amp;gt;&lt;/span&gt; agregamos lo siguiente:&lt;br&gt;&lt;br&gt;&lt;pre&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;lt;plugins&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;plugin&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;groupId&amp;gt;org.codehaus.mojo&amp;lt;/groupId&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;artifactId&amp;gt;sysdeo-tomcat-maven-plugin&amp;lt;/artifactId&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;version&amp;gt;1.1&amp;lt;/version&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/plugin&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/plugins&amp;gt;&lt;br&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Este tag lo que hace es agregar la dependencia del plugin de Codehaus al proyecto. Cuando invoquemos al mojo, que será en el próximo paso, las dependencias se descargarán en nuestro repositorio local y podremos hacer uso del mismo.&lt;br /&gt;&lt;br /&gt;En la consola tipeamos:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;mvn sysdeo-tomcat:generate&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;Con esto lo que logramos es que se genere el &lt;span style="font-weight: bold;"&gt;.tomcatplugin&lt;/span&gt; que Sysdeo necesita para reconocer al proyecto como un proyecto Tomcat, y que automáticamente agregue lo necesario en el &lt;span style="font-weight: bold;"&gt;.project&lt;/span&gt; para habilitar el menú de Tomcat en el Eclipse.&lt;br /&gt;&lt;br /&gt;Ahora sí, importamos el proyecto en Eclipse y gualá! Si vamos a las &lt;span style="font-weight: bold;"&gt;propiedades del proyecto -&gt; Tomcat&lt;/span&gt;, vemos que efectivamente es un proyecto Tomcat y, las rutas que en el post anterior con mucha dedicación configuramos, aquí ya están correctas.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_Q43CNgNBt9Y/SNm6a_U0EcI/AAAAAAAAAZU/EMH4734MXVQ/s1600-h/HelloServletMaven2.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_Q43CNgNBt9Y/SNm6a_U0EcI/AAAAAAAAAZU/EMH4734MXVQ/s400/HelloServletMaven2.png" alt="" id="BLOGGER_PHOTO_ID_5249431813515121090" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4718168423716602728-4207695035574158982?l=tecnologiasjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tecnologiasjava.blogspot.com/feeds/4207695035574158982/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4718168423716602728&amp;postID=4207695035574158982' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4718168423716602728/posts/default/4207695035574158982'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4718168423716602728/posts/default/4207695035574158982'/><link rel='alternate' type='text/html' href='http://tecnologiasjava.blogspot.com/2008/09/plugin-de-maven2-para-sysdeo.html' title='Plugin de Maven2 para Sysdeo'/><author><name>Adrián Paredes</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-rCR9tdvy1zQ/AAAAAAAAAAI/AAAAAAAADik/eHxEpx8CVa0/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_Q43CNgNBt9Y/SNm6a_U0EcI/AAAAAAAAAZU/EMH4734MXVQ/s72-c/HelloServletMaven2.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4718168423716602728.post-2364297038560983253</id><published>2008-09-21T18:11:00.000-07:00</published><updated>2009-01-14T17:00:38.441-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='Maven'/><category scheme='http://www.blogger.com/atom/ns#' term='Tomcat'/><title type='text'>HelloServlet Web Application con Maven2 y Eclipse</title><content type='html'>&lt;a href="http://maven.apache.org/"&gt;Apache Maven&lt;/a&gt; es una herramienta muy poderosa de Apache, que sirve para buildear proyectos hechos en Java. Un momento! ¿¿Para buildear?? ¿Apache ya no había lanzado &lt;a href="http://ant.apache.org/"&gt;Apache Ant&lt;/a&gt; para eso?&lt;br /&gt;&lt;br /&gt;La diferencia que hay entre Maven y Ant es tan grande que hasta casi parece que provienen de dos diferentes paradigmas. Ant es una simple herramienta para buildear. No es más que un &lt;span style="font-style: italic;"&gt;make&lt;/span&gt; multiplataforma, procedural, como cualquier proceso &lt;span style="font-style: italic;"&gt;batch&lt;/span&gt;. Tranquilamente el &lt;span style="font-style: italic;"&gt;build.xml&lt;/span&gt; que tenemos que escribir con Ant, lo podríamos escribir con un script de Bash, de DOS, de perl o de python. La gran diferencia es que Maven introduce el concepto de POM (&lt;span style="font-style: italic;"&gt;Project Object Maven&lt;/span&gt;) y, con él, muchas funcionalidades que Ant no intenta ni intentará cubrir, como resolución automática de dependencias, armado de &lt;span style="font-style: italic;"&gt;archetypes&lt;/span&gt; (esqueletos de proyectos para distintas plataformas), herramientas para estadísticas, administración de proyectos y un largo etcétera.&lt;br /&gt;&lt;br /&gt;Maven es un pequeño &lt;span style="font-style: italic;"&gt;core&lt;/span&gt; que por sí solo no hace nada, pero al comenzar a usarlo empezará a descargar todos los plugins que lo hacen extremadamente poderoso e invencible.&lt;br /&gt;&lt;br /&gt;Sí, ya sé, ésa es una desventaja... Dudo que Maven pueda servir de mucho sin una conexión a Internet.&lt;br /&gt;&lt;br /&gt;Lo que me propongo en este post, es lograr crear un proyecto web con Maven, utilizando uno de estos &lt;span style="font-style: italic;"&gt;archetypes&lt;/span&gt; que mencioné, y luego integrar este proyecto con &lt;a href="http://www.eclipse.org/"&gt;Eclipse&lt;/a&gt; y &lt;a href="http://www.eclipsetotale.com/tomcatPlugin.html"&gt;Sysdeo&lt;/a&gt;, el plugin de &lt;a href="http://tomcat.apache.org/"&gt;Apache Tomcat&lt;/a&gt;. A pesar de que &lt;a href="http://mojo.codehaus.org/sysdeo-tomcat-maven-plugin/"&gt;ya existe un plugin para Maven&lt;/a&gt; que ya resuelve lo que yo estoy a punto de explicar y que todavía no he tenido oportunidad de investigar, creo que el siguiente ejemplo puede resultar muy útil para el que no conoce nada de Maven.&lt;br /&gt;&lt;br /&gt;Para la realización de este ejemplo utilicé:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;JDK 1.6&lt;/li&gt;&lt;li&gt;Apache Tomcat 6.0.18&lt;/li&gt;&lt;li&gt;Apache Maven 2.0.9&lt;/li&gt;&lt;li&gt;Eclipse 3.4.0&lt;/li&gt;&lt;li&gt;TomcatPluginV321 (Sysdeo)&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;Creando un HelloServlet con Maven paso a paso&lt;/h2&gt;&lt;span style="font-weight: bold;"&gt;Paso 1 - Crear un proyecto web vacío con Maven:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;El primer paso consiste en abrir una consola, pararnos sobre el directorio donde tenemos nuestro &lt;span style="font-style: italic;"&gt;workspace&lt;/span&gt; de Eclipse y tipear nuestro primer comando Maven:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;$ mvn archetype:create -DgroupId=com.blogspot.tecnologiasjava.helloservletmaven -DartifactId=HelloServletMaven -DarchetypeArtifactId=maven-archetype-webapp&lt;/span&gt;&lt;br /&gt;El &lt;span style="font-style: italic;"&gt;archetype&lt;/span&gt; que usamos se llama &lt;span style="font-style: italic;"&gt;maven-archetype-webapp&lt;/span&gt;. El resultado exitoso de este comando es un proyecto Maven nuevo, que cuelga sobre el directorio del que lo invocamos, con el nombre &lt;span style="font-style: italic;"&gt;HelloServletMaven&lt;/span&gt; y con la estructura de carpetas necesarias para desplegarlo en un Tomcat.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Paso 2 - Convertir el proyecto en un proyecto de Eclipse:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Maven tiene un plugin que sirve para convertir cualquier proyecto en un proyecto para Eclipse. Simplemente lo que tenemos que hacer es tipear:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;$ mvn eclipse:eclipse&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Habrán notado que si es la primera vez que utilizan Maven cada comando desencadena varias descargas de distintos repositorios, algunas pueden tardar su buen tiempo. Esto es porque Maven descarga todo lo que necesita para ejecutar el comando o se fija si hubo alguna actualización.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Paso 3 - Importar el proyecto con Eclipse:&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;Este paso consiste simplemente en importar el proyecto en Eclipse: &lt;span style="font-weight: bold;"&gt;Import --&gt; Existing Project into Workspace&lt;/span&gt;. Una vez importado el proyecto, veremos que hay algunas rutas en el classpath que no pueden resolverse. Si pasa esto, seguramente es porque no tenemos configurada la variable M2_REPO en el classpath del Eclipse. Para registrarla vamos a &lt;span style="font-weight: bold;"&gt;Windows -&gt; Preferences&lt;/span&gt; y allí elegimos &lt;span style="font-weight: bold;"&gt;Java -&gt; Build Path -&gt; Classpath Variables&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_Q43CNgNBt9Y/SNbzbzqGHrI/AAAAAAAAAZM/Kof5s5dzHlY/s1600-h/HelloServletMaven01.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_Q43CNgNBt9Y/SNbzbzqGHrI/AAAAAAAAAZM/Kof5s5dzHlY/s400/HelloServletMaven01.png" alt="" id="BLOGGER_PHOTO_ID_5248650074795679410" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Hacemos click en &lt;span style="font-weight: bold;"&gt;New&lt;/span&gt; y cargamos la variable &lt;span style="font-weight: bold;"&gt;M2_REPO&lt;/span&gt; con la ruta del repositorio local de Maven2, que seguramente es &lt;span style="font-weight: bold;"&gt;$HOME/.m2/repository&lt;/span&gt;, si trabajan con Linux.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_Q43CNgNBt9Y/SNbzSIdpQXI/AAAAAAAAAZE/ZZ707Knhum4/s1600-h/HelloServletMaven02.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_Q43CNgNBt9Y/SNbzSIdpQXI/AAAAAAAAAZE/ZZ707Knhum4/s400/HelloServletMaven02.png" alt="" id="BLOGGER_PHOTO_ID_5248649908581908850" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Cuando le demos aceptar, Eclipse nos preguntará si queremos re-buildear. Por supuesto le contestamos que sí. Y ya está! Problemas de buildeo solucionados.&lt;br /&gt;&lt;br /&gt;Maven cuenta con dos tipos de repositorios: los locales y los externos o remotos. En estos repositorios viven miles y miles de jars que Maven se descargará para resolver automáticamente las dependencias que tenga el proyecto. Para más información sobre los repositorios: &lt;a href="http://maven.apache.org/guides/introduction/introduction-to-repositories.html"&gt;http://maven.apache.org/guides/introduction/introduction-to-repositories.html&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Paso 4 - Buildear con Maven:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Para buildear con Maven, escribimos en la consola:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;$ mvn clean install&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Como siempre, veremos que se bajan varios archivos. Habrá que tener paciencia.&lt;br /&gt;&lt;br /&gt;Al terminar notaremos que nos generó una carpeta &lt;span style="font-weight: bold;"&gt;target&lt;/span&gt; en el &lt;span style="font-style: italic;"&gt;root&lt;/span&gt; del proyecto y en la que dentro, entre otras cosas, vive un archivo llamado &lt;span style="font-style: italic;"&gt;HelloServletMaven.war&lt;/span&gt;. Este &lt;span style="font-style: italic;"&gt;HelloServletMaven.war&lt;/span&gt; puede desplegarse en el Tomcat como cualquier archivo war y va a funcionar perfecto. Pero no es eso lo que queremos por ahora. Lo que queremos es desplegar la aplicación con el mismo plugin de Eclipse, Sysdeo.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Paso 5 - Convertir el Proyecto en un Proyecto Tomcat:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;En Eclipse, &lt;span style="font-weight: bold;"&gt;botón derecho sobre el proyecto -&gt;&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;Properties&lt;/span&gt;. Vamos a donde dice &lt;span style="font-weight: bold;"&gt;Tomcat &lt;/span&gt;y, en la solapa &lt;span style="font-weight: bold;"&gt;General&lt;/span&gt;, clickeamos en &lt;span style="font-weight: bold;"&gt;Is a Tomcat Project&lt;/span&gt;. Luego, en &lt;span style="font-weight: bold;"&gt;Subdirectory to set as web application root (optional)&lt;/span&gt;, seteamos la ruta que el Maven usa en su &lt;span style="font-style: italic;"&gt;archetype&lt;/span&gt; como root de la web-app: &lt;span style="font-weight: bold;"&gt;/src/main/webapp&lt;/span&gt; (la ruta es relativa al &lt;span style="font-style: italic;"&gt;root&lt;/span&gt; del proyecto).&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_Q43CNgNBt9Y/SNby5YeA7jI/AAAAAAAAAY8/hVhpDelA4fg/s1600-h/HelloServletMaven03.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_Q43CNgNBt9Y/SNby5YeA7jI/AAAAAAAAAY8/hVhpDelA4fg/s400/HelloServletMaven03.png" alt="" id="BLOGGER_PHOTO_ID_5248649483381698098" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Paso 6 - Levantar el Hello World:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Levantamos el Tomcat con el plugin de Sisdeo (start tomcat) y, para probar que vamos por buen camino, abrimos el &lt;span style="font-style: italic;"&gt;browser&lt;/span&gt; y vamos a &lt;span style="font-weight: bold;"&gt;http://localhost:8080/HelloServletMaven/&lt;/span&gt; (asumiendo que nuestro Tomcat esté escuchando en el puerto 8080). Si todo salió bien tenemos que estar viendo el &lt;span style="font-weight: bold;"&gt;Hello World!&lt;/span&gt; del &lt;span style="font-style: italic;"&gt;index.jsp&lt;/span&gt; que el comando &lt;span style="font-style: italic;"&gt;create&lt;/span&gt; de Maven2 generó con el &lt;span style="font-style: italic;"&gt;archetype&lt;/span&gt; de &lt;span style="font-style: italic;"&gt;webapp&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_Q43CNgNBt9Y/SNbytd5jxFI/AAAAAAAAAY0/GE2Ot14q41A/s1600-h/HelloServletMaven04.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_Q43CNgNBt9Y/SNbytd5jxFI/AAAAAAAAAY0/GE2Ot14q41A/s400/HelloServletMaven04.png" alt="" id="BLOGGER_PHOTO_ID_5248649278680974418" border="0" /&gt;&lt;/a&gt;Pero queremos más... Queremos estar levantando un Servlet...&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Paso 7 - Crear el HelloServlet&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;Primero bajemos el Tomcat (stop tomcat), para que no ande molestando mientras tocamos el proyecto. Luego, en &lt;span style="font-weight: bold;"&gt;src/main&lt;/span&gt; creamos una carpeta llamada &lt;span style="font-weight: bold;"&gt;java&lt;/span&gt; donde vamos a poner nuestro código.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_Q43CNgNBt9Y/SNbybzEYEeI/AAAAAAAAAYs/hphJu3X9YeA/s1600-h/HelloServletMaven05.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_Q43CNgNBt9Y/SNbybzEYEeI/AAAAAAAAAYs/hphJu3X9YeA/s400/HelloServletMaven05.png" alt="" id="BLOGGER_PHOTO_ID_5248648975125844450" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Lo siguiente que hacemos es poner esa carpeta en el build path. Para esto, &lt;span style="font-weight: bold;"&gt;botón derecho a la carpeta recién creada -&gt; BuildPath -&gt; Use as Source Folder&lt;/span&gt;. A continuación, creamos un paquete llamado &lt;span style="font-weight: bold;"&gt;servlets&lt;/span&gt; en &lt;span style="font-weight: bold;"&gt;src/main/java&lt;/span&gt; y creamos una clase &lt;span style="font-style: italic;"&gt;HelloServlet&lt;/span&gt; que sobrecargue el método &lt;span style="font-style: italic;"&gt;doGet&lt;/span&gt; para que imprima el &lt;span style="font-weight: bold;"&gt;Hello Servlet&lt;/span&gt; que nosotros queremos en la pantalla del &lt;span style="font-style: italic;"&gt;browser&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;package&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;servlets;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;import&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;java.io.IOException;&lt;/font&gt;&lt;br /&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;import&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;java.io.PrintWriter;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;import&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;javax.servlet.ServletException;&lt;/font&gt;&lt;br /&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;import&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;javax.servlet.http.HttpServlet;&lt;/font&gt;&lt;br /&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;import&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;javax.servlet.http.HttpServletRequest;&lt;/font&gt;&lt;br /&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;import&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;javax.servlet.http.HttpServletResponse;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;public&amp;nbsp;class&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;HelloServlet&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;extends&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;HttpServlet&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;{&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;private&amp;nbsp;static&amp;nbsp;final&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;long&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;serialVersionUID&amp;nbsp;=&amp;nbsp;&lt;/font&gt;&lt;font color="#990000"&gt;1L&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#646464"&gt;@Override&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;protected&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;void&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;doGet&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;HttpServletRequest&amp;nbsp;req,&amp;nbsp;HttpServletResponse&amp;nbsp;resp&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;throws&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;ServletException,&amp;nbsp;IOException&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;{&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;resp.setContentType&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#2a00ff"&gt;&amp;#34;text/html&amp;#34;&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;PrintWriter&amp;nbsp;out&amp;nbsp;=&amp;nbsp;resp.getWriter&lt;/font&gt;&lt;font color="#000000"&gt;()&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;out.println&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#2a00ff"&gt;&amp;#34;&amp;lt;h1&amp;gt;Hello&amp;nbsp;Servlet!!!&amp;lt;/h1&amp;gt;&amp;#34;&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;out.close&lt;/font&gt;&lt;font color="#000000"&gt;()&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;br /&gt;&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Paso 8 - Agregar la dependencia de servlet-api en el Maven:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Por supuesto, una vez de copiar este códgio, veremos que el Eclipse no compila, ya que le falta las librerías de &lt;span style="font-style: italic;"&gt;servlets&lt;/span&gt; en el &lt;span style="font-style: italic;"&gt;classpath&lt;/span&gt; del proyecto.&lt;br /&gt;&lt;br /&gt;En lugar de agregarlas en el proyecto de la forma tradicional, las agregaremos en el &lt;span style="font-weight: bold;"&gt;pom.xml &lt;/span&gt;(el archivo que Maven usa para compilar y que se encuentra en el &lt;span style="font-style: italic;"&gt;root&lt;/span&gt; del proyecto). Dentro del tag de &lt;span style="font-weight: bold;"&gt;dependencies&lt;/span&gt; escribimos:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;  &amp;nbsp; &amp;lt;dependency&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;groupid&amp;gt;javax.servlet&amp;lt;/groupid&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;artifactid&amp;gt;servlet-api&amp;lt;/artifactid&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;version&amp;gt;2.4&amp;lt;/version&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;scope&amp;gt;provided&amp;lt;/scope&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp; &amp;lt;/dependency&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Acto seguido, para que Maven incluya en el proyecto de Eclipse la dependencia, haremos de vuelta en la consola un:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;$ mvn eclipse:eclipse&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Maven descargará el &lt;span style="font-weight: bold;"&gt;servlet-api-2.4.jar&lt;/span&gt; desde sus repositorios y lo agregará al proyecto. Si le damos F5 al proyecto en el Eclipse veremos que los errores de dependencias se han solucionado. El &lt;span style="font-weight: bold;"&gt;servlet-api-2.4.jar&lt;/span&gt; se ha agregado al classpath.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Paso 9 - Registrar el HelloServlet en el web.xml:&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;En el &lt;span style="font-weight: bold;"&gt;/src/main/webapp/WEB-INF/web.xml&lt;/span&gt; agregamos la referencia al servlet que acabamos de crear. Dentro del tag &lt;span style="font-weight: bold;"&gt;web-app&lt;/span&gt;, debajo de &lt;span style="font-weight: bold;"&gt;display-name&lt;/span&gt; agregamos:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;code&gt;   &lt;br /&gt;&amp;nbsp; &amp;lt;servlet&amp;gt;&amp;nbsp;&amp;nbsp; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;servlet-name&amp;gt;HelloServlet&amp;lt;/servlet-name&amp;gt;&amp;nbsp;&amp;nbsp; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;servlet-class&amp;gt;servlets.HelloServlet&amp;lt;/servlet-class&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/servlet&amp;gt;&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp; &amp;lt;servlet-mapping&amp;gt;&amp;nbsp;&amp;nbsp; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;servlet-name&amp;gt;HelloServlet&amp;lt;/servlet-name&amp;gt;&amp;nbsp;&amp;nbsp; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;url-pattern&amp;gt;/HelloServlet&amp;lt;/url-pattern&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/servlet-mapping&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Paso 10 - Redireccionar la salida de los .class:&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;En &lt;span style="font-weight: bold;"&gt;/src/main/webapp/WEB-INF&lt;/span&gt; creamos la carpeta &lt;span style="font-weight: bold;"&gt;classes&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Luego, vamos a &lt;span style="font-weight: bold;"&gt;Propiedades del Proyecto&lt;/span&gt; y en &lt;span style="font-weight: bold;"&gt;Java Build Path&lt;/span&gt; seleccionamos la solapa &lt;span style="font-weight: bold;"&gt;Source&lt;/span&gt;. Aquí tenemos que tener &lt;span style="font-weight: bold;"&gt;HelloServlet/src/main/java&lt;/span&gt; y &lt;span style="font-weight: bold;"&gt;HelloServlet/src/main/resources&lt;/span&gt;. Seleccionamos &lt;span style="font-weight: bold;"&gt;Allow output folder for source folders&lt;/span&gt; y para ambas carpetas seleccionamos la ruta donde queremos que tire los .class compilados, que es la ruta donde el Tomcat buscará los servlets: &lt;span style="font-weight: bold;"&gt;HelloServletMaven/src/main/webapp/WEB-INF/classes&lt;/span&gt;. Se trata de la carpeta que acabamos de crear.&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_Q43CNgNBt9Y/SNbyLnsJx5I/AAAAAAAAAYk/k_4zh8bTECA/s1600-h/HelloServletMaven06.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_Q43CNgNBt9Y/SNbyLnsJx5I/AAAAAAAAAYk/k_4zh8bTECA/s400/HelloServletMaven06.png" alt="" id="BLOGGER_PHOTO_ID_5248648697193547666" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Paso 11 - Levantar el HelloServlet:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Levantamos de vuelta el Tomcat (start tomcat) y probamos en el browser si todo salió bien, a través de la dirección: &lt;span style="font-weight: bold;"&gt;http://localhost:8080/HelloServletMaven/HelloServlet&lt;/span&gt;. Si en la pantalla del browser vemos el &lt;span style="font-weight: bold;"&gt;Hello Servlet!!!&lt;/span&gt; quiere decir que todo salió bien.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_Q43CNgNBt9Y/SNbyAEUx_NI/AAAAAAAAAYc/WgPYauVB-WA/s1600-h/HelloServletMaven07.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_Q43CNgNBt9Y/SNbyAEUx_NI/AAAAAAAAAYc/WgPYauVB-WA/s400/HelloServletMaven07.png" alt="" id="BLOGGER_PHOTO_ID_5248648498721717458" border="0" /&gt;&lt;/a&gt;&lt;span style="font-weight: bold;"&gt;Paso 12 - Buildear exitosamente con Maven:&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;Siguiente desafío: buildear exitosamente con Maven. Para esto usamos el comando:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;$ mvn clean install&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Si tenemos problemas para builder porque el Maven nos tira algo así:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;/HelloServlet.java:[15,2] annotations are not supported in -source 1.3&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;(use -source 5 or higher to enable annotations)&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;@Override&lt;/span&gt;&lt;br /&gt;Significa que nuestro Maven, por default, está compilando con un JDK 1.3. Eso lo corregimos fácilmente agregando en el &lt;span style="font-weight: bold;"&gt;pom.xml&lt;/span&gt; del proyecto, dentro del tag &lt;span style="font-weight: bold;"&gt;build&lt;/span&gt;, debajo de &lt;span style="font-weight: bold;"&gt;finalName&lt;/span&gt;, lo siguiente:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;plugins&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;plugin&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;groupid&amp;gt;org.apache.maven.plugins&amp;lt;/groupid&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;artifactid&amp;gt;maven-compiler-plugin&amp;lt;/artifactid&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;version&amp;gt;2.0.2&amp;lt;/version&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;configuration&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;source&amp;gt;1.6&amp;lt;/source&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;target&amp;gt;1.6&amp;lt;/target&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/configuration&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/plugin&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/plugins&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;De esta forma, le indicamos que queremos buildear este proyecto con el JDK 1.6, que por supuesto sí soporta &lt;span style="font-style: italic;"&gt;annotations&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Podemos comprobar que en la carpeta &lt;span style="font-weight: bold;"&gt;target&lt;/span&gt; se generó el archivo &lt;span style="font-weight: bold;"&gt;HelloServletMaven.war&lt;/span&gt;. Les aseguro que este .war funciona perfecto. Si quieren hacer la prueba, despliéguenlo en el Tomcat y prueben con &lt;span style="font-weight: bold;"&gt;http://localhost:8080/HelloServletMaven/HelloServlet&lt;/span&gt;. Van a ver que el Servlet los saluda afectuosamente, como antes.&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4718168423716602728-2364297038560983253?l=tecnologiasjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tecnologiasjava.blogspot.com/feeds/2364297038560983253/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4718168423716602728&amp;postID=2364297038560983253' title='5 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4718168423716602728/posts/default/2364297038560983253'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4718168423716602728/posts/default/2364297038560983253'/><link rel='alternate' type='text/html' href='http://tecnologiasjava.blogspot.com/2008/09/helloservlet-web-application-con-maven2.html' title='HelloServlet Web Application con Maven2 y Eclipse'/><author><name>Adrián Paredes</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-rCR9tdvy1zQ/AAAAAAAAAAI/AAAAAAAADik/eHxEpx8CVa0/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_Q43CNgNBt9Y/SNbzbzqGHrI/AAAAAAAAAZM/Kof5s5dzHlY/s72-c/HelloServletMaven01.png' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4718168423716602728.post-2694486033664872306</id><published>2008-09-11T19:35:00.000-07:00</published><updated>2008-09-11T20:01:49.941-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='EJB 3'/><title type='text'>Introducción a EJB 3.0 - Parte 2</title><content type='html'>En el &lt;a href="http://tecnologiasjava.blogspot.com/2008/08/introduccin-ejb-30-parte-1.html"&gt;post anterior de EJB3&lt;/a&gt; presenté el libro de &lt;a href="http://www.manning.com/"&gt;&lt;span style="font-style: italic;"&gt;Manning Publications Co.&lt;/span&gt;&lt;/a&gt; &lt;a href="http://www.manning.com/panda/"&gt;&lt;span style="font-style: italic;"&gt;EJB 3 In Action&lt;/span&gt;&lt;/a&gt;, de &lt;span style="font-weight: bold;"&gt;Bebu Panda&lt;/span&gt;, &lt;span style="font-weight: bold;"&gt;Reza Rahman&lt;/span&gt; y &lt;span style="font-weight: bold;"&gt;Derek Lane&lt;/span&gt;, edición de Abril de 2007 (ISBN: 1-933988-34-7). Más que nada, me centré en el primer capítulo del libro, que es gratuito y &lt;a href="http://www.manning.com/panda/sample-ch01_Panda.pdf"&gt;puede descargarse desde aquí&lt;/a&gt;. Expliqué qué es un EJB, cuáles son los distintos tipos de EJB que JavaEE provee, escribí un poco sobre los Entities y la JPA (Java Persistence API), expliqué qué es un contenedor de EJBs como &lt;span style="font-style: italic;"&gt;Glassfish&lt;/span&gt; o &lt;span style="font-style: italic;"&gt;JBoss&lt;/span&gt;, detallé cuáles son los servicios que proveen los EJBs, uno por uno, y por último presenté el &lt;span style="font-style: italic;"&gt;HelloUser Example&lt;/span&gt; que se encuentra al final de este capítulo en el libro.&lt;br /&gt;&lt;br /&gt;Para esta segunda parte, nos vamos a meter de lleno en esa maravilla que ofrece EJB 3 que es la &lt;span style="font-weight: bold;"&gt;Inyección de Dependencia&lt;/span&gt; y en una explicación concisa del ejemplo del capítulo 2 del libro, que se puede &lt;a href="http://www.manning.com/panda/"&gt;descarcar desde aquí&lt;/a&gt;.&lt;br /&gt;&lt;h2&gt;Inyección de Dependencia&lt;/h2&gt;La &lt;span style="font-weight: bold;"&gt;Inyección de Dependencia&lt;/span&gt; (DI) es un concepto (o patrón) de arquitectura que está fuertemente emparentado con la &lt;span style="font-weight: bold;"&gt;Inversión de Control&lt;/span&gt; (IoC). Básicamente la DI se especializa en &lt;span style="font-weight: bold;"&gt;inyectar objetos&lt;/span&gt; en una clase, en lugar de ser la propia clase quien cree el objeto. En EJB 3 es el contenedor de EJBs quien inyecta en cada objeto los objetos necesarios según las relaciones plasmadas en los descriptores de despliegue o en las anotaciones.&lt;br /&gt;&lt;br /&gt;Para el que le interese conocer más de este patrón, hay un artículo muy pero muy interesante de &lt;a href="http://www.martinfowler.com/"&gt;Martin Fowler&lt;/a&gt; que se llama: &lt;a href="http://martinfowler.com/articles/injection.html"&gt;&lt;span style="font-style: italic;"&gt;"Inversion of Control Containers and the Dependency Injection pattern"&lt;/span&gt;&lt;/a&gt;. Fowler categoriza los distintos tipos de DI y ejemplifica cada uno con código de distintos &lt;span style="font-style: italic;"&gt;frameworks&lt;/span&gt;. Cuando Fowler escribió este fascinante artículo, todavía no existía la especificación de EJB 3, por lo tanto no hay ninguna mención a esta forma de inyectar beans mediante anotaciones, pero igual vale la pena leerlo.&lt;br /&gt;&lt;br /&gt;Uno de los grandes avances de EJB 3 es que nos permite reemplazar los descriptores XML de despliegue, en extremo verbosos y aburridos, por &lt;span style="font-style: italic;"&gt;metadata annotations&lt;/span&gt; inmersas en el código (esto no se pudo lograr hasta que no salió la característica de &lt;span style="font-style: italic;"&gt;annotations&lt;/span&gt; con Java5). En el ejemplo del post anterior, la inyección se llevó a cabo en el código del cliente. Mediante la anotación &lt;span style="font-style: italic;"&gt;@EJB&lt;/span&gt;, se inyectó un objeto del tipo &lt;span style="font-style: italic;"&gt;HelloUser&lt;/span&gt; en el atributo &lt;span style="font-style: italic;"&gt;helloUser&lt;/span&gt; de la clase del cliente:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;@EJB&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;private&lt;/span&gt; HelloUser helloUser;&lt;br /&gt;&lt;br /&gt;Recordemos que &lt;span style="font-style: italic;"&gt;HelloUser&lt;/span&gt; era una &lt;span style="font-weight: bold;"&gt;interface&lt;/span&gt;, por ende no se puede instanciar sin una implementación. El milagro en realidad sucedió cuando, en un código cualquiera de la clase del cliente, &lt;span style="font-weight: bold;"&gt;pudimos utilizar el objeto &lt;/span&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt;helloUser&lt;/span&gt;&lt;span style="font-weight: bold;"&gt; sin enfrentarnos a un NullPointerException, a pesar de no haber alocado memoria (&lt;span style="font-style: italic;"&gt;new&lt;/span&gt;) &lt;/span&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;en ninguna parte del código&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;void&lt;/span&gt; hello() {&lt;br /&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;helloUser.sayHello(&lt;span style="font-style: italic;"&gt;"Curious George"&lt;/span&gt;);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;El secreto está en la &lt;span style="font-weight: bold;"&gt;Inyección de Dependencia&lt;/span&gt;. La anotación &lt;span style="font-style: italic;"&gt;@EJB&lt;/span&gt;, que parece tan inocente, es una orden directa al contenedor de EJBs para que cree una instancia de &lt;span style="font-style: italic;"&gt;HelloUser&lt;/span&gt; con la implementación proporcionada del lado del servidor, que recordemos era ésta:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;@Stateless&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;public class&lt;/span&gt; HelloUserBean &lt;span style="font-weight: bold;"&gt;implement&lt;/span&gt; HelloUser {&lt;br /&gt;&lt;span&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;public void&lt;/span&gt; sayHello(String name) {&lt;br /&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;________&lt;/span&gt;System.out.println("Hello " + name + " welcome to EJB 3!");&lt;br /&gt;&lt;span&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;&lt;/span&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;¿Para qué sirve la DI entonces? En su forma más pura, &lt;span style="font-weight: bold;"&gt;la DI sirve para desacoplar completamente una interface de su implementación, por lo que podríamos cambiar de implementación en tiempo de ejecución&lt;/span&gt;. Noten que en ninguna parte del código del cliente es necesario utilizar la implementación &lt;span style="font-style: italic;"&gt;HelloUserBean&lt;/span&gt;. Gracias al polimorfismo podemos usar su interface &lt;span style="font-style: italic;"&gt;HelloUser&lt;/span&gt; sin tener conocimiento de &lt;span style="font-style: italic;"&gt;HelloUserBean&lt;/span&gt; y, gracias a la DI, podemos olvidarnos del &lt;span style="font-weight: bold;"&gt;new HelloUserBean()&lt;/span&gt; que es lo único de lo que el polimorfismo no permite abstraernos.&lt;br /&gt;&lt;br /&gt;En este caso, además, tenemos el adicional de que la DI reemplaza el terriblemente rutinario código de &lt;span style="font-style: italic;"&gt;JNDI lookup&lt;/span&gt;, que los programadores de EJB 2 conocen mejor que yo. Una aplicación tradicional J2EE usa JNDI como mecanismo para que un componente pueda acceder a otro. El problema con JNDI es que acopla fuertemente el código del cliente con el código del servidor, con todas las desventajas que esto implica en el desarrollo y el &lt;span style="font-style: italic;"&gt;testing&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Como ya dijimos, el objetivo principal de DI es hacer que los componentes estén lo menos acoplados posible. Cuando se usa JNDI, es responsabilidad del cliente buscar y obtener la referencia al objeto. &lt;span style="font-weight: bold;"&gt;La DI es exactamente lo opuesto a JNDI: es responsabilidad del contenedor inyectar un objeto basado en una dependencia declarada&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_Q43CNgNBt9Y/SMnXnpWWx_I/AAAAAAAAAU8/iSzHa-Cbn5c/s1600-h/JNDI_vs_DI.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_Q43CNgNBt9Y/SMnXnpWWx_I/AAAAAAAAAU8/iSzHa-Cbn5c/s400/JNDI_vs_DI.jpg" alt="" id="BLOGGER_PHOTO_ID_5244960317164144626" border="0" /&gt;&lt;/a&gt;&lt;h2&gt;Ejemplo de la aplicación &lt;span style="font-style: italic;"&gt;ActionBazaar&lt;/span&gt;&lt;/h2&gt;El ejemplo del capítulo 2 de &lt;span style="font-style: italic;"&gt;"EJB 3 in Action"&lt;/span&gt; es muchísimo más completo e interesante. Trata sobre una aplicación llamada &lt;span style="font-style: italic;"&gt;ActionBazaar&lt;/span&gt;, que no es más que un simple sitio de subastas como &lt;a href="http://www.ebay.com/"&gt;eBay&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_Q43CNgNBt9Y/SMnWdMb2qeI/AAAAAAAAAUs/4V7RtVwA4lM/s1600-h/ActionBazaar_01.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_Q43CNgNBt9Y/SMnWdMb2qeI/AAAAAAAAAUs/4V7RtVwA4lM/s400/ActionBazaar_01.jpg" alt="" id="BLOGGER_PHOTO_ID_5244959038092257762" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_Q43CNgNBt9Y/SMnWU1tWx6I/AAAAAAAAAUk/GqKlCezMyws/s1600-h/ActionBazaar_02.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_Q43CNgNBt9Y/SMnWU1tWx6I/AAAAAAAAAUk/GqKlCezMyws/s400/ActionBazaar_02.jpg" alt="" id="BLOGGER_PHOTO_ID_5244958894552696738" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;En el ejemplo (recordemos que lo pueden bajar de la url del libro, en su &lt;a href="http://www.manning.com/panda/codeexamples-javaeesdk.zip"&gt;versión para Glassfish&lt;/a&gt;, en su &lt;a href="http://www.manning.com/panda/codeexamples-oracleAS.zip"&gt;versión para oracleAS&lt;/a&gt;, o en su &lt;a href="http://www.manning-source.com/books/panda/codeexamples-jbossas.zip"&gt;versión para JBoss&lt;/a&gt;; el código que nos ocupa es el de la carpeta: "chapter2"), se utilizan cuatro beans: dos &lt;span style="font-style: italic;"&gt;Session Beans&lt;/span&gt; (&lt;span style="font-style: italic;"&gt;PlaceBidBean&lt;/span&gt; y &lt;span style="font-style: italic;"&gt;PlaceOrderBean&lt;/span&gt;) y un &lt;span style="font-style: italic;"&gt;Message-Driven Bean&lt;/span&gt; (MDB) (&lt;span style="font-style: italic;"&gt;OrderBillingMDB&lt;/span&gt;), que viven en la capa de lógica del negocio, y dos &lt;span style="font-style: italic;"&gt;Entities&lt;/span&gt;, que viven en la capa de persistencia. Además, de los dos Session Beans, uno es un &lt;span style="font-style: italic;"&gt;Stateless Bean&lt;/span&gt; (&lt;span style="font-style: italic;"&gt;PlaceBidBean&lt;/span&gt;) y el otro es un &lt;span style="font-style: italic;"&gt;Stateful Bean&lt;/span&gt; (&lt;span style="font-style: italic;"&gt;PlaceOrderBean&lt;/span&gt;).&lt;br /&gt;&lt;h2&gt;PlaceBinBean: un stateless bean&lt;/h2&gt;Los beans de sesión sirven para modelar &lt;span style="font-weight: bold;"&gt;procesos de negocio&lt;/span&gt; o &lt;span style="font-weight: bold;"&gt;acciones&lt;/span&gt;, especialmente los procesos y acciones percibidos por el usuario. Los &lt;span style="font-style: italic;"&gt;stateless session beans&lt;/span&gt;, en particular, se usan para modelar acciones o procesos que pueden hacerse de una sola vez, que no necesitan guardar su estado.&lt;br /&gt;&lt;br /&gt;En el gráfico de la sección anterior, vemos que &lt;span style="font-style: italic;"&gt;PlaceBidBean&lt;/span&gt; es invocado desde la interfaz de usuario mediante el servicio &lt;span style="font-style: italic;"&gt;addBid&lt;/span&gt;. Add Bid será un método del bean de sesión, que persistirá una oferta a través de &lt;span style="font-style: italic;"&gt;Bid Entity&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;@Local    &lt;/span&gt;&lt;span style="font-weight: bold;"&gt;// Marks EJB business interface as local&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;public interface&lt;/span&gt; PlaceBid {&lt;br /&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;public&lt;/span&gt; Bid addBid(Bid bid);&lt;br /&gt;}&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;@Stateless&lt;/span&gt;    &lt;span style="font-weight: bold;"&gt;// Marks POJO as stateless session bean&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;public class&lt;/span&gt; PlaceBidBean &lt;span style="font-weight: bold;"&gt;implements&lt;/span&gt; PlaceBid {&lt;br /&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;...&lt;br /&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;public&lt;/span&gt; PlaceBidBean() {}&lt;br /&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;public&lt;/span&gt; Bid addBid(Bid bid) {&lt;br /&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;return &lt;/span&gt;save(bid);&lt;br /&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;PlaceBid&lt;/span&gt; puede ser llamado, por ejemplo, desde un JSP o un servlet. En el libro usan un servlet llamado &lt;span style="font-style: italic;"&gt;PlaceBidServlet&lt;/span&gt; para invocar el servicio de &lt;span style="font-style: italic;"&gt;addBid&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;public class&lt;/span&gt; PlaceBidServlet &lt;span style="font-weight: bold;"&gt;extends&lt;/span&gt; HttpServlet {&lt;br /&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;&lt;span style="font-style: italic;"&gt;@EJB&lt;/span&gt;    &lt;span style="font-weight: bold;"&gt;// Injects instance of PlaceBid EJB&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;private&lt;/span&gt; PlaceBid placeBid;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;public void &lt;/span&gt;service(HttpServletRequest request, HttpServletResponse response) &lt;span style="font-weight: bold;"&gt;throws&lt;/span&gt; ServletException, IOException {&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;// Se leen los datos que vienen en el request&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;int&lt;/span&gt; bidderId = Integer.parseInt(request.getParameter("bidder_id"));&lt;br /&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;int&lt;/span&gt; itemId = Integer.parseInt(request.getParameter("item_id"));&lt;br /&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;double&lt;/span&gt; bidAmount = Double.parseDouble(request.getParameter("bid_amount"));&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;// Se crea la oferta y se setean los atributos&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;Bid bid = &lt;span style="font-weight: bold;"&gt;new&lt;/span&gt; Bid();&lt;br /&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;bid.setBidderID(bidderID);&lt;br /&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;bid.setItemID(itemID);&lt;br /&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;bid.setBidAmount(bidAmount);&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;// Se invoca el addBid del Bean de Sesión&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;// Notar que jamás necesitamos&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;// hacer un new de placeBid,&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;// El contenedor&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;ya lo hizo por nosotros.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;placeBid.addBid(bid);&lt;br /&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;...&lt;br /&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;h2&gt;PlaceOrderBean: un stateful bean&lt;/h2&gt;En el código anterior, cada llamada a &lt;span style="font-style: italic;"&gt;addBid&lt;/span&gt; desde el servlet termina en la creación de una nueva oferta (&lt;span style="font-style: italic;"&gt;Bid&lt;/span&gt;). En ningún momento el cliente se preocupa por el estado interno del bean, simplemente porque sabe que el estado de los atributos internos del bean nunca va a ser conservado (ni le interesa). El cliente ve como si cada llamada a un método del bean de sesión fuera ejecutado por una instancia distinta. Por eso, los &lt;span style="font-style: italic;"&gt;Stateless Beans&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;son utilizados para completar una acción en una única llamada&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Pero a veces necesitamos guardar ciertos datos, a veces necesitamos &lt;span style="font-weight: bold;"&gt;mantener una sesión&lt;/span&gt;. La aplicación de &lt;span style="font-style: italic;"&gt;ActionBazaar&lt;/span&gt; usa un &lt;span style="font-style: italic;"&gt;Stateful&lt;/span&gt; &lt;span style="font-style: italic;"&gt;Session Bean&lt;/span&gt; para ejecutar el proceso de realizar el pedido, a través del bean &lt;span style="font-style: italic;"&gt;PlaceOrderBean&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;El proceso de realizar una orden o pedido es un proceso demasiado complejo para ejecutarlo en un solo paso. Hay todo un &lt;span style="font-style: italic;"&gt;workflow&lt;/span&gt; involucrado que abarca desde agregar items a una orden hasta confirmar la misma orden, que se ve representado en el siguiente esquema:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_Q43CNgNBt9Y/SMnV9rcdyOI/AAAAAAAAAUc/e0sNicY6leg/s1600-h/ActionBazaar_03.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_Q43CNgNBt9Y/SMnV9rcdyOI/AAAAAAAAAUc/e0sNicY6leg/s400/ActionBazaar_03.jpg" alt="" id="BLOGGER_PHOTO_ID_5244958496660506850" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Se necesita interacción con el usuario en cada uno de los pasos. Se necesita mantener abierta una sesión con datos temporarios que se conserven de una invocación a otra mientras dure el proceso. Con un &lt;span style="font-style: italic;"&gt;Stateful Bean&lt;/span&gt;, los datos que el usuario ingresa en cada paso pueden mantenerse temporariamente en el bean hasta completar el &lt;span style="font-style: italic;"&gt;workflow&lt;/span&gt; de pedido.&lt;br /&gt;&lt;br /&gt;Cada uno de los pasos representados en el dibujo será implementado como un método de &lt;span style="font-style: italic;"&gt;PlaceOrderBean&lt;/span&gt;, que serán invocados secuencialmente desde el cliente.&lt;br /&gt;&lt;br /&gt;Definimos la interface remota &lt;span style="font-style: italic;"&gt;PlaceOrder&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;@Remote&lt;/span&gt;    &lt;span style="font-weight: bold;"&gt;// Defines remote business interface&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;public interface&lt;/span&gt; PlaceOrder {&lt;br /&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;void&lt;/span&gt; setBidderId(Long bidderId);&lt;br /&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;void &lt;/span&gt;addItem(Long itemId);&lt;br /&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;void&lt;/span&gt; setShippingInfo(ShippingInfo shippingInfo);&lt;br /&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;void&lt;/span&gt; setBillingInfo(BillingInfo billingInfo);&lt;br /&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;Long confirmOrder();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Luego, implementamos la interface y anotamos la implementación como un bean de sesión &lt;span style="font-style: italic;"&gt;stateful&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;@Stateful&lt;/span&gt;    &lt;span style="font-weight: bold;"&gt;// Marks POJO as statefull&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;public class&lt;/span&gt; PlaceOrderBean &lt;span style="font-weight: bold;"&gt;implements&lt;/span&gt; PlaceOrder {&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;// This four attributes&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;// defines stateful instance variables&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;private&lt;/span&gt; Long bidderID;&lt;br /&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;private&lt;/span&gt; List&lt;long&gt; items;&lt;br /&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;private&lt;/span&gt; ShippingInfo shippingInfo;&lt;br /&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;private&lt;/span&gt; BillingInfo billingInfo;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;public&lt;/span&gt; PlaceOrderBean () {&lt;br /&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;items = &lt;span style="font-weight: bold;"&gt;new&lt;/span&gt; ArrayList&lt;long&gt;();&lt;br /&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;}&lt;br /&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;public void&lt;/span&gt; setBidderID(Long bidderId) {&lt;br /&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;this.bidderId = bidderId;&lt;br /&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;}&lt;br /&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;public void&lt;/span&gt; addItem(Long itemId) {&lt;br /&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;items.add(itemId);&lt;br /&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;}&lt;br /&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;public void&lt;/span&gt; setShippingInfo(ShippingInfo shippingInfo) {&lt;br /&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;this.shippingInfo = shippingInfo;&lt;br /&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;}&lt;br /&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;public void&lt;/span&gt; setBillingInfo(BillingInfo billingInfo) {&lt;br /&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;this.billingInfo = billingInfo;&lt;br /&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;&lt;span style="font-style: italic;"&gt;@Remove&lt;/span&gt;    &lt;span style="font-weight: bold;"&gt;// Contains remove method&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;public&lt;/span&gt; Long confirmOrder() {&lt;br /&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;Order order = &lt;span style="font-weight: bold;"&gt;new&lt;/span&gt; Order();&lt;br /&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;order.setBidderId(bidderId);&lt;br /&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;order.setItems(items);&lt;br /&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;order.setShippingInfo(shippingInfo);&lt;br /&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;order.setBillingInfo(billingInfo);&lt;br /&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;saveOrder(order);&lt;br /&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;billOrder(order);&lt;br /&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;return&lt;/span&gt; order.getOrderId();&lt;br /&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;}&lt;br /&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;...&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Como estuvimos viendo hasta ahora, el bean no es más que un POJO con la anotación de &lt;span style="font-style: italic;"&gt;@Stateful&lt;/span&gt; al comienzo. Es interesante notar que todos los atributos definidos al comienzo son los que el usuario irá seteando a lo largo de la sesión hasta llegar al último método, y el más importante, que es el que crea una orden, la persiste y la confirma.&lt;br /&gt;&lt;br /&gt;La anotación &lt;span style="font-style: italic;"&gt;@Remove&lt;/span&gt; marca el final del &lt;span style="font-style: italic;"&gt;workflow&lt;/span&gt; modelado por el &lt;span style="font-style: italic;"&gt;stateful bean&lt;/span&gt;. Es una forma de indicarle al contenedor de EJBs que tras ejecutar este método ya no necesita mantener la sesión del bean. Es un error muy grave no utilizar esta anotación en un &lt;span style="font-style: italic;"&gt;stateful bean&lt;/span&gt;, ya que si nos la olvidamos, el contenedor quedará manteniendo el estado de las variables y la instancia del bean hasta que la sesión expire por medio de un &lt;span style="font-style: italic;"&gt;timeout&lt;/span&gt;, lo que nos lleva a un desperdicio de preciosos recursos del servidor y una ralentización bastante seria de la aplicación.&lt;br /&gt;&lt;br /&gt;El código del cliente no vale la pena incluirlo (recuerden que pueden ver el código completo descargándolo de la página del libro), ya que la DI se hace de la misma forma que ya estuvimos viendo y, salvo la invocación de los demás métodos que pertenecen al &lt;span style="font-style: italic;"&gt;workflow&lt;/span&gt;, que no son más que simples invocaciones, no hay nada interesante en él. &lt;span style="font-weight: bold;"&gt;Lo verdaderamente interesante es que el código del cliente de un &lt;span style="font-style: italic;"&gt;Stateful Bean&lt;/span&gt; y un &lt;span style="font-style: italic;"&gt;Stateless Bean&lt;/span&gt; o de un bean local y un bean remoto es exactamente igual!&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;Al cliente le da igual si el bean es remoto o si es local, ya que EJB 3 encapsula todo el manejo de RMI.&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;h2&gt;OrderBillingMDB: un message-driven bean&lt;/h2&gt;Así como un bean de sesión procesa &lt;span style="font-style: italic;"&gt;request&lt;/span&gt; de negocio directos  del cliente, los MDBs procesan mensajes indirectos. En los sistemas &lt;span style="font-style: italic;"&gt;enterprise&lt;/span&gt;, la mensajería tiene numerosos usos, por ejemplo:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Integración de sistemas&lt;/li&gt;&lt;li&gt;Procesamiento asincrónico&lt;/li&gt;&lt;li&gt;Comunicación entre sistemas distribuidos&lt;/li&gt;&lt;/ul&gt;Para implementar una mensajería asincrónica, es necesario utilizar un intermediario entre el emisor del mensaje y el receptor. En JavaEE ese mediador se llama &lt;span style="font-weight: bold;"&gt;message-oriented middleware&lt;/span&gt; (&lt;span style="font-weight: bold;"&gt;MOM&lt;/span&gt;). Ejemplos comerciales de MOM en el mercado son: &lt;span style="font-style: italic;"&gt;MQSeries&lt;/span&gt; de &lt;span style="font-style: italic;"&gt;IBM&lt;/span&gt; o &lt;span style="font-style: italic;"&gt;SonicMQ&lt;/span&gt; de &lt;span style="font-style: italic;"&gt;Progress Software&lt;/span&gt;. EJB 3.0 estandariza esta capa intermedia de mensajería mediante el uso de los MDBs, que de alguna forma, sirven para encapsular el aburrido código de la API de &lt;span style="font-style: italic;"&gt;Java Messaging Service&lt;/span&gt; (JMS).&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_Q43CNgNBt9Y/SMnXNPIetDI/AAAAAAAAAU0/n_G9YWXU4E8/s1600-h/MDB.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_Q43CNgNBt9Y/SMnXNPIetDI/AAAAAAAAAU0/n_G9YWXU4E8/s400/MDB.jpg" alt="" id="BLOGGER_PHOTO_ID_5244959863450022962" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;El libro muestra la diferencia entre un código que usa directamente JMS y otro que usa un MDB, mediante un código que deja al descubierto la diferencia de cantidad, claridad y facilidad entre uno y otro (sale ganando el segundo, por supuesto). No es un tema que me interese tratar en este post. El tema de mensajería en JavaEE es tan complejo que, en todo caso, merece unos cuantos post separados. Al que le interese ver la implementación de un MDB, puede buscar en el código el bean &lt;span style="font-style: italic;"&gt;OrderBillingMDB&lt;span style="font-style: italic;"&gt;&lt;span style="font-style: italic;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;que implementa la interfaz &lt;span style="font-style: italic;"&gt;MessageListener&lt;/span&gt;, para poder hacer uso de JMS a través del framework de EJB y además para poder implementar el método &lt;span style="font-style: italic;"&gt;onMessage&lt;/span&gt;, que es donde se arma el mensaje propiamente dicho y se le adjuntan los objetos que se desean enviar. Además se usa la anotación &lt;span style="font-style: italic;"&gt;@MessageDriven&lt;/span&gt; como anotador de la clase, que ya se imaginarán para qué sirve.&lt;br /&gt;&lt;h2&gt;Persistiendo las Entidades Bid y Order a través de JPA&lt;/h2&gt;Gracia&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_Q43CNgNBt9Y/SMnVvruTk8I/AAAAAAAAAUU/c1-cpwlWyvA/s1600-h/JPA.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer;" src="http://1.bp.blogspot.com/_Q43CNgNBt9Y/SMnVvruTk8I/AAAAAAAAAUU/c1-cpwlWyvA/s400/JPA.jpg" alt="" id="BLOGGER_PHOTO_ID_5244958256217166786" border="0" /&gt;&lt;/a&gt;s a Dios, en EJB 3, JPA no implementa el modelo de contenedores (como sí lo hacía en las versiones anteriores), sino que utiliza un paradigma de API, similar a JDBC, JavaMail o JMS. La interface &lt;span style="font-style: italic;"&gt;EntityManager&lt;/span&gt; define la API de persistencia mientras que las entidades JPA especifican cómo se debe realizar el mapeo entre los datos de la aplicación y los registros de las tablas relacionales.&lt;br /&gt;&lt;br /&gt;Veamos por ejemplo cómo sería la entidad &lt;span style="font-style: italic;"&gt;Bid&lt;/span&gt; con las anotaciones correspondientes a JPA:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;@Entity&lt;/span&gt;    &lt;span style="font-weight: bold;"&gt;// Marks POJO as entity&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;@Table(name="BIDS")&lt;/span&gt;    &lt;span style="font-weight: bold;"&gt;// Specifies table mapping&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;class&lt;/span&gt; Bid &lt;span style="font-weight: bold;"&gt;implements&lt;/span&gt; Serializable {&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;private&lt;/span&gt; Long bidID;&lt;br /&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;private&lt;/span&gt; Long itemID;&lt;br /&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;private&lt;/span&gt; Long bidderID;&lt;br /&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;private&lt;/span&gt; Double bidAmount;&lt;br /&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;private&lt;/span&gt; Date bidDate;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;span style="font-style: italic;"&gt;@Id&lt;/span&gt;    &lt;span style="font-weight: bold;"&gt;// Containes entity ID&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;span style="font-style: italic;"&gt;@GeneratedValue(strategy=GenerationType.AUTO) &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;// Specifies column mappings&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;span style="font-style: italic;"&gt;@Column(name="BID_ID")&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;public&lt;/span&gt; Long getBidID() {&lt;br /&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;return&lt;/span&gt; bidID;&lt;br /&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;}&lt;br /&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;public void&lt;/span&gt; setBidID(Long bidID) {&lt;br /&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;this.bidID = bidID;&lt;br /&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;span style="font-style: italic;"&gt;@Column(name="ITEM_ID") &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;public&lt;/span&gt; Long getItemID() {&lt;br /&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;return&lt;/span&gt; itemID;&lt;br /&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;}&lt;br /&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;public void&lt;/span&gt; setItemID(Long itemID) {&lt;br /&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;this.itemID = itemID;&lt;br /&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;&lt;/span&gt;&lt;span style="font-style: italic;"&gt;@Column(name="BIDDER_ID") &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;public&lt;/span&gt; Long getBidderID() {&lt;br /&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;return&lt;/span&gt; bidderID;&lt;br /&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;}&lt;br /&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;public void&lt;/span&gt; setBidderID(Long bidderID) {&lt;br /&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;this.bidderID = bidderID;&lt;br /&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;&lt;/span&gt;&lt;span style="font-style: italic;"&gt;@Column(name="BID_AMOUNT") &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;public&lt;/span&gt; Double getBidAmount() {&lt;br /&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;return&lt;/span&gt; bidAmount;&lt;br /&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;}&lt;br /&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;public void&lt;/span&gt; setBidAmount(Double bidAmount) {  &lt;br /&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;this.bidAmount = bidAmount;             &lt;br /&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;span style="font-style: italic;"&gt;@Column(name="BID_DATE") &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;public&lt;/span&gt; Date getBidDate() {&lt;br /&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;return&lt;/span&gt; bidDate;&lt;br /&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;}&lt;br /&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;public void&lt;/span&gt; setBidDate(Date bidDate) {&lt;br /&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;this.bidDate = bidDate;&lt;br /&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Es notable el poder de esta &lt;span style="font-style: italic;"&gt;Entity&lt;/span&gt;. Es notable que &lt;span style="font-style: italic;"&gt;Bid&lt;/span&gt; no es más que un POJO común y corriente, que no requiere ninguna interface, ni requiere heredar de ninguna clase rara. La anotación &lt;span style="font-style: italic;"&gt;@Table&lt;/span&gt; sirve para mapear la clase a la tabla BIDS de la base de datos; &lt;span style="font-style: italic;"&gt;@Column&lt;/span&gt; para mapear atributos a campos. El código es en verdad muy sencillo, y JPA no es para nada intrusivo.&lt;br /&gt;&lt;br /&gt;Cuando mostré el código de los beans, al principio del ejemplo, obvié deliberadamente el método save. Recordemos que, por ejemplo, el &lt;span style="font-style: italic;"&gt;addBid &lt;/span&gt;de &lt;span style="font-style: italic;"&gt;PlaceBidBean&lt;/span&gt; invocaba a save para persistir la &lt;span style="font-style: italic;"&gt;Bid&lt;/span&gt; recibida por parámetro. Veamos ahora esa parte de código:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;@Stateless &lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;public class&lt;/span&gt; PlaceBidBean &lt;span style="font-weight: bold;"&gt;implements&lt;/span&gt; PlaceBid {&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;// Injects instance of EntityManager&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;&lt;span style="font-style: italic;"&gt;@PersistenceContext(unitName="actionBazaar")&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;private&lt;/span&gt; EntityManager entityManager;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;...&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;private&lt;/span&gt; Bid save(Bid bid) {&lt;br /&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;// Persists entity instance&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;entityManager.persist(bid);&lt;br /&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;return&lt;/span&gt; bid;&lt;br /&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;La persistencia se realiza a través del &lt;span style="font-style: italic;"&gt;EntityManager&lt;/span&gt; que es inyectado por el contenedor de EJBs. El &lt;span style="font-style: italic;"&gt;EntityManager&lt;/span&gt; puede ser visto como un "intérprete" entre el mundo de la orientación a objetos y el mundo de tablas relacionales. El &lt;span style="font-style: italic;"&gt;EntityManager&lt;/span&gt; lee las anotaciones de la entidad que vimos unas líneas más arriba y, una vez que entiende cómo debe guardar el objeto en la base, cómo debe &lt;span style="font-weight: bold;"&gt;mapear&lt;/span&gt; el objeto en un registro de una tabla, lo hace. El &lt;span style="font-style: italic;"&gt;EntityManager&lt;/span&gt; es inyectado en el bean &lt;span style="font-style: italic;"&gt;PlaceBid&lt;/span&gt; a través de la anotación &lt;span style="font-style: italic;"&gt;@PersistenceContext&lt;/span&gt;. Una unidad de persistencia es un grupo de entidades empaquetadas juntas en un módulo de aplicación. El atributo &lt;span style="font-style: italic;"&gt;unitName&lt;/span&gt; de la anotación hace referencia a esa unidad de persistencia.&lt;br /&gt;&lt;br /&gt;Cuando el &lt;span style="font-style: italic;"&gt;EntityManager&lt;/span&gt; persiste una entidad, en realidad lo que está haciendo es generar SQL dinámico, SQL &lt;span style="font-style: italic;"&gt;on the fly&lt;/span&gt;, el SQL que es capaz de leer el DBMS de la base de datos que fue configurada en el ORM. La llamada:&lt;br /&gt;&lt;br /&gt;entityManager.persist(bid);&lt;br /&gt;&lt;br /&gt;Podría generar un código SQL de este estilo:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;INSERT INTO BIDS (BID_ID, BID_DATE, BIDDER_ID, BID_AMOUNT, ITEM_ID) &lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;VALUES (52, NULL, 60, 20000.50, 100) &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Dependiendo de los valores de los atributos del objeto enviado por parámetro.&lt;br /&gt;&lt;h2&gt;Conclusión&lt;/h2&gt;EJB 3 es una especificación abierta de &lt;span style="font-style: italic;"&gt;Sun Microsystem&lt;/span&gt;. Para utilizar EJBs necesitaremos un contenedor de EJB que implemente la especificación como &lt;span style="font-style: italic;"&gt;Glassfish&lt;/span&gt; del mismo Sun o &lt;span style="font-style: italic;"&gt;JBoss&lt;/span&gt; de &lt;span style="font-style: italic;"&gt;Red Hat&lt;/span&gt;. El uso de EJBs en una aplicación enterprise nos abstrae de muchos &lt;span style="font-style: italic;"&gt;crosscutting concerns&lt;/span&gt; como pueden ser integración, pooling, mensajería, transacciones, seguridad, dependencias, etc.&lt;br /&gt;&lt;br /&gt;La especificación 3 de EJB presenta grandes ventajas frente a la 2, como el uso de anotaciones, en lugar de descriptores XML verbosos (que pueden seguir utilizándose y, de hecho, cuando no es posible volver a tocar un código, siguen siendo indispensables), un modelo de programación más liviano y menos intrusivo, una especificación de persistencia mucho más flexible (basada en los ORM que ya existían en el mercado) y el uso de inyección de dependencia en lugar del uso directo de JNDI &lt;span style="font-style: italic;"&gt;lookup&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.manning.com/panda/"&gt;&lt;span style="font-style: italic;"&gt;EJB 3 In Action&lt;/span&gt;&lt;/a&gt; es un muy buen libro, claro y completo, que es una referencia obligada para aquel que trabaje a diario con EJB 3.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4718168423716602728-2694486033664872306?l=tecnologiasjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tecnologiasjava.blogspot.com/feeds/2694486033664872306/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4718168423716602728&amp;postID=2694486033664872306' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4718168423716602728/posts/default/2694486033664872306'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4718168423716602728/posts/default/2694486033664872306'/><link rel='alternate' type='text/html' href='http://tecnologiasjava.blogspot.com/2008/09/introduccin-ejb-30-parte-2.html' title='Introducción a EJB 3.0 - Parte 2'/><author><name>Adrián Paredes</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-rCR9tdvy1zQ/AAAAAAAAAAI/AAAAAAAADik/eHxEpx8CVa0/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_Q43CNgNBt9Y/SMnXnpWWx_I/AAAAAAAAAU8/iSzHa-Cbn5c/s72-c/JNDI_vs_DI.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4718168423716602728.post-8253985260407288714</id><published>2008-09-04T19:08:00.000-07:00</published><updated>2008-09-04T20:41:39.371-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Eclipse'/><title type='text'>Eclipse: User Libraries y Javadoc</title><content type='html'>Cuando un proyecto de java crece se llena de apis libres que nos facilitan mucho las cosas, generalmente estas apis a su vez tienen como requerimientos otras jars, estos suelen ser comunmente las librerías de apache commons por poner un ejemplo.&lt;br /&gt;Es común que al ejecutar nuestra aplicación comience a arrojar ClassNotFoundException cuando no encuentra estas apis, automáticamente empezamos a bajar jars para evitar estas excepciones.&lt;br /&gt;&lt;br /&gt;Otro escenario son las apis que usamos frecuentemente y cuyo página en internet con la documentación consultamos asiduamente.&lt;br /&gt;&lt;br /&gt;En ambos casos lo ideal sería utilizar las User Libraries de eclipse. Podemos crear librerías con los jars que usamos generalmente y asociarle su documentación,  para de esta forma, al necesitar un jar, sólo agregamos la librería que creamos, y al necesitar consultar algo de documentación bastará con presionar control+barra espaciadora y mantener el mouse sobre una clase o método.&lt;br /&gt;&lt;br /&gt;En este ejemplo vamos a crear una librería para Apache Commons Collections&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;1) Hacer click sobre el menu &lt;span style="font-weight: bold;"&gt;Windows&lt;/span&gt;, opción Preferences. Buscar &lt;span style="font-weight: bold;"&gt;Java/BuildPath/User Libraries&lt;/span&gt;. Hacemos click sobre &lt;span style="font-weight: bold;"&gt;NEW&lt;/span&gt;&lt;br /&gt;2) Ingresamos un nombre descriptivo para la nueva librería&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_UD9wqJsJiww/SMCnfq615tI/AAAAAAAAAC0/AkgXwMkstFA/s1600-h/tuteclipse1_1.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_UD9wqJsJiww/SMCnfq615tI/AAAAAAAAAC0/AkgXwMkstFA/s400/tuteclipse1_1.png" alt="" id="BLOGGER_PHOTO_ID_5242374128798131922" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;3) Seleccionamos la nueva librería y hacemos click sobre &lt;span style="font-weight: bold;"&gt;ADD JARS....&lt;/span&gt; Buscamos los jars de la librería.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_UD9wqJsJiww/SMCnbGLgPBI/AAAAAAAAACs/HsiY7h-UW4g/s1600-h/tuteclipse1_2.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_UD9wqJsJiww/SMCnbGLgPBI/AAAAAAAAACs/HsiY7h-UW4g/s400/tuteclipse1_2.png" alt="" id="BLOGGER_PHOTO_ID_5242374050216426514" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;4) Para agregar la documentación seleccionamos &lt;span style="font-weight: bold;"&gt;javadoc location&lt;/span&gt; y hacemos click sobre &lt;span style="font-weight: bold;"&gt;edit&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_UD9wqJsJiww/SMCnXE0ESkI/AAAAAAAAACk/czZ0hLEXF-Q/s1600-h/tuteclipse1_3.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_UD9wqJsJiww/SMCnXE0ESkI/AAAAAAAAACk/czZ0hLEXF-Q/s400/tuteclipse1_3.png" alt="" id="BLOGGER_PHOTO_ID_5242373981130213954" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;5) La documentación generalmente viene dentro del mismo zip donde se encuentran los jars. Puede ser que esta venga descomprimida o comprimida dentro de otro jar.&lt;br /&gt;En caso de estar descomprimida tenemos que indicarle la carpeta donde de se encuentra el index.html de la documentación&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_UD9wqJsJiww/SMCnSPvpW2I/AAAAAAAAACc/0aM8MrFcFlM/s1600-h/tuteclipse1_4.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_UD9wqJsJiww/SMCnSPvpW2I/AAAAAAAAACc/0aM8MrFcFlM/s400/tuteclipse1_4.png" alt="" id="BLOGGER_PHOTO_ID_5242373898165115746" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;O en caso de ser un jar, indicarle la ruta&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_UD9wqJsJiww/SMCnNJw34NI/AAAAAAAAACU/-A9jSVfznTI/s1600-h/tuteclipse1_5.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_UD9wqJsJiww/SMCnNJw34NI/AAAAAAAAACU/-A9jSVfznTI/s400/tuteclipse1_5.png" alt="" id="BLOGGER_PHOTO_ID_5242373810660303058" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Como se puede verse, se tienen las dos opciones disponibles, y de un botón &lt;span style="font-weight: bold;"&gt;Validate&lt;/span&gt; el cual nos mostrará el index de la documentación para verificar que se haya elegido la carpeta con la documentación apropiada.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_UD9wqJsJiww/SMCnIz_xc2I/AAAAAAAAACM/aTFTEMWdfRU/s1600-h/tuteclipse1_6.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_UD9wqJsJiww/SMCnIz_xc2I/AAAAAAAAACM/aTFTEMWdfRU/s400/tuteclipse1_6.png" alt="" id="BLOGGER_PHOTO_ID_5242373736097739618" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_UD9wqJsJiww/SMCnDjmNzsI/AAAAAAAAACE/x4IQ_FBP5wc/s1600-h/tuteclipse1_7.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_UD9wqJsJiww/SMCnDjmNzsI/AAAAAAAAACE/x4IQ_FBP5wc/s400/tuteclipse1_7.png" alt="" id="BLOGGER_PHOTO_ID_5242373645796232898" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;6) Ahora sólo necesitamos agregar esta librería a un proyecto. Botón secundario sobre el proyecto &lt;span style="font-weight: bold;"&gt;Build Path/Add Libraries/User Libraries&lt;/span&gt;. En este caso agregamos Apache Commons Collections, que es el caso de nuestro ejemplo. Como se puede apreciar ya se puede disponer de esta api y de su documentación.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_UD9wqJsJiww/SMCmpgu_UDI/AAAAAAAAAB8/55G98L-OxE4/s1600-h/tuteclipse1_8.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_UD9wqJsJiww/SMCmpgu_UDI/AAAAAAAAAB8/55G98L-OxE4/s400/tuteclipse1_8.png" alt="" id="BLOGGER_PHOTO_ID_5242373198351126578" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4718168423716602728-8253985260407288714?l=tecnologiasjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tecnologiasjava.blogspot.com/feeds/8253985260407288714/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4718168423716602728&amp;postID=8253985260407288714' title='4 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4718168423716602728/posts/default/8253985260407288714'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4718168423716602728/posts/default/8253985260407288714'/><link rel='alternate' type='text/html' href='http://tecnologiasjava.blogspot.com/2008/09/eclipse-user-libraries-y-javadoc.html' title='Eclipse: User Libraries y Javadoc'/><author><name>Paola A. Grajeda</name><uri>http://www.blogger.com/profile/03183842695664105951</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/-yyp-u1Rz7hw/Tc8P46eAvVI/AAAAAAAAAm0/0Aubx8YUTHo/s220/avatar.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_UD9wqJsJiww/SMCnfq615tI/AAAAAAAAAC0/AkgXwMkstFA/s72-c/tuteclipse1_1.png' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4718168423716602728.post-3264291976366122095</id><published>2008-08-31T06:52:00.000-07:00</published><updated>2009-01-14T16:25:38.100-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iReport'/><title type='text'>Reportes con iReport. Fuente de Datos : XML</title><content type='html'>La clase JRXmlDataSource encapsula un archivo xml ya sea dinámico o estático para poder utilizarlo como fuente de datos en nuestro reporte.&lt;br /&gt;&lt;br /&gt;Lo primero que debemos hacer es crear el template del reporte, esto lo haremos con iReport. Por ahora no será necesario escribir código.&lt;br /&gt;&lt;br /&gt;Suponiendo que el XML será obtenido mediante un servicio u otro medio al ejecutarse la aplicación, necesitamos un XML de prueba, con la misma estructura del xml que le pasaremos al reporte. Por ejemplo este XML de prueba solo tiene dos personas, pero el que tengamos en la aplicación podrá tener 100, 15, lo que sea, sólo necesito la        estructura, el nombre de las etiquetas.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br /&gt;&amp;lt;personas&amp;gt;&lt;br /&gt;     &amp;lt;persona&amp;gt;&lt;br /&gt;         &amp;lt;nombre&amp;gt;Adrian&amp;lt;/nombre&amp;gt;&lt;br /&gt;         &amp;lt;edad&amp;gt;26&amp;lt;/edad&amp;gt;&lt;br /&gt;         &amp;lt;domicilio&amp;gt;Buenos Aires&amp;lt;/domicilio&amp;gt;&lt;br /&gt;    &amp;lt;/persona&amp;gt;&lt;br /&gt;    &amp;lt;persona&amp;gt;&lt;br /&gt;         &amp;lt;nombre&amp;gt;Juan&amp;lt;/nombre&amp;gt;&lt;br /&gt;         &amp;lt;edad&amp;gt;15&amp;lt;/edad&amp;gt;&lt;br /&gt;         &amp;lt;domicilio&amp;gt;Chubut&amp;lt;/domicilio&amp;gt;&lt;br /&gt;   &amp;lt;/persona&amp;gt;&lt;br /&gt;&amp;lt;/personas&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Abrimos iReport y creamos un nuevo reporte.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_UD9wqJsJiww/SLqnZadT61I/AAAAAAAAAAY/rh_zUVnkeXk/s1600-h/tutireport1_1.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_UD9wqJsJiww/SLqnZadT61I/AAAAAAAAAAY/rh_zUVnkeXk/s320/tutireport1_1.png" alt="" id="BLOGGER_PHOTO_ID_5240685171439823698" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Vamos al menú &lt;span style="font-weight: bold;"&gt;Data&lt;/span&gt; y hacemos click sobre la opción Connections&lt;span style="font-weight: bold;"&gt;/&lt;/span&gt;Data Sources. En esta pestaña hacemos click sobre NEW y seleccionamos &lt;span style="font-weight: bold;"&gt;XML file data source&lt;/span&gt; y hacemos click sobre Next&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_UD9wqJsJiww/SLqoPzEgbBI/AAAAAAAAAAg/BZLGtuqA7Qg/s1600-h/tutireport1_2.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_UD9wqJsJiww/SLqoPzEgbBI/AAAAAAAAAAg/BZLGtuqA7Qg/s320/tutireport1_2.png" alt="" id="BLOGGER_PHOTO_ID_5240686105759607826" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;En a nueva ventana podemos ponerle el nombre al DataSource y seleccionar el archivo de prueba con la estructura del XML.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_UD9wqJsJiww/SLrcHxLXjKI/AAAAAAAAABY/I5RrjT5-rqQ/s1600-h/tutireport1_3.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_UD9wqJsJiww/SLrcHxLXjKI/AAAAAAAAABY/I5RrjT5-rqQ/s400/tutireport1_3.png" alt="" id="BLOGGER_PHOTO_ID_5240743142417206434" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Para comprobar si el datasource fue creado correctamente hacemos click sobre Test.&lt;br /&gt;Para guardar el datasource hacemos click en save.&lt;br /&gt;&lt;br /&gt;En este punto ya podemos definir el diseño del reporte. Hacemos click sobre Edit y buscamos la opción Report Query.&lt;br /&gt;En el desplegable Query Language seleccionamos XPath. Automáticamente  en la misma ventana se verá las etiquetas del xml de prueba.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_UD9wqJsJiww/SLrVxk_Hc2I/AAAAAAAAAAo/bt869ml8p-U/s1600-h/tutireport1_4.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_UD9wqJsJiww/SLrVxk_Hc2I/AAAAAAAAAAo/bt869ml8p-U/s320/tutireport1_4.png" alt="" id="BLOGGER_PHOTO_ID_5240736164117705570" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Ahora necesitamos crear los campos que serán incluidos en el reporte. Por ejemplo nosotros vamos a querer hacer un listado de personas con nombre y domicilio, para ello agregamos en el campo de Query Language &lt;span style="font-weight: bold;"&gt;/personas/persona&lt;/span&gt; y  arrastramos los nodos nombre y domicilio a la ventana inferior.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_UD9wqJsJiww/SLrW5wQJbBI/AAAAAAAAAA4/-ZPepBMcyTs/s1600-h/tutireport1_5.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_UD9wqJsJiww/SLrW5wQJbBI/AAAAAAAAAA4/-ZPepBMcyTs/s400/tutireport1_5.png" alt="" id="BLOGGER_PHOTO_ID_5240737404092509202" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Aceptamos.&lt;br /&gt;&lt;br /&gt;Si buscamos dentro de Document Structure / fields podemos encontrar los campos creados.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_UD9wqJsJiww/SLrXXw0Rd1I/AAAAAAAAABA/OBI38nkD1B0/s1600-h/tutireport1_6.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_UD9wqJsJiww/SLrXXw0Rd1I/AAAAAAAAABA/OBI38nkD1B0/s400/tutireport1_6.png" alt="" id="BLOGGER_PHOTO_ID_5240737919640106834" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Arrastramos estos campos a la banda detail del reporte.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_UD9wqJsJiww/SLrX26mseOI/AAAAAAAAABI/VjIDrrPoy-M/s1600-h/tutireport1_7.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_UD9wqJsJiww/SLrX26mseOI/AAAAAAAAABI/VjIDrrPoy-M/s400/tutireport1_7.png" alt="" id="BLOGGER_PHOTO_ID_5240738454843455714" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Finalmente guardamos el reporte.&lt;br /&gt;&lt;br /&gt;Ahora podemos pasar a la parte de código. Haremos un sencillo programa que reciba por parámetro la ruta de un xml y que con este cree el reporte.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;package test;&lt;br /&gt;&lt;br /&gt;import java.io.File;&lt;br /&gt;import java.io.FileNotFoundException;&lt;br /&gt;import java.io.FileOutputStream;&lt;br /&gt;import java.io.IOException;&lt;br /&gt;import java.util.HashMap;&lt;br /&gt;&lt;br /&gt;import net.sf.jasperreports.engine.JRException;&lt;br /&gt;import net.sf.jasperreports.engine.JasperCompileManager;&lt;br /&gt;import net.sf.jasperreports.engine.JasperRunManager;&lt;br /&gt;import net.sf.jasperreports.engine.data.JRXmlDataSource;&lt;br /&gt;&lt;br /&gt;public class Test {&lt;br /&gt;&lt;br /&gt;    public static void main(String[] args)&lt;br /&gt;    {&lt;br /&gt;         String filexml = args[0];&lt;br /&gt;          try&lt;br /&gt;          {&lt;br /&gt;           System.out.println("Create DataSource...");&lt;br /&gt;           File file =  new File(filexml);&lt;br /&gt;           JRXmlDataSource xmlDataSource = new JRXmlDataSource(file,"/personas/persona");&lt;br /&gt;           System.out.println("Compiling report...");&lt;br /&gt;            &lt;br /&gt;   &lt;br /&gt;           JasperCompileManager.&lt;br /&gt;           compileReportToFile("/home/paola/workspace/iReport/src/test/personas.jrxml");&lt;br /&gt;&lt;br /&gt;            System.out.println("Filled report...");&lt;br /&gt;            byte[] bytes = JasperRunManager.&lt;br /&gt;                      runReportToPdf("/home/paola/workspace/iReport/src/test/Personas.jasper",new&lt;br /&gt;                      HashMap(),xmlDataSource);&lt;br /&gt;&lt;br /&gt;            String filePDF = filexml.substring(0,filexml.length()-3)+".pdf";&lt;br /&gt;            FileOutputStream output = new FileOutputStream(filePDF);&lt;br /&gt;                 &lt;br /&gt;            output.write(bytes);&lt;br /&gt;            output.flush();&lt;br /&gt;            output.close();&lt;br /&gt;             System.out.println("Done!");&lt;br /&gt;          }&lt;br /&gt;          catch (JRException e)&lt;br /&gt;          {&lt;br /&gt;            e.printStackTrace();&lt;br /&gt;          } catch (FileNotFoundException e) {&lt;br /&gt;            // TODO Auto-generated catch block&lt;br /&gt;            e.printStackTrace();&lt;br /&gt;        } catch (IOException e) {&lt;br /&gt;            // TODO Auto-generated catch block&lt;br /&gt;            e.printStackTrace();&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Este es nuestro reporte final.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_UD9wqJsJiww/SLrYXnnCZzI/AAAAAAAAABQ/ktcsbW6dV0Y/s1600-h/tutireport1_8.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_UD9wqJsJiww/SLrYXnnCZzI/AAAAAAAAABQ/ktcsbW6dV0Y/s400/tutireport1_8.png" alt="" id="BLOGGER_PHOTO_ID_5240739016680302386" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Aplicaciones:&lt;/span&gt;&lt;br /&gt;iReport 3.0.0&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Librerias  utilizadas:&lt;/span&gt;&lt;br /&gt;JasperReport 3.0.1&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Requisitos de JasperReport:&lt;/span&gt;&lt;br /&gt;JasperReport para funcionar necesita de una serie de apis, estas son:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;BeanUtils (Download de http://commons.apache.org/)&lt;/li&gt;&lt;li&gt;Digester(Download de http://commons.apache.org/)&lt;/li&gt;&lt;li&gt;Collections(Download de http://commons.apache.org/)&lt;/li&gt;&lt;li&gt;Logging(Download de http://commons.apache.org/)&lt;/li&gt;&lt;li&gt;iText (Download de http://www.lowagie.com/iText/download.html)&lt;/li&gt;&lt;li&gt;Xalan (Download de http://apache.patan.com.ar/xml/xalan-j/)&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Libros de JasperReport y de iReport:&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;JasperReports for Java Developers. Autor:David R. Heffelfinger &lt;/li&gt;&lt;li&gt;The Definitive Guide to iReport. Autor:Giulio Toffoli&lt;/li&gt;&lt;li&gt;The Definitive Guide to JasperReport. Autores:Teodor Danciu and Lucian Chirita&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4718168423716602728-3264291976366122095?l=tecnologiasjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tecnologiasjava.blogspot.com/feeds/3264291976366122095/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4718168423716602728&amp;postID=3264291976366122095' title='9 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4718168423716602728/posts/default/3264291976366122095'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4718168423716602728/posts/default/3264291976366122095'/><link rel='alternate' type='text/html' href='http://tecnologiasjava.blogspot.com/2008/08/reportes-con-ireport-fuente-de-datos_31.html' title='Reportes con iReport. Fuente de Datos : XML'/><author><name>Paola A. Grajeda</name><uri>http://www.blogger.com/profile/03183842695664105951</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/-yyp-u1Rz7hw/Tc8P46eAvVI/AAAAAAAAAm0/0Aubx8YUTHo/s220/avatar.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_UD9wqJsJiww/SLqnZadT61I/AAAAAAAAAAY/rh_zUVnkeXk/s72-c/tutireport1_1.png' height='72' width='72'/><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4718168423716602728.post-5111818347808469426</id><published>2008-08-27T10:32:00.000-07:00</published><updated>2008-08-27T19:25:00.367-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='EJB 3'/><title type='text'>Introducción a EJB 3.0 - Parte 1</title><content type='html'>&lt;a href="http://www.manning.com/"&gt;&lt;span style="font-style: italic;"&gt;Manning Publications Co.&lt;/span&gt;&lt;/a&gt; cuenta con una colección inmensa de libros dedicados a distintas tecnologías y/o herramientas de programación. En particular, en el mundo de &lt;a href="http://www.manning.com/catalog/java/"&gt;Tecnologías Java&lt;/a&gt;, cuenta con unos 70 libros aproximadamente. Algunos de los ejemplos más populares son: &lt;a style="font-style: italic;" href="http://www.manning.com/crichardson/"&gt;POJOs In Action&lt;/a&gt;, dedicado al diseño y desarrollo de aplicaciones enterprise con frameworks livianos (&lt;span style="font-style: italic;"&gt;Spring&lt;/span&gt;, EJB 3.0, etc), &lt;a style="font-style: italic;" href="http://www.manning.com/walls2/"&gt;Spring In Action&lt;/a&gt;, dedicado exclusivamente al framework Spring, &lt;a style="font-style: italic;" href="http://www.manning.com/bauer/"&gt;Hibernate In Action&lt;/a&gt;, cuya segunda edición pasó a llamarse &lt;a style="font-style: italic;" href="http://www.manning.com/bauer/"&gt;Java Persistence with Hibernate&lt;/a&gt;, &lt;a style="font-style: italic;" href="http://www.manning.com/jamae/"&gt;JBoss In Action&lt;/a&gt;, dedicado al contenedor y servidor de aplicacion de &lt;a href="http://www.jboss.com/"&gt;&lt;span style="font-style: italic;"&gt;Red Hat&lt;/span&gt;&lt;/a&gt;, etc, etc, y un largo etc (incluso hay también un &lt;a href="http://www.manning.com/massol/"&gt;JUnit In Action&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;En este post y en el siguiente, pretendo esbozar un vistazo furtivo de lo que podemos encontrar en el &lt;a href="http://www.manning.com/panda/"&gt;&lt;span style="font-style: italic;"&gt;EJB 3 In Action&lt;/span&gt;&lt;/a&gt;, de &lt;span style="font-weight: bold;"&gt;Bebu Panda&lt;/span&gt;, &lt;span style="font-weight: bold;"&gt;Reza Rahman&lt;/span&gt; y &lt;span style="font-weight: bold;"&gt;Derek Lane&lt;/span&gt;, edición de Abril de 2007 (ISBN: 1-933988-34-7). El libro está compuesto por 5 grandes partes (&lt;a href="http://www.manning.com/panda/excerpt_index.pdf"&gt;decargar el índice&lt;/a&gt;):&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Overview of the EJB landscape:&lt;/span&gt; una introducción bastante exhaustiva del mundo actual de los EJB con un ejemplo bastante completo y simple para ir introduciéndonos en la tecnología. (El primer capítulo es gratuito y &lt;a href="http://www.manning.com/panda/sample-ch01_Panda.pdf"&gt;se puede descargar desde aquí&lt;/a&gt;.)&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Building Business Logic with EJB3:&lt;/span&gt; se encarga principalmente de la lógica de negocio, que es donde viven los EJB. Si bien los distintos tipos de EJB ya fueron presentados en los dos capítulos de la parte anterior, en esta sección se explican distintos aspectos de los mismos en mucho más detalle y profundidad. Tenemos un capítulo dedicado a los &lt;span style="font-style: italic;"&gt;Session Beans&lt;/span&gt;, uno dedicado a la mensajería asincrónica con los &lt;span style="font-style: italic;"&gt;Message-Driven Beans&lt;/span&gt; (MDBs), uno dedicado al funcionamientos interno de los contenedores y conceptos avanzados de EJB, y, por último, tenemos uno dedicado a las transacciones y el manejo de la seguridad en detalle.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Diving into the Java Persistence API (JP&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;A):&lt;/span&gt; se encarga principalmente del estándar JPA surgido a partir de la especificación 3.0 de los EJB. Habla de cómo implementar un buen modelo de dominio con la utilización de simples &lt;a href="http://es.wikipedia.org/wiki/Plain_Old_Java_Object"&gt;POJOs&lt;/a&gt;, cómo construir y manipular la configuración de la metadata para el correcto funcionamiento de un &lt;a href="http://es.wikipedia.org/wiki/Mapeo_objeto-relacional"&gt;ORM&lt;/a&gt;, cómo manipular las entidades persistentes mediante la interfaz de &lt;span style="font-style: italic;"&gt;EntityManager&lt;/span&gt; provista por la especificación y un capítulo final dedicado al uso del &lt;span style="font-style: italic;"&gt;Java Persistence Query Language&lt;/span&gt; (JPQL) para hacer consultas a la base de datos a través del ORM.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Putting EJB 3 into Action:&lt;/span&gt; provee una &lt;span style="font-style: italic;"&gt;guideline&lt;/span&gt; para el uso efectivo de los EJB 3. El primer capítulo es gratuito (&lt;a href="http://www.manning.com/panda/sample-ch11_Panda.pdf"&gt;se puede descargar de aquí&lt;/a&gt;) y trata sobre cómo empaquetar los EJBs y las entidades, mediante los XML &lt;span style="font-style: italic;"&gt;descr&lt;/span&gt;&lt;span style="font-style: italic;"&gt;iptors&lt;/span&gt;. El siguiente capítulo habla sobre los patrones de diseño de EJB 3 y JPA. Por último, el capítulo 13 habla sobre performance y escalabilidad en una aplicación enterprise que usa EJB 3 y las formas óptimas de configuración.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Migration and Interoperability Issues:&lt;/span&gt; esta última parte trata temas varios: cómo hacer una migración efectiva de una aplicación enterprise existente a EJB 3 (sobre todo desde EJB 2), cómo exponer EJBs como &lt;span style="font-style: italic;"&gt;web services&lt;/span&gt; y discusiones sobre aplicaciones que usan JAX WS 2.0 y EJB 3 y, por último, da un pantallazo general de lo que es el esfuerzo de las comunidades &lt;span style="font-style: italic;"&gt;open source&lt;/span&gt; de &lt;a href="http://www.sun.com/"&gt;Sun&lt;/a&gt; y de &lt;a href="http://www.springframework.org/"&gt;Spring&lt;/a&gt; para unir y complementar estos dos frameworks que muchas veces se ven como enemigos, pero pueden resultar complementarios.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Apéndices:&lt;/span&gt; Al final cuenta con cinco apéndices que cubren los siguientes temas: un tutorial de JNDI y RMI, un vistazo furtivo a las bases de datos hoy existentes, referencias a las anotaciones de configuración y los descriptores XML existentes, e instrucciones para instalar y configurar el servidor de aplicaciones oficial de Sun, &lt;a style="font-style: italic;" href="https://glassfish.dev.java.net/"&gt;Glassfish&lt;/a&gt;, y cómo efectuar el despliegue de los códigos de ejemplo proporcionados a lo largo de todo el libro.&lt;/li&gt;&lt;/ul&gt;En este post y en el siguiente me enfocaré principalmente en la primera parte del libro, la que da una introducción al mundo de los EJB 3. Como mencioné antes, esta parte está dividida en dos capítulos. El primer capítulo es gratuito y se puede descargar gratis. El segundo capítulo no, pero trata sobre un ejemplo donde hay un vistazo general de lo que se va a ver a lo largo de todo el libro, y el ejemplo sí es gratuito (se pueden descargar los códigos fuentes para los servidores de aplicaciones de &lt;a href="http://www.manning.com/panda/codeexamples-javaeesdk.zip"&gt;Glassfish&lt;/a&gt;, &lt;a href="http://www.manning.com/panda/codeexamples-oracleAS.zip"&gt;OracleAS&lt;/a&gt; y &lt;a href="http://www.manning-source.com/books/panda/codeexamples-jbossas.zip"&gt;JBoss&lt;/a&gt; desde la &lt;a href="http://www.manning.com/panda/"&gt;página del libro&lt;/a&gt;).&lt;br /&gt;&lt;h2&gt;¿Qué es un EJB?&lt;/h2&gt;&lt;span style="font-weight: bold;"&gt;Enterprise Java Beans (EJB) es una plataforma para construir aplicaciones de negocio portables, reusables y escalabl&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;es usa&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;ndo el lenguaje de programación Java.&lt;/span&gt; Desde el punto de vista del desarrollador, un EJB es una porción de código que se ejecuta en un contenedor EJB, que no es más que un ambiente especializado (&lt;span style="font-style: italic;"&gt;runtime&lt;/span&gt;) que povee determinados componentes de servicio.&lt;br /&gt;&lt;br /&gt;Los EJBs pueden ser vistos como &lt;span style="font-weight: bold;"&gt;componentes&lt;/span&gt;, desde el punto de vista que encapsulan comportamiento y permite reutilizar porciones de código, pero también pueden ser vistos como un &lt;span style="font-weight: bold;"&gt;framework&lt;/span&gt;, ya que, desplegados en un contenedor, proveen servicios para el desarrollo de aplicaciones enterprise, servicios que son invisibles para el programador y no ensucian la lógica de negocio con funcionalidades trasversales al modelo de dominio (a menudo &lt;span style="font-style: italic;"&gt;requerimientos no funcionales&lt;/span&gt; o &lt;span style="font-style: italic;"&gt;aspectos&lt;/span&gt;). &lt;span style="font-weight: bold;"&gt;En la especificación 3.0, los EJB no son más que POJOs (clases planas comunes y corrientes de Java) con algunos poderes esp&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;eciales implícitos, que se activan en &lt;span style="font-style: italic;"&gt;runtime&lt;/span&gt; cuando son ejecutados en un &lt;/span&gt;&lt;span style="font-weight: bold;"&gt;contenedor de EJBs.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_Q43CNgNBt9Y/SLWS3S0jbII/AAAAAAAAAPk/AaKmRVndPaQ/s1600-h/Introduccion_EJB3_01.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_Q43CNgNBt9Y/SLWS3S0jbII/AAAAAAAAAPk/AaKmRVndPaQ/s400/Introduccion_EJB3_01.jpg" alt="" id="BLOGGER_PHOTO_ID_5239255220158164098" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Los servicios que debe proveer el contenedor de EJBs deben ser especificados por el programador a través de &lt;span style="font-style: italic;"&gt;metadata&lt;/span&gt; de configuración que puede escribirse como:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Anotaciones de Java5 intercaladas en el código de las clases.&lt;/li&gt;&lt;li&gt;Descriptores XML (archivos XML separados).&lt;/li&gt;&lt;/ul&gt;A partir de EJB 3 se puede usar cualquiera de estas dos técnicas. Las técnicas no son exclusivas, pueden coexistir anotaciones con descriptores XML y, en el caso de superponerse la &lt;span style="font-style: italic;"&gt;metadata&lt;/span&gt;, los XML tendrán prioridad y podrán sobreescribir las anotaciones.&lt;br /&gt;&lt;br /&gt;Algunos ejemplos de los contenedores más populares que hay actualmente en el mercado son: &lt;span style="font-style: italic;"&gt;Glassfish&lt;/span&gt;, de &lt;span style="font-style: italic;"&gt;Sun Microsystem&lt;/span&gt;, &lt;span style="font-style: italic;"&gt;JBoss Application Server&lt;/span&gt;, de &lt;span style="font-style: italic;"&gt;Red Hat&lt;/span&gt;, &lt;span style="font-style: italic;"&gt;BEA Weblogic Server&lt;/span&gt; y &lt;span style="font-style: italic;"&gt;Oracle Application Server&lt;/span&gt;, ambos de &lt;span style="font-style: italic;"&gt;Oracle&lt;/span&gt; y &lt;span style="font-style: italic;"&gt;WebSphere&lt;/span&gt; de &lt;span style="font-style: italic;"&gt;IBM&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Una anotación transforma un simple POJO en un EJB.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_Q43CNgNBt9Y/SLWTkGmEDJI/AAAAAAAAAPs/7myTXdoDViY/s1600-h/Introduccion_EJB3_02.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_Q43CNgNBt9Y/SLWTkGmEDJI/AAAAAAAAAPs/7myTXdoDViY/s400/Introduccion_EJB3_02.jpg" alt="" id="BLOGGER_PHOTO_ID_5239255989970275474" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;h2&gt;Tipos de EJBs&lt;/h2&gt;Existen tres tipos de EJBs:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt;Session Beans&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;:&lt;/span&gt; en una aplicación enterprise típica, dividida en cuatro grandes capas o &lt;span style="font-style: italic;"&gt;layers&lt;/span&gt; (presentación, lógica de negocio (&lt;span style="font-style: italic;"&gt;business logic&lt;/span&gt;), persistencia y base de datos (&lt;a href="http://es.wikipedia.org/wiki/DBMS"&gt;DBMS&lt;/a&gt;)), los &lt;span style="font-style: italic;"&gt;Session Beans&lt;/span&gt; viven en la lógica de negocio. Hay dos grandes tipos de &lt;span style="font-style: italic;"&gt;Session Beans&lt;/span&gt;: &lt;span style="font-style: italic;"&gt;Stateless&lt;/span&gt; y &lt;span style="font-style: italic;"&gt;Stateful&lt;/span&gt;, el primero no conserva el estado de ninguno de sus atributos de la invocación de un método a otro y el segundo conserva el estado a lo largo de toda una sesión. Los &lt;span style="font-style: italic;"&gt;Session Beans Stateless&lt;/span&gt; son los únicos que pueden exponerse como &lt;span style="font-style: italic;"&gt;web services&lt;/span&gt;.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;Message-Driven Beans (MDBs)&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;:&lt;/span&gt; también viven en la lógica de negocio y los servicios que proveen son parecidos a los &lt;span style="font-style: italic;"&gt;Session Beans&lt;/span&gt;, con la diferencia de que los MDBs son usados para invocar métodos de forma asincrónica. Cuando se produce la invocación de un método de un MDB desde un cliente, la llamada no bloquea el código del cliente y el mismo puede seguir con su ejecución, sin tener que esperar indefinidamente por la respuesta del servidor. Los MDBs encapsulan el popular servicio de mensajería de Java, &lt;a href="http://es.wikipedia.org/wiki/JMS"&gt;JMS&lt;/a&gt;. Hay una analogía muy interesante en el libro que dice que &lt;span style="font-weight: bold;"&gt;los MDBs son a JMS lo que JDBC es a SQL&lt;/span&gt;.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-style: italic;"&gt;Entities&lt;/span&gt;:&lt;/span&gt; los &lt;span style="font-style: italic;"&gt;entities&lt;/span&gt; viven en la capa de persistencia y son los EJBs que manejan la &lt;span style="font-style: italic;"&gt;Java Persistence API&lt;/span&gt; (JPA), también parte de la especificación de EJB 3.0. Los &lt;span style="font-style: italic;"&gt;entities&lt;/span&gt; son POJOs con cierta &lt;span style="font-style: italic;"&gt;metadata&lt;/span&gt; que permite a la capa de persistencia mapear los atributos de la clase a las tablas de la base de datos y sus relaciones.&lt;/li&gt;&lt;/ul&gt;Los &lt;span style="font-style: italic;"&gt;Session Beans&lt;/span&gt; son invocados por el cliente con el propósito de ejecutar operaciones de negocio específicas, como por ejemplo podría ser chequear la historia crediticia del cliente de un banco. El nombre &lt;span style="font-weight: bold;"&gt;sesión&lt;/span&gt; implica que la instancia del &lt;span style="font-style: italic;"&gt;bean&lt;/span&gt; estará disponible durante una &lt;span style="font-weight: bold;"&gt;unidad de trabajo&lt;/span&gt; (&lt;a href="http://martinfowler.com/eaaCatalog/unitOfWork.html"&gt;&lt;span style="font-style: italic;"&gt;unit of work&lt;/span&gt;&lt;/a&gt;) y no sobrevivirá a una caída del servidor. &lt;span style="font-weight: bold;"&gt;Un bean de sesión sirve para modelar cualquier funcionalidad lógica de una aplicación.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Los MDBs también procesan lógica de negocio, pero un cliente nunca invoca a un método de un MDB directamente. El sistema de mensajería asincrónica propone la utilización de una capa intermedia en la comunicación entre el productor y el consumidor del mensaje. En EJB 3, esta capa se llama &lt;span style="font-weight: bold;"&gt;MOM&lt;/span&gt; (&lt;span style="font-style: italic;"&gt;Message-oriented middleware&lt;/span&gt;). Básicamente la MOM es un software que permite funcionar como servidor de mensajería, reteniendo los mensajes del productor y enviándolos posteriormente al consumidor en el momento en que esté disponible para recibirlo. (Es un funcionamiento similar al de un servidor de correo electrónico.) Algunos ejemplos típicos de servidores de mensajería son &lt;span style="font-style: italic;"&gt;WebSphere MQ&lt;/span&gt; de &lt;span style="font-style: italic;"&gt;IBM&lt;/span&gt;, &lt;span style="font-style: italic;"&gt;SonicMQ&lt;/span&gt;, &lt;span style="font-style: italic;"&gt;Advanced Queueing&lt;/span&gt; de &lt;span style="font-style: italic;"&gt;Oracle&lt;/span&gt; y &lt;span style="font-style: italic;"&gt;TIBCO&lt;/span&gt;.&lt;br /&gt;&lt;h2&gt;Entities y la Java Persistence API&lt;/h2&gt;Debido al auge de los &lt;span style="font-style: italic;"&gt;frameworks&lt;/span&gt; ORM (&lt;span style="font-style: italic;"&gt;Hibernate&lt;/span&gt;, &lt;span style="font-style: italic;"&gt;TopLink&lt;/span&gt;, etc), Sun tuvo que replantear su complicada y anti-natural especificación de persistencia, que tanto dolores de cabeza le daba a los programadores que usaban EJB 2, al extremo que optó por reescribirla casi por completo. Así nació JPA.&lt;br /&gt;&lt;br /&gt;JPA persiste automáticamente los objetos Java usando la técnica de ORM (mapeo objeto-relacional). Los ORM del mercado se han adaptado a esta especificación y, hoy en día, cualquier &lt;span style="font-style: italic;"&gt;framework&lt;/span&gt; de persistencia ORM soporta JPA.&lt;br /&gt;&lt;br /&gt;El estándar JPA define:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;La configuración ORM mediante &lt;span style="font-style: italic;"&gt;metadat&lt;/span&gt;&lt;span style="font-style: italic;"&gt;a&lt;/span&gt; que mapea &lt;span style="font-weight: bold;"&gt;entidades&lt;/span&gt; a &lt;span style="font-weight: bold;"&gt;tablas relacionales&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;La interface &lt;span style="font-style: italic;"&gt;EntityManager&lt;/span&gt;, que define una API estándar para realizar las operaciones de persistencia (&lt;a href="http://en.wikipedia.org/wiki/Create,_read,_update_and_delete"&gt;CRUD&lt;/a&gt;) de las entidades.&lt;/li&gt;&lt;li&gt;El &lt;span style="font-style: italic;"&gt;Java Persistence Query Language&lt;/span&gt; (&lt;span style="font-weight: bold;"&gt;JPQL&lt;/span&gt;), para consultas y lecturas de datos de aplicación persistidos (algo así como un SQL orientado a objetos).&lt;/li&gt;&lt;/ul&gt;En general, los contenedores proveen su ORM. Por ejemplo, &lt;span style="font-style: italic;"&gt;JBoss&lt;/span&gt; provee &lt;span style="font-style: italic;"&gt;Hibernate&lt;/span&gt;, &lt;span style="font-style: italic;"&gt;Glassfish&lt;/span&gt; provee &lt;span style="font-style: italic;"&gt;TopLink&lt;/span&gt;. &lt;span style="font-weight: bold;"&gt;JPA puede funcionar independientemente del resto de los componentes de EJB 3 y hasta puede ser usado en una aplicación desktop común y corriente, una aplicación Java SE.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Los &lt;span style="font-style: italic;"&gt;entities&lt;/span&gt; son los objetos Java que se persisten en la base de datos. Mientras que los &lt;span style="font-style: italic;"&gt;Session Beans&lt;/span&gt; son los  &lt;span style="font-weight: bold;"&gt;verbos &lt;/span&gt;del sistema, las entidades son los &lt;span style="font-weight: bold;"&gt;sustantivos&lt;/span&gt;.&lt;br /&gt;&lt;h2&gt;¿Qué es un contenedor de EJBs?&lt;/h2&gt;Así como cuando compilamos una clase simple de Java, necesitamos una &lt;span style="font-style: italic;"&gt;Java Virtual Machine&lt;/span&gt; (&lt;span style="font-weight: bold;"&gt;JVM&lt;/span&gt;) para ejecutarla, &lt;span style="font-weight: bold;"&gt;necesitamos un contenedor de EJBs para ejecutar los &lt;span style="font-style: italic;"&gt;Session Beans&lt;/span&gt; y los MDBs&lt;/span&gt;.&lt;br /&gt;&lt;h2&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_Q43CNgNBt9Y/SLWUQ4V5teI/AAAAAAAAAP0/fInz7JrhYoQ/s1600-h/Introduccion_EJB3_03.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_Q43CNgNBt9Y/SLWUQ4V5teI/AAAAAAAAAP0/fInz7JrhYoQ/s400/Introduccion_EJB3_03.jpg" alt="" id="BLOGGER_PHOTO_ID_5239256759238505954" border="0" /&gt;&lt;/a&gt;&lt;/h2&gt;Un contenedor Java EE es un servidor de aplicaciones que es capaz de ejecutar EJBs, puede servir como &lt;span style="font-style: italic;"&gt;web container&lt;/span&gt; y además puede incluir otras APIS y servicios, como por ejemplo el de persistencia. Algunos servidores de aplicaciones pueden proveer solamente un contenedor web, como es el caso de &lt;a href="http://tomcat.apache.org/"&gt;&lt;span style="font-style: italic;"&gt;Apache Tomcat&lt;/span&gt;&lt;/a&gt;, o sólo proveer servicios de persistencia, como es el caso de &lt;a href="http://www.hibernate.org/"&gt;&lt;span style="font-style: italic;"&gt;Hibernate&lt;/span&gt;&lt;/a&gt;. Un servidor de aplicaciones como &lt;a style="font-style: italic;" href="http://www.jboss.org/"&gt;JBoss&lt;/a&gt; trae un servidor &lt;span style="font-style: italic;"&gt;Apache Tomcat&lt;/span&gt; y un servidor &lt;span style="font-style: italic;"&gt;Hibernate&lt;/span&gt;, que se ejecutan dentro de forma transparente.&lt;br /&gt;&lt;h2&gt;¿Qué servicios proveen los EJBs?&lt;br /&gt;&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Integración:&lt;/span&gt; Proveen una forma de acoplar en tiempo de ejecución diferentes componentes, mediante simple configuración de anotaciones o XMLs. El acoplamiento se puede hacer mediante &lt;span style="font-weight: bold;"&gt;Inyección de Dependencia&lt;/span&gt; (&lt;span style="font-weight: bold;"&gt;DI&lt;/span&gt;) o usando &lt;a href="http://es.wikipedia.org/wiki/JNDI"&gt;JNDI&lt;/a&gt;, como se hacía en EJB 2 (explicaré el concepto de &lt;span style="font-style: italic;"&gt;Inyección de Dependencia&lt;/span&gt; en detalle en el próximo post). La integración es un servicio que proveen los beans de sesión y los MDBs.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Pooling:&lt;/span&gt; El contenedor de EJBs crea para componentes EJB un pool de instancias que es compartido por los diferentes clientes. Aunque cada cliente ve como si recibiera siempre instancias diferentes de los EJB, el contenedor está constantemente reusando objetos para optimizar memoria. El &lt;span style="font-style: italic;"&gt;pooling&lt;/span&gt; es un servicio que se aplica a los &lt;span style="font-style: italic;"&gt;Stateless Session Beans&lt;/span&gt; y a los MDBs.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Thread-safely:&lt;/span&gt; El programador puede escribir componentes del lado del servidor como si estuviera trabajando en una aplicación sencilla con un solo &lt;span style="font-style: italic;"&gt;thread&lt;/span&gt; (hilo). El contenedor se encarga de que los EJBs tengan el soporte adecuado para una aplicación multi-usuario (como son en general las aplicaciones enterprise) de forma transparente, asegurando el acceso seguro, consistente y performante. Aplica a los beans de sesión y a los MDBs. &lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Administración de Estados:&lt;/span&gt; El contenedor de EJBs almacena y maneja el estado de un &lt;span style="font-style: italic;"&gt;Stateful Session Bean&lt;/span&gt; de forma transparente, lo que significa que el programador puede mantener el estado de los miembros de una clase como si estuviera desarrollando una aplicación &lt;span style="font-style: italic;"&gt;desktop&lt;/span&gt; ordinaria. El contenedor maneja los detalles de las sesiones.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Mensajería:&lt;/span&gt; Mediante los MDBs es posible desacoplar por completo dos componentes para que se comuniquen de forma asincrónica, sin reparar demasiado en los mecanismos de la JMS API que los MDBs encapsulan.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Transacciones:&lt;/span&gt; EJB soporta el manejo de transacciones declarativas que permiten agregar comportamiento transaccional a un componente simplemente usando anotaciones o XMLs de configuración. Esto significa que cuando un método de un EJB (&lt;span style="font-style: italic;"&gt;Session Bean&lt;/span&gt; o MDB) se completa normalmente, el contenedor se encargará de &lt;span style="font-style: italic;"&gt;commitear&lt;/span&gt; la transacción y efectivizar los cambios que se realizaron en los datos de forma permanente. Si algo fallara durante la ejecución del método (una excepción o cualquier otro problema), la transacción haría un &lt;span style="font-style: italic;"&gt;rollback&lt;/span&gt; y es como si el método jamás se hubiera invocado.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Seguridad:&lt;/span&gt; EJB soporta integración con la &lt;span style="font-style: italic;"&gt;Java Authentication and Authorization Service&lt;/span&gt; (&lt;span style="font-weight: bold;"&gt;JAAS&lt;/span&gt;) API, haciendo casi transparente el manejo transversal de la seguridad. Aplica a todos los &lt;span style="font-style: italic;"&gt;Session Beans&lt;/span&gt;.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Interceptors&lt;span style="font-weight: bold;"&gt;:&lt;/span&gt;&lt;/span&gt; EJB introduce un framework liviano y simple para &lt;a href="http://es.wikipedia.org/wiki/Programaci%C3%B3n_Orientada_a_Aspectos"&gt;AOP&lt;/a&gt; (programación orientada a aspectos). No es tan robusto y completo como otros, pero es lo suficientemente útil para que sea utilizado por los demás servicios del contenedor para brindarnos de forma invisible los &lt;span style="font-style: italic;"&gt;crosscutting concerns&lt;/span&gt; de seguridad, transacciones, &lt;span style="font-style: italic;"&gt;thread-safely&lt;/span&gt;. Además, nosotros, como programadores, podemos agregar nuevos aspectos como logging o auditoria y demás de forma configurable.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Acceso Remoto:&lt;/span&gt; Es posible acceder de forma remota a distintos EJBs de forma sencilla, simplemente mediante la &lt;span style="font-weight: bold;"&gt;Inyección de Dependencia&lt;/span&gt;. El procedimiento para inyectar un componente local o uno remoto es exactamente el mismo, abstrayéndonos de las complicaciones especificas de RMI o similares. Este servicio aplica únicamente a los &lt;span style="font-style: italic;"&gt;Session Beans&lt;/span&gt;.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Web Services:&lt;/span&gt; Un &lt;span style="font-style: italic;"&gt;Stateless Session Bean&lt;/span&gt; puede publicar sus métodos como &lt;span style="font-style: italic;"&gt;web services&lt;/span&gt; mediante una sencilla anotación.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Persistencia:&lt;/span&gt; EJB 3 provee la especificación JPA para el mapeo de objetos (&lt;span style="font-style: italic;"&gt;Entities&lt;/span&gt;) a tablas.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Catching and Performance:&lt;/span&gt; JPA provee de forma transparente un importante número de servicios que permiten usar un &lt;span style="font-style: italic;"&gt;caché&lt;/span&gt; de entidades en memoria y una lectura y escritura sobre la base de datos altamente performante.&lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;HelloUser Example&lt;/h2&gt;Termino este post con el ejemplo provisto por el libro en este capítulo. El ejemplo cuenta con una simple interface llamada &lt;span style="font-style: italic;"&gt;HelloUser&lt;/span&gt; con un único método &lt;span style="font-style: italic;"&gt;sayHello&lt;/span&gt;. Luego, se muestra una clase que implementa esa interface, &lt;span style="font-style: italic;"&gt;HelloUserBean&lt;/span&gt;, y que además, mediante una simple anotación, &lt;span style="font-style: italic;"&gt;@Stateless&lt;/span&gt;, se le indica al contenedor que &lt;span style="font-style: italic;"&gt;HelloUserBean&lt;/span&gt; es un &lt;span style="font-style: italic;"&gt;Stateless Seasion Bean&lt;/span&gt;. A continuación, del lado del cliente, se muestra el código para inyectar el bean en un atributo privado llamado &lt;span style="font-style: italic;"&gt;helloUser&lt;/span&gt;, del tipo &lt;span style="font-style: italic;"&gt;HelloUser&lt;/span&gt;. En un método del cliente llamado &lt;span style="font-style: italic;"&gt;hello()&lt;/span&gt;, se invoca el método &lt;span style="font-style: italic;"&gt;sayHello()&lt;/span&gt; del bean de sesión (notar que &lt;span style="font-style: italic;"&gt;sayHello()&lt;/span&gt; es un método que se ejecuta del lado del servidor, por ende la salida no se verá en la consola del cliente, sino en la consola del servidor, que a menudo es un archivo de log del servidor de aplicaciones).&lt;br /&gt;&lt;br /&gt;Para inyectar de forma transparente el bean de sesión en el objeto del tipo &lt;span style="font-style: italic;"&gt;HelloUser&lt;/span&gt;, se usa la anotación &lt;span style="font-style: italic;"&gt;@EJB&lt;/span&gt;. Otra opción podría haber sido la única que había en EJB 2: localizar el componente mediante JNDI.&lt;br /&gt;&lt;h2&gt;Código del Lado del Servidor&lt;/h2&gt;&lt;span style="font-weight: bold;"&gt;package&lt;/span&gt; ejb3inaction.example;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;interface&lt;/span&gt; HelloUser {&lt;br /&gt;&lt;span&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;public void&lt;/span&gt; sayHello(String name);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;package&lt;/span&gt; ejb3inaction.example;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;import&lt;/span&gt; javax.ejb.Stateless;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;@Stateless&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;public class&lt;/span&gt; HelloUserBean &lt;span style="font-weight: bold;"&gt;implement&lt;/span&gt; HelloUser {&lt;br /&gt;&lt;span&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;public void&lt;/span&gt; sayHello(String name) {&lt;br /&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;________&lt;/span&gt;System.out.println("Hello " + name + " welcome to EJB 3!");&lt;br /&gt;&lt;span&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;&lt;/span&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;h2&gt;Código del Lado del Cliente&lt;/h2&gt;...&lt;br /&gt;&lt;span style="font-style: italic;"&gt;@EJB&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;private&lt;/span&gt; HelloUser helloUser;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;void&lt;/span&gt; hello() {&lt;br /&gt;&lt;span style="color: rgb(204, 255, 255);"&gt;____&lt;/span&gt;helloUser.sayHello(&lt;span style="font-style: italic;"&gt;"Curious George"&lt;/span&gt;);&lt;br /&gt;}&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;El código de todo el libro, incluyendo este mismo ejemplo, que es el del capítulo 1, se puede descargar de &lt;a href="http://www.manning.com/panda/"&gt;la url del libro&lt;/a&gt;. En el próximo post me concentraré en la &lt;span style="font-weight: bold;"&gt;Inyección de Dependencia&lt;/span&gt; y en una explicación concisa del ejemplo del capítulo 2 del libro, que es bastante más interesante.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4718168423716602728-5111818347808469426?l=tecnologiasjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tecnologiasjava.blogspot.com/feeds/5111818347808469426/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4718168423716602728&amp;postID=5111818347808469426' title='6 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4718168423716602728/posts/default/5111818347808469426'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4718168423716602728/posts/default/5111818347808469426'/><link rel='alternate' type='text/html' href='http://tecnologiasjava.blogspot.com/2008/08/introduccin-ejb-30-parte-1.html' title='Introducción a EJB 3.0 - Parte 1'/><author><name>Adrián Paredes</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-rCR9tdvy1zQ/AAAAAAAAAAI/AAAAAAAADik/eHxEpx8CVa0/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_Q43CNgNBt9Y/SLWS3S0jbII/AAAAAAAAAPk/AaKmRVndPaQ/s72-c/Introduccion_EJB3_01.jpg' height='72' width='72'/><thr:total>6</thr:total></entry></feed>
