<?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-8262369655936226064</id><updated>2012-01-09T22:47:23.996-06:00</updated><category term='ejemplo'/><category term='ventajas de Struts2'/><category term='JavaServer Faces 2.0 CRUD'/><category term='Struts2'/><category term='Struts2 - FileUpload - Carga de Archivos'/><category term='Struts2 - 1.1. - Ejemplo de Struts2'/><category term='Struts2 - 2.4.- Manejo de la Sesión'/><category term='JSF2 Java Server Faces 2.0 y NetBeans'/><category term='Tips de Java'/><category term='Java'/><category term='Struts2 - 1.2. - Ejemplo de Struts2'/><category term='Struts2 - 2.3.- Manejo de la Sesión'/><category term='Chuck Norris'/><category term='Hola mundo'/><category term='Struts1 vs Struts2'/><category term='JavaServer Faces 2.0'/><category term='Struts2 - 2.1.- Manejo de la Sesión'/><category term='buenas prácticas'/><category term='Struts2 - 2.2.- Manejo de la Sesión'/><category term='JavaServer Faces 2.0 - Hola Mundo'/><category term='Verificación Visual en Formularios'/><category term='Struts2 - 1.4. - Ejemplo de Struts2'/><category term='Struts2 - 1.5. - Ejemplo de Struts2'/><category term='Struts2 - 1.6. - Ejemplo de Struts2'/><category term='Struts2 - 1.3. - Ejemplo de Struts2'/><category term='Anti patrones'/><title type='text'>Programación en Java</title><subtitle type='html'>Programación en Java y otras cosas, microtutoriales y ejemplos para comenzar :)</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://programacionconejemplos.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8262369655936226064/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://programacionconejemplos.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Ant</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>33</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-8262369655936226064.post-6165264535302629869</id><published>2011-12-18T19:32:00.001-06:00</published><updated>2011-12-18T19:35:38.718-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ejemplo'/><category scheme='http://www.blogger.com/atom/ns#' term='Struts2'/><category scheme='http://www.blogger.com/atom/ns#' term='Hola mundo'/><title type='text'>Primer Ejemplo en Video de Struts2</title><content type='html'>&lt;iframe width="500" height="284" src="http://www.youtube.com/embed/Wj9QWhoPKbE" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;br /&gt;Aqui les dejamos la versión en video del primer ejemplo de Struts2&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8262369655936226064-6165264535302629869?l=programacionconejemplos.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programacionconejemplos.blogspot.com/feeds/6165264535302629869/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://programacionconejemplos.blogspot.com/2011/12/primer-ejemplo-en-video-de-struts2.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8262369655936226064/posts/default/6165264535302629869'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8262369655936226064/posts/default/6165264535302629869'/><link rel='alternate' type='text/html' href='http://programacionconejemplos.blogspot.com/2011/12/primer-ejemplo-en-video-de-struts2.html' title='Primer Ejemplo en Video de Struts2'/><author><name>Ant</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://img.youtube.com/vi/Wj9QWhoPKbE/default.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8262369655936226064.post-6312985800725212712</id><published>2011-09-14T19:07:00.000-05:00</published><updated>2011-09-14T19:10:15.001-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Anti patrones'/><category scheme='http://www.blogger.com/atom/ns#' term='buenas prácticas'/><title type='text'>Anti Patrones Java - Manejo de XML</title><content type='html'>Una mala práctica en el manejo de documentos XML es no hacer uso de &lt;b&gt;parsers &lt;/b&gt;o analizadores.  El siguiente&amp;nbsp;código&amp;nbsp;muestra un escenario común:&lt;br /&gt;&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;int inicio = xml.indexOf("&amp;lt;nombre&amp;gt;");&lt;br /&gt;int fin = xml.indexOf("&amp;lt;/nombre&amp;gt;");&lt;br /&gt;String nombre = xml.substring(&lt;/code&gt;&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;inicio&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;, fin);&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;El método anterior que en apariencia funciona, tiene los siguientes inconvenientes:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Puede haber mas de un nodo "name" en el documento.&lt;/li&gt;&lt;li&gt;El contenido de "name" puede no estar hecho de caracteres de datos solamente.&lt;/li&gt;&lt;li&gt;Puede haber caracteres escapados en los datos.&lt;/li&gt;&lt;li&gt;Si los datos contenidos en el nodo son CDATA puede no devolver el resultado esperado.&lt;/li&gt;&lt;li&gt;El documento XML puede tener namespaces.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;En general un documento XML es mucho mas complejo que es un String de java, por el tipo de operaciones que están&amp;nbsp;implícitas&amp;nbsp;en la lectura. Para leer de forma correcta el contenido de un documento XML existen analizadores como Xerces que ademas son muy ligeros. El equivalente en JDOM es el siguiente:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;SAXBuilder builder = new SAXBuilder(false);&lt;br /&gt;Document doc = doc = builder.build(new StringReader(xml));&lt;br /&gt;String nombre = doc.getRootElement().getChild("nombre").getText();&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;Otra mala práctica en el manejo de XML que es muy común es en la construcción del documento, haciendo algo como esto:&lt;br /&gt;&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;String nombre = ...&lt;br /&gt;String atriburo = ...&lt;br /&gt;String xml = "&amp;lt;root&amp;gt;"&lt;br /&gt;            +"&amp;lt;nombre atr=\""+ attribute +"\"&amp;gt;"+ nombre +"&amp;lt;/nombre&amp;gt;"&lt;br /&gt;            +"&amp;lt;/root&amp;gt;";&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Cuando lo correcto es hacer mas bien lo siguiente:&lt;br /&gt;&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;Element root = new Element("root");&lt;br /&gt;root.setAttribute("atr", atributo);&lt;br /&gt;root.setText(nombre);&lt;br /&gt;Document doc = new Documet();&lt;br /&gt;doc.setRootElement(root);&lt;br /&gt;XmlOutputter out = new XmlOutputter(Format.getPrettyFormat());&lt;br /&gt;String xml = out.outputString(root);&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Olvidandonos de escapar caracteres y con la sentecia&amp;nbsp;&lt;b&gt;XmlOutputter out = new XmlOutputter(Format.getPrettyFormat()) &amp;nbsp;&lt;/b&gt;le damos el formato visual adecuado a nuestro documento. &amp;nbsp;También podremos agregar namespaces a nuestros nodos sin ningún problema. &amp;nbsp;JDom es sin duda una magnifica opción para manejar documentos XML.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8262369655936226064-6312985800725212712?l=programacionconejemplos.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programacionconejemplos.blogspot.com/feeds/6312985800725212712/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://programacionconejemplos.blogspot.com/2011/09/anti-patrones-java-manejo-de-xml.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8262369655936226064/posts/default/6312985800725212712'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8262369655936226064/posts/default/6312985800725212712'/><link rel='alternate' type='text/html' href='http://programacionconejemplos.blogspot.com/2011/09/anti-patrones-java-manejo-de-xml.html' title='Anti Patrones Java - Manejo de XML'/><author><name>Ant</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8262369655936226064.post-5400474143283931138</id><published>2011-09-01T13:57:00.000-05:00</published><updated>2011-09-01T14:01:31.979-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Chuck Norris'/><title type='text'>Java y Chuck Norris</title><content type='html'>Unos cuantos hechos acerca de &lt;b&gt;Chuck Norris&lt;/b&gt;, que quizá te convenga saber para tu examen de certificación &lt;b&gt;SCJP.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Chuck Norris&lt;/b&gt; puede crear clases que son ambas cosas: &lt;b&gt;abstract &lt;/b&gt;y &lt;b&gt;final&lt;/b&gt;.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Chuck Norri&lt;/b&gt;s no despliega aplicaciones, las mete a patadas en el servidor.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Chuck Norris&lt;/b&gt; puede usar cualquier clase en &lt;b&gt;java.util.*&lt;/b&gt; para matarte y sin leer los &lt;b&gt;javadocs&lt;/b&gt;.&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Chuck Norris&lt;/b&gt; puede golpear tan duro a tu aplicación web que la convierte en una aplicación swing con iconos en forma de cráneos humanos.&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Chuck Norris&lt;/b&gt; contó el mismo para llegar al valor &lt;b&gt;Float.POSITIVE_INFINITY&lt;/b&gt; y demostrar que es correcto, dos veces.&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;b&gt;synchronized &lt;/b&gt;no protege de &lt;b&gt;Chuck Norris&lt;/b&gt;, si él lo necesita lo toma.&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Chuck Norris&lt;/b&gt; no usa &lt;b&gt;javac&lt;/b&gt;, el escribe sus aplicaciones directamente en código binario.&amp;nbsp;&lt;/li&gt;&lt;li&gt;El código java de &lt;b&gt;Chuck Norris&lt;/b&gt; nunca necesita optimizarse.&amp;nbsp;&lt;/li&gt;&lt;li&gt;Su código es tan rápido que rompe la velocidad de la luz y durante las pruebas mata a 37 personas en los laboratorios de Sun.&amp;nbsp;&lt;/li&gt;&lt;li&gt;El código de &lt;b&gt;Chuck Norris&lt;/b&gt; nunca tiene un error. ¡&lt;b&gt;Nunca&lt;/b&gt;!&amp;nbsp;&lt;/li&gt;&lt;li&gt;Cuando alguien intenta usar un método &lt;b&gt;deprecated &lt;/b&gt;de &lt;b&gt;Chuck Norris&lt;/b&gt;, reciben  automáticamente una patada voladora en tiempo de compilación.&amp;nbsp;&lt;/li&gt;&lt;li&gt;El paquete &lt;b&gt;java.lang&lt;/b&gt;, originalmente contenía la clase &lt;b&gt;Chuck Norris&lt;/b&gt;, pero fue retirada luego de una revisión de diseño y una patada voladora propinada a &lt;b&gt;Bill Joy&lt;/b&gt;, el diseñador a cargo.&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Chuck Norris&lt;/b&gt; no escribe código.  El simplemente se sienta frente al monitor y lo mira hasta que obtiene lo que quiere.&amp;nbsp;&lt;/li&gt;&lt;li&gt;El código corre mejor cuando &lt;b&gt;Chuck Norris&lt;/b&gt; lo mira.&amp;nbsp;&lt;/li&gt;&lt;li&gt;Si tú obtienes una &lt;b&gt;ChuckNorrisException &lt;/b&gt;probablemente morirás.&amp;nbsp;&lt;/li&gt;&lt;li&gt;Los objetos de &lt;b&gt;Chuck Norris&lt;/b&gt; puede lanzar patadas voladoras a cualquier objeto privado de otro paquete.&amp;nbsp;&lt;/li&gt;&lt;li&gt;Los niveles de visibilidad son &lt;b&gt;public&lt;/b&gt;, &lt;b&gt;default&lt;/b&gt;, &lt;b&gt;protected&lt;/b&gt;, &lt;b&gt;private &lt;/b&gt;y “&lt;b&gt;protectedbyChuckNorris&lt;/b&gt;”, ¡No intentes acceder a campos con el último modificador!&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Chuck Norris&lt;/b&gt; puede dividir por cero.&amp;nbsp;&lt;/li&gt;&lt;li&gt;El &lt;b&gt;Garbage Collector&lt;/b&gt; solo pasa sobre el código de &lt;b&gt;Chuck Norris&lt;/b&gt; cuando hay cuerpos que recolectar.&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Chuck Norris&lt;/b&gt; implementa “&lt;b&gt;Indestructible&lt;/b&gt;”. Todas las demás criaturas implementan “&lt;b&gt;Killable&lt;/b&gt;”&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Chuck Norris&lt;/b&gt; puede hacer herencia múltiple en java.&amp;nbsp;&lt;/li&gt;&lt;li&gt;El código de &lt;b&gt;Chuck Norris &lt;/b&gt;usa generics desde la versión &lt;b&gt;1.3&lt;/b&gt; de &lt;b&gt;java&lt;/b&gt;.&amp;nbsp;&lt;/li&gt;&lt;li&gt;Cuando se ejecuta una clase de &lt;b&gt;Chuck Norris&lt;/b&gt;, el CPU la corre al doble de velocidad.&amp;nbsp;&lt;/li&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: right;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/--28dCHVi-vU/Tl_VHXK3pzI/AAAAAAAAAec/TI-kCPcr_k0/s1600/chuck+solito.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="200" src="http://4.bp.blogspot.com/--28dCHVi-vU/Tl_VHXK3pzI/AAAAAAAAAec/TI-kCPcr_k0/s200/chuck+solito.png" width="155" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Chuck Norris y Java&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;li&gt;El código de &lt;b&gt;Chuck Norris&lt;/b&gt; no puede ser decompilado, no te molestes en tratar.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;:)&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8262369655936226064-5400474143283931138?l=programacionconejemplos.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programacionconejemplos.blogspot.com/feeds/5400474143283931138/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://programacionconejemplos.blogspot.com/2011/09/unos-cuantos-hechos-acerca-de-chuck.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8262369655936226064/posts/default/5400474143283931138'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8262369655936226064/posts/default/5400474143283931138'/><link rel='alternate' type='text/html' href='http://programacionconejemplos.blogspot.com/2011/09/unos-cuantos-hechos-acerca-de-chuck.html' title='Java y Chuck Norris'/><author><name>Ant</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/--28dCHVi-vU/Tl_VHXK3pzI/AAAAAAAAAec/TI-kCPcr_k0/s72-c/chuck+solito.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8262369655936226064.post-645119846150742061</id><published>2011-08-26T00:35:00.003-05:00</published><updated>2011-09-01T08:55:27.132-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaServer Faces 2.0'/><title type='text'>Plantillas en Facelets (5.4)</title><content type='html'>La tecnología JavaServer Faces provee las herramientas para implementar interfaces que son fáciles de extender y reutilizar.  El uso de plantillas es una características de Facelets que permite crear una página que puede actuar como parase, o plantilla, para otras páginas en una aplicación. Usando plantillas, es posible reutilizar código y liberarse de volver a crear paginas similares.  Las plantillas permiten incluso establecer un estándar para el look and feel en una aplicación con un número de páginas grande.&lt;br /&gt;&lt;br /&gt;La siguiente tabla enlista las etiquetas Facelets que son usadas para las plantillas con su respectiva funcionalidad.&lt;br /&gt;&lt;br /&gt;&lt;style&gt; &lt;!--  /* Font Definitions */ @font-face 	{font-family:Arial; 	panose-1:2 11 6 4 2 2 2 2 2 4; 	mso-font-charset:0; 	mso-generic-font-family:auto; 	mso-font-pitch:variable; 	mso-font-signature:-536859905 -1073711037 9 0 511 0;} @font-face 	{font-family:"ＭＳ 明朝"; 	mso-font-charset:78; 	mso-generic-font-family:auto; 	mso-font-pitch:variable; 	mso-font-signature:1 134676480 16 0 131072 0;} @font-face 	{font-family:"ＭＳ 明朝"; 	mso-font-charset:78; 	mso-generic-font-family:auto; 	mso-font-pitch:variable; 	mso-font-signature:1 134676480 16 0 131072 0;} @font-face 	{font-family:Cambria; 	panose-1:2 4 5 3 5 4 6 3 2 4; 	mso-font-charset:0; 	mso-generic-font-family:auto; 	mso-font-pitch:variable; 	mso-font-signature:-536870145 1073743103 0 0 415 0;}  /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal 	{mso-style-unhide:no; 	mso-style-qformat:yes; 	mso-style-parent:""; 	margin:0cm; 	margin-bottom:.0001pt; 	mso-pagination:widow-orphan; 	font-size:12.0pt; 	font-family:Cambria; 	mso-ascii-font-family:Cambria; 	mso-ascii-theme-font:minor-latin; 	mso-fareast-font-family:"ＭＳ 明朝"; 	mso-fareast-theme-font:minor-fareast; 	mso-hansi-font-family:Cambria; 	mso-hansi-theme-font:minor-latin; 	mso-bidi-font-family:"Times New Roman"; 	mso-bidi-theme-font:minor-bidi;} .MsoChpDefault 	{mso-style-type:export-only; 	mso-default-props:yes; 	font-family:Cambria; 	mso-ascii-font-family:Cambria; 	mso-ascii-theme-font:minor-latin; 	mso-fareast-font-family:"ＭＳ 明朝"; 	mso-fareast-theme-font:minor-fareast; 	mso-hansi-font-family:Cambria; 	mso-hansi-theme-font:minor-latin; 	mso-bidi-font-family:"Times New Roman"; 	mso-bidi-theme-font:minor-bidi;} @page WordSection1 	{size:612.0pt 792.0pt; 	margin:70.85pt 3.0cm 70.85pt 3.0cm; 	mso-header-margin:36.0pt; 	mso-footer-margin:36.0pt; 	mso-paper-source:0;} div.WordSection1 	{page:WordSection1;} --&gt; &lt;/style&gt;     &lt;br /&gt;&lt;table border="1" cellpadding="0" cellspacing="0" class="MsoNormalTable" style="border-collapse: collapse; border: none; mso-border-alt: solid black .75pt; mso-yfti-tbllook: 1184;"&gt;  &lt;tbody&gt;&lt;tr style="mso-yfti-firstrow: yes; mso-yfti-irow: 0;"&gt;   &lt;td style="border: 1pt solid windowtext; padding: 3pt 3pt 4.5pt;" valign="top"&gt;&lt;div class="MsoNormal"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="color: black; font-family: Arial;"&gt;Etiqueta&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="-moz-border-bottom-colors: none; -moz-border-image: none; -moz-border-left-colors: none; -moz-border-right-colors: none; -moz-border-top-colors: none; border-style: solid solid solid none; border-width: 1pt 1pt 1pt medium; color: windowtext windowtext windowtext -moz-use-text-color; padding: 3pt 3pt 4.5pt;" valign="top"&gt;&lt;div class="MsoNormal"&gt;&lt;span style="color: black; font-family: Arial; font-size: 100%;"&gt;Función&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style="mso-yfti-irow: 1;"&gt;   &lt;td style="-moz-border-bottom-colors: none; -moz-border-image: none; -moz-border-left-colors: none; -moz-border-right-colors: none; -moz-border-top-colors: none; border-right: 1pt solid windowtext; border-style: none solid solid; border-width: medium 1pt 1pt; color: -moz-use-text-color windowtext windowtext; padding: 3pt 3pt 4.5pt;" valign="top"&gt;&lt;div class="MsoNormal"&gt;&lt;span style="color: black; font-family: Arial; font-size: 100%;"&gt;ui:component&lt;/span&gt;&lt;span style="color: black; font-family: Arial; font-size: 100%;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-style: none solid solid none; border-width: medium 1pt 1pt medium; color: -moz-use-text-color windowtext windowtext -moz-use-text-color; padding: 3pt 3pt 4.5pt;" valign="top"&gt;&lt;div class="MsoNormal"&gt;&lt;span style="color: black; font-family: Arial; font-size: 100%;"&gt;Defines a component that   is created and added to the component tree.&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style="mso-yfti-irow: 2;"&gt;   &lt;td style="-moz-border-bottom-colors: none; -moz-border-image: none; -moz-border-left-colors: none; -moz-border-right-colors: none; -moz-border-top-colors: none; border-right: 1pt solid windowtext; border-style: none solid solid; border-width: medium 1pt 1pt; color: -moz-use-text-color windowtext windowtext; padding: 3pt 3pt 4.5pt;" valign="top"&gt;&lt;div class="MsoNormal"&gt;&lt;span style="color: black; font-family: Arial; font-size: 100%;"&gt;ui:composition&lt;/span&gt;&lt;span style="color: black; font-family: Arial; font-size: 100%;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-style: none solid solid none; border-width: medium 1pt 1pt medium; color: -moz-use-text-color windowtext windowtext -moz-use-text-color; padding: 3pt 3pt 4.5pt;" valign="top"&gt;&lt;div class="MsoNormal"&gt;&lt;span style="color: black; font-family: Arial; font-size: 100%;"&gt;Defines a page composition   that optionally uses a template. Content outside of this tag is ignored.&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style="mso-yfti-irow: 3;"&gt;   &lt;td style="-moz-border-bottom-colors: none; -moz-border-image: none; -moz-border-left-colors: none; -moz-border-right-colors: none; -moz-border-top-colors: none; border-right: 1pt solid windowtext; border-style: none solid solid; border-width: medium 1pt 1pt; color: -moz-use-text-color windowtext windowtext; padding: 3pt 3pt 4.5pt;" valign="top"&gt;&lt;div class="MsoNormal"&gt;&lt;span style="color: black; font-family: Arial; font-size: 100%;"&gt;ui:debug&lt;/span&gt;&lt;span style="color: black; font-family: Arial; font-size: 100%;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-style: none solid solid none; border-width: medium 1pt 1pt medium; color: -moz-use-text-color windowtext windowtext -moz-use-text-color; padding: 3pt 3pt 4.5pt;" valign="top"&gt;&lt;div class="MsoNormal"&gt;&lt;span style="color: black; font-family: Arial; font-size: 100%;"&gt;Defines a debug component   that is created and added to the component tree.&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style="mso-yfti-irow: 4;"&gt;   &lt;td style="-moz-border-bottom-colors: none; -moz-border-image: none; -moz-border-left-colors: none; -moz-border-right-colors: none; -moz-border-top-colors: none; border-right: 1pt solid windowtext; border-style: none solid solid; border-width: medium 1pt 1pt; color: -moz-use-text-color windowtext windowtext; padding: 3pt 3pt 4.5pt;" valign="top"&gt;&lt;div class="MsoNormal"&gt;&lt;span style="color: black; font-family: Arial; font-size: 100%;"&gt;ui:decorate&lt;/span&gt;&lt;span style="color: black; font-family: Arial; font-size: 100%;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-style: none solid solid none; border-width: medium 1pt 1pt medium; color: -moz-use-text-color windowtext windowtext -moz-use-text-color; padding: 3pt 3pt 4.5pt;" valign="top"&gt;&lt;div class="MsoNormal"&gt;&lt;span style="color: black; font-family: Arial; font-size: 100%;"&gt;Similar to the   composition tag but does not disregard content outside this tag.&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style="mso-yfti-irow: 5;"&gt;   &lt;td style="-moz-border-bottom-colors: none; -moz-border-image: none; -moz-border-left-colors: none; -moz-border-right-colors: none; -moz-border-top-colors: none; border-right: 1pt solid windowtext; border-style: none solid solid; border-width: medium 1pt 1pt; color: -moz-use-text-color windowtext windowtext; padding: 3pt 3pt 4.5pt;" valign="top"&gt;&lt;div class="MsoNormal"&gt;&lt;span style="color: black; font-family: Arial; font-size: 100%;"&gt;ui:define&lt;/span&gt;&lt;span style="color: black; font-family: Arial; font-size: 100%;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-style: none solid solid none; border-width: medium 1pt 1pt medium; color: -moz-use-text-color windowtext windowtext -moz-use-text-color; padding: 3pt 3pt 4.5pt;" valign="top"&gt;&lt;div class="MsoNormal"&gt;&lt;span style="color: black; font-family: Arial; font-size: 100%;"&gt;Defines content that is   inserted into a page by a template.&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style="mso-yfti-irow: 6;"&gt;   &lt;td style="-moz-border-bottom-colors: none; -moz-border-image: none; -moz-border-left-colors: none; -moz-border-right-colors: none; -moz-border-top-colors: none; border-right: 1pt solid windowtext; border-style: none solid solid; border-width: medium 1pt 1pt; color: -moz-use-text-color windowtext windowtext; padding: 3pt 3pt 4.5pt;" valign="top"&gt;&lt;div class="MsoNormal"&gt;&lt;span style="color: black; font-family: Arial; font-size: 100%;"&gt;ui:fragment&lt;/span&gt;&lt;span style="color: black; font-family: Arial; font-size: 100%;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-style: none solid solid none; border-width: medium 1pt 1pt medium; color: -moz-use-text-color windowtext windowtext -moz-use-text-color; padding: 3pt 3pt 4.5pt;" valign="top"&gt;&lt;div class="MsoNormal"&gt;&lt;span style="color: black; font-family: Arial; font-size: 100%;"&gt;Similar to the component   tag but does not disregard content outside this tag.&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style="mso-yfti-irow: 7;"&gt;   &lt;td style="-moz-border-bottom-colors: none; -moz-border-image: none; -moz-border-left-colors: none; -moz-border-right-colors: none; -moz-border-top-colors: none; border-right: 1pt solid windowtext; border-style: none solid solid; border-width: medium 1pt 1pt; color: -moz-use-text-color windowtext windowtext; padding: 3pt 3pt 4.5pt;" valign="top"&gt;&lt;div class="MsoNormal"&gt;&lt;span style="color: black; font-family: Arial; font-size: 100%;"&gt;ui:include&lt;/span&gt;&lt;span style="color: black; font-family: Arial; font-size: 100%;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-style: none solid solid none; border-width: medium 1pt 1pt medium; color: -moz-use-text-color windowtext windowtext -moz-use-text-color; padding: 3pt 3pt 4.5pt;" valign="top"&gt;&lt;div class="MsoNormal"&gt;&lt;span style="color: black; font-family: Arial; font-size: 100%;"&gt;Encapsulate and reuse   content for multiple pages.&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style="mso-yfti-irow: 8;"&gt;   &lt;td style="-moz-border-bottom-colors: none; -moz-border-image: none; -moz-border-left-colors: none; -moz-border-right-colors: none; -moz-border-top-colors: none; border-right: 1pt solid windowtext; border-style: none solid solid; border-width: medium 1pt 1pt; color: -moz-use-text-color windowtext windowtext; padding: 3pt 3pt 4.5pt;" valign="top"&gt;&lt;div class="MsoNormal"&gt;&lt;span style="color: black; font-family: Arial; font-size: 100%;"&gt;ui:insert&lt;/span&gt;&lt;span style="color: black; font-family: Arial; font-size: 100%;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-style: none solid solid none; border-width: medium 1pt 1pt medium; color: -moz-use-text-color windowtext windowtext -moz-use-text-color; padding: 3pt 3pt 4.5pt;" valign="top"&gt;&lt;div class="MsoNormal"&gt;&lt;span style="color: black; font-family: Arial; font-size: 100%;"&gt;Inserts content into a   template.&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style="mso-yfti-irow: 9;"&gt;   &lt;td style="-moz-border-bottom-colors: none; -moz-border-image: none; -moz-border-left-colors: none; -moz-border-right-colors: none; -moz-border-top-colors: none; border-right: 1pt solid windowtext; border-style: none solid solid; border-width: medium 1pt 1pt; color: -moz-use-text-color windowtext windowtext; padding: 3pt 3pt 4.5pt;" valign="top"&gt;&lt;div class="MsoNormal"&gt;&lt;span style="color: black; font-family: Arial; font-size: 100%;"&gt;ui:param&lt;/span&gt;&lt;span style="color: black; font-family: Arial; font-size: 100%;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-style: none solid solid none; border-width: medium 1pt 1pt medium; color: -moz-use-text-color windowtext windowtext -moz-use-text-color; padding: 3pt 3pt 4.5pt;" valign="top"&gt;&lt;div class="MsoNormal"&gt;&lt;span style="color: black; font-family: Arial; font-size: 100%;"&gt;Used to pass parameters   to an included file.&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style="mso-yfti-irow: 10;"&gt;   &lt;td style="-moz-border-bottom-colors: none; -moz-border-image: none; -moz-border-left-colors: none; -moz-border-right-colors: none; -moz-border-top-colors: none; border-right: 1pt solid windowtext; border-style: none solid solid; border-width: medium 1pt 1pt; color: -moz-use-text-color windowtext windowtext; padding: 3pt 3pt 4.5pt;" valign="top"&gt;&lt;div class="MsoNormal"&gt;&lt;span style="color: black; font-family: Arial; font-size: 100%;"&gt;ui:repeat&lt;/span&gt;&lt;span style="color: black; font-family: Arial; font-size: 100%;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-style: none solid solid none; border-width: medium 1pt 1pt medium; color: -moz-use-text-color windowtext windowtext -moz-use-text-color; padding: 3pt 3pt 4.5pt;" valign="top"&gt;&lt;div class="MsoNormal"&gt;&lt;span style="color: black; font-family: Arial; font-size: 100%;"&gt;Used as an alternative   for loop tags, such as &lt;/span&gt;&lt;span style="color: black; font-family: Arial; font-size: 100%;"&gt;c:forEach&lt;/span&gt;&lt;span style="color: black; font-family: Arial; font-size: 100%;"&gt; or &lt;/span&gt;&lt;span style="color: black; font-family: Arial; font-size: 100%;"&gt;h:dataTable.&lt;/span&gt;&lt;span style="color: black; font-family: Arial; font-size: 100%;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style="mso-yfti-irow: 11; mso-yfti-lastrow: yes;"&gt;   &lt;td style="-moz-border-bottom-colors: none; -moz-border-image: none; -moz-border-left-colors: none; -moz-border-right-colors: none; -moz-border-top-colors: none; border-right: 1pt solid windowtext; border-style: none solid solid; border-width: medium 1pt 1pt; color: -moz-use-text-color windowtext windowtext; padding: 3pt 3pt 4.5pt;" valign="top"&gt;&lt;div class="MsoNormal"&gt;&lt;span style="color: black; font-family: Arial; font-size: 100%;"&gt;ui:remove&lt;/span&gt;&lt;span style="color: black; font-family: Arial; font-size: 100%;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-style: none solid solid none; border-width: medium 1pt 1pt medium; color: -moz-use-text-color windowtext windowtext -moz-use-text-color; padding: 3pt 3pt 4.5pt;" valign="top"&gt;&lt;div class="MsoNormal"&gt;&lt;span style="color: black; font-family: Arial; font-size: 100%;"&gt;Removes content from a   page.&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;Para mas información sobre las etiquetas, vea la documentación en&lt;br /&gt;http://download.oracle.com/javaee/6/javaserverfaces/2.1/docs/vdldocs/facelets/&lt;br /&gt;&lt;br /&gt;La librería de etiquetas de Facelets incluye la etiqueta de plantilla principal ui:insert.  Una página plantillas que es creada con esta etiqueta permite definir una estructura default para una página.   Una página plantilla es usada como plantilla para otras páginas usualmente referidas como páginas cliente.&lt;br /&gt;&lt;br /&gt;Aquí hay un ejemplo de una plantilla salvada como &lt;span style="font-weight: bold;"&gt;template.xhtml&lt;/span&gt;.&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;&amp;lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"&lt;br /&gt;&lt;br /&gt;  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;html xmlns="http://www.w3.org/1999/xhtml"&lt;br /&gt;&lt;br /&gt;  xmlns:ui="http://java.sun.com/jsf/facelets"&lt;br /&gt;&lt;br /&gt;  xmlns:h="http://java.sun.com/jsf/html"&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;h:head&amp;gt;&lt;br /&gt;&lt;br /&gt;    &amp;lt;meta http-equiv="Content-Type"&lt;br /&gt;&lt;br /&gt;          content="text/html; charset=UTF-8" /&amp;gt;&lt;br /&gt;&lt;br /&gt;    &amp;lt;link href="./resources/css/default.css"&lt;br /&gt;&lt;br /&gt;          rel="stylesheet" type="text/css" /&amp;gt;&lt;br /&gt;&lt;br /&gt;    &amp;lt;link href="./resources/css/cssLayout.css"&lt;br /&gt;&lt;br /&gt;          rel="stylesheet" type="text/css" /&amp;gt;&lt;br /&gt;&lt;br /&gt;    &amp;lt;title&amp;gt;Facelets Template&amp;lt;/title&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/h:head&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;h:body&amp;gt;&lt;br /&gt;&lt;br /&gt;    &amp;lt;div id="top" class="top"&amp;gt;&lt;br /&gt;&lt;br /&gt;        &amp;lt;ui:insert name="top"&amp;gt;Top Section&amp;lt;/ui:insert&amp;gt;&lt;br /&gt;&lt;br /&gt;    &amp;lt;/div&amp;gt;&lt;br /&gt;&lt;br /&gt;    &amp;lt;div&amp;gt;&lt;br /&gt;&lt;br /&gt;    &amp;lt;div id="left"&amp;gt;&lt;br /&gt;&lt;br /&gt;         &amp;lt;ui:insert name="left"&amp;gt;Left Section&amp;lt;/ui:insert&amp;gt;&lt;br /&gt;&lt;br /&gt;    &amp;lt;/div&amp;gt;&lt;br /&gt;&lt;br /&gt;    &amp;lt;div id="content" class="left_content"&amp;gt;&lt;br /&gt;&lt;br /&gt;         &amp;lt;ui:insert name="content"&amp;gt;Main Content&amp;lt;/ui:insert&amp;gt;&lt;br /&gt;&lt;br /&gt;    &amp;lt;/div&amp;gt;&lt;br /&gt;&lt;br /&gt;    &amp;lt;/div&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/h:body&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;La página de ejemplo define una página XHTML que es dividida en tres secciones: una sección superior, una sección izquierda y una sección principal.  Estas secciones tiene una hoja de estilos asociada a ellas. La misma estructura puede ser reutilizada en otras páginas de la aplicación.&lt;br /&gt;&lt;br /&gt;La página cliente invoca la plantilla usando la etiqueta ui:composition.  En el siguiente ejemplo, una página cliente llamada &lt;span style="font-weight: bold;"&gt;templateclient.xhtml&lt;/span&gt; invoca la plantilla llamada &lt;span style="font-weight: bold;"&gt;template.xhtml&lt;/span&gt; del ejemplo precedente.  Una página cliente puede insertar contenido con la ayuda de la etiqueta &lt;span style="font-weight: bold;"&gt;ui:define&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"&lt;br /&gt;&lt;br /&gt;"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;html xmlns="http://www.w3.org/1999/xhtml"&lt;br /&gt;&lt;br /&gt;  xmlns:ui="http://java.sun.com/jsf/facelets"&lt;br /&gt;&lt;br /&gt;  xmlns:h="http://java.sun.com/jsf/html"&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;h:body&amp;gt;&lt;br /&gt;&lt;br /&gt;    &amp;lt;ui:composition template="./template.xhtml"&amp;gt;&lt;br /&gt;&lt;br /&gt;        &amp;lt;ui:define name="top"&amp;gt;&lt;br /&gt;&lt;br /&gt;            Welcome to Template Client Page&lt;br /&gt;&lt;br /&gt;        &amp;lt;/ui:define&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;        &amp;lt;ui:define name="left"&amp;gt;&lt;br /&gt;&lt;br /&gt;            &amp;lt;h:outputLabel value="You are in the Left Section"/&amp;gt;&lt;br /&gt;&lt;br /&gt;        &amp;lt;/ui:define&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;        &amp;lt;ui:define name="content"&amp;gt;&lt;br /&gt;&lt;br /&gt;            &amp;lt;h:graphicImage value="#{resource['images:wave.med.gif']}"/&amp;gt;&lt;br /&gt;&lt;br /&gt;            &amp;lt;h:outputText value="You are in the Main Content Section"/&amp;gt;&lt;br /&gt;&lt;br /&gt;        &amp;lt;/ui:define&amp;gt;&lt;br /&gt;&lt;br /&gt;    &amp;lt;/ui:composition&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/h:body&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;Se puede utilizar la IDE NetBeans para crear plantillas de Facelets y páginas cliente. Para mas información ver http://netbeans.org/kb/docs/web/jsf20-intro.html&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8262369655936226064-645119846150742061?l=programacionconejemplos.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programacionconejemplos.blogspot.com/feeds/645119846150742061/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://programacionconejemplos.blogspot.com/2011/08/plantillas-en-facelets-54.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8262369655936226064/posts/default/645119846150742061'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8262369655936226064/posts/default/645119846150742061'/><link rel='alternate' type='text/html' href='http://programacionconejemplos.blogspot.com/2011/08/plantillas-en-facelets-54.html' title='Plantillas en Facelets (5.4)'/><author><name>Ant</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8262369655936226064.post-3345387197837848755</id><published>2011-08-23T08:20:00.004-05:00</published><updated>2011-08-23T08:41:24.614-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tips de Java'/><title type='text'>Anti-Patrones Java  - Concatenación de cadenas</title><content type='html'>Veamos el siguiente ejemplo.&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;String s = "";&lt;br /&gt;for (Persona p : personas) {&lt;br /&gt;  s += ", " + p.getNombre();&lt;br /&gt;}&lt;br /&gt;s = s.substring(2); //Quita la primera coma&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;Este código muestra un ejemplo claro de una mala práctica que puede afectar el rendimiento óptimo de una aplicación, su tiempo de ejecución es de orden aproximado &lt;b&gt;O(personas.length²)&lt;/b&gt;.  La concatenación repetitiva de cadenas en ciclos causa exceso de basura y copiado de arreglos.  Además es necesario remover la última coma, lo cual es evidentemente un parte fea del código. &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;La siguiente sería una mejor práctica:&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;StringBuilder sb = new StringBuilder(personas.size() * 16); // Con una estimacion inicial del tamaño del buffer&lt;br /&gt;for (Persona p : personas) {&lt;br /&gt;  if (sb.length() &amp;gt; 0) sb.append(", ");&lt;br /&gt;  sb.append(p.getNombre);&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;Que incluye además una estimación inicial del tamaño del buffer.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8262369655936226064-3345387197837848755?l=programacionconejemplos.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programacionconejemplos.blogspot.com/feeds/3345387197837848755/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://programacionconejemplos.blogspot.com/2011/08/anti-patrones-java-concatenacion-de.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8262369655936226064/posts/default/3345387197837848755'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8262369655936226064/posts/default/3345387197837848755'/><link rel='alternate' type='text/html' href='http://programacionconejemplos.blogspot.com/2011/08/anti-patrones-java-concatenacion-de.html' title='Anti-Patrones Java  - Concatenación de cadenas'/><author><name>Ant</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8262369655936226064.post-4250325077601455466</id><published>2011-08-22T08:53:00.002-05:00</published><updated>2011-08-22T09:05:45.367-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tips de Java'/><title type='text'>Invocar al recolector de basura</title><content type='html'>Java y otros lenguajes tienen un mecanismo de liberación  de memoria llamado Garbage Collector, el cual permite reutilizar la memoria durante la ejecución de un programa. Se puede llamar al recolector de basura utilizando &lt;b&gt;System.gc()&lt;/b&gt; o &lt;b&gt;Runtime.getRuntime.gc()&lt;/b&gt;.  Aunque hacer esto no se considera buena práctica ya que tiene repercusiones importantes en el rendimiento de una aplicación.   La mejor práctica es no tener que llamar a estos métodos haciendo un buen diseño y uso de los recursos.&lt;br /&gt;&lt;br /&gt;La descripción en la documentación para estos métodos es la siguiente:&lt;div&gt;&lt;br /&gt;&lt;b&gt;System.gc()&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Hace correr al recolector de basura.&lt;br /&gt;Al llamar al método gc se sugiere a la máquina virtual realice un esfuerzo de reciclaje de objetos no utilizados con el fin de hacer que la memoria que estos objetos ocupan esté disponible para su uso rápido. Cuando se devuelve el control de la llamada al método, la maquina virtual de java ha hecho su mejor esfuerzo para recuperar el espacio de los objetos desechados.&lt;br /&gt;La llamada System.gc() es efectivamente equivalente a la llamada Runtime.getRuntime.gc()&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;b&gt;Runtime.getRuntime.gc()&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt; Hace correr al recolector de basura.  Al llamar a este método se sugiere a la maquina virtual realice su mayor es fuerzo de reciclaje de objetos no utilizados con el fin de hacer que la memoria que estos objetos ocupan esté disponible para su uso rápido.  Cuando se devuelve el control de la llamada a al método, la máquina virtual ha hecho su mejor esfuerzo para recuperar el espacio de los objetos desechados.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;La maquina virtual lleva a cabo este proceso de reciclaje de forma automática cuando es necesario, en un hilo separado, incluso si el método gc no se invoca explícitamente.&lt;br /&gt;&lt;br /&gt;El método &lt;b&gt;System.gc()&lt;/b&gt; es el medio convencional y conveniente de la invocación de este proceso. En algunas  ocasiones esta invocación no tendrá mayor efecto, ya que la liberación de recursos nunca está garantizada.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8262369655936226064-4250325077601455466?l=programacionconejemplos.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programacionconejemplos.blogspot.com/feeds/4250325077601455466/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://programacionconejemplos.blogspot.com/2011/08/invocar-al-recolector-de-basura.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8262369655936226064/posts/default/4250325077601455466'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8262369655936226064/posts/default/4250325077601455466'/><link rel='alternate' type='text/html' href='http://programacionconejemplos.blogspot.com/2011/08/invocar-al-recolector-de-basura.html' title='Invocar al recolector de basura'/><author><name>Ant</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8262369655936226064.post-7711845992142150563</id><published>2011-08-18T15:54:00.004-05:00</published><updated>2011-08-18T16:14:54.547-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaServer Faces 2.0'/><title type='text'>Desarrollando una Aplicación Simple con Facelets  (5.3)</title><content type='html'>Esta sección describe, de manera general, los pasos que deben seguirse en el desarrollo de una aplicación con JavaServer Faces. Las tareas usualmente requeridas son las siguientes:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Desarrollar los beans manejadores&lt;/li&gt;&lt;li&gt;Crear las páginas usando etiquetas&lt;/li&gt;&lt;li&gt;Se define la navegación entre páginas&lt;/li&gt;&lt;li&gt;Se mapea la instancia FacesServlet&lt;/li&gt;&lt;li&gt;Se agregan declaraciones en los bean manejadores&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;Crear una Aplicación Facelets&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;El ejemplo usado en este tutorial es la aplicación guestnumber.   La aplicación se presenta con una página que pregunta a los visitantes un número entre 0 y 10, valida la entrada contra un número aleatorio generado y responde con otra página que informa si el visitante dio un número correcto o incorrecto.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Desarrollar un Bean Manejador&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;En una aplicación típica de JavaSever Faces, cada página de la aplicación esta vinculada a un bean manejador. El bean manejador define los métodos y propiedades que son asociadas a los componentes.&lt;br /&gt;&lt;br /&gt;La siguiente clase manejadora, &lt;span style="font-weight: bold;"&gt;UserNumberBean.java&lt;/span&gt;, genera un número aleatorio entre 0 y 10:&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;package guessNumber;&lt;br /&gt;&lt;br /&gt;import java.util.Random;&lt;br /&gt;import javax.faces.bean.ManagedBean;&lt;br /&gt;import javax.faces.bean.SessionScoped;&lt;br /&gt;&lt;br /&gt;@ManagedBean&lt;br /&gt;@SessionScoped&lt;br /&gt;public class UserNumberBean {&lt;br /&gt;&lt;br /&gt;  Integer randomInt = null;&lt;br /&gt;  Integer userNumber = null;&lt;br /&gt;  String response = null;&lt;br /&gt;  private long maximum=10;&lt;br /&gt;  private long minimum=0;&lt;br /&gt;&lt;br /&gt;  public UserNumberBean() {&lt;br /&gt;      Random randomGR = new Random();&lt;br /&gt;      randomInt = new Integer(randomGR.nextInt(10));&lt;br /&gt;      System.out.println("Duke's number: " + randomInt);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public void setUserNumber(Integer user_number) {&lt;br /&gt;      userNumber = user_number;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public Integer getUserNumber() {&lt;br /&gt;      return userNumber;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public String getResponse() {&lt;br /&gt;      if ((userNumber != null) &amp;amp;&amp;amp; (userNumber.compareTo(randomInt) == 0)) {&lt;br /&gt;          return "Yay! You got it!";&lt;br /&gt;      } else {&lt;br /&gt;          return "Sorry, " + userNumber + " is incorrect.";&lt;br /&gt;      }&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public long getMaximum() {&lt;br /&gt;      return (this.maximum);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public void setMaximum(long maximum) {&lt;br /&gt;      this.maximum = maximum;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public long getMinimum() {&lt;br /&gt;      return (this.minimum);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public void setMinimum(long minimum) {&lt;br /&gt;      this.minimum = minimum;&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;Note el uso de la anotación &lt;span style="font-weight: bold;"&gt;@ManagedBean&lt;/span&gt;, la cual registra al bean manejador como recurso en la implementación de JavaServer Faces.  La anotación &lt;span style="font-weight: bold;"&gt;@SessionScoped&lt;/span&gt; registra el alcance del bean como session.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Crear Vistas Facelets&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Crear un página o vista es parte de la responsabilidad del autor de la página.  Esta tarea involucra agregar componentes en las páginas, vincular esos componentes con valores y propiedades del bean manejador y registrar convertidores, validadores o escuchadores sobre esos componentes.&lt;br /&gt;&lt;br /&gt;Para la aplicación de ejemplo, las páginas XHTML sirven como vista.  La primera página de la aplicación ejemplo es una página llamada &lt;span style="font-weight: bold;"&gt;greeting.xhtml&lt;/span&gt;. Una mirada mas de cerca a las distintas secciones de esta página nos da mas información.&lt;br /&gt;&lt;br /&gt;La primera sección especifica el lenguaje de la página XHTML, se declaran los namespace XML para las librerías de etiquetas usadas en la página web:&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;&amp;lt;html lang="en"&lt;br /&gt;    xmlns="http://www.w3.org/1999/xhtml"&lt;br /&gt;    xmlns:h="http://java.sun.com/jsf/html"&lt;br /&gt;    xmlns:f="http://java.sun.com/jsf/core"&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;La siguiente sección usa varias etiquetas para insertar componentes en la página:&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;&amp;lt;h:head&amp;gt;&lt;br /&gt;      &amp;lt;title&amp;gt;Guess Number Facelets Application&amp;lt;/title&amp;gt;&lt;br /&gt;  &amp;lt;/h:head&amp;gt;&lt;br /&gt;  &amp;lt;h:body&amp;gt;&lt;br /&gt;      &amp;lt;h:form&amp;gt;&lt;br /&gt;          &amp;lt;h:graphicImage value="#{resource['images:wave.med.gif']}"&lt;br /&gt;                          alt="Duke waving his hand"/&amp;gt;&lt;br /&gt;          &amp;lt;h2&amp;gt;&lt;br /&gt;              Hi, my name is Duke. I am thinking of a number from&lt;br /&gt;              #{userNumberBean.minimum} to #{userNumberBean.maximum}.&lt;br /&gt;              Can you guess it?&lt;br /&gt;          &amp;lt;/h2&amp;gt;&lt;br /&gt;          &amp;lt;p&amp;gt;&amp;lt;h:inputText&lt;br /&gt;                  id="userNo"&lt;br /&gt;                  title="Type a number from 0 to 10:"&lt;br /&gt;                  value="#{userNumberBean.userNumber}"&amp;gt;&lt;br /&gt;                  &amp;lt;f:validateLongRange&lt;br /&gt;                      minimum="#{userNumberBean.minimum}"&lt;br /&gt;                      maximum="#{userNumberBean.maximum}"/&amp;gt;&lt;br /&gt;              &amp;lt;/h:inputText&amp;gt;&lt;br /&gt;        &lt;br /&gt;              &amp;lt;h:commandButton id="submit" value="Submit"&lt;br /&gt;                              action="response.xhtml"/&amp;gt;&lt;br /&gt;          &amp;lt;/p&amp;gt;&lt;br /&gt;          &amp;lt;h:message showSummary="true" showDetail="false"&lt;br /&gt;                     style="color: #d20005;&lt;br /&gt;                     font-family: 'New Century Schoolbook', serif;&lt;br /&gt;                     font-style: oblique;&lt;br /&gt;                     text-decoration: overline"&lt;br /&gt;                     id="errors1"&lt;br /&gt;                     for="userNo"/&amp;gt;&lt;br /&gt;      &amp;lt;/h:form&amp;gt;&lt;br /&gt;  &amp;lt;/h:body&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;Note el uso de las siguientes etiquetas:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Etiquetas de Faceletes HTML (Algunas de las cuales comienzan con h:) para agregar componentes&lt;/li&gt;&lt;li&gt;La etiqueta de Facelets &lt;span style="font-weight: bold;"&gt;f:validateLongRance&lt;/span&gt; para validar la entrada del usuario.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Un componente inputText acepta la entrada del usuario y establece el valor de una propiedad de bean userNumber a través de la expresión EL &lt;span style="font-weight: bold;"&gt;#{userNumberBean.userNumber}&lt;/span&gt;.  El valor de entrada es validado por el validador de rangos estándar f:validateLongRange de JavaServer Faces.&lt;br /&gt;&lt;br /&gt;La imagen&lt;span style="font-weight: bold;"&gt; wave.med.gif&lt;/span&gt;, es agregada a la página como un recurso. Para mas detalle acerca de la accesibilidad a recursos, vea el tema Recursos.&lt;br /&gt;&lt;br /&gt;Un componente &lt;span style="font-weight: bold;"&gt;commandButton&lt;/span&gt; con la ID submit comienza la validación de los datos de entrada cuando el usuario da click en el botón.  Usando navegación implícita, el componente redirige al cliente a la página &lt;span style="font-weight: bold;"&gt;response.xhtml&lt;/span&gt;, la cual muestra la respuesta a la entrada.&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;&amp;lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"&lt;br /&gt;  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;html lang="en"&lt;br /&gt;    xmlns="http://www.w3.org/1999/xhtml"&lt;br /&gt;    xmlns:h="http://java.sun.com/jsf/html"&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;h:head&amp;gt;&lt;br /&gt;      &amp;lt;title&amp;gt;Guess Number Facelets Application&amp;lt;/title&amp;gt;&lt;br /&gt;  &amp;lt;/h:head&amp;gt;&lt;br /&gt;  &amp;lt;h:body&amp;gt;&lt;br /&gt;      &amp;lt;h:form&amp;gt;&lt;br /&gt;          &amp;lt;h:graphicImage value="#{resource['images:wave.med.gif']}"&lt;br /&gt;                          alt="Duke waving his hand"/&amp;gt;&lt;br /&gt;          &amp;lt;h2&amp;gt;&lt;br /&gt;              &amp;lt;h:outputText id="result" value="#{userNumberBean.response}"/&amp;gt;&lt;br /&gt;          &amp;lt;/h2&amp;gt;&lt;br /&gt;          &amp;lt;h:commandButton id="back" value="Back" action="greeting.xhtml"/&amp;gt;&lt;br /&gt;      &amp;lt;/h:form&amp;gt;&lt;br /&gt;  &amp;lt;/h:body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Configuración de la Aplicación&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Configurar una aplicación JavaServer Faces involucra mapear al ServletFaces en el archivo descriptor de despliegue &lt;span style="font-weight: bold;"&gt;web.xml&lt;/span&gt; y la posibilidad de agregar declaraciones de beans manejadores, reglas de navegación y archivos de recursos en el archivo de configuración de la aplicación &lt;span style="font-weight: bold;"&gt;faces-config.xml&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Si esta usando la IDE NetBeans, un archivo descriptor de despliegue es creado automáticamente. En el archivo web.xml creado, debe cambiar la página de saludo &lt;span style="font-weight: bold;"&gt;index.xhtml&lt;/span&gt;, por greeting.xhtml.  Aquí mostramos un ejemplo de archivo &lt;span style="font-weight: bold;"&gt;web.xml&lt;/span&gt;, detallando el cambio.&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br /&gt;&amp;lt;web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"&lt;br /&gt;xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&lt;br /&gt;xsi:schemaLocation="http://java.sun.com/xml/ns/javaee&lt;br /&gt;http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"&amp;gt;&lt;br /&gt;  &amp;lt;context-param&amp;gt;&lt;br /&gt;      &amp;lt;param-name&amp;gt;javax.faces.PROJECT_STAGE&amp;lt;/param-name&amp;gt;&lt;br /&gt;      &amp;lt;param-value&amp;gt;Development&amp;lt;/param-value&amp;gt;&lt;br /&gt;  &amp;lt;/context-param&amp;gt;&lt;br /&gt;  &amp;lt;servlet&amp;gt;&lt;br /&gt;      &amp;lt;servlet-name&amp;gt;Faces Servlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;      &amp;lt;servlet-class&amp;gt;javax.faces.webapp.FacesServlet&amp;lt;/servlet-class&amp;gt;&lt;br /&gt;      &amp;lt;load-on-startup&amp;gt;1&amp;lt;/load-on-startup&amp;gt;&lt;br /&gt;  &amp;lt;/servlet&amp;gt;&lt;br /&gt;  &amp;lt;servlet-mapping&amp;gt;&lt;br /&gt;      &amp;lt;servlet-name&amp;gt;Faces Servlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;      &amp;lt;url-pattern&amp;gt;/faces/*&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;  &amp;lt;/servlet-mapping&amp;gt;&lt;br /&gt;  &amp;lt;session-config&amp;gt;&lt;br /&gt;      &amp;lt;session-timeout&amp;gt;&lt;br /&gt;          30&lt;br /&gt;      &amp;lt;/session-timeout&amp;gt;&lt;br /&gt;  &amp;lt;/session-config&amp;gt;&lt;br /&gt;  &amp;lt;welcome-file-list&amp;gt;&lt;br /&gt;      &amp;lt;welcome-file&amp;gt;faces/greeting.xhtml&amp;lt;/welcome-file&amp;gt;&lt;br /&gt;  &amp;lt;/welcome-file-list&amp;gt;&lt;br /&gt;&amp;lt;/web-app&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Note el uso del parámetro de contexto &lt;span style="font-weight: bold;"&gt;PROJECT_STAGE&lt;/span&gt;.  Este parámetro identifica el estatus de la aplicación JavaServer Faces en el ciclo de vida del software.&lt;br /&gt;&lt;br /&gt;El escenario de una aplicación puede afectar el comportamiento de la aplicación. Por ejemplo, si el escenario del proyecto es definido como Development, la información de debug es generada automáticamente para el usuario. Si no se define por el usuario, el escenario por default es Production.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Construir, Empaquetar, Desplegar y Correr la Aplicación Facelets de Ejemplo&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Se puede usar la IDE NetBeans o Ant para construir, empaquetar, desplegar y correr el ejemplo &lt;span style="font-weight: bold;"&gt;guessnumber&lt;/span&gt;.  El código para este ejemplo esta disponible en el directorio &lt;span style="font-weight: bold;"&gt;tut-install/examples/web/guessnumber&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Para construir, empaquetar y desplegar el ejemplo usando NetBeans&lt;/span&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Desde el menú File, elija Abrir Proyecto&lt;/li&gt;&lt;li&gt;En la ventana de dialogo, navegue hasta: &lt;span style="font-weight: bold;"&gt;tut-install/examples/web&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Seleccione la carpeta guessnumber&lt;/li&gt;&lt;li&gt;De click en el checkbox “Abrir como proyecto principal”&lt;/li&gt;&lt;li&gt;Abra el proyecto&lt;/li&gt;&lt;li&gt;En el tab de proyectos, de click derecho al proyecto &lt;span style="font-weight: bold;"&gt;guessnumber&lt;/span&gt; y seleccione Deploy.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;Esta opción construye y despliega el ejemplo sobre una instancia de GlassFish&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Para construir, empaquetar y desplegar el ejemplo guessnumber usando Ant&lt;/span&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;En una ventana de consola, buscar la ruta: &lt;span style="font-weight: bold;"&gt;tut-install/examples/web/guessnumber&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Escriba el siguiente comando:  &lt;span style="font-weight: bold;"&gt;ant&lt;/span&gt;, este comando llama al target default, el cual construye y empaqueta la aplicación en un archivo WAR, &lt;span style="font-weight: bold;"&gt;guessnumber.war&lt;/span&gt;, que estará localizado en el directorio &lt;span style="font-weight: bold;"&gt;dist&lt;/span&gt;.&lt;/li&gt;&lt;li&gt;Asegúrese de tener GlassFish corriendo.&lt;/li&gt;&lt;li&gt;Para desplegar la aplicación, escriba el comando: &lt;span style="font-weight: bold;"&gt;ant deploy&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Para correr el ejemplo&lt;/span&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Abra el navegador&lt;/li&gt;&lt;li&gt;Escriba la siguiente URL en el navegador: &lt;span style="font-weight: bold;"&gt;http://localhost:8080/guessnumber&lt;/span&gt;, una página se abrirá&lt;/li&gt;&lt;li&gt;En el campo de texto escriba un numero entre 0 y 10 y de click en submit. Otra página aparecerá, reportando si el visitante escribió un valor correcto o incorrecto.&lt;/li&gt;&lt;li&gt;Si el visitante esta equivocado, puede dar click en el botón de regreso a la página principal&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;Podrá continuar hasta que obtenga la respuesta correcta.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8262369655936226064-7711845992142150563?l=programacionconejemplos.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programacionconejemplos.blogspot.com/feeds/7711845992142150563/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://programacionconejemplos.blogspot.com/2011/08/desarrollando-una-aplicacion-con.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8262369655936226064/posts/default/7711845992142150563'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8262369655936226064/posts/default/7711845992142150563'/><link rel='alternate' type='text/html' href='http://programacionconejemplos.blogspot.com/2011/08/desarrollando-una-aplicacion-con.html' title='Desarrollando una Aplicación Simple con Facelets  (5.3)'/><author><name>Ant</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8262369655936226064.post-6081687931593173928</id><published>2011-08-17T09:22:00.002-05:00</published><updated>2011-08-17T09:28:15.805-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tips de Java'/><title type='text'>Java versión 7</title><content type='html'>Oracle ha lanzado la versión 7 de Java. Algunas de las mejoras las listamos a continuación.&lt;br /&gt;&lt;div&gt;&lt;p class="MsoNormal"&gt;&lt;b&gt;Maquina Virtual&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;JSR 292: Soporte para lenguajes&lt;span&gt;  &lt;/span&gt;escritos dinámicamente (InvokeDynamic)&lt;/li&gt;&lt;li&gt;Revisión estricta de archivos clase&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;b&gt;Lenguaje&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;JSR 334: Mejoras pequeñas al lenguaje (Project Coin)&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;b&gt;Core&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Actualización de la arquitectura de carga de clases&lt;/li&gt;&lt;li&gt;Método para cerrar un URLClassLoader&lt;/li&gt;&lt;li&gt;Actualizaciones a concurrencia y colecciones&lt;span&gt;  &lt;/span&gt;(jsr166y)&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;b&gt;Internacionalización&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Soporte a Unicode 6.0&lt;/li&gt;&lt;li&gt;Mejoras en la API Locale&lt;/li&gt;&lt;li&gt;Localización de usuario separada y localización interfaz de usuario&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;b&gt;IO y Networking&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;JSR 203: Nuevas APIs IO para la plataforma Java (NIO.2)&lt;/li&gt;&lt;li&gt;Un proveedor de sistema de archivos NIO.2 para archivos zip/jar&lt;/li&gt;&lt;li&gt;SCTP (Protocolo de transmisión de control de flujos)&lt;/li&gt;&lt;li&gt;SDP (Protocolo directo de sockets )&lt;/li&gt;&lt;li&gt;Uso de la pila IPv6 de Windows Vista&lt;/li&gt;&lt;li&gt;Soporte para TLS 1.2&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;b&gt;Seguridad y Criptografía&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Implementación de criptografía elliptic-curve (ECC)&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;b&gt;Conectividad y Bases de Datos&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;JDBC 4.1&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;b&gt;Cliente&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;XRender para Java 2D&lt;/li&gt;&lt;li&gt;Permite crear nuevas plataformas para gráficas 6u10&lt;/li&gt;&lt;li&gt;Nuevo look-and-feel Nimbus&lt;/li&gt;&lt;li&gt;Componente JLayer para Swing&lt;/li&gt;&lt;li&gt;Sintetizador de sonido Gervill&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;b&gt;Web&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Actualización de la pila de XML&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;b&gt;Administración&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;MBeans mejorados&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;b&gt;Mejoras diferidas a la versión de JDK8 o superiores&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;JSR 294: Soporte a la máquina virtual y al lenguaje para programación modular&lt;/li&gt;&lt;li&gt;JSR308: Anotaciones sobre tipos de java&lt;/li&gt;&lt;li&gt;JSR TBD: Proyecto Lambda&lt;/li&gt;&lt;li&gt;Modularización (Proyecto Jigsaw)&lt;/li&gt;&lt;li&gt;JSR 296: Marco de trabajo para aplicaciones Swing&lt;/li&gt;&lt;li&gt;Componente Swing JDatePicker&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Puedes ver mas detalle en el artículo original de openjdk.java.net en:&lt;/div&gt;&lt;div&gt;&lt;a href="http://openjdk.java.net/projects/jdk7/features/"&gt;http://openjdk.java.net/projects/jdk7/features/&lt;/a&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8262369655936226064-6081687931593173928?l=programacionconejemplos.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programacionconejemplos.blogspot.com/feeds/6081687931593173928/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://programacionconejemplos.blogspot.com/2011/08/java-version-7.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8262369655936226064/posts/default/6081687931593173928'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8262369655936226064/posts/default/6081687931593173928'/><link rel='alternate' type='text/html' href='http://programacionconejemplos.blogspot.com/2011/08/java-version-7.html' title='Java versión 7'/><author><name>Ant</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8262369655936226064.post-6372002817494890411</id><published>2011-08-15T13:01:00.007-05:00</published><updated>2011-08-17T01:16:40.468-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tips de Java'/><title type='text'>Tips - commons-io-x.jar</title><content type='html'>En muchas soluciones de la vida real es necesario manipular y leer el contenido de archivos y es muy común que en un principio se trate de utilizar solo las clases del paquete java.io, esto esta bien si se quiere optimizar la lectura o manipulación de archivos o se requiere una solución a un problema especifico.  Sin embargo existen los Apache Commons, que es un conjunto de librerías para una gran variedad de problemas y una de esas librerías es commons-io.jar que viene con la clase FileUtils y que facilita el manejo de archivos.  Aquí enlistamos algunas de las funciones de esa clase que la hacen bastante útil.&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Permite escribir a un archivo&lt;/li&gt;&lt;li&gt;Leer desde un archivo&lt;/li&gt;&lt;li&gt;Crear directorios, incluyendo directorios padres (de forma recursiva)&lt;/li&gt;&lt;li&gt;Copiar archivos y directorios&lt;/li&gt;&lt;li&gt;Borrar archivos y directorios&lt;/li&gt;&lt;li&gt;Covertir hacia o desde una URL&lt;/li&gt;&lt;li&gt;Listar archivos y directorios con filtros y extensión&lt;/li&gt;&lt;li&gt;Comparar el contenido de archivos&lt;/li&gt;&lt;li&gt;Obtener el última fecha de actualizacion&lt;/li&gt;&lt;li&gt;Calcular checksum, entre otras.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Aqui un pequeño ejemplo para convertir un archivo de texto a String  o traer una lista de archivos desde un directorio y filtrando extensiones.&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 12px;padding: 2px; overflow: auto; width: 100%"&gt;&lt;code&gt;import org.apache.commons.io.FileUtils;&lt;br /&gt;import java.io.File;&lt;br /&gt;import java.io.IOException;&lt;br /&gt;import java.util.Collection;&lt;br /&gt;import java.util.Iterator;&lt;br /&gt;&lt;br /&gt;public class Prueba {&lt;br /&gt;  public static void main(String[] args) {&lt;br /&gt;    //Leer el contenido de un archivo de texto y depositarlo en un String&lt;br /&gt;    File archivo = new File("ejemplo.txt");&lt;br /&gt;&lt;br /&gt;    //Traer una lista de archivos filtrando la extensión&lt;br /&gt;    File root = new File("/proy");&lt;br /&gt;    try {&lt;br /&gt;        // Leer el contenido de un archivo y copiarlo a un String&lt;br /&gt;        String content = FileUtils.readFileToString(archivo);&lt;br /&gt;        System.out.println("File content: " + content);&lt;br /&gt;    &lt;br /&gt;        //Obtener una lista de archivos de forma recursiva contenida en un directorio&lt;br /&gt;        String[] extensiones = {"xml", "java", "dat"};&lt;br /&gt;        boolean recursivo = true;&lt;br /&gt;&lt;br /&gt;        Collection lisaArchivos = FileUtils.listFiles(root, extensiones, recursivo);&lt;br /&gt;        for (Iterator iterator = lisaArchivos.iterator(); iterator.hasNext();) {&lt;br /&gt;            File archivoAux = (File) iterator.next();&lt;br /&gt;            System.out.println("&amp;gt; " + archivoAux.getAbsolutePath());&lt;br /&gt;        }&lt;br /&gt;    } catch (IOException e) {&lt;br /&gt;        e.printStackTrace();&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&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/8262369655936226064-6372002817494890411?l=programacionconejemplos.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programacionconejemplos.blogspot.com/feeds/6372002817494890411/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://programacionconejemplos.blogspot.com/2011/08/tips-commons-iojar.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8262369655936226064/posts/default/6372002817494890411'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8262369655936226064/posts/default/6372002817494890411'/><link rel='alternate' type='text/html' href='http://programacionconejemplos.blogspot.com/2011/08/tips-commons-iojar.html' title='Tips - commons-io-x.jar'/><author><name>Ant</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8262369655936226064.post-7931644375121293410</id><published>2011-08-10T11:45:00.000-05:00</published><updated>2011-08-10T11:46:28.121-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaServer Faces 2.0'/><title type='text'>Que es Facelets (5.2)</title><content type='html'>             &lt;style&gt; &lt;!--  /* Font Definitions */ @font-face 	{font-family:Arial; 	panose-1:2 11 6 4 2 2 2 2 2 4; 	mso-font-charset:0; 	mso-generic-font-family:auto; 	mso-font-pitch:variable; 	mso-font-signature:-536859905 -1073711037 9 0 511 0;} @font-face 	{font-family:"Courier New"; 	panose-1:2 7 3 9 2 2 5 2 4 4; 	mso-font-charset:0; 	mso-generic-font-family:auto; 	mso-font-pitch:variable; 	mso-font-signature:-536859905 -1073711037 9 0 511 0;} @font-face 	{font-family:Times; 	panose-1:2 0 5 0 0 0 0 0 0 0; 	mso-font-charset:0; 	mso-generic-font-family:auto; 	mso-font-pitch:variable; 	mso-font-signature:3 0 0 0 1 0;} @font-face 	{font-family:Wingdings; 	panose-1:5 0 0 0 0 0 0 0 0 0; 	mso-font-charset:2; 	mso-generic-font-family:auto; 	mso-font-pitch:variable; 	mso-font-signature:0 268435456 0 0 -2147483648 0;} @font-face 	{font-family:"ＭＳ 明朝"; 	mso-font-charset:78; 	mso-generic-font-family:auto; 	mso-font-pitch:variable; 	mso-font-signature:-536870145 1791491579 18 0 131231 0;} @font-face 	{font-family:"Cambria Math"; 	panose-1:2 4 5 3 5 4 6 3 2 4; 	mso-font-charset:0; 	mso-generic-font-family:auto; 	mso-font-pitch:variable; 	mso-font-signature:-536870145 1107305727 0 0 415 0;} @font-face 	{font-family:Cambria; 	panose-1:2 4 5 3 5 4 6 3 2 4; 	mso-font-charset:0; 	mso-generic-font-family:auto; 	mso-font-pitch:variable; 	mso-font-signature:-536870145 1073743103 0 0 415 0;}  /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal 	{mso-style-unhide:no; 	mso-style-qformat:yes; 	mso-style-parent:""; 	margin:0cm; 	margin-bottom:.0001pt; 	mso-pagination:widow-orphan; 	font-size:12.0pt; 	font-family:Cambria; 	mso-ascii-font-family:Cambria; 	mso-ascii-theme-font:minor-latin; 	mso-fareast-font-family:"ＭＳ 明朝"; 	mso-fareast-theme-font:minor-fareast; 	mso-hansi-font-family:Cambria; 	mso-hansi-theme-font:minor-latin; 	mso-bidi-font-family:"Times New Roman"; 	mso-bidi-theme-font:minor-bidi;} a:link, span.MsoHyperlink 	{mso-style-priority:99; 	color:blue; 	mso-themecolor:hyperlink; 	text-decoration:underline; 	text-underline:single;} a:visited, span.MsoHyperlinkFollowed 	{mso-style-noshow:yes; 	mso-style-priority:99; 	color:purple; 	mso-themecolor:followedhyperlink; 	text-decoration:underline; 	text-underline:single;} p.MsoListParagraph, li.MsoListParagraph, div.MsoListParagraph 	{mso-style-priority:34; 	mso-style-unhide:no; 	mso-style-qformat:yes; 	margin-top:0cm; 	margin-right:0cm; 	margin-bottom:0cm; 	margin-left:36.0pt; 	margin-bottom:.0001pt; 	mso-add-space:auto; 	mso-pagination:widow-orphan; 	font-size:12.0pt; 	font-family:Cambria; 	mso-ascii-font-family:Cambria; 	mso-ascii-theme-font:minor-latin; 	mso-fareast-font-family:"ＭＳ 明朝"; 	mso-fareast-theme-font:minor-fareast; 	mso-hansi-font-family:Cambria; 	mso-hansi-theme-font:minor-latin; 	mso-bidi-font-family:"Times New Roman"; 	mso-bidi-theme-font:minor-bidi;} p.MsoListParagraphCxSpFirst, li.MsoListParagraphCxSpFirst, div.MsoListParagraphCxSpFirst 	{mso-style-priority:34; 	mso-style-unhide:no; 	mso-style-qformat:yes; 	mso-style-type:export-only; 	margin-top:0cm; 	margin-right:0cm; 	margin-bottom:0cm; 	margin-left:36.0pt; 	margin-bottom:.0001pt; 	mso-add-space:auto; 	mso-pagination:widow-orphan; 	font-size:12.0pt; 	font-family:Cambria; 	mso-ascii-font-family:Cambria; 	mso-ascii-theme-font:minor-latin; 	mso-fareast-font-family:"ＭＳ 明朝"; 	mso-fareast-theme-font:minor-fareast; 	mso-hansi-font-family:Cambria; 	mso-hansi-theme-font:minor-latin; 	mso-bidi-font-family:"Times New Roman"; 	mso-bidi-theme-font:minor-bidi;} p.MsoListParagraphCxSpMiddle, li.MsoListParagraphCxSpMiddle, div.MsoListParagraphCxSpMiddle 	{mso-style-priority:34; 	mso-style-unhide:no; 	mso-style-qformat:yes; 	mso-style-type:export-only; 	margin-top:0cm; 	margin-right:0cm; 	margin-bottom:0cm; 	margin-left:36.0pt; 	margin-bottom:.0001pt; 	mso-add-space:auto; 	mso-pagination:widow-orphan; 	font-size:12.0pt; 	font-family:Cambria; 	mso-ascii-font-family:Cambria; 	mso-ascii-theme-font:minor-latin; 	mso-fareast-font-family:"ＭＳ 明朝"; 	mso-fareast-theme-font:minor-fareast; 	mso-hansi-font-family:Cambria; 	mso-hansi-theme-font:minor-latin; 	mso-bidi-font-family:"Times New Roman"; 	mso-bidi-theme-font:minor-bidi;} p.MsoListParagraphCxSpLast, li.MsoListParagraphCxSpLast, div.MsoListParagraphCxSpLast 	{mso-style-priority:34; 	mso-style-unhide:no; 	mso-style-qformat:yes; 	mso-style-type:export-only; 	margin-top:0cm; 	margin-right:0cm; 	margin-bottom:0cm; 	margin-left:36.0pt; 	margin-bottom:.0001pt; 	mso-add-space:auto; 	mso-pagination:widow-orphan; 	font-size:12.0pt; 	font-family:Cambria; 	mso-ascii-font-family:Cambria; 	mso-ascii-theme-font:minor-latin; 	mso-fareast-font-family:"ＭＳ 明朝"; 	mso-fareast-theme-font:minor-fareast; 	mso-hansi-font-family:Cambria; 	mso-hansi-theme-font:minor-latin; 	mso-bidi-font-family:"Times New Roman"; 	mso-bidi-theme-font:minor-bidi;} .MsoChpDefault 	{mso-style-type:export-only; 	mso-default-props:yes; 	font-family:Cambria; 	mso-ascii-font-family:Cambria; 	mso-ascii-theme-font:minor-latin; 	mso-fareast-font-family:"ＭＳ 明朝"; 	mso-fareast-theme-font:minor-fareast; 	mso-hansi-font-family:Cambria; 	mso-hansi-theme-font:minor-latin; 	mso-bidi-font-family:"Times New Roman"; 	mso-bidi-theme-font:minor-bidi;} @page WordSection1 	{size:612.0pt 792.0pt; 	margin:70.85pt 3.0cm 70.85pt 3.0cm; 	mso-header-margin:36.0pt; 	mso-footer-margin:36.0pt; 	mso-paper-source:0;} div.WordSection1 	{page:WordSection1;}  /* List Definitions */ @list l0 	{mso-list-id:258106685; 	mso-list-type:hybrid; 	mso-list-template-ids:881381528 201981953 201981955 201981957 201981953 201981955 201981957 201981953 201981955 201981957;} @list l0:level1 	{mso-level-number-format:bullet; 	mso-level-text:; 	mso-level-tab-stop:none; 	mso-level-number-position:left; 	text-indent:-18.0pt; 	font-family:Symbol;} @list l0:level2 	{mso-level-number-format:bullet; 	mso-level-text:o; 	mso-level-tab-stop:none; 	mso-level-number-position:left; 	text-indent:-18.0pt; 	font-family:"Courier New"; 	mso-bidi-font-family:"Times New Roman";} @list l0:level3 	{mso-level-number-format:bullet; 	mso-level-text:; 	mso-level-tab-stop:none; 	mso-level-number-position:left; 	text-indent:-18.0pt; 	font-family:Wingdings;} @list l0:level4 	{mso-level-number-format:bullet; 	mso-level-text:; 	mso-level-tab-stop:none; 	mso-level-number-position:left; 	text-indent:-18.0pt; 	font-family:Symbol;} @list l0:level5 	{mso-level-number-format:bullet; 	mso-level-text:o; 	mso-level-tab-stop:none; 	mso-level-number-position:left; 	text-indent:-18.0pt; 	font-family:"Courier New"; 	mso-bidi-font-family:"Times New Roman";} @list l0:level6 	{mso-level-number-format:bullet; 	mso-level-text:; 	mso-level-tab-stop:none; 	mso-level-number-position:left; 	text-indent:-18.0pt; 	font-family:Wingdings;} @list l0:level7 	{mso-level-number-format:bullet; 	mso-level-text:; 	mso-level-tab-stop:none; 	mso-level-number-position:left; 	text-indent:-18.0pt; 	font-family:Symbol;} @list l0:level8 	{mso-level-number-format:bullet; 	mso-level-text:o; 	mso-level-tab-stop:none; 	mso-level-number-position:left; 	text-indent:-18.0pt; 	font-family:"Courier New"; 	mso-bidi-font-family:"Times New Roman";} @list l0:level9 	{mso-level-number-format:bullet; 	mso-level-text:; 	mso-level-tab-stop:none; 	mso-level-number-position:left; 	text-indent:-18.0pt; 	font-family:Wingdings;} @list l1 	{mso-list-id:1236935186; 	mso-list-type:hybrid; 	mso-list-template-ids:-1992237222 201981953 201981955 201981957 201981953 201981955 201981957 201981953 201981955 201981957;} @list l1:level1 	{mso-level-number-format:bullet; 	mso-level-text:; 	mso-level-tab-stop:none; 	mso-level-number-position:left; 	text-indent:-18.0pt; 	font-family:Symbol;} @list l1:level2 	{mso-level-number-format:bullet; 	mso-level-text:o; 	mso-level-tab-stop:none; 	mso-level-number-position:left; 	text-indent:-18.0pt; 	font-family:"Courier New"; 	mso-bidi-font-family:"Times New Roman";} @list l1:level3 	{mso-level-number-format:bullet; 	mso-level-text:; 	mso-level-tab-stop:none; 	mso-level-number-position:left; 	text-indent:-18.0pt; 	font-family:Wingdings;} @list l1:level4 	{mso-level-number-format:bullet; 	mso-level-text:; 	mso-level-tab-stop:none; 	mso-level-number-position:left; 	text-indent:-18.0pt; 	font-family:Symbol;} @list l1:level5 	{mso-level-number-format:bullet; 	mso-level-text:o; 	mso-level-tab-stop:none; 	mso-level-number-position:left; 	text-indent:-18.0pt; 	font-family:"Courier New"; 	mso-bidi-font-family:"Times New Roman";} @list l1:level6 	{mso-level-number-format:bullet; 	mso-level-text:; 	mso-level-tab-stop:none; 	mso-level-number-position:left; 	text-indent:-18.0pt; 	font-family:Wingdings;} @list l1:level7 	{mso-level-number-format:bullet; 	mso-level-text:; 	mso-level-tab-stop:none; 	mso-level-number-position:left; 	text-indent:-18.0pt; 	font-family:Symbol;} @list l1:level8 	{mso-level-number-format:bullet; 	mso-level-text:o; 	mso-level-tab-stop:none; 	mso-level-number-position:left; 	text-indent:-18.0pt; 	font-family:"Courier New"; 	mso-bidi-font-family:"Times New Roman";} @list l1:level9 	{mso-level-number-format:bullet; 	mso-level-text:; 	mso-level-tab-stop:none; 	mso-level-number-position:left; 	text-indent:-18.0pt; 	font-family:Wingdings;} ol 	{margin-bottom:0cm;} ul 	{margin-bottom:0cm;} --&gt; &lt;/style&gt;     &lt;p class="MsoNormal"&gt;&lt;b style="mso-bidi-font-weight:normal"&gt;Que es Facelets&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt; &lt;/p&gt;  &lt;p class="MsoNormal"&gt;Facelets es un lenguaje de declaración de páginas, poderoso pero ligero, que es usado para construir vistas de JavaServer Faces usando plantillas de estilo de HTML y construyendo arboles de componentes.&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;Las características que Facelets incluyen son algunas de las siguientes:&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpFirst" style="text-indent:-18.0pt;mso-list:l1 level1 lfo1"&gt;&lt;span style="font-family:Symbol;mso-fareast-font-family:Symbol;mso-bidi-font-family: Symbol"&gt;&lt;span style="mso-list:Ignore"&gt;·&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;Uso de XHTML para crear páginas web&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpMiddle" style="text-indent:-18.0pt;mso-list:l1 level1 lfo1"&gt;&lt;span style="font-family:Symbol;mso-fareast-font-family:Symbol;mso-bidi-font-family: Symbol"&gt;&lt;span style="mso-list:Ignore"&gt;·&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;Soporte para librerías de etiquetas Facelets que se suman a las librerías de JavaServer Faces y JSTL&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpMiddle" style="text-indent:-18.0pt;mso-list:l1 level1 lfo1"&gt;&lt;span style="font-family:Symbol;mso-fareast-font-family:Symbol;mso-bidi-font-family: Symbol"&gt;&lt;span style="mso-list:Ignore"&gt;·&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;Soporte para el &lt;b style="mso-bidi-font-weight: normal"&gt;Lenguaje de Expresiones (EL &lt;/b&gt;por su siglas en ingles&lt;b style="mso-bidi-font-weight:normal"&gt;)&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpLast" style="text-indent:-18.0pt;mso-list:l1 level1 lfo1"&gt;&lt;span style="font-family:Symbol;mso-fareast-font-family:Symbol;mso-bidi-font-family: Symbol"&gt;&lt;span style="mso-list:Ignore"&gt;·&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;Plantillas para componentes y páginas&lt;/p&gt;  &lt;p class="MsoNormal"&gt; &lt;/p&gt;  &lt;p class="MsoNormal"&gt;Las ventajas que Facelets incluye para el desarrollo de proyectos de gran escala son las siguientes:&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpFirst" style="text-indent:-18.0pt;mso-list:l0 level1 lfo2"&gt;&lt;span style="font-family:Symbol;mso-fareast-font-family:Symbol;mso-bidi-font-family: Symbol"&gt;&lt;span style="mso-list:Ignore"&gt;·&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;Soporte para reutilización de código por medio de plantillas y componentes compuestos.&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpMiddle" style="text-indent:-18.0pt;mso-list:l0 level1 lfo2"&gt;&lt;span style="font-family:Symbol;mso-fareast-font-family:Symbol;mso-bidi-font-family: Symbol"&gt;&lt;span style="mso-list:Ignore"&gt;·&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;Extensibilidad funcional de componentes y otros objetos del lado del server por configuración.&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpMiddle" style="text-indent:-18.0pt;mso-list:l0 level1 lfo2"&gt;&lt;span style="font-family:Symbol;mso-fareast-font-family:Symbol;mso-bidi-font-family: Symbol"&gt;&lt;span style="mso-list:Ignore"&gt;·&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;Tiempo de compilación rápido.&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpMiddle" style="text-indent:-18.0pt;mso-list:l0 level1 lfo2"&gt;&lt;span style="font-family:Symbol;mso-fareast-font-family:Symbol;mso-bidi-font-family: Symbol"&gt;&lt;span style="mso-list:Ignore"&gt;·&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;Validación de &lt;b style="mso-bidi-font-weight: normal"&gt;EL&lt;/b&gt; en tiempo de compilación.&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpLast" style="text-indent:-18.0pt;mso-list:l0 level1 lfo2"&gt;&lt;span style="font-family:Symbol;mso-fareast-font-family:Symbol;mso-bidi-font-family: Symbol"&gt;&lt;span style="mso-list:Ignore"&gt;·&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;Rendereo de alto performance.&lt;/p&gt;  &lt;p class="MsoNormal"&gt; &lt;/p&gt;  &lt;p class="MsoNormal"&gt;En resumen, el uso de Facelets reduce el tiempo y esfuerzo que se necesita para el desarrollo y despliegue de aplicaciones.&lt;/p&gt;  &lt;p class="MsoNormal"&gt; &lt;/p&gt;  &lt;p class="MsoNormal"&gt;Las vistas de Facelets&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;son usualmente creadas como páginas XHTML.&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;Las implementaciones de JavaServer Faces soportan páginas creadas en XHTML de acuerdo con la &lt;b style="mso-bidi-font-weight: normal"&gt;XHTML Transitional document Type Definition (DTD)&lt;/b&gt;, como se enlista en &lt;a href="http://www.w3.org/TR/xhtml1/#a_dtd_XHTML-1.0-Transitional"&gt;http://www.w3.org/TR/xhtml1/#a_dtd_XHTML-1.0-Transitional&lt;/a&gt;. Por convención, las páginas web construidas con XHTML tienen una extensión .xhtml&lt;/p&gt;  &lt;p class="MsoNormal"&gt; &lt;/p&gt;  &lt;p class="MsoNormal"&gt;La tecnología JavaServer Faces soporta varias librerías de etiquetas para agregar componentes a una página web.&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;Para soportar el mecanismo de librerías de JavaServer Faces, Facelets usa declaración de &lt;b style="mso-bidi-font-weight: normal"&gt;namespaces&lt;/b&gt; de XML. La siguiente tabla de librerías de etiquetas son soportadas por Facelets.&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="font-size:10.0pt"&gt; &lt;/span&gt;&lt;/p&gt;  &lt;table class="MsoNormalTable" style="border-collapse:collapse;mso-table-layout-alt:fixed;border:none;  mso-border-alt:solid black .75pt;mso-yfti-tbllook:1184" border="1" cellpadding="0" cellspacing="0"&gt;  &lt;tbody&gt;&lt;tr style="mso-yfti-irow:0;mso-yfti-firstrow:yes"&gt;   &lt;td style="width:52.65pt;border:solid windowtext 1.0pt;   mso-border-alt:solid windowtext .75pt;padding:3.0pt 3.0pt 4.5pt 3.0pt" valign="top" width="53"&gt;   &lt;p class="MsoNormal"&gt;&lt;b&gt;&lt;span style="font-size:10.0pt;font-family:Times;   mso-bidi-font-family:&amp;quot;Times New Roman&amp;quot;;color:black"&gt;Librería&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="width:181.9pt;border:solid windowtext 1.0pt;   border-left:none;mso-border-left-alt:solid windowtext .75pt;mso-border-alt:   solid windowtext .75pt;padding:3.0pt 3.0pt 4.5pt 3.0pt" valign="top" width="182"&gt;   &lt;p class="MsoNormal"&gt;&lt;b&gt;&lt;span style="font-size:10.0pt;font-family:Times;   mso-bidi-font-family:&amp;quot;Times New Roman&amp;quot;;color:black"&gt;URI&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="width:35.45pt;border:solid windowtext 1.0pt;   border-left:none;mso-border-left-alt:solid windowtext .75pt;mso-border-alt:   solid windowtext .75pt;padding:3.0pt 3.0pt 4.5pt 3.0pt" valign="top" width="35"&gt;   &lt;p class="MsoNormal"&gt;&lt;b&gt;&lt;span style="font-size:10.0pt;font-family:Times;   mso-bidi-font-family:&amp;quot;Times New Roman&amp;quot;;color:black"&gt;Prefijo&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="width:86.3pt;border:solid windowtext 1.0pt;   border-left:none;mso-border-left-alt:solid windowtext .75pt;mso-border-alt:   solid windowtext .75pt;padding:3.0pt 3.0pt 4.5pt 3.0pt" valign="top" width="86"&gt;   &lt;p class="MsoNormal"&gt;&lt;b&gt;&lt;span style="font-size:10.0pt;font-family:Times;   mso-bidi-font-family:&amp;quot;Times New Roman&amp;quot;;color:black"&gt;Ejemplo&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="width:74.6pt;border:solid windowtext 1.0pt;   border-left:none;mso-border-left-alt:solid windowtext .75pt;mso-border-alt:   solid windowtext .75pt;padding:3.0pt 3.0pt 4.5pt 3.0pt" valign="top" width="75"&gt;   &lt;p class="MsoNormal"&gt;&lt;b&gt;&lt;span style="font-size:10.0pt;font-family:Times;   mso-bidi-font-family:&amp;quot;Times New Roman&amp;quot;;color:black"&gt;Contenido&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt;  &lt;tr style="mso-yfti-irow:1"&gt;   &lt;td style="width:52.65pt;border:solid windowtext 1.0pt;   border-top:none;mso-border-top-alt:solid windowtext .75pt;mso-border-alt:   solid windowtext .75pt;padding:3.0pt 3.0pt 4.5pt 3.0pt" valign="top" width="53"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-size:10.0pt;font-family:Arial;   color:black"&gt;JavaServer Faces Facelets Tag Library&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="width:181.9pt;border-top:none;border-left:   none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;   mso-border-top-alt:solid windowtext .75pt;mso-border-left-alt:solid windowtext .75pt;   mso-border-alt:solid windowtext .75pt;padding:3.0pt 3.0pt 4.5pt 3.0pt" valign="top" width="182"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-size:10.0pt;font-family:Arial;   color:black"&gt;http://java.sun.com/jsf/facelets&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="width:35.45pt;border-top:none;border-left:   none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;   mso-border-top-alt:solid windowtext .75pt;mso-border-left-alt:solid windowtext .75pt;   mso-border-alt:solid windowtext .75pt;padding:3.0pt 3.0pt 4.5pt 3.0pt" valign="top" width="35"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-size:10.0pt;font-family:Arial;   color:black"&gt;ui:&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="width:86.3pt;border-top:none;border-left:none;   border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;   mso-border-top-alt:solid windowtext .75pt;mso-border-left-alt:solid windowtext .75pt;   mso-border-alt:solid windowtext .75pt;padding:3.0pt 3.0pt 4.5pt 3.0pt" valign="top" width="86"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-size:10.0pt;font-family:Arial;   color:black"&gt;ui:component&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal" style="margin-top:4.5pt"&gt;&lt;span style="font-size:10.0pt;   font-family:Arial;color:black"&gt;ui:insert&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="width:74.6pt;border-top:none;border-left:none;   border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;   mso-border-top-alt:solid windowtext .75pt;mso-border-left-alt:solid windowtext .75pt;   mso-border-alt:solid windowtext .75pt;padding:3.0pt 3.0pt 4.5pt 3.0pt" valign="top" width="75"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-size:10.0pt;font-family:Arial;   color:black"&gt;Tags for templating&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt;  &lt;tr style="mso-yfti-irow:2"&gt;   &lt;td style="width:52.65pt;border:solid windowtext 1.0pt;   border-top:none;mso-border-top-alt:solid windowtext .75pt;mso-border-alt:   solid windowtext .75pt;padding:3.0pt 3.0pt 4.5pt 3.0pt" valign="top" width="53"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-size:10.0pt;font-family:Arial;   color:black"&gt;JavaServer Faces HTML Tag Library&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="width:181.9pt;border-top:none;border-left:   none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;   mso-border-top-alt:solid windowtext .75pt;mso-border-left-alt:solid windowtext .75pt;   mso-border-alt:solid windowtext .75pt;padding:3.0pt 3.0pt 4.5pt 3.0pt" valign="top" width="182"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-size:10.0pt;font-family:Arial;   color:black"&gt;http://java.sun.com/jsf/html&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="width:35.45pt;border-top:none;border-left:   none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;   mso-border-top-alt:solid windowtext .75pt;mso-border-left-alt:solid windowtext .75pt;   mso-border-alt:solid windowtext .75pt;padding:3.0pt 3.0pt 4.5pt 3.0pt" valign="top" width="35"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-size:10.0pt;font-family:Arial;   color:black"&gt;h:&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="width:86.3pt;border-top:none;border-left:none;   border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;   mso-border-top-alt:solid windowtext .75pt;mso-border-left-alt:solid windowtext .75pt;   mso-border-alt:solid windowtext .75pt;padding:3.0pt 3.0pt 4.5pt 3.0pt" valign="top" width="86"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-size:10.0pt;font-family:Arial;   color:black"&gt;h:head&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal" style="margin-top:4.5pt"&gt;&lt;span style="font-size:10.0pt;   font-family:Arial;color:black"&gt;h:body&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal" style="margin-top:4.5pt"&gt;&lt;span style="font-size:10.0pt;   font-family:Arial;color:black"&gt;h:outputText&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal" style="margin-top:4.5pt"&gt;&lt;span style="font-size:10.0pt;   font-family:Arial;color:black"&gt;h:inputText&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="width:74.6pt;border-top:none;border-left:none;   border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;   mso-border-top-alt:solid windowtext .75pt;mso-border-left-alt:solid windowtext .75pt;   mso-border-alt:solid windowtext .75pt;padding:3.0pt 3.0pt 4.5pt 3.0pt" valign="top" width="75"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-size:10.0pt;font-family:Arial;   color:black"&gt;JavaServer Faces component tags for allUIComponents&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt;  &lt;tr style="mso-yfti-irow:3"&gt;   &lt;td style="width:52.65pt;border:solid windowtext 1.0pt;   border-top:none;mso-border-top-alt:solid windowtext .75pt;mso-border-alt:   solid windowtext .75pt;padding:3.0pt 3.0pt 4.5pt 3.0pt" valign="top" width="53"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-size:10.0pt;font-family:Arial;   color:black"&gt;JavaServer Faces Core Tag Library&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="width:181.9pt;border-top:none;border-left:   none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;   mso-border-top-alt:solid windowtext .75pt;mso-border-left-alt:solid windowtext .75pt;   mso-border-alt:solid windowtext .75pt;padding:3.0pt 3.0pt 4.5pt 3.0pt" valign="top" width="182"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-size:10.0pt;font-family:Arial;   color:black"&gt;http://java.sun.com/jsf/core&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="width:35.45pt;border-top:none;border-left:   none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;   mso-border-top-alt:solid windowtext .75pt;mso-border-left-alt:solid windowtext .75pt;   mso-border-alt:solid windowtext .75pt;padding:3.0pt 3.0pt 4.5pt 3.0pt" valign="top" width="35"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-size:10.0pt;font-family:Arial;   color:black"&gt;f:&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="width:86.3pt;border-top:none;border-left:none;   border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;   mso-border-top-alt:solid windowtext .75pt;mso-border-left-alt:solid windowtext .75pt;   mso-border-alt:solid windowtext .75pt;padding:3.0pt 3.0pt 4.5pt 3.0pt" valign="top" width="86"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-size:10.0pt;font-family:Arial;   color:black"&gt;f:actionListener&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal" style="margin-top:4.5pt"&gt;&lt;span style="font-size:10.0pt;   font-family:Arial;color:black"&gt;f:attribute&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="width:74.6pt;border-top:none;border-left:none;   border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;   mso-border-top-alt:solid windowtext .75pt;mso-border-left-alt:solid windowtext .75pt;   mso-border-alt:solid windowtext .75pt;padding:3.0pt 3.0pt 4.5pt 3.0pt" valign="top" width="75"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-size:10.0pt;font-family:Arial;   color:black"&gt;Tags for JavaServer Faces custom actions that are independent of   any particular RenderKit&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt;  &lt;tr style="mso-yfti-irow:4"&gt;   &lt;td style="width:52.65pt;border:solid windowtext 1.0pt;   border-top:none;mso-border-top-alt:solid windowtext .75pt;mso-border-alt:   solid windowtext .75pt;padding:3.0pt 3.0pt 4.5pt 3.0pt" valign="top" width="53"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-size:10.0pt;font-family:Arial;   color:black"&gt;JSTL Core Tag Library&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="width:181.9pt;border-top:none;border-left:   none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;   mso-border-top-alt:solid windowtext .75pt;mso-border-left-alt:solid windowtext .75pt;   mso-border-alt:solid windowtext .75pt;padding:3.0pt 3.0pt 4.5pt 3.0pt" valign="top" width="182"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-size:10.0pt;font-family:Arial;   color:black"&gt;http://java.sun.com/jsp/jstl/core&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="width:35.45pt;border-top:none;border-left:   none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;   mso-border-top-alt:solid windowtext .75pt;mso-border-left-alt:solid windowtext .75pt;   mso-border-alt:solid windowtext .75pt;padding:3.0pt 3.0pt 4.5pt 3.0pt" valign="top" width="35"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-size:10.0pt;font-family:Arial;   color:black"&gt;c:&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="width:86.3pt;border-top:none;border-left:none;   border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;   mso-border-top-alt:solid windowtext .75pt;mso-border-left-alt:solid windowtext .75pt;   mso-border-alt:solid windowtext .75pt;padding:3.0pt 3.0pt 4.5pt 3.0pt" valign="top" width="86"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-size:10.0pt;font-family:Arial;   color:black"&gt;c:forEach&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal" style="margin-top:4.5pt"&gt;&lt;span style="font-size:10.0pt;   font-family:Arial;color:black"&gt;c:catch&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="width:74.6pt;border-top:none;border-left:none;   border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;   mso-border-top-alt:solid windowtext .75pt;mso-border-left-alt:solid windowtext .75pt;   mso-border-alt:solid windowtext .75pt;padding:3.0pt 3.0pt 4.5pt 3.0pt" valign="top" width="75"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-size:10.0pt;font-family:Arial;   color:black"&gt;JSTL 1.1 Core Tags&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt;  &lt;tr style="mso-yfti-irow:5;mso-yfti-lastrow:yes"&gt;   &lt;td style="width:52.65pt;border:solid windowtext 1.0pt;   border-top:none;mso-border-top-alt:solid windowtext .75pt;mso-border-alt:   solid windowtext .75pt;padding:3.0pt 3.0pt 4.5pt 3.0pt" valign="top" width="53"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-size:10.0pt;font-family:Arial;   color:black"&gt;JSTL Functions Tag Library&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="width:181.9pt;border-top:none;border-left:   none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;   mso-border-top-alt:solid windowtext .75pt;mso-border-left-alt:solid windowtext .75pt;   mso-border-alt:solid windowtext .75pt;padding:3.0pt 3.0pt 4.5pt 3.0pt" valign="top" width="182"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-size:10.0pt;font-family:Arial;   color:black"&gt;http://java.sun.com/jsp/jstl/functions&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="width:35.45pt;border-top:none;border-left:   none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;   mso-border-top-alt:solid windowtext .75pt;mso-border-left-alt:solid windowtext .75pt;   mso-border-alt:solid windowtext .75pt;padding:3.0pt 3.0pt 4.5pt 3.0pt" valign="top" width="35"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-size:10.0pt;font-family:Arial;   color:black"&gt;fn:&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="width:86.3pt;border-top:none;border-left:none;   border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;   mso-border-top-alt:solid windowtext .75pt;mso-border-left-alt:solid windowtext .75pt;   mso-border-alt:solid windowtext .75pt;padding:3.0pt 3.0pt 4.5pt 3.0pt" valign="top" width="86"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-size:10.0pt;font-family:Arial;   color:black"&gt;fn:toUpperCase&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal" style="margin-top:4.5pt"&gt;&lt;span style="font-size:10.0pt;   font-family:Arial;color:black"&gt;fn:toLowerCase&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="width:74.6pt;border-top:none;border-left:none;   border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;   mso-border-top-alt:solid windowtext .75pt;mso-border-left-alt:solid windowtext .75pt;   mso-border-alt:solid windowtext .75pt;padding:3.0pt 3.0pt 4.5pt 3.0pt" valign="top" width="75"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-size:10.0pt;font-family:Arial;   color:black"&gt;JSTL 1.1 Functions Tags&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt;  &lt;p class="MsoNormal"&gt; &lt;/p&gt;  &lt;p class="MsoNormal"&gt;Adicionalmente, Faceletes soporta etiquetas para componentes compuestos por cualquier prefijo configurado que declare.&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;Para mas información sobre componentes compuestos, vea el tema &lt;b style="mso-bidi-font-weight:normal"&gt;Componentes Compuestos&lt;/b&gt;.&lt;/p&gt;  &lt;p class="MsoNormal"&gt; &lt;/p&gt;  &lt;p class="MsoNormal"&gt;Basado en el soporte de la sintaxis del &lt;b style="mso-bidi-font-weight: normal"&gt;Expression Language&lt;/b&gt; (&lt;b style="mso-bidi-font-weight:normal"&gt;EL&lt;/b&gt;), Facelets usa expresiones EL para referenciar propiedades o métodos del bean de respaldo. Las expresiones EL pueden ser usadas para ligar objetos componentes o valores a métodos o propiedades de los beans de respaldo. Para mas información sobre el uso de expresiones EL , vea el tema&lt;b style="mso-bidi-font-weight: normal"&gt; Usando expresiones EL para referenciar Beans Manejadores.&lt;/b&gt;&lt;/p&gt;   &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8262369655936226064-7931644375121293410?l=programacionconejemplos.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programacionconejemplos.blogspot.com/feeds/7931644375121293410/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://programacionconejemplos.blogspot.com/2011/08/que-es-facelets-52.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8262369655936226064/posts/default/7931644375121293410'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8262369655936226064/posts/default/7931644375121293410'/><link rel='alternate' type='text/html' href='http://programacionconejemplos.blogspot.com/2011/08/que-es-facelets-52.html' title='Que es Facelets (5.2)'/><author><name>Ant</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8262369655936226064.post-2783801359855935978</id><published>2011-08-05T17:52:00.001-05:00</published><updated>2011-08-05T17:53:32.043-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaServer Faces 2.0'/><title type='text'>Introducción a Facelets (5.1)</title><content type='html'>&lt;style&gt; &lt;!--  /* Font Definitions */ @font-face  {font-family:"Courier New";  panose-1:2 7 3 9 2 2 5 2 4 4;  mso-font-charset:0;  mso-generic-font-family:auto;  mso-font-pitch:variable;  mso-font-signature:3 0 0 0 1 0;} @font-face  {font-family:Wingdings;  panose-1:5 0 0 0 0 0 0 0 0 0;  mso-font-charset:2;  mso-generic-font-family:auto;  mso-font-pitch:variable;  mso-font-signature:0 268435456 0 0 -2147483648 0;} @font-face  {font-family:"ＭＳ 明朝";  panose-1:0 0 0 0 0 0 0 0 0 0;  mso-font-charset:128;  mso-generic-font-family:roman;  mso-font-format:other;  mso-font-pitch:fixed;  mso-font-signature:1 134676480 16 0 131072 0;} @font-face  {font-family:"Cambria Math";  panose-1:2 4 5 3 5 4 6 3 2 4;  mso-font-charset:0;  mso-generic-font-family:auto;  mso-font-pitch:variable;  mso-font-signature:3 0 0 0 1 0;} @font-face  {font-family:Cambria;  panose-1:2 4 5 3 5 4 6 3 2 4;  mso-font-charset:0;  mso-generic-font-family:auto;  mso-font-pitch:variable;  mso-font-signature:3 0 0 0 1 0;}  /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal  {mso-style-unhide:no;  mso-style-qformat:yes;  mso-style-parent:"";  margin:0cm;  margin-bottom:.0001pt;  mso-pagination:widow-orphan;  font-size:12.0pt;  font-family:Cambria;  mso-ascii-font-family:Cambria;  mso-ascii-theme-font:minor-latin;  mso-fareast-font-family:"ＭＳ 明朝";  mso-fareast-theme-font:minor-fareast;  mso-hansi-font-family:Cambria;  mso-hansi-theme-font:minor-latin;  mso-bidi-font-family:"Times New Roman";  mso-bidi-theme-font:minor-bidi;} p.MsoListParagraph, li.MsoListParagraph, div.MsoListParagraph  {mso-style-priority:34;  mso-style-unhide:no;  mso-style-qformat:yes;  margin-top:0cm;  margin-right:0cm;  margin-bottom:0cm;  margin-left:36.0pt;  margin-bottom:.0001pt;  mso-add-space:auto;  mso-pagination:widow-orphan;  font-size:12.0pt;  font-family:Cambria;  mso-ascii-font-family:Cambria;  mso-ascii-theme-font:minor-latin;  mso-fareast-font-family:"ＭＳ 明朝";  mso-fareast-theme-font:minor-fareast;  mso-hansi-font-family:Cambria;  mso-hansi-theme-font:minor-latin;  mso-bidi-font-family:"Times New Roman";  mso-bidi-theme-font:minor-bidi;} p.MsoListParagraphCxSpFirst, li.MsoListParagraphCxSpFirst, div.MsoListParagraphCxSpFirst  {mso-style-priority:34;  mso-style-unhide:no;  mso-style-qformat:yes;  mso-style-type:export-only;  margin-top:0cm;  margin-right:0cm;  margin-bottom:0cm;  margin-left:36.0pt;  margin-bottom:.0001pt;  mso-add-space:auto;  mso-pagination:widow-orphan;  font-size:12.0pt;  font-family:Cambria;  mso-ascii-font-family:Cambria;  mso-ascii-theme-font:minor-latin;  mso-fareast-font-family:"ＭＳ 明朝";  mso-fareast-theme-font:minor-fareast;  mso-hansi-font-family:Cambria;  mso-hansi-theme-font:minor-latin;  mso-bidi-font-family:"Times New Roman";  mso-bidi-theme-font:minor-bidi;} p.MsoListParagraphCxSpMiddle, li.MsoListParagraphCxSpMiddle, div.MsoListParagraphCxSpMiddle  {mso-style-priority:34;  mso-style-unhide:no;  mso-style-qformat:yes;  mso-style-type:export-only;  margin-top:0cm;  margin-right:0cm;  margin-bottom:0cm;  margin-left:36.0pt;  margin-bottom:.0001pt;  mso-add-space:auto;  mso-pagination:widow-orphan;  font-size:12.0pt;  font-family:Cambria;  mso-ascii-font-family:Cambria;  mso-ascii-theme-font:minor-latin;  mso-fareast-font-family:"ＭＳ 明朝";  mso-fareast-theme-font:minor-fareast;  mso-hansi-font-family:Cambria;  mso-hansi-theme-font:minor-latin;  mso-bidi-font-family:"Times New Roman";  mso-bidi-theme-font:minor-bidi;} p.MsoListParagraphCxSpLast, li.MsoListParagraphCxSpLast, div.MsoListParagraphCxSpLast  {mso-style-priority:34;  mso-style-unhide:no;  mso-style-qformat:yes;  mso-style-type:export-only;  margin-top:0cm;  margin-right:0cm;  margin-bottom:0cm;  margin-left:36.0pt;  margin-bottom:.0001pt;  mso-add-space:auto;  mso-pagination:widow-orphan;  font-size:12.0pt;  font-family:Cambria;  mso-ascii-font-family:Cambria;  mso-ascii-theme-font:minor-latin;  mso-fareast-font-family:"ＭＳ 明朝";  mso-fareast-theme-font:minor-fareast;  mso-hansi-font-family:Cambria;  mso-hansi-theme-font:minor-latin;  mso-bidi-font-family:"Times New Roman";  mso-bidi-theme-font:minor-bidi;} .MsoChpDefault  {mso-style-type:export-only;  mso-default-props:yes;  font-family:Cambria;  mso-ascii-font-family:Cambria;  mso-ascii-theme-font:minor-latin;  mso-fareast-font-family:"ＭＳ 明朝";  mso-fareast-theme-font:minor-fareast;  mso-hansi-font-family:Cambria;  mso-hansi-theme-font:minor-latin;  mso-bidi-font-family:"Times New Roman";  mso-bidi-theme-font:minor-bidi;} @page WordSection1  {size:612.0pt 792.0pt;  margin:70.85pt 3.0cm 70.85pt 3.0cm;  mso-header-margin:36.0pt;  mso-footer-margin:36.0pt;  mso-paper-source:0;} div.WordSection1  {page:WordSection1;}  /* List Definitions */ @list l0  {mso-list-id:258106685;  mso-list-type:hybrid;  mso-list-template-ids:881381528 201981953 201981955 201981957 201981953 201981955 201981957 201981953 201981955 201981957;} @list l0:level1  {mso-level-number-format:bullet;  mso-level-text:;  mso-level-tab-stop:none;  mso-level-number-position:left;  text-indent:-18.0pt;  font-family:Symbol;} @list l0:level2  {mso-level-number-format:bullet;  mso-level-text:o;  mso-level-tab-stop:none;  mso-level-number-position:left;  text-indent:-18.0pt;  font-family:"Courier New";} @list l0:level3  {mso-level-number-format:bullet;  mso-level-text:;  mso-level-tab-stop:none;  mso-level-number-position:left;  text-indent:-18.0pt;  font-family:Wingdings;} @list l0:level4  {mso-level-number-format:bullet;  mso-level-text:;  mso-level-tab-stop:none;  mso-level-number-position:left;  text-indent:-18.0pt;  font-family:Symbol;} @list l0:level5  {mso-level-number-format:bullet;  mso-level-text:o;  mso-level-tab-stop:none;  mso-level-number-position:left;  text-indent:-18.0pt;  font-family:"Courier New";} @list l0:level6  {mso-level-number-format:bullet;  mso-level-text:;  mso-level-tab-stop:none;  mso-level-number-position:left;  text-indent:-18.0pt;  font-family:Wingdings;} @list l0:level7  {mso-level-number-format:bullet;  mso-level-text:;  mso-level-tab-stop:none;  mso-level-number-position:left;  text-indent:-18.0pt;  font-family:Symbol;} @list l0:level8  {mso-level-number-format:bullet;  mso-level-text:o;  mso-level-tab-stop:none;  mso-level-number-position:left;  text-indent:-18.0pt;  font-family:"Courier New";} @list l0:level9  {mso-level-number-format:bullet;  mso-level-text:;  mso-level-tab-stop:none;  mso-level-number-position:left;  text-indent:-18.0pt;  font-family:Wingdings;} @list l1  {mso-list-id:435753566;  mso-list-type:hybrid;  mso-list-template-ids:-184276720 201981953 201981955 201981957 201981953 201981955 201981957 201981953 201981955 201981957;} @list l1:level1  {mso-level-number-format:bullet;  mso-level-text:;  mso-level-tab-stop:none;  mso-level-number-position:left;  text-indent:-18.0pt;  font-family:Symbol;} @list l1:level2  {mso-level-number-format:bullet;  mso-level-text:o;  mso-level-tab-stop:none;  mso-level-number-position:left;  text-indent:-18.0pt;  font-family:"Courier New";} @list l1:level3  {mso-level-number-format:bullet;  mso-level-text:;  mso-level-tab-stop:none;  mso-level-number-position:left;  text-indent:-18.0pt;  font-family:Wingdings;} @list l1:level4  {mso-level-number-format:bullet;  mso-level-text:;  mso-level-tab-stop:none;  mso-level-number-position:left;  text-indent:-18.0pt;  font-family:Symbol;} @list l1:level5  {mso-level-number-format:bullet;  mso-level-text:o;  mso-level-tab-stop:none;  mso-level-number-position:left;  text-indent:-18.0pt;  font-family:"Courier New";} @list l1:level6  {mso-level-number-format:bullet;  mso-level-text:;  mso-level-tab-stop:none;  mso-level-number-position:left;  text-indent:-18.0pt;  font-family:Wingdings;} @list l1:level7  {mso-level-number-format:bullet;  mso-level-text:;  mso-level-tab-stop:none;  mso-level-number-position:left;  text-indent:-18.0pt;  font-family:Symbol;} @list l1:level8  {mso-level-number-format:bullet;  mso-level-text:o;  mso-level-tab-stop:none;  mso-level-number-position:left;  text-indent:-18.0pt;  font-family:"Courier New";} @list l1:level9  {mso-level-number-format:bullet;  mso-level-text:;  mso-level-tab-stop:none;  mso-level-number-position:left;  text-indent:-18.0pt;  font-family:Wingdings;} @list l2  {mso-list-id:1236935186;  mso-list-type:hybrid;  mso-list-template-ids:-1992237222 201981953 201981955 201981957 201981953 201981955 201981957 201981953 201981955 201981957;} @list l2:level1  {mso-level-number-format:bullet;  mso-level-text:;  mso-level-tab-stop:none;  mso-level-number-position:left;  text-indent:-18.0pt;  font-family:Symbol;} @list l2:level2  {mso-level-number-format:bullet;  mso-level-text:o;  mso-level-tab-stop:none;  mso-level-number-position:left;  text-indent:-18.0pt;  font-family:"Courier New";} @list l2:level3  {mso-level-number-format:bullet;  mso-level-text:;  mso-level-tab-stop:none;  mso-level-number-position:left;  text-indent:-18.0pt;  font-family:Wingdings;} @list l2:level4  {mso-level-number-format:bullet;  mso-level-text:;  mso-level-tab-stop:none;  mso-level-number-position:left;  text-indent:-18.0pt;  font-family:Symbol;} @list l2:level5  {mso-level-number-format:bullet;  mso-level-text:o;  mso-level-tab-stop:none;  mso-level-number-position:left;  text-indent:-18.0pt;  font-family:"Courier New";} @list l2:level6  {mso-level-number-format:bullet;  mso-level-text:;  mso-level-tab-stop:none;  mso-level-number-position:left;  text-indent:-18.0pt;  font-family:Wingdings;} @list l2:level7  {mso-level-number-format:bullet;  mso-level-text:;  mso-level-tab-stop:none;  mso-level-number-position:left;  text-indent:-18.0pt;  font-family:Symbol;} @list l2:level8  {mso-level-number-format:bullet;  mso-level-text:o;  mso-level-tab-stop:none;  mso-level-number-position:left;  text-indent:-18.0pt;  font-family:"Courier New";} @list l2:level9  {mso-level-number-format:bullet;  mso-level-text:;  mso-level-tab-stop:none;  mso-level-number-position:left;  text-indent:-18.0pt;  font-family:Wingdings;} ol  {margin-bottom:0cm;} ul  {margin-bottom:0cm;} --&gt; &lt;/style&gt;     &lt;p class="MsoNormal"&gt;&lt;b style=""&gt;Capitulo 5&lt;/b&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;b style="mso-bidi-font-weight:normal"&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt; &lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;b style=""&gt;Introducción a Facelets&lt;/b&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;b style="mso-bidi-font-weight:normal"&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt; &lt;/p&gt;  &lt;p class="MsoNormal"&gt;El termino &lt;b style="mso-bidi-font-weight:normal"&gt;Faceltes&lt;/b&gt; se refiere a la vista del lenguaje de declaración para la tecnología JavaServer Faces.&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;La tecnología JavaServer Pages (JSP), previa a la presentación de JavaServer Faces, no soporta todas las características disponibles en JavaServer Faces 2.0.&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;La tecnología de JSPs es considerada una tecnología para JSF obsoleta (deprecated).&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;Facelets es una parte de la especificación de JavaServer Faces es además la tecnología de presentación preferida para construir aplicaciones&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;basadas en JavaServer Faces.&lt;/p&gt;  &lt;p class="MsoNormal"&gt; &lt;/p&gt;  &lt;p class="MsoNormal"&gt;En este capitulo se cubrirán los siguientes temas:&lt;/p&gt;  &lt;p class="MsoNormal"&gt; &lt;/p&gt;  &lt;p class="MsoListParagraphCxSpFirst" style="text-indent:-18.0pt;mso-list:l1 level1 lfo1"&gt;&lt;span style="font-family:Symbol;mso-fareast-font-family:Symbol;mso-bidi-font-family:Symbol;" &gt;&lt;span style="mso-list:Ignore"&gt;·&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;Que es Facelets&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpMiddle" style="text-indent:-18.0pt;mso-list:l1 level1 lfo1"&gt;&lt;span style="font-family:Symbol;mso-fareast-font-family:Symbol;mso-bidi-font-family:Symbol;" &gt;&lt;span style="mso-list:Ignore"&gt;·&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;Desarrollando una aplicación Facelets simple&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpMiddle" style="text-indent:-18.0pt;mso-list:l1 level1 lfo1"&gt;&lt;span style="font-family:Symbol;mso-fareast-font-family:Symbol;mso-bidi-font-family:Symbol;" &gt;&lt;span style="mso-list:Ignore"&gt;·&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;Plantillas&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpMiddle" style="text-indent:-18.0pt;mso-list:l1 level1 lfo1"&gt;&lt;span style="font-family:Symbol;mso-fareast-font-family:Symbol;mso-bidi-font-family:Symbol;" &gt;&lt;span style="mso-list:Ignore"&gt;·&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;Componentes compuestos&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpLast" style="text-indent:-18.0pt;mso-list:l1 level1 lfo1"&gt;&lt;span style="font-family:Symbol;mso-fareast-font-family:Symbol;mso-bidi-font-family:Symbol;" &gt;&lt;span style="mso-list:Ignore"&gt;·&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;Recursos&lt;/p&gt;  &lt;p class="MsoNormal"&gt; &lt;/p&gt;  &lt;p class="MsoNormal"&gt;Que es Facelets&lt;/p&gt;  &lt;p class="MsoNormal"&gt; &lt;/p&gt;  &lt;p class="MsoNormal"&gt;Facelets es un lenguaje de declaración de página, poderoso pero ligero, que es usado para construir vistas de JavaServer Faces usando plantillas de estilo de HTML y construyendo arboles de componentes.&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;Las características de Facelets incluyen son algunas de las siguientes:&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpFirst" style="text-indent:-18.0pt;mso-list:l2 level1 lfo2"&gt;&lt;span style="font-family:Symbol;mso-fareast-font-family:Symbol;mso-bidi-font-family:Symbol;" &gt;&lt;span style="mso-list:Ignore"&gt;·&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;Uso de XHTML para crear páginas web&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpMiddle" style="text-indent:-18.0pt;mso-list:l2 level1 lfo2"&gt;&lt;span style="font-family:Symbol;mso-fareast-font-family:Symbol;mso-bidi-font-family:Symbol;" &gt;&lt;span style="mso-list:Ignore"&gt;·&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;Soporte para librerías de etiquetas Facelets que se suman a las librerías de JavaServer Faces y JSTL&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpMiddle" style="text-indent:-18.0pt;mso-list:l2 level1 lfo2"&gt;&lt;span style="font-family:Symbol;mso-fareast-font-family:Symbol;mso-bidi-font-family:Symbol;" &gt;&lt;span style="mso-list:Ignore"&gt;·&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;Soporte para el Lenguaje de Expresiones &lt;b style="mso-bidi-font-weight:normal"&gt;EL&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpLast" style="text-indent:-18.0pt;mso-list:l2 level1 lfo2"&gt;&lt;span style="font-family:Symbol;mso-fareast-font-family:Symbol;mso-bidi-font-family:Symbol;" &gt;&lt;span style="mso-list:Ignore"&gt;·&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;Plantillas para componentes y páginas&lt;/p&gt;  &lt;p class="MsoNormal"&gt; &lt;/p&gt;  &lt;p class="MsoNormal"&gt;Las ventajas que Facelets incluye para el desarrollo de proyectos de gran escala son las siguientes:&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpFirst" style="text-indent:-18.0pt;mso-list:l0 level1 lfo3"&gt;&lt;span style="font-family:Symbol;mso-fareast-font-family:Symbol;mso-bidi-font-family:Symbol;" &gt;&lt;span style="mso-list:Ignore"&gt;·&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;Soporte&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;para reutilización de código por medio de plantillas y componentes compuestos.&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpMiddle" style="text-indent:-18.0pt;mso-list:l0 level1 lfo3"&gt;&lt;span style="font-family:Symbol;mso-fareast-font-family:Symbol;mso-bidi-font-family:Symbol;" &gt;&lt;span style="mso-list:Ignore"&gt;·&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;Extensibilidad funcional de componentes y otros objetos del lado del server por configuración&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpMiddle" style="text-indent:-18.0pt;mso-list:l0 level1 lfo3"&gt;&lt;span style="font-family:Symbol;mso-fareast-font-family:Symbol;mso-bidi-font-family:Symbol;" &gt;&lt;span style="mso-list:Ignore"&gt;·&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;Tiempo de compilación rápido&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpLast" style="text-indent:-18.0pt;mso-list:l0 level1 lfo3"&gt;&lt;span style="font-family:Symbol;mso-fareast-font-family:Symbol;mso-bidi-font-family:Symbol;" &gt;&lt;span style="mso-list:Ignore"&gt;·&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;Validación de EL en tiempo de compilación&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8262369655936226064-2783801359855935978?l=programacionconejemplos.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programacionconejemplos.blogspot.com/feeds/2783801359855935978/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://programacionconejemplos.blogspot.com/2011/08/introduccion-facelets-51.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8262369655936226064/posts/default/2783801359855935978'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8262369655936226064/posts/default/2783801359855935978'/><link rel='alternate' type='text/html' href='http://programacionconejemplos.blogspot.com/2011/08/introduccion-facelets-51.html' title='Introducción a Facelets (5.1)'/><author><name>Ant</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8262369655936226064.post-3557615052408257574</id><published>2011-08-05T17:29:00.003-05:00</published><updated>2011-08-05T17:49:29.586-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaServer Faces 2.0'/><title type='text'>Crear una aplicación JavaServer Faces simple (4.4)</title><content type='html'>&lt;style&gt; &lt;!--  /* Font Definitions */ @font-face  {font-family:"Courier New";  panose-1:2 7 3 9 2 2 5 2 4 4;  mso-font-charset:0;  mso-generic-font-family:auto;  mso-font-pitch:variable;  mso-font-signature:3 0 0 0 1 0;} @font-face  {font-family:Wingdings;  panose-1:5 0 0 0 0 0 0 0 0 0;  mso-font-charset:2;  mso-generic-font-family:auto;  mso-font-pitch:variable;  mso-font-signature:0 268435456 0 0 -2147483648 0;} @font-face  {font-family:"ＭＳ 明朝";  panose-1:0 0 0 0 0 0 0 0 0 0;  mso-font-charset:128;  mso-generic-font-family:roman;  mso-font-format:other;  mso-font-pitch:fixed;  mso-font-signature:1 134676480 16 0 131072 0;} @font-face  {font-family:"Cambria Math";  panose-1:2 4 5 3 5 4 6 3 2 4;  mso-font-charset:1;  mso-generic-font-family:roman;  mso-font-format:other;  mso-font-pitch:variable;  mso-font-signature:0 0 0 0 0 0;} @font-face  {font-family:Cambria;  panose-1:2 4 5 3 5 4 6 3 2 4;  mso-font-charset:0;  mso-generic-font-family:auto;  mso-font-pitch:variable;  mso-font-signature:3 0 0 0 1 0;}  /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal  {mso-style-unhide:no;  mso-style-qformat:yes;  mso-style-parent:"";  margin:0cm;  margin-bottom:.0001pt;  mso-pagination:widow-orphan;  font-size:12.0pt;  font-family:Cambria;  mso-ascii-font-family:Cambria;  mso-ascii-theme-font:minor-latin;  mso-fareast-font-family:"ＭＳ 明朝";  mso-fareast-theme-font:minor-fareast;  mso-hansi-font-family:Cambria;  mso-hansi-theme-font:minor-latin;  mso-bidi-font-family:"Times New Roman";  mso-bidi-theme-font:minor-bidi;} p.MsoListParagraph, li.MsoListParagraph, div.MsoListParagraph  {mso-style-priority:34;  mso-style-unhide:no;  mso-style-qformat:yes;  margin-top:0cm;  margin-right:0cm;  margin-bottom:0cm;  margin-left:36.0pt;  margin-bottom:.0001pt;  mso-add-space:auto;  mso-pagination:widow-orphan;  font-size:12.0pt;  font-family:Cambria;  mso-ascii-font-family:Cambria;  mso-ascii-theme-font:minor-latin;  mso-fareast-font-family:"ＭＳ 明朝";  mso-fareast-theme-font:minor-fareast;  mso-hansi-font-family:Cambria;  mso-hansi-theme-font:minor-latin;  mso-bidi-font-family:"Times New Roman";  mso-bidi-theme-font:minor-bidi;} p.MsoListParagraphCxSpFirst, li.MsoListParagraphCxSpFirst, div.MsoListParagraphCxSpFirst  {mso-style-priority:34;  mso-style-unhide:no;  mso-style-qformat:yes;  mso-style-type:export-only;  margin-top:0cm;  margin-right:0cm;  margin-bottom:0cm;  margin-left:36.0pt;  margin-bottom:.0001pt;  mso-add-space:auto;  mso-pagination:widow-orphan;  font-size:12.0pt;  font-family:Cambria;  mso-ascii-font-family:Cambria;  mso-ascii-theme-font:minor-latin;  mso-fareast-font-family:"ＭＳ 明朝";  mso-fareast-theme-font:minor-fareast;  mso-hansi-font-family:Cambria;  mso-hansi-theme-font:minor-latin;  mso-bidi-font-family:"Times New Roman";  mso-bidi-theme-font:minor-bidi;} p.MsoListParagraphCxSpMiddle, li.MsoListParagraphCxSpMiddle, div.MsoListParagraphCxSpMiddle  {mso-style-priority:34;  mso-style-unhide:no;  mso-style-qformat:yes;  mso-style-type:export-only;  margin-top:0cm;  margin-right:0cm;  margin-bottom:0cm;  margin-left:36.0pt;  margin-bottom:.0001pt;  mso-add-space:auto;  mso-pagination:widow-orphan;  font-size:12.0pt;  font-family:Cambria;  mso-ascii-font-family:Cambria;  mso-ascii-theme-font:minor-latin;  mso-fareast-font-family:"ＭＳ 明朝";  mso-fareast-theme-font:minor-fareast;  mso-hansi-font-family:Cambria;  mso-hansi-theme-font:minor-latin;  mso-bidi-font-family:"Times New Roman";  mso-bidi-theme-font:minor-bidi;} p.MsoListParagraphCxSpLast, li.MsoListParagraphCxSpLast, div.MsoListParagraphCxSpLast  {mso-style-priority:34;  mso-style-unhide:no;  mso-style-qformat:yes;  mso-style-type:export-only;  margin-top:0cm;  margin-right:0cm;  margin-bottom:0cm;  margin-left:36.0pt;  margin-bottom:.0001pt;  mso-add-space:auto;  mso-pagination:widow-orphan;  font-size:12.0pt;  font-family:Cambria;  mso-ascii-font-family:Cambria;  mso-ascii-theme-font:minor-latin;  mso-fareast-font-family:"ＭＳ 明朝";  mso-fareast-theme-font:minor-fareast;  mso-hansi-font-family:Cambria;  mso-hansi-theme-font:minor-latin;  mso-bidi-font-family:"Times New Roman";  mso-bidi-theme-font:minor-bidi;} .MsoChpDefault  {mso-style-type:export-only;  mso-default-props:yes;  font-family:Cambria;  mso-ascii-font-family:Cambria;  mso-ascii-theme-font:minor-latin;  mso-fareast-font-family:"ＭＳ 明朝";  mso-fareast-theme-font:minor-fareast;  mso-hansi-font-family:Cambria;  mso-hansi-theme-font:minor-latin;  mso-bidi-font-family:"Times New Roman";  mso-bidi-theme-font:minor-bidi;} @page WordSection1  {size:612.0pt 792.0pt;  margin:70.85pt 3.0cm 70.85pt 3.0cm;  mso-header-margin:36.0pt;  mso-footer-margin:36.0pt;  mso-paper-source:0;} div.WordSection1  {page:WordSection1;}  /* List Definitions */ @list l0  {mso-list-id:2031687554;  mso-list-type:hybrid;  mso-list-template-ids:-88541382 201981953 201981955 201981957 201981953 201981955 201981957 201981953 201981955 201981957;} @list l0:level1  {mso-level-number-format:bullet;  mso-level-text:;  mso-level-tab-stop:none;  mso-level-number-position:left;  text-indent:-18.0pt;  font-family:Symbol;} @list l0:level2  {mso-level-number-format:bullet;  mso-level-text:o;  mso-level-tab-stop:none;  mso-level-number-position:left;  text-indent:-18.0pt;  font-family:"Courier New";} @list l0:level3  {mso-level-number-format:bullet;  mso-level-text:;  mso-level-tab-stop:none;  mso-level-number-position:left;  text-indent:-18.0pt;  font-family:Wingdings;} @list l0:level4  {mso-level-number-format:bullet;  mso-level-text:;  mso-level-tab-stop:none;  mso-level-number-position:left;  text-indent:-18.0pt;  font-family:Symbol;} @list l0:level5  {mso-level-number-format:bullet;  mso-level-text:o;  mso-level-tab-stop:none;  mso-level-number-position:left;  text-indent:-18.0pt;  font-family:"Courier New";} @list l0:level6  {mso-level-number-format:bullet;  mso-level-text:;  mso-level-tab-stop:none;  mso-level-number-position:left;  text-indent:-18.0pt;  font-family:Wingdings;} @list l0:level7  {mso-level-number-format:bullet;  mso-level-text:;  mso-level-tab-stop:none;  mso-level-number-position:left;  text-indent:-18.0pt;  font-family:Symbol;} @list l0:level8  {mso-level-number-format:bullet;  mso-level-text:o;  mso-level-tab-stop:none;  mso-level-number-position:left;  text-indent:-18.0pt;  font-family:"Courier New";} @list l0:level9  {mso-level-number-format:bullet;  mso-level-text:;  mso-level-tab-stop:none;  mso-level-number-position:left;  text-indent:-18.0pt;  font-family:Wingdings;} ol  {margin-bottom:0cm;} ul  {margin-bottom:0cm;} --&gt; &lt;/style&gt;     &lt;p class="MsoNormal"&gt;&lt;b style=""&gt;Crear una aplicación JavaServer Faces simple&lt;/b&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;b style="mso-bidi-font-weight:normal"&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt; &lt;/p&gt;  &lt;p class="MsoNormal"&gt;El proceso de crear aplicaciones web con JavaServer Faces es fácil y amigable. Desarrollar una aplicación requiere típicamente de las siguientes tareas:&lt;/p&gt;  &lt;p class="MsoNormal"&gt; &lt;/p&gt;  &lt;p class="MsoListParagraphCxSpFirst" style="text-indent:-18.0pt;mso-list:l0 level1 lfo1"&gt;&lt;span style="font-family:Symbol;mso-fareast-font-family:Symbol;mso-bidi-font-family:Symbol;" &gt;&lt;span style="mso-list:Ignore"&gt;·&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;Desarrollar beans manejadores&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpMiddle" style="text-indent:-18.0pt;mso-list:l0 level1 lfo1"&gt;&lt;span style="font-family:Symbol;mso-fareast-font-family:Symbol;mso-bidi-font-family:Symbol;" &gt;&lt;span style="mso-list:Ignore"&gt;·&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;Agregar declaraciones de manejo de bean&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpMiddle" style="text-indent:-18.0pt;mso-list:l0 level1 lfo1"&gt;&lt;span style="font-family:Symbol;mso-fareast-font-family:Symbol;mso-bidi-font-family:Symbol;" &gt;&lt;span style="mso-list:Ignore"&gt;·&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;Crear páginas web utilizando de etiquetas&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpLast" style="text-indent:-18.0pt;mso-list:l0 level1 lfo1"&gt;&lt;span style="font-family:Symbol;mso-fareast-font-family:Symbol;mso-bidi-font-family:Symbol;" &gt;&lt;span style="mso-list:Ignore"&gt;·&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;Mapear la instancia FacesServlet&lt;/p&gt;  &lt;p class="MsoNormal"&gt; &lt;/p&gt;  &lt;p class="MsoNormal"&gt;Esta sección describe esas tareas creando una aplicación en JavaServer Faces simple.&lt;/p&gt;  &lt;p class="MsoNormal"&gt; &lt;/p&gt;  &lt;p class="MsoNormal"&gt;El ejemplo es la aplicación &lt;b style="mso-bidi-font-weight: normal"&gt;Hello&lt;/b&gt; que incluye un backing bean y una página web. Cuando el cliente accede, la página web imprime un mensaje de &lt;b style="mso-bidi-font-weight: normal"&gt;HelloWord&lt;/b&gt;.&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;La aplicación ejemplo está localizada en el directorio tut-install/examples/web/hello.&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;Las tareas involucradas en el desarrollo de esta aplicación pueden examinarse revisando los componentes en detalle.&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;br /&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt; &lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;b style=""&gt;Creando El Bean de Respaldo &lt;span style="mso-spacerun:yes"&gt; &lt;/span&gt;(Backing Bean)&lt;/b&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;b style="mso-bidi-font-weight:normal"&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt; &lt;/p&gt;  &lt;p class="MsoNormal"&gt;Como se mencionó anteriormente en este capitulo, el backing bean, es un componente JavaBean que es gestionado por la tecnología JavaServer Faces.&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;Los componentes en una página son asociados a un backing bean, que provee la lógica de la aplicación.&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;El backing bean del ejemplo Hello.java contiene el siguiente código:&lt;/p&gt;&lt;br /&gt;&lt;pre style="font-family:arial;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;;background-image:URL(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif);padding:0px;color:#000000;text-align:left;line-height:20px;"&gt;&lt;code style="color:#000000;word-wrap:normal;"&gt; package hello; &lt;br /&gt;import javax.faces.bean.ManagedBean; &lt;br /&gt;@ManagedBean &lt;br /&gt;public class Hello { &lt;br /&gt;  final String world = "Hello World!"; &lt;br /&gt;  public String getworld() { &lt;br /&gt;    return world; &lt;br /&gt;  } &lt;br /&gt;} &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p class="MsoNormal"&gt;             &lt;style&gt; &lt;!--  /* Font Definitions */ @font-face  {font-family:"ＭＳ 明朝";  panose-1:0 0 0 0 0 0 0 0 0 0;  mso-font-charset:128;  mso-generic-font-family:roman;  mso-font-format:other;  mso-font-pitch:fixed;  mso-font-signature:1 134676480 16 0 131072 0;} @font-face  {font-family:"ＭＳ 明朝";  panose-1:0 0 0 0 0 0 0 0 0 0;  mso-font-charset:128;  mso-generic-font-family:roman;  mso-font-format:other;  mso-font-pitch:fixed;  mso-font-signature:1 134676480 16 0 131072 0;} @font-face  {font-family:Cambria;  panose-1:2 4 5 3 5 4 6 3 2 4;  mso-font-charset:0;  mso-generic-font-family:auto;  mso-font-pitch:variable;  mso-font-signature:3 0 0 0 1 0;}  /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal  {mso-style-unhide:no;  mso-style-qformat:yes;  mso-style-parent:"";  margin:0cm;  margin-bottom:.0001pt;  mso-pagination:widow-orphan;  font-size:12.0pt;  font-family:Cambria;  mso-ascii-font-family:Cambria;  mso-ascii-theme-font:minor-latin;  mso-fareast-font-family:"ＭＳ 明朝";  mso-fareast-theme-font:minor-fareast;  mso-hansi-font-family:Cambria;  mso-hansi-theme-font:minor-latin;  mso-bidi-font-family:"Times New Roman";  mso-bidi-theme-font:minor-bidi;} .MsoChpDefault  {mso-style-type:export-only;  mso-default-props:yes;  font-family:Cambria;  mso-ascii-font-family:Cambria;  mso-ascii-theme-font:minor-latin;  mso-fareast-font-family:"ＭＳ 明朝";  mso-fareast-theme-font:minor-fareast;  mso-hansi-font-family:Cambria;  mso-hansi-theme-font:minor-latin;  mso-bidi-font-family:"Times New Roman";  mso-bidi-theme-font:minor-bidi;} @page WordSection1  {size:612.0pt 792.0pt;  margin:70.85pt 3.0cm 70.85pt 3.0cm;  mso-header-margin:36.0pt;  mso-footer-margin:36.0pt;  mso-paper-source:0;} div.WordSection1  {page:WordSection1;} --&gt; &lt;/style&gt;     &lt;/p&gt;&lt;p class="MsoNormal"&gt;El backing bean establece el valor de la variable &lt;b style="mso-bidi-font-weight:normal"&gt;world&lt;/b&gt; con la cadena “Hello World” La anotación @ManagedBean registra al backing bean como un recurso en la implementación de JavaServer Faces.&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;Para mas información sobre beans gestionados y anotaciones, ver el capitulo 9, &lt;b style="mso-bidi-font-weight:normal"&gt;Desarrollo con la Tecnología JavaServer Faces&lt;/b&gt;.&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;br /&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt; &lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;b style=""&gt;Creando la Página Web&lt;/b&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;b style="mso-bidi-font-weight:normal"&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt; &lt;/p&gt;  &lt;p class="MsoNormal"&gt;En una aplicación Facelets típica, las páginas son creadas en XHTML.&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;El la página web de ejemplo, beanjello.xhtml, es una pagina en XHTML simple. Esta tiene el siguiente contenido.&lt;/p&gt;&lt;br /&gt;&lt;pre style="font-family:arial;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;;background-image:URL(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif);padding:0px;color:#000000;text-align:left;line-height:20px;"&gt;&lt;code style="color:#000000;word-wrap:normal;"&gt; package hello; &lt;br /&gt;import javax.faces.bean.ManagedBean; &lt;br /&gt;@ManagedBean &lt;br /&gt;&amp;lt;html xmlns="http://www.w3.org/1999/xhtml" &lt;br /&gt;   xmlns:h="http://java.sun.com/jsf/html"&amp;gt; &lt;br /&gt;  &amp;lt;h:head&amp;gt; &lt;br /&gt;    &amp;lt;title&amp;gt;Facelets Hello World&amp;lt;/title&amp;gt; &lt;br /&gt;  &amp;lt;/h:head&amp;gt; &lt;br /&gt;  &amp;lt;h:body&amp;gt; &lt;br /&gt;    #{hello.world} &lt;br /&gt;  &amp;lt;/h:body&amp;gt; &lt;br /&gt;&amp;lt;/html&amp;gt; &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p class="MsoNormal"&gt;             &lt;style&gt; &lt;!--  /* Font Definitions */ @font-face  {font-family:"ＭＳ 明朝";  panose-1:0 0 0 0 0 0 0 0 0 0;  mso-font-charset:128;  mso-generic-font-family:roman;  mso-font-format:other;  mso-font-pitch:fixed;  mso-font-signature:1 134676480 16 0 131072 0;} @font-face  {font-family:"Cambria Math";  panose-1:2 4 5 3 5 4 6 3 2 4;  mso-font-charset:1;  mso-generic-font-family:roman;  mso-font-format:other;  mso-font-pitch:variable;  mso-font-signature:0 0 0 0 0 0;} @font-face  {font-family:Cambria;  panose-1:2 4 5 3 5 4 6 3 2 4;  mso-font-charset:0;  mso-generic-font-family:auto;  mso-font-pitch:variable;  mso-font-signature:3 0 0 0 1 0;}  /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal  {mso-style-unhide:no;  mso-style-qformat:yes;  mso-style-parent:"";  margin:0cm;  margin-bottom:.0001pt;  mso-pagination:widow-orphan;  font-size:12.0pt;  font-family:Cambria;  mso-ascii-font-family:Cambria;  mso-ascii-theme-font:minor-latin;  mso-fareast-font-family:"ＭＳ 明朝";  mso-fareast-theme-font:minor-fareast;  mso-hansi-font-family:Cambria;  mso-hansi-theme-font:minor-latin;  mso-bidi-font-family:"Times New Roman";  mso-bidi-theme-font:minor-bidi;} .MsoChpDefault  {mso-style-type:export-only;  mso-default-props:yes;  font-family:Cambria;  mso-ascii-font-family:Cambria;  mso-ascii-theme-font:minor-latin;  mso-fareast-font-family:"ＭＳ 明朝";  mso-fareast-theme-font:minor-fareast;  mso-hansi-font-family:Cambria;  mso-hansi-theme-font:minor-latin;  mso-bidi-font-family:"Times New Roman";  mso-bidi-theme-font:minor-bidi;} @page WordSection1  {size:612.0pt 792.0pt;  margin:70.85pt 3.0cm 70.85pt 3.0cm;  mso-header-margin:36.0pt;  mso-footer-margin:36.0pt;  mso-paper-source:0;} div.WordSection1  {page:WordSection1;} --&gt; &lt;/style&gt;     &lt;/p&gt;&lt;p class="MsoNormal"&gt;Una página XHTML Facelets puede contener otros elementos diversos, los cuales se cubrirán mas adelante en este tutorial.&lt;/p&gt;  &lt;p class="MsoNormal"&gt; &lt;/p&gt;  &lt;p class="MsoNormal"&gt;La página web conecta el backing bean, por medio del lenguaje de expresiones &lt;b style="mso-bidi-font-weight:normal"&gt;EL&lt;/b&gt; (Expression Language), la expresión con el valor &lt;b style="mso-bidi-font-weight: normal"&gt;#{hello.world}&lt;/b&gt;, el cual recupera el valor de la propiedad &lt;b style="mso-bidi-font-weight:normal"&gt;world&lt;/b&gt; del backing bean &lt;b style="mso-bidi-font-weight:normal"&gt;Hello&lt;/b&gt;. Note que se usa la referencia &lt;b style="mso-bidi-font-weight:normal"&gt;hello&lt;/b&gt; al backing bean &lt;b style="mso-bidi-font-weight:normal"&gt;Hello&lt;/b&gt;. Si no se especifica nombre en la anotación &lt;b style="mso-bidi-font-weight:normal"&gt;@ManagedBean&lt;/b&gt;, se puede llamar al backing bean con el mismo nombre y la primera letra de la clase en minúsculas.&lt;/p&gt;  &lt;p class="MsoNormal"&gt; &lt;/p&gt;  &lt;p class="MsoNormal"&gt;Para mas información sobre el uso de expresiones EL, vea el Capítulo 6, Lenguaje de Expresiones.&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;Para mas información acerca del la tecnología Facelets, vea el Capítulo 5, Introducción a los Facelets. Para mas información acerca del modelo de programación y construcción de páginas web usando JavaServer Faces, vea el Capítulo 7, Uso de la Tecnología JavaServer Faces en Páginas Web.&lt;/p&gt;  &lt;p class="MsoNormal"&gt; &lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;b style="mso-bidi-font-weight:normal"&gt;Mapeando la instancia FacesServlet&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt; &lt;/p&gt;  &lt;p class="MsoNormal"&gt;La tarea final requiere mapear el servlet &lt;b style="mso-bidi-font-weight:normal"&gt;FacesServlet&lt;/b&gt;, lo cual se consigue modificando el deployment descriptor (&lt;b style="mso-bidi-font-weight:normal"&gt;web.xml&lt;/b&gt;) .&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;Un mapeo típico del servlet FacesServlet es como sigue:&lt;/p&gt;&lt;br /&gt;&lt;pre style="font-family:arial;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;;background-image:URL(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif);padding:0px;color:#000000;text-align:left;line-height:20px;"&gt;&lt;code style="color:#000000;word-wrap:normal;"&gt; &amp;lt;servlet&amp;gt; &lt;br /&gt;  &amp;lt;servlet-name&amp;gt;Faces Servlet&amp;lt;/servlet-name&amp;gt; &lt;br /&gt;  &amp;lt;servlet-class&amp;gt;javax.faces.webapp.FacesServlet&amp;lt;/servlet-class&amp;gt; &lt;br /&gt;  &amp;lt;load-on-startup&amp;gt;1&amp;lt;/load-on-startup&amp;gt; &lt;br /&gt;&amp;lt;/servlet&amp;gt; &lt;br /&gt;&amp;lt;servlet-mapping&amp;gt; &lt;br /&gt;  &amp;lt;servlet-name&amp;gt;Faces Servlet&amp;lt;/servlet-name&amp;gt; &lt;br /&gt;  &amp;lt;url-pattern&amp;gt;/faces/*&amp;lt;/url-pattern&amp;gt; &lt;br /&gt;&amp;lt;/servlet-mapping&amp;gt; &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p class="MsoNormal"&gt;             &lt;style&gt; &lt;!--  /* Font Definitions */ @font-face  {font-family:"Courier New";  panose-1:2 7 3 9 2 2 5 2 4 4;  mso-font-charset:0;  mso-generic-font-family:auto;  mso-font-pitch:variable;  mso-font-signature:3 0 0 0 1 0;} @font-face  {font-family:Wingdings;  panose-1:5 0 0 0 0 0 0 0 0 0;  mso-font-charset:2;  mso-generic-font-family:auto;  mso-font-pitch:variable;  mso-font-signature:0 268435456 0 0 -2147483648 0;} @font-face  {font-family:"ＭＳ 明朝";  panose-1:0 0 0 0 0 0 0 0 0 0;  mso-font-charset:128;  mso-generic-font-family:roman;  mso-font-format:other;  mso-font-pitch:fixed;  mso-font-signature:1 134676480 16 0 131072 0;} @font-face  {font-family:"Cambria Math";  panose-1:2 4 5 3 5 4 6 3 2 4;  mso-font-charset:1;  mso-generic-font-family:roman;  mso-font-format:other;  mso-font-pitch:variable;  mso-font-signature:0 0 0 0 0 0;} @font-face  {font-family:Cambria;  panose-1:2 4 5 3 5 4 6 3 2 4;  mso-font-charset:0;  mso-generic-font-family:auto;  mso-font-pitch:variable;  mso-font-signature:3 0 0 0 1 0;}  /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal  {mso-style-unhide:no;  mso-style-qformat:yes;  mso-style-parent:"";  margin:0cm;  margin-bottom:.0001pt;  mso-pagination:widow-orphan;  font-size:12.0pt;  font-family:Cambria;  mso-ascii-font-family:Cambria;  mso-ascii-theme-font:minor-latin;  mso-fareast-font-family:"ＭＳ 明朝";  mso-fareast-theme-font:minor-fareast;  mso-hansi-font-family:Cambria;  mso-hansi-theme-font:minor-latin;  mso-bidi-font-family:"Times New Roman";  mso-bidi-theme-font:minor-bidi;} a:link, span.MsoHyperlink  {mso-style-priority:99;  color:blue;  mso-themecolor:hyperlink;  text-decoration:underline;  text-underline:single;} a:visited, span.MsoHyperlinkFollowed  {mso-style-noshow:yes;  mso-style-priority:99;  color:purple;  mso-themecolor:followedhyperlink;  text-decoration:underline;  text-underline:single;} p.MsoListParagraph, li.MsoListParagraph, div.MsoListParagraph  {mso-style-priority:34;  mso-style-unhide:no;  mso-style-qformat:yes;  margin-top:0cm;  margin-right:0cm;  margin-bottom:0cm;  margin-left:36.0pt;  margin-bottom:.0001pt;  mso-add-space:auto;  mso-pagination:widow-orphan;  font-size:12.0pt;  font-family:Cambria;  mso-ascii-font-family:Cambria;  mso-ascii-theme-font:minor-latin;  mso-fareast-font-family:"ＭＳ 明朝";  mso-fareast-theme-font:minor-fareast;  mso-hansi-font-family:Cambria;  mso-hansi-theme-font:minor-latin;  mso-bidi-font-family:"Times New Roman";  mso-bidi-theme-font:minor-bidi;} p.MsoListParagraphCxSpFirst, li.MsoListParagraphCxSpFirst, div.MsoListParagraphCxSpFirst  {mso-style-priority:34;  mso-style-unhide:no;  mso-style-qformat:yes;  mso-style-type:export-only;  margin-top:0cm;  margin-right:0cm;  margin-bottom:0cm;  margin-left:36.0pt;  margin-bottom:.0001pt;  mso-add-space:auto;  mso-pagination:widow-orphan;  font-size:12.0pt;  font-family:Cambria;  mso-ascii-font-family:Cambria;  mso-ascii-theme-font:minor-latin;  mso-fareast-font-family:"ＭＳ 明朝";  mso-fareast-theme-font:minor-fareast;  mso-hansi-font-family:Cambria;  mso-hansi-theme-font:minor-latin;  mso-bidi-font-family:"Times New Roman";  mso-bidi-theme-font:minor-bidi;} p.MsoListParagraphCxSpMiddle, li.MsoListParagraphCxSpMiddle, div.MsoListParagraphCxSpMiddle  {mso-style-priority:34;  mso-style-unhide:no;  mso-style-qformat:yes;  mso-style-type:export-only;  margin-top:0cm;  margin-right:0cm;  margin-bottom:0cm;  margin-left:36.0pt;  margin-bottom:.0001pt;  mso-add-space:auto;  mso-pagination:widow-orphan;  font-size:12.0pt;  font-family:Cambria;  mso-ascii-font-family:Cambria;  mso-ascii-theme-font:minor-latin;  mso-fareast-font-family:"ＭＳ 明朝";  mso-fareast-theme-font:minor-fareast;  mso-hansi-font-family:Cambria;  mso-hansi-theme-font:minor-latin;  mso-bidi-font-family:"Times New Roman";  mso-bidi-theme-font:minor-bidi;} p.MsoListParagraphCxSpLast, li.MsoListParagraphCxSpLast, div.MsoListParagraphCxSpLast  {mso-style-priority:34;  mso-style-unhide:no;  mso-style-qformat:yes;  mso-style-type:export-only;  margin-top:0cm;  margin-right:0cm;  margin-bottom:0cm;  margin-left:36.0pt;  margin-bottom:.0001pt;  mso-add-space:auto;  mso-pagination:widow-orphan;  font-size:12.0pt;  font-family:Cambria;  mso-ascii-font-family:Cambria;  mso-ascii-theme-font:minor-latin;  mso-fareast-font-family:"ＭＳ 明朝";  mso-fareast-theme-font:minor-fareast;  mso-hansi-font-family:Cambria;  mso-hansi-theme-font:minor-latin;  mso-bidi-font-family:"Times New Roman";  mso-bidi-theme-font:minor-bidi;} .MsoChpDefault  {mso-style-type:export-only;  mso-default-props:yes;  font-family:Cambria;  mso-ascii-font-family:Cambria;  mso-ascii-theme-font:minor-latin;  mso-fareast-font-family:"ＭＳ 明朝";  mso-fareast-theme-font:minor-fareast;  mso-hansi-font-family:Cambria;  mso-hansi-theme-font:minor-latin;  mso-bidi-font-family:"Times New Roman";  mso-bidi-theme-font:minor-bidi;} @page WordSection1  {size:612.0pt 792.0pt;  margin:70.85pt 3.0cm 70.85pt 3.0cm;  mso-header-margin:36.0pt;  mso-footer-margin:36.0pt;  mso-paper-source:0;} div.WordSection1  {page:WordSection1;}  /* List Definitions */ @list l0  {mso-list-id:435753566;  mso-list-type:hybrid;  mso-list-template-ids:-184276720 201981953 201981955 201981957 201981953 201981955 201981957 201981953 201981955 201981957;} @list l0:level1  {mso-level-number-format:bullet;  mso-level-text:;  mso-level-tab-stop:none;  mso-level-number-position:left;  text-indent:-18.0pt;  font-family:Symbol;} @list l0:level2  {mso-level-number-format:bullet;  mso-level-text:o;  mso-level-tab-stop:none;  mso-level-number-position:left;  text-indent:-18.0pt;  font-family:"Courier New";} @list l0:level3  {mso-level-number-format:bullet;  mso-level-text:;  mso-level-tab-stop:none;  mso-level-number-position:left;  text-indent:-18.0pt;  font-family:Wingdings;} @list l0:level4  {mso-level-number-format:bullet;  mso-level-text:;  mso-level-tab-stop:none;  mso-level-number-position:left;  text-indent:-18.0pt;  font-family:Symbol;} @list l0:level5  {mso-level-number-format:bullet;  mso-level-text:o;  mso-level-tab-stop:none;  mso-level-number-position:left;  text-indent:-18.0pt;  font-family:"Courier New";} @list l0:level6  {mso-level-number-format:bullet;  mso-level-text:;  mso-level-tab-stop:none;  mso-level-number-position:left;  text-indent:-18.0pt;  font-family:Wingdings;} @list l0:level7  {mso-level-number-format:bullet;  mso-level-text:;  mso-level-tab-stop:none;  mso-level-number-position:left;  text-indent:-18.0pt;  font-family:Symbol;} @list l0:level8  {mso-level-number-format:bullet;  mso-level-text:o;  mso-level-tab-stop:none;  mso-level-number-position:left;  text-indent:-18.0pt;  font-family:"Courier New";} @list l0:level9  {mso-level-number-format:bullet;  mso-level-text:;  mso-level-tab-stop:none;  mso-level-number-position:left;  text-indent:-18.0pt;  font-family:Wingdings;} @list l1  {mso-list-id:507215380;  mso-list-type:hybrid;  mso-list-template-ids:602470008 201981967 201981977 201981979 201981967 201981977 201981979 201981967 201981977 201981979;} @list l1:level1  {mso-level-tab-stop:none;  mso-level-number-position:left;  text-indent:-18.0pt;} @list l1:level2  {mso-level-number-format:alpha-lower;  mso-level-tab-stop:none;  mso-level-number-position:left;  text-indent:-18.0pt;} @list l1:level3  {mso-level-number-format:roman-lower;  mso-level-tab-stop:none;  mso-level-number-position:right;  text-indent:-9.0pt;} @list l1:level4  {mso-level-tab-stop:none;  mso-level-number-position:left;  text-indent:-18.0pt;} @list l1:level5  {mso-level-number-format:alpha-lower;  mso-level-tab-stop:none;  mso-level-number-position:left;  text-indent:-18.0pt;} @list l1:level6  {mso-level-number-format:roman-lower;  mso-level-tab-stop:none;  mso-level-number-position:right;  text-indent:-9.0pt;} @list l1:level7  {mso-level-tab-stop:none;  mso-level-number-position:left;  text-indent:-18.0pt;} @list l1:level8  {mso-level-number-format:alpha-lower;  mso-level-tab-stop:none;  mso-level-number-position:left;  text-indent:-18.0pt;} @list l1:level9  {mso-level-number-format:roman-lower;  mso-level-tab-stop:none;  mso-level-number-position:right;  text-indent:-9.0pt;} @list l2  {mso-list-id:1097480444;  mso-list-type:hybrid;  mso-list-template-ids:-1438498146 201981967 201981977 201981979 201981967 201981977 201981979 201981967 201981977 201981979;} @list l2:level1  {mso-level-tab-stop:none;  mso-level-number-position:left;  text-indent:-18.0pt;} @list l2:level2  {mso-level-number-format:alpha-lower;  mso-level-tab-stop:none;  mso-level-number-position:left;  text-indent:-18.0pt;} @list l2:level3  {mso-level-number-format:roman-lower;  mso-level-tab-stop:none;  mso-level-number-position:right;  text-indent:-9.0pt;} @list l2:level4  {mso-level-tab-stop:none;  mso-level-number-position:left;  text-indent:-18.0pt;} @list l2:level5  {mso-level-number-format:alpha-lower;  mso-level-tab-stop:none;  mso-level-number-position:left;  text-indent:-18.0pt;} @list l2:level6  {mso-level-number-format:roman-lower;  mso-level-tab-stop:none;  mso-level-number-position:right;  text-indent:-9.0pt;} @list l2:level7  {mso-level-tab-stop:none;  mso-level-number-position:left;  text-indent:-18.0pt;} @list l2:level8  {mso-level-number-format:alpha-lower;  mso-level-tab-stop:none;  mso-level-number-position:left;  text-indent:-18.0pt;} @list l2:level9  {mso-level-number-format:roman-lower;  mso-level-tab-stop:none;  mso-level-number-position:right;  text-indent:-9.0pt;} @list l3  {mso-list-id:1584992414;  mso-list-type:hybrid;  mso-list-template-ids:2082102586 201981953 201981955 201981957 201981953 201981955 201981957 201981953 201981955 201981957;} @list l3:level1  {mso-level-number-format:bullet;  mso-level-text:;  mso-level-tab-stop:none;  mso-level-number-position:left;  text-indent:-18.0pt;  font-family:Symbol;} @list l3:level2  {mso-level-number-format:bullet;  mso-level-text:o;  mso-level-tab-stop:none;  mso-level-number-position:left;  text-indent:-18.0pt;  font-family:"Courier New";} @list l3:level3  {mso-level-number-format:bullet;  mso-level-text:;  mso-level-tab-stop:none;  mso-level-number-position:left;  text-indent:-18.0pt;  font-family:Wingdings;} @list l3:level4  {mso-level-number-format:bullet;  mso-level-text:;  mso-level-tab-stop:none;  mso-level-number-position:left;  text-indent:-18.0pt;  font-family:Symbol;} @list l3:level5  {mso-level-number-format:bullet;  mso-level-text:o;  mso-level-tab-stop:none;  mso-level-number-position:left;  text-indent:-18.0pt;  font-family:"Courier New";} @list l3:level6  {mso-level-number-format:bullet;  mso-level-text:;  mso-level-tab-stop:none;  mso-level-number-position:left;  text-indent:-18.0pt;  font-family:Wingdings;} @list l3:level7  {mso-level-number-format:bullet;  mso-level-text:;  mso-level-tab-stop:none;  mso-level-number-position:left;  text-indent:-18.0pt;  font-family:Symbol;} @list l3:level8  {mso-level-number-format:bullet;  mso-level-text:o;  mso-level-tab-stop:none;  mso-level-number-position:left;  text-indent:-18.0pt;  font-family:"Courier New";} @list l3:level9  {mso-level-number-format:bullet;  mso-level-text:;  mso-level-tab-stop:none;  mso-level-number-position:left;  text-indent:-18.0pt;  font-family:Wingdings;} ol  {margin-bottom:0cm;} ul  {margin-bottom:0cm;} --&gt; &lt;/style&gt;     &lt;/p&gt;&lt;p class="MsoNormal"&gt;El segmento de archivo precedente, representa parte de un archivo de descripción de despliegue típico.&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;El descriptor de despliegue puede contener además, otros contenidos relevantes para la configuración de una aplicación con JavaServer Faces, pero esa información no se cubre en esta sección.&lt;/p&gt;  &lt;p class="MsoNormal"&gt; &lt;/p&gt;  &lt;p class="MsoNormal"&gt;El mapeo de FacesServlet es automáticamente hecho si se usa un IDE como Netbeans IDE.&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;br /&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt; &lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;b style=""&gt;El Ciclo de Vida de la Aplicación Hello&lt;/b&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;b style="mso-bidi-font-weight:normal"&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt; &lt;/p&gt;  &lt;p class="MsoNormal"&gt;Cada aplicación web tiene un ciclo de vida. Las tareas comunes como el manejo de peticiones entrantes, decodificación de parámetros, modificación y almacenamiento de estado y rendereo de páginas web hacia el navegador, son todas ejecutadas durante el ciclo de vida de la aplicación.&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;Algunos marcos de trabajo web ocultan los detalles del ciclo de vida mientras que otros requieren ser manejados manualmente.&lt;/p&gt;  &lt;p class="MsoNormal"&gt; &lt;/p&gt;  &lt;p class="MsoNormal"&gt;Por default, JavaServer Faces maneja automáticamente la mayoría de las acciones de ciclo de vida de una página web.&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;No obstante, es posible acceder a los diferentes escenarios de la petición de un ciclo de vida y es modificar o ejecutar diversas acciones si la aplicación así lo requiere.&lt;/p&gt;  &lt;p class="MsoNormal"&gt; &lt;/p&gt;  &lt;p class="MsoNormal"&gt;No es necesario para quien esta comenzando, conocer todo el ciclo de vida de una aplicación en JavaServer Faces, pero esta información puede ser muy útil para quien desea crear aplicaciones mas complejas.&lt;/p&gt;  &lt;p class="MsoNormal"&gt; &lt;/p&gt;  &lt;p class="MsoNormal"&gt;El ciclo de vida de una aplicación JavaServer Faces comienza y termina con la siguiente actividad: El cliente hace una petición a la página web, y el server responde con una página.&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;El ciclo consiste de dos faces principales: ejecutar y renderear.&lt;/p&gt;  &lt;p class="MsoNormal"&gt; &lt;/p&gt;  &lt;p class="MsoNormal"&gt;Durante la fase de ejecución, diversas acciones son ejecutadas:&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpFirst" style="text-indent:-18.0pt;mso-list:l3 level1 lfo1"&gt;&lt;span style="font-family:Symbol;mso-fareast-font-family:Symbol;mso-bidi-font-family:Symbol;" &gt;&lt;span style="mso-list:Ignore"&gt;·&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;La vista de la aplicación es construida o restaurada.&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpMiddle" style="text-indent:-18.0pt;mso-list:l3 level1 lfo1"&gt;&lt;span style="font-family:Symbol;mso-fareast-font-family:Symbol;mso-bidi-font-family:Symbol;" &gt;&lt;span style="mso-list:Ignore"&gt;·&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;Los valores de parámetros de petición son aplicados.&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpMiddle" style="text-indent:-18.0pt;mso-list:l3 level1 lfo1"&gt;&lt;span style="font-family:Symbol;mso-fareast-font-family:Symbol;mso-bidi-font-family:Symbol;" &gt;&lt;span style="mso-list:Ignore"&gt;·&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;Conversiones y validaciones son ejecutadas para los valores de los componentes.&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpMiddle" style="text-indent:-18.0pt;mso-list:l3 level1 lfo1"&gt;&lt;span style="font-family:Symbol;mso-fareast-font-family:Symbol;mso-bidi-font-family:Symbol;" &gt;&lt;span style="mso-list:Ignore"&gt;·&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;Los beans de respaldo son actualizados con los valores de los componentes.&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpLast" style="text-indent:-18.0pt;mso-list:l3 level1 lfo1"&gt;&lt;span style="font-family:Symbol;mso-fareast-font-family:Symbol;mso-bidi-font-family:Symbol;" &gt;&lt;span style="mso-list:Ignore"&gt;·&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;La lógica de la aplicación es invocada.&lt;/p&gt;  &lt;p class="MsoNormal"&gt; &lt;/p&gt;  &lt;p class="MsoNormal"&gt;Para una primera petición (&lt;b style="mso-bidi-font-weight: normal"&gt;initial&lt;/b&gt;), solo se construye la vista. Para peticiones subsecuentes (&lt;b style="mso-bidi-font-weight:normal"&gt;postback&lt;/b&gt;), algunas o quizá todas las acciones pueden tener lugar.&lt;/p&gt;  &lt;p class="MsoNormal"&gt; &lt;/p&gt;  &lt;p class="MsoNormal"&gt;En la fase de rendering, la vista solicitada es rendereada como respuesta al cliente.&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;El rendering es típicamente el proceso de generación de salidas, que pueden ser HTML o XHTML, y pueden ser leídas por el cliente, usualmente un navegador.&lt;/p&gt;  &lt;p class="MsoNormal"&gt; &lt;/p&gt;  &lt;p class="MsoNormal"&gt;A continuación daremos una descripción corta del ejemplo en JavaServer Faces donde haremos una revisión resumida de la actividad detrás de escena que se realiza en el ciclo de vida del ejemplo.&lt;/p&gt;  &lt;p class="MsoNormal"&gt; &lt;/p&gt;  &lt;p class="MsoNormal"&gt;El ejemplo &lt;b style="mso-bidi-font-weight:normal"&gt;hello&lt;/b&gt; atraviesa por los siguientes escenarios cuando es desplegada en el servidor GlassFish.&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpFirst" style="text-indent:-18.0pt;mso-list:l1 level1 lfo2"&gt;&lt;span style="mso-fareast-font-family:Cambria;mso-fareast-theme-font:minor-latin; mso-bidi-mso-bidi-theme-font:minor-latinfont-family:Cambria;" &gt;&lt;span style="mso-list:Ignore"&gt;1.&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;     &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;Cuando la aplicación hello es construida y desplegada en GlassFish, la aplicación se encuentra en un estado no inicializado.&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpMiddle" style="text-indent:-18.0pt;mso-list:l1 level1 lfo2"&gt;&lt;span style="mso-fareast-font-family:Cambria;mso-fareast-theme-font:minor-latin; mso-bidi-mso-bidi-theme-font:minor-latinfont-family:Cambria;" &gt;&lt;span style="mso-list:Ignore"&gt;2.&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;     &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;Cuando un cliente hace una petición inicial a la página &lt;b style="mso-bidi-font-weight:normal"&gt;beanhello.xhtml&lt;/b&gt;, la aplicación &lt;b style="mso-bidi-font-weight:normal"&gt;hello&lt;/b&gt; Facelets es complilada.&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpMiddle" style="text-indent:-18.0pt;mso-list:l1 level1 lfo2"&gt;&lt;span style="mso-fareast-font-family:Cambria;mso-fareast-theme-font:minor-latin; mso-bidi-mso-bidi-theme-font:minor-latinfont-family:Cambria;" &gt;&lt;span style="mso-list:Ignore"&gt;3.&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;     &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;La aplicación Facelets ya compilada es ejecutada, y un nuevo árbol de componentes es construido para la aplicación &lt;b style="mso-bidi-font-weight:normal"&gt;hello&lt;/b&gt; y es puesto en un &lt;b style="mso-bidi-font-weight:normal"&gt;FacesContext&lt;/b&gt;.&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpMiddle" style="text-indent:-18.0pt;mso-list:l1 level1 lfo2"&gt;&lt;span style="mso-fareast-font-family:Cambria;mso-fareast-theme-font:minor-latin; mso-bidi-mso-bidi-theme-font:minor-latinfont-family:Cambria;" &gt;&lt;span style="mso-list:Ignore"&gt;4.&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;     &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;El árbol de componentes es poblado con el componente y la propiedad del bean de respaldo asociada a el, representada por la expresión &lt;b style="mso-bidi-font-weight:normal"&gt;EL&lt;/b&gt; &lt;b style="mso-bidi-font-weight: normal"&gt;hello.world.&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpMiddle" style="text-indent:-18.0pt;mso-list:l1 level1 lfo2"&gt;&lt;span style="mso-fareast-font-family:Cambria;mso-fareast-theme-font:minor-latin; mso-bidi-mso-bidi-theme-font:minor-latinfont-family:Cambria;" &gt;&lt;span style="mso-list:Ignore"&gt;5.&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;     &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;Una nueva vista es construida, basada en el árbol de componentes.&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpMiddle" style="text-indent:-18.0pt;mso-list:l1 level1 lfo2"&gt;&lt;span style="mso-fareast-font-family:Cambria;mso-fareast-theme-font:minor-latin; mso-bidi-mso-bidi-theme-font:minor-latinfont-family:Cambria;" &gt;&lt;span style="mso-list:Ignore"&gt;6.&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;     &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;La vista es rendereada como respuesta a las peticiones del cliente.&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpMiddle" style="text-indent:-18.0pt;mso-list:l1 level1 lfo2"&gt;&lt;span style="mso-fareast-font-family:Cambria;mso-fareast-theme-font:minor-latin; mso-bidi-mso-bidi-theme-font:minor-latinfont-family:Cambria;" &gt;&lt;span style="mso-list:Ignore"&gt;7.&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;     &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;El árbol de componentes es destruido automáticamente.&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpLast" style="text-indent:-18.0pt;mso-list:l1 level1 lfo2"&gt;&lt;span style="mso-fareast-font-family:Cambria;mso-fareast-theme-font:minor-latin; mso-bidi-mso-bidi-theme-font:minor-latinfont-family:Cambria;" &gt;&lt;span style="mso-list:Ignore"&gt;8.&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;     &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;En subsecuentes peticiones (postback), el árbol de componentes es reconstruido, y el estado almacenado se aplica.&lt;/p&gt;  &lt;p class="MsoNormal"&gt;Para información mas detallada sobre el ciclo de vida de JavaServer Faces, vea &lt;b style=""&gt;JavaServer Faces Specification, Version 2.0.&lt;/b&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;b style="mso-bidi-font-weight:normal"&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;b style="mso-bidi-font-weight:normal"&gt; &lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;b style=""&gt;Para Construir, Empaquetar, Desplegar y Correr la Aplicación en NetbeanIDE&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;b style="mso-bidi-font-weight:normal"&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpFirst" style="text-indent:-18.0pt;mso-list:l2 level1 lfo3"&gt;&lt;span style="mso-fareast-font-family:Cambria;mso-fareast-theme-font:minor-latin; mso-bidi-mso-bidi-theme-font:minor-latinfont-family:Cambria;" &gt;&lt;span style="mso-list:Ignore"&gt;1.&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;     &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;En el opción File del menú principal, elija Open Project.&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpMiddle" style="text-indent:-18.0pt;mso-list:l2 level1 lfo3"&gt;&lt;span style="mso-fareast-font-family:Cambria;mso-fareast-theme-font:minor-latin; mso-bidi-mso-bidi-theme-font:minor-latinfont-family:Cambria;" &gt;&lt;span style="mso-list:Ignore"&gt;2.&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;     &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;En la ventana de dialogo de Open Project, navegue hasta:&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpMiddle" style="margin-left:72.0pt;mso-add-space: auto"&gt;Tut-install/examples/web&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpMiddle" style="text-indent:-18.0pt;mso-list:l2 level1 lfo3"&gt;&lt;span style="mso-fareast-font-family:Cambria;mso-fareast-theme-font:minor-latin; mso-bidi-mso-bidi-theme-font:minor-latinfont-family:Cambria;" &gt;&lt;span style="mso-list:Ignore"&gt;3.&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;     &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;Seleccione el folder &lt;b style="mso-bidi-font-weight: normal"&gt;hello&lt;/b&gt;.&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpMiddle" style="text-indent:-18.0pt;mso-list:l2 level1 lfo3"&gt;&lt;span style="mso-fareast-font-family:Cambria;mso-fareast-theme-font:minor-latin; mso-bidi-mso-bidi-theme-font:minor-latinfont-family:Cambria;" &gt;&lt;span style="mso-list:Ignore"&gt;4.&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;     &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;Seleccione el check box &lt;b style="mso-bidi-font-weight: normal"&gt;Open as Main Project&lt;/b&gt;.&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpMiddle" style="text-indent:-18.0pt;mso-list:l2 level1 lfo3"&gt;&lt;span style="mso-fareast-font-family:Cambria;mso-fareast-theme-font:minor-latin; mso-bidi-mso-bidi-theme-font:minor-latinfont-family:Cambria;" &gt;&lt;span style="mso-list:Ignore"&gt;5.&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;     &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;De click en Open Project.&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpLast" style="text-indent:-18.0pt;mso-list:l2 level1 lfo3"&gt;&lt;span style="mso-fareast-font-family:Cambria;mso-fareast-theme-font:minor-latin; mso-bidi-mso-bidi-theme-font:minor-latinfont-family:Cambria;" &gt;&lt;span style="mso-list:Ignore"&gt;6.&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;     &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;In el tab &lt;b style="mso-bidi-font-weight:normal"&gt;Projects&lt;/b&gt;, de click derecho a el proyecto &lt;b style="mso-bidi-font-weight:normal"&gt;hello&lt;/b&gt; y ejecute.&lt;/p&gt;  &lt;p class="MsoNormal"&gt; &lt;/p&gt;  &lt;p class="MsoNormal"&gt;Estos pasos compilan, ensamblan y despliegan la aplicación y después abren una ventana del navegador donde se hace petición a la siguiente URL: &lt;/p&gt;  &lt;p class="MsoNormal"&gt; &lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;a href="http://localhost:8080/hello"&gt;http://localhost:8080/hello&lt;/a&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt; &lt;/p&gt;  &lt;p class="MsoNormal"&gt;la salida que se despliega es la siguiente:&lt;/p&gt;  &lt;p class="MsoNormal"&gt; &lt;/p&gt;  &lt;p class="MsoNormal"&gt;Hello World!&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;br /&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt; &lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;b style=""&gt;Información Adicional acerca de la tecnología JavaServer Faces&lt;/b&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;b style="mso-bidi-font-weight:normal"&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt; &lt;/p&gt;  &lt;p class="MsoNormal"&gt;Para mas información acerca de JavaServer faces, vea:&lt;/p&gt;  &lt;p class="MsoNormal"&gt; &lt;/p&gt;  &lt;p class="MsoListParagraphCxSpFirst" style="text-indent:-18.0pt;mso-list:l0 level1 lfo4"&gt;&lt;span style="font-family:Symbol;mso-fareast-font-family:Symbol;mso-bidi-font-family:Symbol;" &gt;&lt;span style="mso-list:Ignore"&gt;·&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;Especificación de JavaServer Faces 2.0:&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpMiddle" style="text-indent:34.8pt"&gt;&lt;a href="http://jcp.org/en/jsr/detail?id=314"&gt;http://jcp.org/en/jsr/detail?id=314&lt;/a&gt;&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpMiddle" style="text-indent:-18.0pt;mso-list:l0 level1 lfo4"&gt;&lt;span style="font-family:Symbol;mso-fareast-font-family:Symbol;mso-bidi-font-family:Symbol;" &gt;&lt;span style="mso-list:Ignore"&gt;·&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;Página web de la tecnología JavaServer Faces:&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpMiddle" style="margin-left:70.8pt;mso-add-space: auto"&gt;&lt;a href="http://www.oracle.com/technetwork/java/javaee/javaserverfaces-139869.html"&gt;http://www.oracle.com/technetwork/java/javaee/javaserverfaces-139869.html&lt;/a&gt;&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpMiddle" style="text-indent:-18.0pt;mso-list:l0 level1 lfo4"&gt;&lt;span style="font-family:Symbol;mso-fareast-font-family:Symbol;mso-bidi-font-family:Symbol;" &gt;&lt;span style="mso-list:Ignore"&gt;·&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;Página de descarga JavaServer Faces 2.0:&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpMiddle" style="margin-left:72.0pt;mso-add-space: auto"&gt;&lt;a href="http://www.oracle.com/technetwork/java/javaee/download-139288.html"&gt;http://www.oracle.com/technetwork/java/javaee/download-139288.html&lt;/a&gt;&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpMiddle" style="text-indent:-18.0pt;mso-list:l0 level1 lfo4"&gt;&lt;span style="font-family:Symbol;mso-fareast-font-family:Symbol;mso-bidi-font-family:Symbol;" &gt;&lt;span style="mso-list:Ignore"&gt;·&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;Notas de Mojarra (JavaServer Faces 2.0):&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpMiddle" style="margin-left:72.0pt;mso-add-space: auto"&gt;&lt;a href="http://javaserverfaces.java.net/nonav/rlnotes/2.0.0/index.html"&gt;http://javaserverfaces.java.net/nonav/rlnotes/2.0.0/index.html&lt;/a&gt;&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpLast" style="margin-left:72.0pt;mso-add-space:auto"&gt; &lt;/p&gt;  &lt;p class="MsoNormal"&gt; &lt;/p&gt;  &lt;b style="mso-bidi-font-weight:normal"&gt;&lt;span style=" font-family:Cambria;mso-ascii-theme-font:minor-latin;mso-fareast-font-family: &amp;quot;ＭＳ 明朝&amp;quot;;mso-fareast-theme-font:minor-fareast;mso-hansi-theme-font:minor-latin; mso-bidi-Times New Roman&amp;quot;;mso-bidi-theme-font:minor-bidi; mso-ansi-language:ES-TRAD;mso-fareast-language:ES;mso-bidi-language:AR-SAfont-family:&amp;quot;;font-size:12.0pt;"  &gt;&lt;/span&gt;&lt;/b&gt;  &lt;p class="MsoNormal"&gt;&lt;b style="mso-bidi-font-weight:normal"&gt; &lt;/b&gt;&lt;/p&gt;   &lt;p&gt;&lt;/p&gt;   &lt;p&gt;&lt;/p&gt;   &lt;p&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8262369655936226064-3557615052408257574?l=programacionconejemplos.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programacionconejemplos.blogspot.com/feeds/3557615052408257574/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://programacionconejemplos.blogspot.com/2011/08/crear-una-aplicacion-javaserver-faces.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8262369655936226064/posts/default/3557615052408257574'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8262369655936226064/posts/default/3557615052408257574'/><link rel='alternate' type='text/html' href='http://programacionconejemplos.blogspot.com/2011/08/crear-una-aplicacion-javaserver-faces.html' title='Crear una aplicación JavaServer Faces simple (4.4)'/><author><name>Ant</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8262369655936226064.post-6187203137538309683</id><published>2011-08-05T17:26:00.001-05:00</published><updated>2011-08-05T17:28:57.279-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaServer Faces 2.0'/><title type='text'>Beneficios de la tecnología JavaServer Faces (4.3)</title><content type='html'>&lt;b style="mso-bidi-font-weight:normal"&gt;Beneficios de la tecnología JavaServer Faces&lt;/b&gt;  &lt;p class="MsoNormal"&gt; &lt;/p&gt;  &lt;p class="MsoNormal"&gt;Una de las grandes ventajas de la tecnología JavaServer Faces es que ofrece una separación limpia entre el comportamiento y la presentación de una aplicación web.&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;Una aplicación JavaServer Faces puede mapear peticiones http hacia manejadores de eventos y manejar componentes como objetos de estado en el servidor.&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;La tecnología JavaServer Faces permite construir aplicaciones web que implementan la separación a grano fino entre el comportamiento y la presentación, que es tradicionalmente resuelta en las arquitecturas UI del lado del cliente.&lt;/p&gt;  &lt;p class="MsoNormal"&gt; &lt;/p&gt;  &lt;p class="MsoNormal"&gt;La separación de la capa de lógica de la presentación permite además, que cada miembro del equipo de desarrollo se enfoque en una simple pieza de el proceso de desarrollo y provee de un modelo simple de programación para ligar las piezas. Por ejemplo, desarrolladores de paginas con poca experiencia para programar pueden usar etiquetas de JavaServer Faces en una página web que se vinculen a objetos del lado del servidor sin la ayuda de scripts.&lt;/p&gt;  &lt;p class="MsoNormal"&gt; &lt;/p&gt;  &lt;p class="MsoNormal"&gt;Otra meta importante de tecnología JavaServer Faces es la de ser una herramienta que resulte familiar sin que limite al desarrollador a usar un lenguaje de scripts&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;o de marcado.&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;La tecnología JavaServer Faces ha sido puesta directamente encima de la API de los Servlets como se muestra en la siguiente figura.&lt;/p&gt;  &lt;p class="MsoNormal"&gt; &lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;a href="http://1.bp.blogspot.com/--g8zh_7t8As/TjxufueU1-I/AAAAAAAAAbs/1zTQsaI9kQ0/s1600/diagrama%2Bjavaserver%2Bfaces.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 106px;" src="http://1.bp.blogspot.com/--g8zh_7t8As/TjxufueU1-I/AAAAAAAAAbs/1zTQsaI9kQ0/s320/diagrama%2Bjavaserver%2Bfaces.png" alt="" id="BLOGGER_PHOTO_ID_5637502324891244514" border="0" /&gt;&lt;/a&gt;Esta separación de capas permite la implementación de diversos casos de uso, &lt;span style="mso-spacerun:yes"&gt; &lt;/span&gt;crear componentes propios directamente de las clases y generar salidas para diferentes dispositivos.&lt;/p&gt;  &lt;p class="MsoNormal"&gt; &lt;/p&gt;  &lt;p class="MsoNormal"&gt;La tecnología Facelets, disponible como parte de JavaServer Faces 2.0, es ahora la tecnología presentación deseada para construir aplicaciones web basadas en JavaServer Faces.&lt;span style="mso-spacerun:yes"&gt;   &lt;/span&gt;Para mas información sobre las características de Facelets, vea el capitulo siguiente.&lt;/p&gt;  &lt;p class="MsoNormal"&gt; &lt;/p&gt;  &lt;p class="MsoNormal"&gt;La tecnología Facelets ofrece varias ventajas:&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpFirst" style="text-indent:-18.0pt;mso-list:l0 level1 lfo1"&gt;&lt;span style="font-family:Symbol;mso-fareast-font-family:Symbol;mso-bidi-font-family:Symbol;" &gt;&lt;span style="mso-list:Ignore"&gt;·&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;El código puede ser reutilizado y ampliado para los componentes a través de la plantilla y características compuestas de componentes.&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpMiddle" style="text-indent:-18.0pt;mso-list:l0 level1 lfo1"&gt;&lt;span style="font-family:Symbol;mso-fareast-font-family:Symbol;mso-bidi-font-family:Symbol;" &gt;&lt;span style="mso-list:Ignore"&gt;·&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;Cuando se usan las anotaciones de JavaServer Faces, es posible registrar el bean de respaldo como un recurso disponible para aplicaciones JavaServer Faces.&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;Además, las reglas de Navegación Implícita permiten a los desarrolladores configurar rápidamente la navegación de la aplicación.&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;Estas características reducen el proceso de configuración manual para aplicaciones.&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpLast" style="text-indent:-18.0pt;mso-list:l0 level1 lfo1"&gt;&lt;span style="font-family:Symbol;mso-fareast-font-family:Symbol;mso-bidi-font-family:Symbol;" &gt;&lt;span style="mso-list:Ignore"&gt;·&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;Mas importante, JavaServer Faces provee una arquitectura rica para manejar el estado de los componentes, procesando datos de los componentes, validando entradas de usuarios y manejando eventos.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8262369655936226064-6187203137538309683?l=programacionconejemplos.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programacionconejemplos.blogspot.com/feeds/6187203137538309683/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://programacionconejemplos.blogspot.com/2011/08/beneficios-de-la-tecnologia-javaserver.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8262369655936226064/posts/default/6187203137538309683'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8262369655936226064/posts/default/6187203137538309683'/><link rel='alternate' type='text/html' href='http://programacionconejemplos.blogspot.com/2011/08/beneficios-de-la-tecnologia-javaserver.html' title='Beneficios de la tecnología JavaServer Faces (4.3)'/><author><name>Ant</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/--g8zh_7t8As/TjxufueU1-I/AAAAAAAAAbs/1zTQsaI9kQ0/s72-c/diagrama%2Bjavaserver%2Bfaces.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8262369655936226064.post-7194759901139321718</id><published>2011-08-05T17:25:00.002-05:00</published><updated>2011-08-05T17:37:29.145-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaServer Faces 2.0'/><title type='text'>¿Que es una aplicación JavaServer Faces? (4.2)</title><content type='html'>&lt;style&gt; &lt;!--  /* Font Definitions */ @font-face  {font-family:"Courier New";  panose-1:2 7 3 9 2 2 5 2 4 4;  mso-font-charset:0;  mso-generic-font-family:auto;  mso-font-pitch:variable;  mso-font-signature:3 0 0 0 1 0;} @font-face  {font-family:Times;  panose-1:2 0 5 0 0 0 0 0 0 0;  mso-font-charset:0;  mso-generic-font-family:auto;  mso-font-pitch:variable;  mso-font-signature:3 0 0 0 1 0;} @font-face  {font-family:Wingdings;  panose-1:5 0 0 0 0 0 0 0 0 0;  mso-font-charset:2;  mso-generic-font-family:auto;  mso-font-pitch:variable;  mso-font-signature:0 268435456 0 0 -2147483648 0;} @font-face  {font-family:"ＭＳ 明朝";  panose-1:0 0 0 0 0 0 0 0 0 0;  mso-font-charset:128;  mso-generic-font-family:roman;  mso-font-format:other;  mso-font-pitch:fixed;  mso-font-signature:1 134676480 16 0 131072 0;} @font-face  {font-family:"Cambria Math";  panose-1:2 4 5 3 5 4 6 3 2 4;  mso-font-charset:1;  mso-generic-font-family:roman;  mso-font-format:other;  mso-font-pitch:variable;  mso-font-signature:0 0 0 0 0 0;} @font-face  {font-family:Cambria;  panose-1:2 4 5 3 5 4 6 3 2 4;  mso-font-charset:0;  mso-generic-font-family:auto;  mso-font-pitch:variable;  mso-font-signature:3 0 0 0 1 0;}  /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal  {mso-style-unhide:no;  mso-style-qformat:yes;  mso-style-parent:"";  margin:0cm;  margin-bottom:.0001pt;  mso-pagination:widow-orphan;  font-size:12.0pt;  font-family:Cambria;  mso-ascii-font-family:Cambria;  mso-ascii-theme-font:minor-latin;  mso-fareast-font-family:"ＭＳ 明朝";  mso-fareast-theme-font:minor-fareast;  mso-hansi-font-family:Cambria;  mso-hansi-theme-font:minor-latin;  mso-bidi-font-family:"Times New Roman";  mso-bidi-theme-font:minor-bidi;} p.MsoListParagraph, li.MsoListParagraph, div.MsoListParagraph  {mso-style-priority:34;  mso-style-unhide:no;  mso-style-qformat:yes;  margin-top:0cm;  margin-right:0cm;  margin-bottom:0cm;  margin-left:36.0pt;  margin-bottom:.0001pt;  mso-add-space:auto;  mso-pagination:widow-orphan;  font-size:12.0pt;  font-family:Cambria;  mso-ascii-font-family:Cambria;  mso-ascii-theme-font:minor-latin;  mso-fareast-font-family:"ＭＳ 明朝";  mso-fareast-theme-font:minor-fareast;  mso-hansi-font-family:Cambria;  mso-hansi-theme-font:minor-latin;  mso-bidi-font-family:"Times New Roman";  mso-bidi-theme-font:minor-bidi;} p.MsoListParagraphCxSpFirst, li.MsoListParagraphCxSpFirst, div.MsoListParagraphCxSpFirst  {mso-style-priority:34;  mso-style-unhide:no;  mso-style-qformat:yes;  mso-style-type:export-only;  margin-top:0cm;  margin-right:0cm;  margin-bottom:0cm;  margin-left:36.0pt;  margin-bottom:.0001pt;  mso-add-space:auto;  mso-pagination:widow-orphan;  font-size:12.0pt;  font-family:Cambria;  mso-ascii-font-family:Cambria;  mso-ascii-theme-font:minor-latin;  mso-fareast-font-family:"ＭＳ 明朝";  mso-fareast-theme-font:minor-fareast;  mso-hansi-font-family:Cambria;  mso-hansi-theme-font:minor-latin;  mso-bidi-font-family:"Times New Roman";  mso-bidi-theme-font:minor-bidi;} p.MsoListParagraphCxSpMiddle, li.MsoListParagraphCxSpMiddle, div.MsoListParagraphCxSpMiddle  {mso-style-priority:34;  mso-style-unhide:no;  mso-style-qformat:yes;  mso-style-type:export-only;  margin-top:0cm;  margin-right:0cm;  margin-bottom:0cm;  margin-left:36.0pt;  margin-bottom:.0001pt;  mso-add-space:auto;  mso-pagination:widow-orphan;  font-size:12.0pt;  font-family:Cambria;  mso-ascii-font-family:Cambria;  mso-ascii-theme-font:minor-latin;  mso-fareast-font-family:"ＭＳ 明朝";  mso-fareast-theme-font:minor-fareast;  mso-hansi-font-family:Cambria;  mso-hansi-theme-font:minor-latin;  mso-bidi-font-family:"Times New Roman";  mso-bidi-theme-font:minor-bidi;} p.MsoListParagraphCxSpLast, li.MsoListParagraphCxSpLast, div.MsoListParagraphCxSpLast  {mso-style-priority:34;  mso-style-unhide:no;  mso-style-qformat:yes;  mso-style-type:export-only;  margin-top:0cm;  margin-right:0cm;  margin-bottom:0cm;  margin-left:36.0pt;  margin-bottom:.0001pt;  mso-add-space:auto;  mso-pagination:widow-orphan;  font-size:12.0pt;  font-family:Cambria;  mso-ascii-font-family:Cambria;  mso-ascii-theme-font:minor-latin;  mso-fareast-font-family:"ＭＳ 明朝";  mso-fareast-theme-font:minor-fareast;  mso-hansi-font-family:Cambria;  mso-hansi-theme-font:minor-latin;  mso-bidi-font-family:"Times New Roman";  mso-bidi-theme-font:minor-bidi;} .MsoChpDefault  {mso-style-type:export-only;  mso-default-props:yes;  font-family:Cambria;  mso-ascii-font-family:Cambria;  mso-ascii-theme-font:minor-latin;  mso-fareast-font-family:"ＭＳ 明朝";  mso-fareast-theme-font:minor-fareast;  mso-hansi-font-family:Cambria;  mso-hansi-theme-font:minor-latin;  mso-bidi-font-family:"Times New Roman";  mso-bidi-theme-font:minor-bidi;} @page WordSection1  {size:612.0pt 792.0pt;  margin:70.85pt 3.0cm 70.85pt 3.0cm;  mso-header-margin:36.0pt;  mso-footer-margin:36.0pt;  mso-paper-source:0;} div.WordSection1  {page:WordSection1;}  /* List Definitions */ @list l0  {mso-list-id:342977007;  mso-list-type:hybrid;  mso-list-template-ids:-1638924218 201981953 201981955 201981957 201981953 201981955 201981957 201981953 201981955 201981957;} @list l0:level1  {mso-level-number-format:bullet;  mso-level-text:;  mso-level-tab-stop:none;  mso-level-number-position:left;  text-indent:-18.0pt;  font-family:Symbol;} @list l0:level2  {mso-level-number-format:bullet;  mso-level-text:o;  mso-level-tab-stop:none;  mso-level-number-position:left;  text-indent:-18.0pt;  font-family:"Courier New";} @list l0:level3  {mso-level-number-format:bullet;  mso-level-text:;  mso-level-tab-stop:none;  mso-level-number-position:left;  text-indent:-18.0pt;  font-family:Wingdings;} @list l0:level4  {mso-level-number-format:bullet;  mso-level-text:;  mso-level-tab-stop:none;  mso-level-number-position:left;  text-indent:-18.0pt;  font-family:Symbol;} @list l0:level5  {mso-level-number-format:bullet;  mso-level-text:o;  mso-level-tab-stop:none;  mso-level-number-position:left;  text-indent:-18.0pt;  font-family:"Courier New";} @list l0:level6  {mso-level-number-format:bullet;  mso-level-text:;  mso-level-tab-stop:none;  mso-level-number-position:left;  text-indent:-18.0pt;  font-family:Wingdings;} @list l0:level7  {mso-level-number-format:bullet;  mso-level-text:;  mso-level-tab-stop:none;  mso-level-number-position:left;  text-indent:-18.0pt;  font-family:Symbol;} @list l0:level8  {mso-level-number-format:bullet;  mso-level-text:o;  mso-level-tab-stop:none;  mso-level-number-position:left;  text-indent:-18.0pt;  font-family:"Courier New";} @list l0:level9  {mso-level-number-format:bullet;  mso-level-text:;  mso-level-tab-stop:none;  mso-level-number-position:left;  text-indent:-18.0pt;  font-family:Wingdings;} @list l1  {mso-list-id:1547185277;  mso-list-type:hybrid;  mso-list-template-ids:-812091734 201981953 201981955 201981957 201981953 201981955 201981957 201981953 201981955 201981957;} @list l1:level1  {mso-level-number-format:bullet;  mso-level-text:;  mso-level-tab-stop:none;  mso-level-number-position:left;  text-indent:-18.0pt;  font-family:Symbol;} @list l1:level2  {mso-level-number-format:bullet;  mso-level-text:o;  mso-level-tab-stop:none;  mso-level-number-position:left;  text-indent:-18.0pt;  font-family:"Courier New";} @list l1:level3  {mso-level-number-format:bullet;  mso-level-text:;  mso-level-tab-stop:none;  mso-level-number-position:left;  text-indent:-18.0pt;  font-family:Wingdings;} @list l1:level4  {mso-level-number-format:bullet;  mso-level-text:;  mso-level-tab-stop:none;  mso-level-number-position:left;  text-indent:-18.0pt;  font-family:Symbol;} @list l1:level5  {mso-level-number-format:bullet;  mso-level-text:o;  mso-level-tab-stop:none;  mso-level-number-position:left;  text-indent:-18.0pt;  font-family:"Courier New";} @list l1:level6  {mso-level-number-format:bullet;  mso-level-text:;  mso-level-tab-stop:none;  mso-level-number-position:left;  text-indent:-18.0pt;  font-family:Wingdings;} @list l1:level7  {mso-level-number-format:bullet;  mso-level-text:;  mso-level-tab-stop:none;  mso-level-number-position:left;  text-indent:-18.0pt;  font-family:Symbol;} @list l1:level8  {mso-level-number-format:bullet;  mso-level-text:o;  mso-level-tab-stop:none;  mso-level-number-position:left;  text-indent:-18.0pt;  font-family:"Courier New";} @list l1:level9  {mso-level-number-format:bullet;  mso-level-text:;  mso-level-tab-stop:none;  mso-level-number-position:left;  text-indent:-18.0pt;  font-family:Wingdings;} ol  {margin-bottom:0cm;} ul  {margin-bottom:0cm;} -- &lt;/style&gt;     &lt;p class="MsoNormal"&gt;&lt;b style=""&gt;¿Que es una aplicación JavaServer Faces?&lt;/b&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;b style="mso-bidi-font-weight:normal"&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt; &lt;/p&gt;  &lt;p class="MsoNormal"&gt;La funcionalidad que provee una aplicación hecha con JavaServer Faces es similar a cualquier otra aplicación.&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;Una aplicación típica de JavaServer Faces incluye las siguientes partes:&lt;/p&gt;  &lt;p class="MsoNormal"&gt; &lt;/p&gt;  &lt;p class="MsoListParagraphCxSpFirst" style="text-indent:-18.0pt;mso-list:l0 level1 lfo1"&gt;&lt;span style="font-family:Symbol;mso-fareast-font-family:Symbol;mso-bidi-font-family:Symbol;" &gt;&lt;span style="mso-list:Ignore"&gt;·&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;Un conjunto de páginas en las cuales se disponen los componentes.&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpMiddle" style="text-indent:-18.0pt;mso-list:l0 level1 lfo1"&gt;&lt;span style="font-family:Symbol;mso-fareast-font-family:Symbol;mso-bidi-font-family:Symbol;" &gt;&lt;span style="mso-list:Ignore"&gt;·&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;Un conjunto de etiquetas para agregar componentes a una página web.&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpMiddle" style="text-indent:-18.0pt;mso-list:l0 level1 lfo1"&gt;&lt;span style="font-family:Symbol;mso-fareast-font-family:Symbol;mso-bidi-font-family:Symbol;" &gt;&lt;span style="mso-list:Ignore"&gt;·&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;Un conjunto de beans de apoyo o de respaldo (&lt;b style="mso-bidi-font-weight:normal"&gt;backing beans&lt;/b&gt;), que son JavaBeans que definen&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;las propiedades y funciones para los componentes en la página.&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpMiddle" style="text-indent:-18.0pt;mso-list:l0 level1 lfo1"&gt;&lt;span style="font-family:Symbol;mso-fareast-font-family:Symbol;mso-bidi-font-family:Symbol;" &gt;&lt;span style="mso-list:Ignore"&gt;·&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;Un descriptor de despliegue web (web.xml)&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpMiddle" style="text-indent:-18.0pt;mso-list:l0 level1 lfo1"&gt;&lt;span style="font-family:Symbol;mso-fareast-font-family:Symbol;mso-bidi-font-family:Symbol;" &gt;&lt;span style="mso-list:Ignore"&gt;·&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;Opcionalmente, uno o mas archivos de configuración de la aplicación, tales como el archivo &lt;b style="mso-bidi-font-weight: normal"&gt;faces-config.xml&lt;/b&gt;, el cual es usado para definir reglas de navegación y configurar beans y configurar otros objetos, como componentes personalizados.&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpMiddle" style="text-indent:-18.0pt;mso-list:l0 level1 lfo1"&gt;&lt;span style="font-family:Symbol;mso-fareast-font-family:Symbol;mso-bidi-font-family:Symbol;" &gt;&lt;span style="mso-list:Ignore"&gt;·&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;Opcionalmente, un conjunto de objetos personalizados, los cuales pueden incluir componentes personalizados, validadores, convertidores, escuchadores, creados por el desarrollador de la aplicación.&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpLast" style="text-indent:-18.0pt;mso-list:l0 level1 lfo1"&gt;&lt;span style="font-family:Symbol;mso-fareast-font-family:Symbol;mso-bidi-font-family:Symbol;" &gt;&lt;span style="mso-list:Ignore"&gt;·&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;Un conjunto de etiquetas personalizadas para representar objetos personalizados en una página.&lt;/p&gt;  &lt;p class="MsoNormal"&gt; &lt;/p&gt;  &lt;p class="MsoNormal" style="text-align:center" align="center"&gt;&lt;a href="http://2.bp.blogspot.com/--zsAWdqt7Xg/TjxwmmSx1pI/AAAAAAAAAb8/HFszqVw4bsY/s1600/diagrama%2Bgeneral%2Bjavaserver%2Bfaces.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 118px;" src="http://2.bp.blogspot.com/--zsAWdqt7Xg/TjxwmmSx1pI/AAAAAAAAAb8/HFszqVw4bsY/s320/diagrama%2Bgeneral%2Bjavaserver%2Bfaces.png" alt="" id="BLOGGER_PHOTO_ID_5637504641977669266" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="font-family: Times;font-family:&amp;quot;;font-size:85%;"  &gt;Figura 4.1&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;Muestra la interacción entre el cliente y el servidor en un aplicación JavaServer Faces típica. En respuesta a la petición del cliente, una página web es rendereada por el contenedor web que implementa la tecnología JavaServer Faces.&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-family:Times;mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;;mso-bidi-Times New Roman&amp;quot;font-family:&amp;quot;;font-size:85%;"  &gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt; &lt;/p&gt;  &lt;p class="MsoNormal"&gt;La página web, myfacelet.xhtml, es construida usando etiquetas de componentes JavaServer Faces.&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;Las etiquetas de componentes son usadas para agregar componentes a la vista (representada por myUI en el diagrama), la cual es la representación del lado del servidor, de la página. Adicionalmente a los componentes, la página web hace referencia a objetos, tales como:&lt;/p&gt;  &lt;p class="MsoNormal"&gt; &lt;/p&gt;  &lt;p class="MsoListParagraphCxSpFirst" style="text-indent:-18.0pt;mso-list:l1 level1 lfo2"&gt;&lt;span style="font-family:Symbol;mso-fareast-font-family:Symbol;mso-bidi-font-family:Symbol;" &gt;&lt;span style="mso-list:Ignore"&gt;·&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;Cualquier escuchador, validador, y convertidores que son registrados en los componentes.&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpLast" style="text-indent:-18.0pt;mso-list:l1 level1 lfo2"&gt;&lt;span style="font-family:Symbol;mso-fareast-font-family:Symbol;mso-bidi-font-family:Symbol;" &gt;&lt;span style="mso-list:Ignore"&gt;·&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;Los componentes JavaBeans que capturan los datos y procesan la funcionalidad especifica de los componentes de la aplicación.&lt;/p&gt;  &lt;p class="MsoNormal"&gt; &lt;/p&gt;  &lt;p class="MsoNormal"&gt;Con una petición del lado del cliente, la vista es rendereada como respuesta.&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;El rendering&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;es el proceso mediante el cual, basado en la vista de lado del servidor,&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;el contenedor web genera una salida, que puede ser HTML o XHTML, que a su vez puede ser leída y mostrada por el navegador.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8262369655936226064-7194759901139321718?l=programacionconejemplos.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programacionconejemplos.blogspot.com/feeds/7194759901139321718/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://programacionconejemplos.blogspot.com/2011/08/que-es-una-aplicacion-javaserver-faces.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8262369655936226064/posts/default/7194759901139321718'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8262369655936226064/posts/default/7194759901139321718'/><link rel='alternate' type='text/html' href='http://programacionconejemplos.blogspot.com/2011/08/que-es-una-aplicacion-javaserver-faces.html' title='¿Que es una aplicación JavaServer Faces? (4.2)'/><author><name>Ant</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/--zsAWdqt7Xg/TjxwmmSx1pI/AAAAAAAAAb8/HFszqVw4bsY/s72-c/diagrama%2Bgeneral%2Bjavaserver%2Bfaces.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8262369655936226064.post-3926126103113573263</id><published>2011-08-05T17:19:00.002-05:00</published><updated>2011-08-05T17:25:14.915-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaServer Faces 2.0'/><title type='text'>JavaServer Faces 2.0 (4.1)</title><content type='html'>&lt;style&gt; &lt;!--  /* Font Definitions */ @font-face  {font-family:"Courier New";  panose-1:2 7 3 9 2 2 5 2 4 4;  mso-font-charset:0;  mso-generic-font-family:auto;  mso-font-pitch:variable;  mso-font-signature:3 0 0 0 1 0;} @font-face  {font-family:Wingdings;  panose-1:5 0 0 0 0 0 0 0 0 0;  mso-font-charset:2;  mso-generic-font-family:auto;  mso-font-pitch:variable;  mso-font-signature:0 268435456 0 0 -2147483648 0;} @font-face  {font-family:"ＭＳ 明朝";  panose-1:0 0 0 0 0 0 0 0 0 0;  mso-font-charset:128;  mso-generic-font-family:roman;  mso-font-format:other;  mso-font-pitch:fixed;  mso-font-signature:1 134676480 16 0 131072 0;} @font-face  {font-family:"ＭＳ 明朝";  panose-1:0 0 0 0 0 0 0 0 0 0;  mso-font-charset:128;  mso-generic-font-family:roman;  mso-font-format:other;  mso-font-pitch:fixed;  mso-font-signature:1 134676480 16 0 131072 0;} @font-face  {font-family:Cambria;  panose-1:2 4 5 3 5 4 6 3 2 4;  mso-font-charset:0;  mso-generic-font-family:auto;  mso-font-pitch:variable;  mso-font-signature:3 0 0 0 1 0;}  /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal  {mso-style-unhide:no;  mso-style-qformat:yes;  mso-style-parent:"";  margin:0cm;  margin-bottom:.0001pt;  mso-pagination:widow-orphan;  font-size:12.0pt;  font-family:Cambria;  mso-ascii-font-family:Cambria;  mso-ascii-theme-font:minor-latin;  mso-fareast-font-family:"ＭＳ 明朝";  mso-fareast-theme-font:minor-fareast;  mso-hansi-font-family:Cambria;  mso-hansi-theme-font:minor-latin;  mso-bidi-font-family:"Times New Roman";  mso-bidi-theme-font:minor-bidi;} p.MsoListParagraph, li.MsoListParagraph, div.MsoListParagraph  {mso-style-priority:34;  mso-style-unhide:no;  mso-style-qformat:yes;  margin-top:0cm;  margin-right:0cm;  margin-bottom:0cm;  margin-left:36.0pt;  margin-bottom:.0001pt;  mso-add-space:auto;  mso-pagination:widow-orphan;  font-size:12.0pt;  font-family:Cambria;  mso-ascii-font-family:Cambria;  mso-ascii-theme-font:minor-latin;  mso-fareast-font-family:"ＭＳ 明朝";  mso-fareast-theme-font:minor-fareast;  mso-hansi-font-family:Cambria;  mso-hansi-theme-font:minor-latin;  mso-bidi-font-family:"Times New Roman";  mso-bidi-theme-font:minor-bidi;} p.MsoListParagraphCxSpFirst, li.MsoListParagraphCxSpFirst, div.MsoListParagraphCxSpFirst  {mso-style-priority:34;  mso-style-unhide:no;  mso-style-qformat:yes;  mso-style-type:export-only;  margin-top:0cm;  margin-right:0cm;  margin-bottom:0cm;  margin-left:36.0pt;  margin-bottom:.0001pt;  mso-add-space:auto;  mso-pagination:widow-orphan;  font-size:12.0pt;  font-family:Cambria;  mso-ascii-font-family:Cambria;  mso-ascii-theme-font:minor-latin;  mso-fareast-font-family:"ＭＳ 明朝";  mso-fareast-theme-font:minor-fareast;  mso-hansi-font-family:Cambria;  mso-hansi-theme-font:minor-latin;  mso-bidi-font-family:"Times New Roman";  mso-bidi-theme-font:minor-bidi;} p.MsoListParagraphCxSpMiddle, li.MsoListParagraphCxSpMiddle, div.MsoListParagraphCxSpMiddle  {mso-style-priority:34;  mso-style-unhide:no;  mso-style-qformat:yes;  mso-style-type:export-only;  margin-top:0cm;  margin-right:0cm;  margin-bottom:0cm;  margin-left:36.0pt;  margin-bottom:.0001pt;  mso-add-space:auto;  mso-pagination:widow-orphan;  font-size:12.0pt;  font-family:Cambria;  mso-ascii-font-family:Cambria;  mso-ascii-theme-font:minor-latin;  mso-fareast-font-family:"ＭＳ 明朝";  mso-fareast-theme-font:minor-fareast;  mso-hansi-font-family:Cambria;  mso-hansi-theme-font:minor-latin;  mso-bidi-font-family:"Times New Roman";  mso-bidi-theme-font:minor-bidi;} p.MsoListParagraphCxSpLast, li.MsoListParagraphCxSpLast, div.MsoListParagraphCxSpLast  {mso-style-priority:34;  mso-style-unhide:no;  mso-style-qformat:yes;  mso-style-type:export-only;  margin-top:0cm;  margin-right:0cm;  margin-bottom:0cm;  margin-left:36.0pt;  margin-bottom:.0001pt;  mso-add-space:auto;  mso-pagination:widow-orphan;  font-size:12.0pt;  font-family:Cambria;  mso-ascii-font-family:Cambria;  mso-ascii-theme-font:minor-latin;  mso-fareast-font-family:"ＭＳ 明朝";  mso-fareast-theme-font:minor-fareast;  mso-hansi-font-family:Cambria;  mso-hansi-theme-font:minor-latin;  mso-bidi-font-family:"Times New Roman";  mso-bidi-theme-font:minor-bidi;} .MsoChpDefault  {mso-style-type:export-only;  mso-default-props:yes;  font-family:Cambria;  mso-ascii-font-family:Cambria;  mso-ascii-theme-font:minor-latin;  mso-fareast-font-family:"ＭＳ 明朝";  mso-fareast-theme-font:minor-fareast;  mso-hansi-font-family:Cambria;  mso-hansi-theme-font:minor-latin;  mso-bidi-font-family:"Times New Roman";  mso-bidi-theme-font:minor-bidi;} @page WordSection1  {size:612.0pt 792.0pt;  margin:70.85pt 3.0cm 70.85pt 3.0cm;  mso-header-margin:36.0pt;  mso-footer-margin:36.0pt;  mso-paper-source:0;} div.WordSection1  {page:WordSection1;}  /* List Definitions */ @list l0  {mso-list-id:1499031595;  mso-list-type:hybrid;  mso-list-template-ids:121825168 201981953 201981955 201981957 201981953 201981955 201981957 201981953 201981955 201981957;} @list l0:level1  {mso-level-number-format:bullet;  mso-level-text:;  mso-level-tab-stop:none;  mso-level-number-position:left;  text-indent:-18.0pt;  font-family:Symbol;} @list l0:level2  {mso-level-number-format:bullet;  mso-level-text:o;  mso-level-tab-stop:none;  mso-level-number-position:left;  text-indent:-18.0pt;  font-family:"Courier New";} @list l0:level3  {mso-level-number-format:bullet;  mso-level-text:;  mso-level-tab-stop:none;  mso-level-number-position:left;  text-indent:-18.0pt;  font-family:Wingdings;} @list l0:level4  {mso-level-number-format:bullet;  mso-level-text:;  mso-level-tab-stop:none;  mso-level-number-position:left;  text-indent:-18.0pt;  font-family:Symbol;} @list l0:level5  {mso-level-number-format:bullet;  mso-level-text:o;  mso-level-tab-stop:none;  mso-level-number-position:left;  text-indent:-18.0pt;  font-family:"Courier New";} @list l0:level6  {mso-level-number-format:bullet;  mso-level-text:;  mso-level-tab-stop:none;  mso-level-number-position:left;  text-indent:-18.0pt;  font-family:Wingdings;} @list l0:level7  {mso-level-number-format:bullet;  mso-level-text:;  mso-level-tab-stop:none;  mso-level-number-position:left;  text-indent:-18.0pt;  font-family:Symbol;} @list l0:level8  {mso-level-number-format:bullet;  mso-level-text:o;  mso-level-tab-stop:none;  mso-level-number-position:left;  text-indent:-18.0pt;  font-family:"Courier New";} @list l0:level9  {mso-level-number-format:bullet;  mso-level-text:;  mso-level-tab-stop:none;  mso-level-number-position:left;  text-indent:-18.0pt;  font-family:Wingdings;} @list l1  {mso-list-id:1890846646;  mso-list-type:hybrid;  mso-list-template-ids:355875766 201981953 201981955 201981957 201981953 201981955 201981957 201981953 201981955 201981957;} @list l1:level1  {mso-level-number-format:bullet;  mso-level-text:;  mso-level-tab-stop:none;  mso-level-number-position:left;  text-indent:-18.0pt;  font-family:Symbol;} @list l1:level2  {mso-level-number-format:bullet;  mso-level-text:o;  mso-level-tab-stop:none;  mso-level-number-position:left;  text-indent:-18.0pt;  font-family:"Courier New";} @list l1:level3  {mso-level-number-format:bullet;  mso-level-text:;  mso-level-tab-stop:none;  mso-level-number-position:left;  text-indent:-18.0pt;  font-family:Wingdings;} @list l1:level4  {mso-level-number-format:bullet;  mso-level-text:;  mso-level-tab-stop:none;  mso-level-number-position:left;  text-indent:-18.0pt;  font-family:Symbol;} @list l1:level5  {mso-level-number-format:bullet;  mso-level-text:o;  mso-level-tab-stop:none;  mso-level-number-position:left;  text-indent:-18.0pt;  font-family:"Courier New";} @list l1:level6  {mso-level-number-format:bullet;  mso-level-text:;  mso-level-tab-stop:none;  mso-level-number-position:left;  text-indent:-18.0pt;  font-family:Wingdings;} @list l1:level7  {mso-level-number-format:bullet;  mso-level-text:;  mso-level-tab-stop:none;  mso-level-number-position:left;  text-indent:-18.0pt;  font-family:Symbol;} @list l1:level8  {mso-level-number-format:bullet;  mso-level-text:o;  mso-level-tab-stop:none;  mso-level-number-position:left;  text-indent:-18.0pt;  font-family:"Courier New";} @list l1:level9  {mso-level-number-format:bullet;  mso-level-text:;  mso-level-tab-stop:none;  mso-level-number-position:left;  text-indent:-18.0pt;  font-family:Wingdings;} @list l2  {mso-list-id:2131900842;  mso-list-type:hybrid;  mso-list-template-ids:-437984294 201981953 201981955 201981957 201981953 201981955 201981957 201981953 201981955 201981957;} @list l2:level1  {mso-level-number-format:bullet;  mso-level-text:;  mso-level-tab-stop:none;  mso-level-number-position:left;  text-indent:-18.0pt;  font-family:Symbol;} @list l2:level2  {mso-level-number-format:bullet;  mso-level-text:o;  mso-level-tab-stop:none;  mso-level-number-position:left;  text-indent:-18.0pt;  font-family:"Courier New";} @list l2:level3  {mso-level-number-format:bullet;  mso-level-text:;  mso-level-tab-stop:none;  mso-level-number-position:left;  text-indent:-18.0pt;  font-family:Wingdings;} @list l2:level4  {mso-level-number-format:bullet;  mso-level-text:;  mso-level-tab-stop:none;  mso-level-number-position:left;  text-indent:-18.0pt;  font-family:Symbol;} @list l2:level5  {mso-level-number-format:bullet;  mso-level-text:o;  mso-level-tab-stop:none;  mso-level-number-position:left;  text-indent:-18.0pt;  font-family:"Courier New";} @list l2:level6  {mso-level-number-format:bullet;  mso-level-text:;  mso-level-tab-stop:none;  mso-level-number-position:left;  text-indent:-18.0pt;  font-family:Wingdings;} @list l2:level7  {mso-level-number-format:bullet;  mso-level-text:;  mso-level-tab-stop:none;  mso-level-number-position:left;  text-indent:-18.0pt;  font-family:Symbol;} @list l2:level8  {mso-level-number-format:bullet;  mso-level-text:o;  mso-level-tab-stop:none;  mso-level-number-position:left;  text-indent:-18.0pt;  font-family:"Courier New";} @list l2:level9  {mso-level-number-format:bullet;  mso-level-text:;  mso-level-tab-stop:none;  mso-level-number-position:left;  text-indent:-18.0pt;  font-family:Wingdings;} ol  {margin-bottom:0cm;} ul  {margin-bottom:0cm;} --&gt; &lt;/style&gt;     &lt;p class="MsoNormal"&gt;&lt;span style="font-size:85%;"&gt;El contenido de este articulo es la traducción del tutorial publicado por Orale y disponible en:&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size:85%;"&gt; http://download.oracle.com/javaee/6/tutorial/doc/bnaph.html&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;b style=""&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;b style="mso-bidi-font-weight:normal"&gt;Capitulo 4&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;b style="mso-bidi-font-weight:normal"&gt; &lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;b style="mso-bidi-font-weight:normal"&gt;Tecnología JavaServer Faces&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt; &lt;/p&gt;  &lt;p class="MsoNormal"&gt;La tecnología de JavaServer Faces es un marco de trabajo (&lt;b style="mso-bidi-font-weight:normal"&gt;Framework&lt;/b&gt;) del lado de servidor cuya funcionalidad permite construir aplicaciones Web.&lt;/p&gt;  &lt;p class="MsoNormal"&gt; &lt;/p&gt;  &lt;p class="MsoNormal"&gt;La tecnología JavaServer Faces consiste de lo siguiente:&lt;/p&gt;  &lt;p class="MsoNormal"&gt; &lt;/p&gt;  &lt;p class="MsoListParagraphCxSpFirst" style="text-indent:-18.0pt;mso-list:l2 level1 lfo1"&gt;&lt;span style="font-family:Symbol;mso-fareast-font-family:Symbol;mso-bidi-font-family:Symbol;" &gt;&lt;span style="mso-list:Ignore"&gt;·&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;Una API para representar componentes y manejar su estado; manejar eventos, validaciones del lado del servidor y conversión de datos; permite definir la navegación entre páginas; suporte para internacionalización y accesibilidad; también permite extender todas estas características.&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpLast" style="text-indent:-18.0pt;mso-list:l2 level1 lfo1"&gt;&lt;span style="font-family:Symbol;mso-fareast-font-family:Symbol;mso-bidi-font-family:Symbol;" &gt;&lt;span style="mso-list:Ignore"&gt;·&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;Librerías de etiquetas&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;para agregar componentes a páginas web y para conectar componentes con objetos del lado del servidor.&lt;/p&gt;  &lt;p class="MsoNormal"&gt; &lt;/p&gt;  &lt;p class="MsoNormal"&gt;La tecnología JavaServer Faces provee un modelo de programación bien definido y varias librerías de etiquetas.&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;Estas características facilitan la carga de construcción y mantenimiento de aplicaciones web con interfaces de usuario del lado del&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;servidor. Con mínimo esfuerzo, se pueden realizar las siguientes tareas.&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpFirst" style="text-indent:-18.0pt;mso-list:l0 level1 lfo2"&gt;&lt;span style="font-family:Symbol;mso-fareast-font-family:Symbol;mso-bidi-font-family:Symbol;" &gt;&lt;span style="mso-list:Ignore"&gt;·&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;Crear páginas web&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpMiddle" style="text-indent:-18.0pt;mso-list:l0 level1 lfo2"&gt;&lt;span style="font-family:Symbol;mso-fareast-font-family:Symbol;mso-bidi-font-family:Symbol;" &gt;&lt;span style="mso-list:Ignore"&gt;·&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;Insertar componentes en una página usando etiquetas.&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpMiddle" style="text-indent:-18.0pt;mso-list:l0 level1 lfo2"&gt;&lt;span style="font-family:Symbol;mso-fareast-font-family:Symbol;mso-bidi-font-family:Symbol;" &gt;&lt;span style="mso-list:Ignore"&gt;·&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;Ligar componentes de una página a datos de lado del servidor.&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpMiddle" style="text-indent:-18.0pt;mso-list:l0 level1 lfo2"&gt;&lt;span style="font-family:Symbol;mso-fareast-font-family:Symbol;mso-bidi-font-family:Symbol;" &gt;&lt;span style="mso-list:Ignore"&gt;·&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;Ligar eventos generados por componentes a código de lado del servidor.&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpMiddle" style="text-indent:-18.0pt;mso-list:l0 level1 lfo2"&gt;&lt;span style="font-family:Symbol;mso-fareast-font-family:Symbol;mso-bidi-font-family:Symbol;" &gt;&lt;span style="mso-list:Ignore"&gt;·&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;Salvar y restablecer el estado de la aplicación mas allá de la vida de los requests al servidor.&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpLast" style="text-indent:-18.0pt;mso-list:l0 level1 lfo2"&gt;&lt;span style="font-family:Symbol;mso-fareast-font-family:Symbol;mso-bidi-font-family:Symbol;" &gt;&lt;span style="mso-list:Ignore"&gt;·&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;Reusar y extender componentes personalizándolos.&lt;/p&gt;  &lt;p class="MsoNormal"&gt; &lt;/p&gt;  &lt;p class="MsoNormal"&gt;Este capítulo provee de un resumen de la tecnología de JavaServer Faces. Después de explicar que es una aplicación JavaServer Faces y revisar algunos de los principales beneficios de usar esta tecnología, se describe el proceso de crear una aplicación en JavaServer Faces simple.&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;Este capitulo muestra también una aplicación que ejemplifica los estados del ciclo de vida de JavaServer Faces.&lt;/p&gt;  &lt;p class="MsoNormal"&gt; &lt;/p&gt;  &lt;p class="MsoNormal"&gt;Se cubren los siguientes tópicos:&lt;/p&gt;  &lt;p class="MsoNormal"&gt; &lt;/p&gt;  &lt;p class="MsoListParagraphCxSpFirst" style="text-indent:-18.0pt;mso-list:l1 level1 lfo3"&gt;&lt;span style="font-family:Symbol;mso-fareast-font-family:Symbol;mso-bidi-font-family:Symbol;" &gt;&lt;span style="mso-list:Ignore"&gt;·&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;¿Que es una aplicación de JavaServer Faces?&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpMiddle" style="text-indent:-18.0pt;mso-list:l1 level1 lfo3"&gt;&lt;span style="font-family:Symbol;mso-fareast-font-family:Symbol;mso-bidi-font-family:Symbol;" &gt;&lt;span style="mso-list:Ignore"&gt;·&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;Beneficios de la tecnología JavaServer Faces&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpMiddle" style="text-indent:-18.0pt;mso-list:l1 level1 lfo3"&gt;&lt;span style="font-family:Symbol;mso-fareast-font-family:Symbol;mso-bidi-font-family:Symbol;" &gt;&lt;span style="mso-list:Ignore"&gt;·&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;Crear una aplicación simple en JavaServer Faces&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpLast" style="text-indent:-18.0pt;mso-list:l1 level1 lfo3"&gt;&lt;span style="font-family:Symbol;mso-fareast-font-family:Symbol;mso-bidi-font-family:Symbol;" &gt;&lt;span style="mso-list:Ignore"&gt;·&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;Información adicional acerca del la tecnología JavaServer Faces&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8262369655936226064-3926126103113573263?l=programacionconejemplos.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programacionconejemplos.blogspot.com/feeds/3926126103113573263/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://programacionconejemplos.blogspot.com/2011/08/javaserver-faces-20-41.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8262369655936226064/posts/default/3926126103113573263'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8262369655936226064/posts/default/3926126103113573263'/><link rel='alternate' type='text/html' href='http://programacionconejemplos.blogspot.com/2011/08/javaserver-faces-20-41.html' title='JavaServer Faces 2.0 (4.1)'/><author><name>Ant</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8262369655936226064.post-6945807757140761603</id><published>2010-04-19T12:13:00.006-05:00</published><updated>2010-04-19T12:17:53.856-05:00</updated><title type='text'>indice de temas</title><content type='html'>&lt;span style="font-weight: bold;"&gt;Struts 2&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Comparativo  entre Struts2 y Struts1&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://programacionconejemplos.blogspot.com/2009/07/struts1-vs-struts2.html"&gt;Struts2  vs Struts1&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;   Hola Mundo&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://programacionconejemplos.blogspot.com/2009/06/1-ejemplo-struts2_17.html"&gt;Requisitos&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://programacionconejemplos.blogspot.com/2009/06/2-ejemplo-struts2_17.html"&gt;Crear  el Proyecto en NetBeans&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://programacionconejemplos.blogspot.com/2009/06/3-ejemplo-struts2_17.html"&gt;Configurar  el Proyecyto Para Usar Struts 2&lt;br /&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://programacionconejemplos.blogspot.com/2009/06/4-ejemplo-struts2_17.html"&gt;La  Vista del Proyecto&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://programacionconejemplos.blogspot.com/2009/06/5-ejemplo-struts2_17.html"&gt;La  Capa de Negocios&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://programacionconejemplos.blogspot.com/2009/06/6-ejemplo-struts2_17.html"&gt;Ejecutar  el Proyecto&lt;br /&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;     Manejo de Sesión&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://programacionconejemplos.blogspot.com/2009/06/1-segundo-ejemplo-de-struts2-manejo-de.html"&gt;Primeros  Pasos&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://programacionconejemplos.blogspot.com/2009/06/2-segundo-ejemplo-de-struts2-manejo-de.html"&gt;La  configuración de struts.xml&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://programacionconejemplos.blogspot.com/2009/06/3-segundo-ejemplo-de-struts2-manejo-de.html"&gt;La  clase Action que desplegará la lista&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://programacionconejemplos.blogspot.com/2009/06/4-segundo-ejemplo-de-struts2-manejo-de.html"&gt;El  Interceptor y la sesión&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;Carga de Archivo&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://programacionconejemplos.blogspot.com/2009/08/carga-de-archivo-interceptor-fileupload.html"&gt;Interceptor  FileUlopad&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;JavaServer  Faces&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://programacionconejemplos.blogspot.com/2009/10/jsf2-java-server-faces-20-y-netbeans.html"&gt;JSF2  Java Server Faces 2.0 en NetBeans&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://programacionconejemplos.blogspot.com/2010/01/articulo-con-video.html"&gt;JavaServer  Faces 2.0 Hola Mundo&lt;br /&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://programacionconejemplos.blogspot.com/2010/02/javaserver-faces-20-crud.html"&gt;JavaServer  Faces 2.0 CRUD&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;Ejemplos  Java-Web&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://programacionconejemplos.blogspot.com/2009/09/verificacion-viusal-en-formularios.html"&gt;Verificación  Visual en Formularios CAPTCHA&lt;/a&gt;&lt;br /&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/8262369655936226064-6945807757140761603?l=programacionconejemplos.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programacionconejemplos.blogspot.com/feeds/6945807757140761603/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://programacionconejemplos.blogspot.com/2010/04/indice-de-temas.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8262369655936226064/posts/default/6945807757140761603'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8262369655936226064/posts/default/6945807757140761603'/><link rel='alternate' type='text/html' href='http://programacionconejemplos.blogspot.com/2010/04/indice-de-temas.html' title='indice de temas'/><author><name>Ant</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8262369655936226064.post-4245222395855729209</id><published>2010-03-02T13:05:00.004-06:00</published><updated>2010-03-02T16:29:02.663-06:00</updated><title type='text'>Errores comunes en la ejecución de proyectos de TI</title><content type='html'>¿Quién no ha incurrido en estos errores? Si ya llevas algún tiempo desarrollando, seguro has sufrido por alguno de ellos.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;La lista de errores más frecuentes encontrados en la ejecución de los proyectos de TI:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Errores relacionados con la gente&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Miembros del equipo desmotivados&lt;/li&gt;&lt;li&gt;Falta de capacitación de la gente involucrada en el desarrollo&lt;/li&gt;&lt;li&gt;Personas problemáticas en el equipo&lt;/li&gt;&lt;li&gt;Agregar más programadores a un proyecto ya retrasado&lt;/li&gt;&lt;li&gt;Oficinas ruidosas y aglomeradas&lt;/li&gt;&lt;li&gt;Fricciones entre quienes desarrollan y el cliente&lt;/li&gt;&lt;li&gt;Expectativas poco realistas&lt;/li&gt;&lt;li&gt;Falta de un líder efectivo para el proyecto&lt;/li&gt;&lt;li&gt;Falta de participación del usuario&lt;/li&gt;&lt;li&gt;Falta de acuerdo antes que el desarrollo de inicio&lt;/li&gt;&lt;li&gt;Las  “Ilusiones”&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Errores relacionados con los procesos&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Planeación demasiado optimista&lt;/li&gt;&lt;li&gt;Falta de administración de riesgos&lt;/li&gt;&lt;li&gt;Falla en los contratos&lt;/li&gt;&lt;li&gt;No hay suficiente planeación&lt;/li&gt;&lt;li&gt;Abandono del plan bajo presión&lt;/li&gt;&lt;li&gt;Pérdida de tiempo al inicio del proyecto&lt;/li&gt;&lt;li&gt;Saltarse las tareas iniciales&lt;/li&gt;&lt;li&gt;Diseño no adecuado&lt;/li&gt;&lt;li&gt;Falta de supervisión por parte de los responsables&lt;/li&gt;&lt;li&gt;Falta de estimaciones adecuadas&lt;/li&gt;&lt;li&gt;Errores relacionados con el producto&lt;/li&gt;&lt;li&gt;Requerimientos excesivos&lt;/li&gt;&lt;li&gt;Cambio de requerimientos&lt;/li&gt;&lt;li&gt;Developers muy meticulosos&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Errores relacionados con la tecnología&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Síndrome de la panacea&lt;/li&gt;&lt;li&gt;Sobre-estimación de las ventajas del uso de una nueva herramienta&lt;/li&gt;&lt;li&gt;Cambio de herramientas a mitad del proyecto&lt;/li&gt;&lt;li&gt;Falta de un control de código fuente automático&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Seguramente ya hay muchos mas&lt;br /&gt;&lt;br /&gt;Ahora algunas de las razones no tan serias :)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Errores relacionados con la gente&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Miembros del equipo desmotivados&lt;/span&gt;. Es casi imposible encontrar gente que se enamore de todos los proyectos.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Falta de capacitación de la gente involucrada en el desarrollo.&lt;/span&gt;  La gente que va comenzando es la que cobra menos, ¿Por qué no meter solo becarios?&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Personas problemáticas.&lt;/span&gt;  Dime si no has estado junto al clásico que cree saber más que el líder de proyecto, pero no lleva más de unas semanas en un proyecto real (los de la escuela no cuentan).  O bien, gente que simplemente no está bien con la vida ¡Y se dedicó a programar!&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Agregar más programadores a un proyecto ya retrasado. &lt;/span&gt; Y como además no es necesario capacitarlos, explicarles las reglas de negocio, explicarles lo que quisieron hacer los otros programadores (que seguro ya  no se acuerdan o ya ni están).&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Oficinas ruidosas y aglomeradas.&lt;/span&gt; Son programadores, no personas y solo necesitan una PC delante de ellos, lo demás con unas mesas de SAMs y unos manteles se arregla.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Fricciones entre los developers y el cliente.&lt;/span&gt;  La gente de TI siempre sabe lo que el cliente realmente necesita.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Expectativas poco realistas.&lt;/span&gt; Nunca falta el que quiere que le fabriquen un Word y pagar solo lo que cuesta el CD pirata.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Falta de un líder efectivo para el proyecto.&lt;/span&gt; Bueno, la gente de TI no nació para administrar proyectos, ¡Por eso programa!  Pero casi nadie respeta a un líder de proyecto que no ha programado, por eso debe ser una especie de super administrador-programador-buena-gente.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Falta de participación del usuario.&lt;/span&gt; El usuario solo quiere sentarse y que su programa funcione y que no le quite tiempo para entrar al facebook.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Falta de acuerdo antes que el desarrollo de inicio.&lt;/span&gt;  Y es que, ¿Cómo podemos estar de acuerdo con todas las tonterías que el cliente pide?&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Las “Ilusiones”.&lt;/span&gt; El usuario piensa que le darán un automóvil, el líder de proyecto cree que solo le dará tiempo para hacer una bicicleta, los programadores tienen problemas para construir las ruedas de unos simples patines, y al final el usuario va a terminar caminando (como siempre lo ha hecho (el usuario es el incauto que trabaja para el que contrató a tu empresa, le vas a quitar tiempo y al final harás mas difícil su trabajo)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Errores relacionados con los procesos&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Planeamiento demasiado optimista.&lt;/span&gt; ¡Claro! Hacemos un módulo por día y el último integramos todo.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Falta de administración de riesgos.&lt;/span&gt;  ¿Alguien conoce a los que se dedican a administrar esas cosas?&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Falla en los contratos. &lt;/span&gt; Lo bueno de usar plantillas es que todas incluyen las letras chiquitas donde no nos hacemos responsables de errores o vicios ocultos después de seis o más meses. Cuando calculas más o menos que base de datos se va al carajo.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;No hay suficiente planeamiento.&lt;/span&gt; Muchas veces solo se tiene el texto que viene en la propuesta comercial.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Abandono del planeamiento bajo presión.&lt;/span&gt; Sobre todo cuando le dices al usuario que hacer un facebook o un twitter es normalmente más caro que hacer una simple página web.&lt;br /&gt;Pérdida de tiempo al inicio del proyecto. Y cuando pasa el pánico y comienza la negación.&lt;br /&gt;Saltarse las tareas iniciales. Nunca analizas y nunca diseñas, esa es tarea de ñoños.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Diseño no adecuado. &lt;/span&gt; Así me enseñaron en la escuela y los profesores son gente muy capacitada que lleva años en la industria del desarrollo de sistemas.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Falta de supervisión.&lt;/span&gt;  Porque el gestor y el líder llevan como veinte proyectos al mismo tiempo y todavía no terminan otros que ya se entregaron.  Y por supuesto los programadores se pueden enseñar solitos sobre lo que el cliente quiere.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Falta de estimaciones.&lt;/span&gt;  La autoestima de los programadores es lo que se al carajo cuando fallan los proyectos.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Errores relacionados con el producto&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Requerimientos excesivos.&lt;/span&gt; Si no está clara la propuesta el cliente te va a meter todas las funcionalidades que pueda y si puede hacer todo su trabajo, mejor.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Cambio de requerimientos.&lt;/span&gt; Porque claro, el mercado cambia constantemente y hay que ser competitivos y ajustarse a esos cambios. Pero la verdad es que, es hasta que el usuario comienza a usar el sistema, que se da cuenta de que nadie tenía idea de lo que se tenía que hacer realmente.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Developers muy meticulosos.&lt;/span&gt; Todos los programmers somos obsesivos compulsivos, es lo que nos metió en esto desde un principio.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Errores relacionados con la tecnología&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Síndrome de la panacea.&lt;/span&gt; Es que le tienes que meter Struts, Spring y Hibernate siempre y ya con eso quedan todos los sistemas.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Sobre-estimación de las ventajas del uso de una nueva herramienta.&lt;/span&gt; Como cuando usas una de esas herramientas de business intelligence o un CMS, que según el vendedor harán prácticamente todo lo que el cliente te pida.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Cambio de herramientas a mitad del proyecto.&lt;/span&gt; Si no funciona Struts usa JSF, porque es mejor, si no funciona tampoco pues usa Spring MVC, porque es más simple, si no funciona mete Flex, porque se ve bien, si no funciona...&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Falta de un control de código fuente automático.&lt;/span&gt; Te apuesto que eso si no te lo enseñaron en la escuela.  Y que flojera da meter subversión y que todos se conecten la primera vez.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8262369655936226064-4245222395855729209?l=programacionconejemplos.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programacionconejemplos.blogspot.com/feeds/4245222395855729209/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://programacionconejemplos.blogspot.com/2010/03/errores-comunes-en-la-ejecucion-de.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8262369655936226064/posts/default/4245222395855729209'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8262369655936226064/posts/default/4245222395855729209'/><link rel='alternate' type='text/html' href='http://programacionconejemplos.blogspot.com/2010/03/errores-comunes-en-la-ejecucion-de.html' title='Errores comunes en la ejecución de proyectos de TI'/><author><name>Ant</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8262369655936226064.post-8803621664079770541</id><published>2010-02-23T12:26:00.081-06:00</published><updated>2010-03-28T20:50:25.159-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaServer Faces 2.0 CRUD'/><title type='text'>JavaServer Faces 2.0 CRUD</title><content type='html'>Mostraremos como hacer la funcionalidad en &lt;span style="font-weight: bold;"&gt;JavaServer Faces 2.0&lt;/span&gt; para crear, leer, actualizar y borrar registros en una base datos de &lt;span style="font-weight: bold;"&gt;MySQL&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;En este ejemplo haremos uso de las siguientes tecnologías:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;strong style="font-weight: normal;"&gt;JavaServer Faces (JSF) 2.0&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;&lt;strong style="font-weight: normal;"&gt;Java Persistence API (JPA) 2.0&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;&lt;strong style="font-weight: normal;"&gt;Enterprise JavaBeans (EJB) 3.1&lt;br /&gt;&lt;/strong&gt;&lt;/li&gt;&lt;/ul&gt;Será necesario tener instalado el siguiente software:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;NetBeans IDE 6.8, o superior&lt;/span&gt;.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Java Development Kit (JDK)  6, o superior&lt;/span&gt;.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;GlassFish Application Server  v3, o superior&lt;/span&gt;.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;MySQL 5.x o superior&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;Para este ejemplo seguiremos los siguientes pasos:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Crear la base de datos&lt;/li&gt;&lt;li&gt;Examinar la estructura de base de datos&lt;/li&gt;&lt;li&gt;Crear el proyecto Web&lt;/li&gt;&lt;li&gt;Generar las clases de entidad desde la base de datos&lt;/li&gt;&lt;li&gt;Generar los JSF desde las clases de entidad&lt;/li&gt;&lt;li&gt;Explorando la aplicación&lt;/li&gt;&lt;/ol&gt;&lt;span style="font-weight: bold;"&gt;Crear la base de datos&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Si ya has creado una base de datos en MySQL antes, quizá sabes también que hay mas de una forma o herramienta para hacerlo. Aqui te mostraremos como hacerlo desde la sección de servicios de &lt;span style="font-weight: bold;"&gt;NetBeans&lt;/span&gt;.   Si abres la ventana de &lt;span style="font-weight: bold;"&gt;Servicios&lt;/span&gt; de NetBeans y después das click en &lt;span style="font-weight: bold;"&gt;Databases&lt;/span&gt;, podrás ver que existe predefinido un item solo para &lt;span style="font-weight: bold;"&gt;MySQL&lt;/span&gt;, para iniciar el servicio en NetBeans, debes dar click derecho y despues en propiedades para completar los datos de conexión.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_6I9HJQ7QnqA/S4VVsHPsPvI/AAAAAAAAAQQ/aTsbgdOXgQM/s1600-h/NetBeansServicios.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 252px; height: 260px;" src="http://4.bp.blogspot.com/_6I9HJQ7QnqA/S4VVsHPsPvI/AAAAAAAAAQQ/aTsbgdOXgQM/s400/NetBeansServicios.gif" alt="" id="BLOGGER_PHOTO_ID_5441849941094579954" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;En tu caso los datos de acceso serán los que hayas definido cuando instalaste MySQL&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_6I9HJQ7QnqA/S4VU8aqYDnI/AAAAAAAAAQI/CwcBjltIzX4/s1600-h/NetBeansServiciosMySQLPropiedades.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 339px;" src="http://1.bp.blogspot.com/_6I9HJQ7QnqA/S4VU8aqYDnI/AAAAAAAAAQI/CwcBjltIzX4/s400/NetBeansServiciosMySQLPropiedades.gif" alt="" id="BLOGGER_PHOTO_ID_5441849121673055858" border="0" /&gt;&lt;/a&gt;cuando hayas teminado de llenar los datos para conectarte, simplemente da click derecho al mouse y despues en conectar.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_6I9HJQ7QnqA/S4VYTj79yRI/AAAAAAAAAQg/V9vRp4nEFg0/s1600-h/NetBeansServiciosMySQL03.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 353px; height: 125px;" src="http://3.bp.blogspot.com/_6I9HJQ7QnqA/S4VYTj79yRI/AAAAAAAAAQg/V9vRp4nEFg0/s400/NetBeansServiciosMySQL03.gif" alt="" id="BLOGGER_PHOTO_ID_5441852817834625298" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Ya que te hayas conectado es posible crear una nueva base de datos en las opciones del submenu con click derecho:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_6I9HJQ7QnqA/S4VaLknPTKI/AAAAAAAAAQo/CYyNW9RLQUQ/s1600-h/NetBeansServiciosMySQL04.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 169px;" src="http://1.bp.blogspot.com/_6I9HJQ7QnqA/S4VaLknPTKI/AAAAAAAAAQo/CYyNW9RLQUQ/s400/NetBeansServiciosMySQL04.gif" alt="" id="BLOGGER_PHOTO_ID_5441854879600430242" border="0" /&gt;&lt;/a&gt;Al crear la base de datos, también se crea una conexión a la misma y es posible ejecutar comandos de SQL sobre la nueva base.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_6I9HJQ7QnqA/S4Vbn-lAgSI/AAAAAAAAAQw/qgZZzezLXy8/s1600-h/NetBeansServiciosMySQL05.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 276px; height: 159px;" src="http://3.bp.blogspot.com/_6I9HJQ7QnqA/S4Vbn-lAgSI/AAAAAAAAAQw/qgZZzezLXy8/s400/NetBeansServiciosMySQL05.gif" alt="" id="BLOGGER_PHOTO_ID_5441856467118358818" border="0" /&gt;&lt;/a&gt;Para este ejemplo te proporcionamos dos scripts de SQL que te permitirán crear las tablas necesarias y llenarlas de datos de ejemplo para ejecutar el ejercicio adecuadamente.&lt;br /&gt;&lt;br /&gt;Te dejamos la liga de los scripts aqui:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;a href="http://dcn.mx/sites/default/files/script.rar"&gt;script&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Examinar la estructura de base de datos&lt;/span&gt;  Una vez que has ejecutado los scripts puedes explorar la base de datos para ver las tablas y el contenido que has creado. No olvides refrescar el estado de la conexión.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_6I9HJQ7QnqA/S4WyA7lG3VI/AAAAAAAAAQ4/VvfpYG4QU2Q/s1600-h/NetBeansServiciosMySQL06.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 342px; height: 400px;" src="http://1.bp.blogspot.com/_6I9HJQ7QnqA/S4WyA7lG3VI/AAAAAAAAAQ4/VvfpYG4QU2Q/s400/NetBeansServiciosMySQL06.gif" alt="" id="BLOGGER_PHOTO_ID_5441951453810187602" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Se han creado y poblado las tablas que necesitaremos.&lt;br /&gt;&lt;br /&gt;La siguiente es una descripción de las tablas:&lt;br /&gt;&lt;br /&gt;&lt;table class="indent" style="width: 744px;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th class="tblheader" scope="col"&gt;Tabla&lt;/th&gt;                 &lt;th class="tblheader" scope="col"&gt;Descripción&lt;/th&gt;                 &lt;th class="tblheader" scope="col"&gt;Características&lt;/th&gt;             &lt;/tr&gt;             &lt;tr&gt;                 &lt;td class="tbltd1"&gt;CLIENTE&lt;/td&gt;                 &lt;td class="tbltd0"&gt;Cliente de la agencia de consultoria&lt;br /&gt;&lt;/td&gt;&lt;td class="tbltd0"&gt;No-generada, llave primaria compuesta (cuyos campos no constituyen una llave foranea)&lt;br /&gt;&lt;/td&gt;              &lt;/tr&gt;             &lt;tr&gt;                 &lt;td class="tbltd1"&gt;CONSULTOR&lt;br /&gt;&lt;/td&gt;                 &lt;td class="tbltd0"&gt;Un empleado de la agencia de consultoría que los clientes pueden contratar sobre una base contractual&lt;/td&gt;                 &lt;td class="tbltd0"&gt;Incluye un campo resumen de tipo LONG VARCHAR&lt;br /&gt;&lt;/td&gt;             &lt;/tr&gt;             &lt;tr&gt;                 &lt;td class="tbltd1"&gt;ESTATUS_CONSULTOR&lt;/td&gt;&lt;td class="tbltd0"&gt;El estado de un consultor con la agencia de consultoría (por ejemplo, activos e inactivos son estados posibles)&lt;/td&gt;                 &lt;td class="tbltd0"&gt;No-generada, llave primaria de tipo CHAR&lt;/td&gt;             &lt;/tr&gt;             &lt;tr&gt;                 &lt;td class="tbltd1"&gt;RECLUTADOR&lt;/td&gt;                 &lt;td class="tbltd0"&gt;&lt;span id="result_box" class="short_text"&gt;&lt;span&gt;Un empleado de la agencia consultora responsable de la conexión de los clientes y consultores&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;                 &lt;td class="tbltd0"&gt;&lt;br /&gt;&lt;/td&gt;             &lt;/tr&gt;             &lt;tr&gt;                 &lt;td class="tbltd1"&gt;PROYECTO&lt;/td&gt;                 &lt;td class="tbltd0"&gt;Un proyecto de los clientes con consultores de la agencia.&lt;/td&gt;                 &lt;td class="tbltd0"&gt;No-generada, llave compuesta que incluye dos campos constituyendo una llave foranea para la tabla CLIENTE&lt;br /&gt;&lt;/td&gt;             &lt;/tr&gt;             &lt;tr&gt;                 &lt;td class="tbltd1"&gt;FACTURABLE&lt;/td&gt;                 &lt;td class="tbltd0"&gt;Un conjunto de horas trabajadas por un consultor en un proyecto, para los que la consultoría de proyectos factura al cliente en cuestión&lt;/td&gt;                 &lt;td class="tbltd0"&gt;Incluye un campo artefacto de tipo CLOB&lt;br /&gt;&lt;/td&gt;             &lt;/tr&gt;             &lt;tr&gt;                 &lt;td class="tbltd1"&gt;DIRECCION&lt;/td&gt;                 &lt;td class="tbltd0"&gt;Dirección de Facturación&lt;br /&gt;&lt;/td&gt;&lt;td class="tbltd0"&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tbltd1"&gt;CONSULTOR_PROYECTO&lt;/td&gt;&lt;td class="tbltd0"&gt;Tabla de Union que indica que consultores están asignados a que proyectos.&lt;/td&gt;&lt;td class="tbltd0"&gt;Referencia-cruzada PROYECTO y CONSULTOR, los primeros tienen una clave primaria compuesta&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;La base de datos incluye una variedad de relaciones. Al crear clases de entidad de una base de datos, el IDE genera automáticamente las propiedades del tipo de Java adecuada basada en el tipo de SQL de las columnas. La siguiente tabla describe las relaciones de entidades para consultar la base de datos.  (Relaciones inversas no se muestran)&lt;br /&gt;&lt;br /&gt;&lt;table id="relationships" class="indent" style="width: 744px;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th class="tblheader" scope="col"&gt;Entidad&lt;/th&gt;                 &lt;th class="tblheader" scope="col"&gt;Entidad Relacionada&lt;br /&gt;&lt;/th&gt;                 &lt;th class="tblheader" scope="col"&gt;Información&lt;/th&gt;                 &lt;th class="tblheader" scope="col"&gt;Descripción&lt;/th&gt;             &lt;/tr&gt;             &lt;tr&gt;                 &lt;td class="tbltd1"&gt;CLIENTE&lt;/td&gt;                 &lt;td class="tbltd0"&gt;RECLUTADOR&lt;/td&gt;                 &lt;td class="tbltd0"&gt;nullable con edición manual; nullable uno-a-muchos si no.&lt;br /&gt;&lt;/td&gt;                 &lt;td class="tbltd0"&gt;CLIENTE tiene muchos RECLUTADORES y RECULTADOR tiene cero o un CLIENTE                     (si no es editado manualmente)&lt;/td&gt;             &lt;/tr&gt;             &lt;tr&gt;                 &lt;td class="tbltd1"&gt;CLIENTE&lt;/td&gt;                 &lt;td class="tbltd0"&gt;DIRECCION&lt;/td&gt;                 &lt;td class="tbltd0"&gt;non-nullable uno-a-uno&lt;/td&gt;                 &lt;td class="tbltd0"&gt;CLIENTE tiene una DIRECCION y DIRECCION tiene cero o un CLIENTE&lt;/td&gt;             &lt;/tr&gt;             &lt;tr&gt;                 &lt;td class="tbltd1"&gt;CLIENTE&lt;/td&gt;                 &lt;td class="tbltd0"&gt;PROYECTO&lt;/td&gt;                 &lt;td class="tbltd0"&gt;non-nullable uno-a-muchos; en una entidad Proyecto, el valor del campo cliente es parte de la llave primaria del Proyecto&lt;br /&gt;&lt;/td&gt;                 &lt;td class="tbltd0"&gt;CLIENTE tiene muchos PROYECTOs y un PROYECTO tiene un CLIENTE&lt;/td&gt;             &lt;/tr&gt;             &lt;tr&gt;                 &lt;td class="tbltd1"&gt;CONSULTOR&lt;br /&gt;&lt;/td&gt;                 &lt;td class="tbltd0"&gt;PROYECTO&lt;/td&gt;                 &lt;td class="tbltd0"&gt;muchos-a-muchos&lt;/td&gt;                 &lt;td class="tbltd0"&gt;CONSULTOR tiene muchos PROYECTOs y PROYECTO tiene muchos CONSULTORES&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tbltd1"&gt;CONSULTOR&lt;/td&gt;                 &lt;td class="tbltd0"&gt;FACTURABLE&lt;/td&gt;                 &lt;td class="tbltd0"&gt;non-nullable uno-a-muchos&lt;/td&gt;                 &lt;td class="tbltd0"&gt;CONSULTOR tiene muchas FACTURABLEs y FACTURABLE tiene un CONSULTOR&lt;/td&gt;             &lt;/tr&gt;             &lt;tr&gt;                 &lt;td class="tbltd1"&gt;ESTATUS_CONSULTOR&lt;/td&gt;                 &lt;td class="tbltd0"&gt;CONSULTOR&lt;/td&gt;                 &lt;td class="tbltd0"&gt;non-nullable uno-a-muchos&lt;/td&gt;                 &lt;td class="tbltd0"&gt;ESTATUS_CONSULTOR tiene muchos CONSULTOREs y CONSULTOR tiene un ESTATUS_CONSULTOR&lt;/td&gt;             &lt;/tr&gt;             &lt;tr&gt;                 &lt;td class="tbltd1"&gt;CONSULTOR&lt;/td&gt;                 &lt;td class="tbltd0"&gt;RECLUTADOR&lt;/td&gt;                 &lt;td class="tbltd0"&gt;nullable uno-a-muchos&lt;/td&gt;                 &lt;td class="tbltd0"&gt;CONSULTOR tiene cero o un RECLUTADOR y RECLUTADOR tiene muchos CONSULTOREs&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tbltd1"&gt;FACTURABLE&lt;/td&gt;                 &lt;td class="tbltd0"&gt;PROYECTO&lt;/td&gt;                 &lt;td class="tbltd0"&gt;non-nullable uno-a-muchos&lt;/td&gt;                 &lt;td class="tbltd0"&gt;FACTURABLE tiene un PROYECTO y PROYECTO tiene muchos FACTURABLEs&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Crear el proyecto Web&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Ahora es momento de crear el proyecto Web utilizando el framework de JSF&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;En el menú superior debes elegir: &lt;span style="font-weight: bold;"&gt; File&gt; New Project (Ctrl-Shift-N)&lt;/span&gt;.&lt;/li&gt;&lt;li&gt;Selecciona&lt;span style="font-weight: bold;"&gt; Web Application&lt;/span&gt; de la categoría &lt;span style="font-weight: bold;"&gt;Java Web&lt;/span&gt;. Da click en Next.&lt;/li&gt;&lt;li&gt;Escribe el nombre del proyecto y la hubicación, para este ejemplo usamos el nombre &lt;span style="font-weight: bold;"&gt;ejemploJSF2&lt;/span&gt;. Despues da click en el botón Next&lt;/li&gt;&lt;li&gt;Selecciona el servidor &lt;span style="font-weight: bold;"&gt;GlassFish v3&lt;/span&gt; y especifica la versión de Java EE con la&lt;span style="font-weight: bold;"&gt; Java EE 6 Web&lt;/span&gt;. Da un click en Next.&lt;/li&gt;&lt;li&gt;En el panel de Frameworks, selecciona la opción de &lt;span style="font-weight: bold;"&gt;JavaServer Faces&lt;/span&gt;. Da click en Finish.&lt;/li&gt;&lt;/ol&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_6I9HJQ7QnqA/S4a1tWKPcMI/AAAAAAAAARA/b-NhDFp2pp4/s1600-h/NetBeansProyecto01.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 302px;" src="http://1.bp.blogspot.com/_6I9HJQ7QnqA/S4a1tWKPcMI/AAAAAAAAARA/b-NhDFp2pp4/s400/NetBeansProyecto01.gif" alt="" id="BLOGGER_PHOTO_ID_5442236990371098818" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_6I9HJQ7QnqA/S4a2E8T1afI/AAAAAAAAARI/kvpqaBZ091E/s1600-h/NetBeansProyecto02.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 343px;" src="http://1.bp.blogspot.com/_6I9HJQ7QnqA/S4a2E8T1afI/AAAAAAAAARI/kvpqaBZ091E/s400/NetBeansProyecto02.gif" alt="" id="BLOGGER_PHOTO_ID_5442237395748874738" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Cuando das click en Finish, el IDE genera el proyecto de tipo Web y abre &lt;span style="font-weight: bold;"&gt;index.xhtml&lt;/span&gt; en el editor.&lt;br /&gt;&lt;span id="result_box" class="long_text"&gt;&lt;span title="(Inverse relationships are not shown.)"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;Generar las clases de entidad desde la base de datos&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;1.- Despues de conectar la IDE a la base de datos, usaremos el asistente o wizard que obtiene entidades de la base de datos para generar de forma rápida las clases basadas en las tablas de la base de datos.  El IDE puede generar clases de entidad de cada tabla que selecciones, y puede generar además, cualquier clase de entidades para relacionar las tablas.&lt;br /&gt;&lt;br /&gt;2.- En la ventana de Proyectos, dando un click derecho al nodo de &lt;span style="font-weight: bold;"&gt;ejemploJSF2&lt;/span&gt;, y seleccionando &lt;span style="font-weight: bold;"&gt;New&gt; Entity Classes from Database&lt;/span&gt;.  (Si esta opción no está en la lista, ejliga Otra. Despues, en el Wizard de File, seleccione la categoría de Persistence, después Entity Classes from Database)&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_6I9HJQ7QnqA/S4bBk5siWTI/AAAAAAAAARQ/Lz9u5HL18Wo/s1600-h/NetBeansEntities01.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 71px;" src="http://2.bp.blogspot.com/_6I9HJQ7QnqA/S4bBk5siWTI/AAAAAAAAARQ/Lz9u5HL18Wo/s400/NetBeansEntities01.gif" alt="" id="BLOGGER_PHOTO_ID_5442250039430895922" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;3.- Selecciona &lt;span style="font-weight: bold;"&gt;New Data Source from the Data Source&lt;/span&gt;, arrastra la lista para abrir la ventana de dialogo Create Data Source.&lt;br /&gt;&lt;br /&gt;4.- Selecciona el nombre JNDI &lt;span style="font-weight: bold;"&gt;jdbc/ejemploJSF2 &lt;/span&gt;y selecciona &lt;span style="font-weight: bold;"&gt;jdbc:mysql://localhost:3306/ejemploJSF2  &lt;/span&gt;como la base de conexión.&lt;br /&gt;&lt;br /&gt;5.- Las tablas de la base de datos deberán aparecer en la lista de Tablas disponibles.&lt;br /&gt;&lt;br /&gt;6.- Da click en el boton &lt;span style="font-weight: bold;"&gt;Add All&lt;/span&gt; para seleccionar todas las tablas. Da click en Next.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_6I9HJQ7QnqA/S4bBlO3FPPI/AAAAAAAAARY/V45V8KiopWw/s1600-h/NetBeansEntities02.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 294px;" src="http://2.bp.blogspot.com/_6I9HJQ7QnqA/S4bBlO3FPPI/AAAAAAAAARY/V45V8KiopWw/s400/NetBeansEntities02.gif" alt="" id="BLOGGER_PHOTO_ID_5442250045112270066" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;7.- Escribe&lt;span style="font-weight: bold;"&gt; jpa.ent&lt;/span&gt; como nombre de paquete. Asegurate que el checkbox para generar consultas con nombre se ha seleccionado "&lt;span style="font-weight: bold;"&gt;Generate Named Query Annotations&lt;/span&gt;".&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_6I9HJQ7QnqA/S4bGtX7FsWI/AAAAAAAAARg/SoQCvlsfmt4/s1600-h/NetBeansEntities03.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 260px;" src="http://3.bp.blogspot.com/_6I9HJQ7QnqA/S4bGtX7FsWI/AAAAAAAAARg/SoQCvlsfmt4/s400/NetBeansEntities03.gif" alt="" id="BLOGGER_PHOTO_ID_5442255682542088546" border="0" /&gt;&lt;/a&gt;8.- Da click en el boton &lt;span style="font-weight: bold;"&gt;Create Persistence Unit&lt;/span&gt; para abrir la ventana de dialogo &lt;span style="font-weight: bold;"&gt;Create Persistence Unit&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_6I9HJQ7QnqA/S4bHExF1vOI/AAAAAAAAARo/26CGFcYXv0c/s1600-h/NetBeansEntities04.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 258px;" src="http://1.bp.blogspot.com/_6I9HJQ7QnqA/S4bHExF1vOI/AAAAAAAAARo/26CGFcYXv0c/s400/NetBeansEntities04.gif" alt="" id="BLOGGER_PHOTO_ID_5442256084435057890" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Puedes dejar los valores por default que vienen. da click en &lt;span style="font-weight: bold;"&gt;Create&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;8.- Finalmente das click en &lt;span style="font-weight: bold;"&gt;Finish &lt;/span&gt;y el IDE comenzará a crear las entidades en el paquete que especificamos.&lt;br /&gt;&lt;br /&gt;Al utilizar el asistente para crear clases de entidad de una base de datos, el IDE examina las relaciones entre las tablas de base de datos. En la ventana de &lt;span style="font-weight: bold;"&gt;Proyectos&lt;/span&gt;, si se expande el nodo del paquete &lt;span style="font-weight: bold;"&gt;jpa.ent&lt;/span&gt;, se puede ver que el IDE genera una clase de entidad para cada tabla, excepto para la tabla de &lt;span style="font-weight: bold;"&gt;PROYECTO_CONSULTOR&lt;/span&gt;. El IDE no ha creado una clase de entidad para &lt;span style="font-weight: bold;"&gt;PROYECTO_CONSULTOR&lt;/span&gt; porque la tabla es una union de tablas.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_6I9HJQ7QnqA/S4bI-P4B-AI/AAAAAAAAARw/_lJRCXm7UdM/s1600-h/NetBeansEntities05.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 239px; height: 393px;" src="http://2.bp.blogspot.com/_6I9HJQ7QnqA/S4bI-P4B-AI/AAAAAAAAARw/_lJRCXm7UdM/s400/NetBeansEntities05.gif" alt="" id="BLOGGER_PHOTO_ID_5442258171462809602" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;El IDE también ha generado dos clases adicionales para las tablas con llaves primarias compuestas: &lt;span style="font-weight: bold;"&gt;CLIENTE &lt;/span&gt;y &lt;span style="font-weight: bold;"&gt;PROYECTO&lt;/span&gt;. Las clases de llave primaria de estas tablas (&lt;span style="font-weight: bold;"&gt;ClientPK.java&lt;/span&gt; y &lt;span style="font-weight: bold;"&gt;ProjectPK.java&lt;/span&gt;) tiene &lt;span style="font-weight: bold;"&gt;PK &lt;/span&gt;concatenado.&lt;br /&gt;&lt;br /&gt;Si nos fijamos en el código generado para las clases de entidad se puede ver que el asistente añade anotaciones &lt;span style="font-weight: bold;"&gt;@GeneratedValue&lt;/span&gt; a los campos auto generados de &lt;span style="font-weight: bold;"&gt;ID &lt;/span&gt;y las anotaciones &lt;span style="font-weight: bold;"&gt;@Basic (optional = "false")&lt;/span&gt; a algunos de los campos en las clases de entidad. En base a las anotaciones &lt;span style="font-weight: bold;"&gt;@Basic (optional = "false")&lt;/span&gt;, las páginas que el asistente &lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;JSF Pages from Entity Classes genera&lt;/span&gt;, incluyen un código con controles para prevenir las violaciónes para columnas con valor no nulo.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Generando los JSF desde las clases de entidad&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Ahora que hemos creado las clases de entidad, haremos la interfaz web para mostrar y modificar los datos. Usaremos el asistente &lt;span style="font-weight: bold;"&gt;JSF Pages from Entity Classes&lt;/span&gt; para generar páginas JavaServer Faces. El código generado por el asistente o wizzard se basa en las anotaciones de persistencia contenidas en las clases de entidad.&lt;br /&gt;&lt;br /&gt;Para cada clase de entidad, el asistente genera lo siguiente:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Un bean de sesión sin estado para la creación, lectura, modificación y eliminación de entidades.&lt;/li&gt;&lt;li&gt;Un bean JSF manejador, session-scoped,&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Un directorio que contiene cuatro archivos Facelets para realizar de &lt;span style="font-weight: bold;"&gt;CRUD &lt;/span&gt;(Create.xhtml, Edit.xhtml, List.xhtml, y View.xhtml)&lt;/li&gt;&lt;li&gt;Clases que serán usadas por los beans JSF manejadores (JsfUtil, PaginationHelper)&lt;/li&gt;&lt;li&gt;Un paquete de propiedades para los mensajes localizados, y una entrada correspondiente en el archivo de configuración del proyecto  (&lt;span style="font-weight: bold;"&gt;faces-config.xml &lt;/span&gt;se crea si no existe)&lt;/li&gt;&lt;li&gt;Archivos Web auxiliares, incluyendo una hoja de estilos predeterminada para renderear componentes y un archivo plantilla para Facelets.&lt;/li&gt;&lt;/ul&gt;Para generar las páginas JSF&lt;br /&gt;&lt;br /&gt;1.- En la ventana Proyectos, haz click en el nodo del proyecto y elije &lt;span style="font-weight: bold;"&gt;New&gt; &lt;/span&gt;&lt;span style="font-weight: bold;"&gt;JSF Pages from Entity Classes&lt;/span&gt; para abrir el asistente. (Si esta opción no aparece en la lista, elije Otro. Luego, en el asistente de archivos, selecciona la categoría &lt;span style="font-weight: bold;"&gt;JavaServer Faces&lt;/span&gt;, a continuación, &lt;span style="font-weight: bold;"&gt;JSF Pages from Entity Classes&lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_6I9HJQ7QnqA/S4b0Oyy8qZI/AAAAAAAAAR4/P8a_zmEcQR0/s1600-h/NetBeansJSF01.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 86px;" src="http://4.bp.blogspot.com/_6I9HJQ7QnqA/S4b0Oyy8qZI/AAAAAAAAAR4/P8a_zmEcQR0/s400/NetBeansJSF01.gif" alt="" id="BLOGGER_PHOTO_ID_5442305734714632594" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;La lista de clases de entidad disponibles muestra las siete clases de entidad que figuran en el proyecto. El cuadro no muestra las clases ClientPK.java y ProjectPK.java.&lt;br /&gt;&lt;br /&gt;2.- Haz click en Agregar todo para mover todas las clases a la Selección de cuadro de clases de entidad.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_6I9HJQ7QnqA/S4b16qAH9FI/AAAAAAAAASA/fUbTZKJKe08/s1600-h/NetBeansJSF02.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 271px;" src="http://2.bp.blogspot.com/_6I9HJQ7QnqA/S4b16qAH9FI/AAAAAAAAASA/fUbTZKJKe08/s400/NetBeansJSF02.gif" alt="" id="BLOGGER_PHOTO_ID_5442307587779851346" border="0" /&gt;&lt;/a&gt;Haz click en Siguiente.&lt;br /&gt;&lt;br /&gt;3.- En el paso 3 del asistente, Generamos páginas JSF y clases, escriba jpa.ses el paquete de JPA Session Bean.&lt;br /&gt;&lt;br /&gt;4.- Escribe jsf para el nombre del paquete de clases JSF.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_6I9HJQ7QnqA/S4cG77KwZqI/AAAAAAAAASo/JbN0gDTGtGk/s1600-h/NetBeansJSF03.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 276px;" src="http://1.bp.blogspot.com/_6I9HJQ7QnqA/S4cG77KwZqI/AAAAAAAAASo/JbN0gDTGtGk/s400/NetBeansJSF03.gif" alt="" id="BLOGGER_PHOTO_ID_5442326301265389218" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;5.- Escribe '&lt;span style="font-weight: bold;"&gt;recursos/Bundle&lt;/span&gt;' en el campo "&lt;span style="font-weight: bold;"&gt;Localization Bundle Name&lt;/span&gt;". Esto generará un paquete llamado &lt;span style="font-weight: bold;"&gt;recursos &lt;/span&gt;en donde estará el archivo &lt;span style="font-weight: bold;"&gt;Bundle.properties&lt;/span&gt; (Si se deja en blanco, el paquete de propiedades, se creará en el paquete default del proyecto.)&lt;br /&gt;&lt;br /&gt;Para que el IDE se adapte mejor a tus convenciones de proyecto, puedes personalizar los archivos generados por el asistente. Haz click en el enlace &lt;span style="font-weight: bold;"&gt;Customize Template&lt;/span&gt; para modificar el archivo de plantillas utilizadas por el asistente.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_6I9HJQ7QnqA/S4b8vho7bMI/AAAAAAAAASY/auJYUEdUtYY/s1600-h/NetBeansJSF04.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 322px; height: 212px;" src="http://2.bp.blogspot.com/_6I9HJQ7QnqA/S4b8vho7bMI/AAAAAAAAASY/auJYUEdUtYY/s400/NetBeansJSF04.gif" alt="" id="BLOGGER_PHOTO_ID_5442315093137910978" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;5.- En general, puedes acceder y realizar cambios en todas las plantillas gestionada por el IDE usando el Administrador de plantillas (&lt;span style="font-weight: bold;"&gt;Tools &gt; Templates&lt;/span&gt;).&lt;br /&gt;&lt;br /&gt;6.- Haz click en &lt;span style="font-weight: bold;"&gt;Finish&lt;/span&gt;. El IDE genera los beans de sesión sin estado en el paquete de &lt;span style="font-weight: bold;"&gt;jpa.ses&lt;/span&gt;, y los beans JSF manejadores session-scoped, en el paquete de &lt;span style="font-weight: bold;"&gt;jsf&lt;/span&gt;. Cada bean de sesión sin estado maneja las operaciones para la clase de entidad correspondiente, incluyendo la creación, edición, y los casos de borrado de la entidad a través de la &lt;span style="font-weight: bold;"&gt;API de persistencia de Java&lt;/span&gt;. Cada bean JSF manejador implementa la interfaz &lt;span style="font-weight: bold;"&gt;javax.faces.convert.Converter&lt;/span&gt; y realiza la tarea de convertir a las instancias de la clase de entidad que corresponde a los objetos String y viceversa.&lt;br /&gt;&lt;br /&gt;Si expandes el nodo &lt;span style="font-weight: bold;"&gt;Web Pages&lt;/span&gt;, veras que el IDE genera una carpeta para cada una de las clases de entidad. Cada carpeta contiene los archivos de &lt;span style="font-weight: bold;"&gt;Create.xhtml&lt;/span&gt;, &lt;span style="font-weight: bold;"&gt;Edit.xhtml&lt;/span&gt;, &lt;span style="font-weight: bold;"&gt;List.xhtml&lt;/span&gt; y &lt;span style="font-weight: bold;"&gt;View.xhtml&lt;/span&gt;. El IDE también modificó el archivo &lt;span style="font-weight: bold;"&gt;index.xhtml&lt;/span&gt; insertando los enlaces a cada una de las páginas &lt;span style="font-weight: bold;"&gt;List.xhtml&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_6I9HJQ7QnqA/S4b_wV5cU-I/AAAAAAAAASg/G2x_VMz3fYs/s1600-h/NetBeansJSF05.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 240px; height: 381px;" src="http://2.bp.blogspot.com/_6I9HJQ7QnqA/S4b_wV5cU-I/AAAAAAAAASg/G2x_VMz3fYs/s400/NetBeansJSF05.gif" alt="" id="BLOGGER_PHOTO_ID_5442318405700703202" border="0" /&gt;&lt;/a&gt;Cada bean JSF manejador es específico para los cuatro archivos Facelets correspondientes e incluye el código que invoca métodos en el bean de sesión adecuado.&lt;br /&gt;&lt;br /&gt;Expande el nodo o folder de recursos para localizar la hoja de estilos jsfcrud.css que fue generado por el asistente. Si abres la página de la aplicación de bienvenida (index.xhtml) o el archivo Facelets de plantilla (template.xhtml) en el editor, verás que contiene una referencia a la hoja de estilos.&lt;br /&gt;&lt;br /&gt;El archivo Facelets de plantilla es usado por cada uno de los cuatro archivos de Facelets para cada clase de entidad.&lt;br /&gt;&lt;br /&gt;&lt;pre face="Andale Mono,Lucida Console,Monaco,fixed,monospace" size="12px" style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); line-height: 14px; width: 100%;"&gt;&lt;code&gt;&amp;lt;h:outputStylesheet name="css/jsfcrud.css"/&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Si expandes los paquetes fuente del nodo se pueden ver los beans de sesión, los bean JSF manejadores, clases de utilidad, y archivos de propiedades que el asistente genera.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_6I9HJQ7QnqA/S4cIJ_R3kTI/AAAAAAAAASw/klzugsk3N7I/s1600-h/NetBeansJSF06.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 240px; height: 397px;" src="http://4.bp.blogspot.com/_6I9HJQ7QnqA/S4cIJ_R3kTI/AAAAAAAAASw/klzugsk3N7I/s400/NetBeansJSF06.gif" alt="" id="BLOGGER_PHOTO_ID_5442327642398757170" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;El asistente también genera un archivo de configuración de Faces (&lt;span style="font-weight: bold;"&gt;faces-config.xml&lt;/span&gt;) para registrar la ubicación del paquete de propiedades. Si expandes el nodo de archivos de configuración y abres  &lt;span style="font-weight: bold;"&gt;faces-config.xml&lt;/span&gt; en el editor de XML, se puede ver que se incluye la siguiente entrada.&lt;br /&gt;&lt;br /&gt;&lt;pre face="Andale Mono,Lucida Console,Monaco,fixed,monospace" size="12px" style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); line-height: 14px; width: 100%;"&gt;&lt;code&gt;    &amp;lt;application&amp;gt;&lt;br /&gt;&amp;lt;resource-bundle&amp;gt;&lt;br /&gt;&amp;lt;base-name&amp;gt;recursos/Bundle&amp;lt;/base-name&amp;gt;&lt;br /&gt;&amp;lt;var&amp;gt;bundle&amp;lt;/var&amp;gt;&lt;br /&gt;&amp;lt;/resource-bundle&amp;gt;&lt;br /&gt;&amp;lt;/application&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Además, si exploras el paquete de recursos, encontrarás en el archivo de &lt;span style="font-weight: bold;"&gt;Bundle.properties&lt;/span&gt;, mensajes para el idioma del cliente por defecto. Los mensajes se derivan de las propiedades de la entidad de clase.&lt;br /&gt;&lt;br /&gt;Para agregar un paquete de propiedades nuevas haz click en el archivo &lt;span style="font-weight: bold;"&gt;Bundle.properties&lt;/span&gt; y selecciona &lt;span style="font-weight: bold;"&gt;Customize&lt;/span&gt;. La ventana de diálogo &lt;span style="font-weight: bold;"&gt;Customizer &lt;/span&gt;te permite añadir nuevas configuraciones regionales para la aplicación.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Explorando la Aplicación&lt;/b&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;Ahora que el proyecto contiene las clases de entidad, los EJBs de sesión para controlar las clases de entidad, y JSF de front-end para mostrar y modificar la base de datos, intenta ejecutar el proyecto para ver los resultados.&lt;br /&gt;&lt;br /&gt;En seguida se presentan algunos ejercicios opcionales que te ayudarán a familiarizarte con la aplicación, así como las características y funcionalidad que el IDE.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Examinar el proyecto terminado&lt;/li&gt;&lt;li&gt;Rellenar la base de datos con una secuencia de comandos de SQL&lt;/li&gt;&lt;li&gt;Explorar el Editor de Facelets&lt;/li&gt;&lt;li&gt;Exploración de la integridad de base de datos, con validación de campo&lt;/li&gt;&lt;li&gt;Edición de clases de la entidad&lt;/li&gt;&lt;/ul&gt;Examinar el proyecto terminado&lt;br /&gt;&lt;br /&gt;1.- Para ejecutar el proyecto, haz click derecho en el nodo del proyecto en la ventana de proyectos y selecciona &lt;span style="font-weight: bold;"&gt;Run &lt;/span&gt;o &lt;span style="font-weight: bold;"&gt;Ejecutar&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Cuando se muestra la página de bienvenida de la aplicación, se proporciona una lista de enlaces que permite ver las entradas que figuran en cada tabla de base de datos.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_6I9HJQ7QnqA/S4vxsoox67I/AAAAAAAAAS4/GsYeNGNUyVE/s1600-h/NetBeansJSF07.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 243px;" src="http://1.bp.blogspot.com/_6I9HJQ7QnqA/S4vxsoox67I/AAAAAAAAAS4/GsYeNGNUyVE/s400/NetBeansJSF07.gif" alt="" id="BLOGGER_PHOTO_ID_5443710323732376498" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Nuevos enlaces se han añadido a la página de bienvenida (&lt;span style="font-weight: bold;"&gt;index.xhtml&lt;/span&gt;) con ayuda del asistente. Los enlaces creados se ofrecen como puntos de entrada a las páginas de Facelets que proporcionan la funcionalidad &lt;span style="font-weight: bold;"&gt;CRUD &lt;/span&gt;sobre la base de datos de la aplicación.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;&amp;lt;?xml version='1.0' encoding='UTF-8' ?&amp;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:h="http://java.sun.com/jsf/html"&amp;gt;&lt;br /&gt;  &amp;lt;h:head&amp;gt;&lt;br /&gt;      &amp;lt;title&amp;gt;Facelet Title&amp;lt;/title&amp;gt;&lt;br /&gt;&amp;lt;h:outputStylesheet name="css/jsfcrud.css"/&amp;gt;&lt;br /&gt;  &amp;lt;/h:head&amp;gt;&lt;br /&gt;  &amp;lt;h:body&amp;gt;&lt;br /&gt;      Hello from Facelets&lt;br /&gt;                  &amp;lt;h:form&amp;gt;&lt;br /&gt;                  &amp;lt;h:commandLink action="/cliente/List" value="Show All Cliente Items"/&amp;gt;&lt;br /&gt;              &amp;lt;/h:form&amp;gt;&lt;br /&gt;              &amp;lt;h:form&amp;gt;&lt;br /&gt;                  &amp;lt;h:commandLink action="/consultor/List" value="Show All Consultor Items"/&amp;gt;&lt;br /&gt;              &amp;lt;/h:form&amp;gt;&lt;br /&gt;              &amp;lt;h:form&amp;gt;&lt;br /&gt;                  &amp;lt;h:commandLink action="/direccion/List" value="Show All Direccion Items"/&amp;gt;&lt;br /&gt;              &amp;lt;/h:form&amp;gt;&lt;br /&gt;              &amp;lt;h:form&amp;gt;&lt;br /&gt;                  &amp;lt;h:commandLink action="/estatusConsultor/List" value="Show All EstatusConsultor Items"/&amp;gt;&lt;br /&gt;              &amp;lt;/h:form&amp;gt;&lt;br /&gt;              &amp;lt;h:form&amp;gt;&lt;br /&gt;                  &amp;lt;h:commandLink action="/facturable/List" value="Show All Facturable Items"/&amp;gt;&lt;br /&gt;              &amp;lt;/h:form&amp;gt;&lt;br /&gt;              &amp;lt;h:form&amp;gt;&lt;br /&gt;                  &amp;lt;h:commandLink action="/proyecto/List" value="Show All Proyecto Items"/&amp;gt;&lt;br /&gt;              &amp;lt;/h:form&amp;gt;&lt;br /&gt;              &amp;lt;h:form&amp;gt;&lt;br /&gt;                  &amp;lt;h:commandLink action="/reclutador/List" value="Show All Reclutador Items"/&amp;gt;&lt;br /&gt;              &amp;lt;/h:form&amp;gt;&lt;br /&gt;&amp;lt;/h:body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;2.- Haz click en el vínculo&lt;span style="font-weight: bold;"&gt; Show All Consultor Items&lt;/span&gt;. Tomando en cuenta el código anterior, puedes ver que la página de destino es &lt;span style="font-weight: bold;"&gt;/consultor/List&lt;/span&gt; (En JSF 2.0, la extensión de archivo se infiere debido a la navegación implícita)&lt;br /&gt;&lt;br /&gt;Si no olvidaste ejecutar el segundo script de SQL que se encarga de rellenar algunas tablas podrás ver algunos datos, para el caso de &lt;span style="font-weight: bold;"&gt;Consultores&lt;/span&gt; se muestra al menos un registro.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_6I9HJQ7QnqA/S4v1ku1wBQI/AAAAAAAAATA/VHqcLNxLpxM/s1600-h/NetBeansJSF08.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 214px;" src="http://4.bp.blogspot.com/_6I9HJQ7QnqA/S4v1ku1wBQI/AAAAAAAAATA/VHqcLNxLpxM/s400/NetBeansJSF08.gif" alt="" id="BLOGGER_PHOTO_ID_5443714586004948226" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Como podrás ver, las ociones:  crear, ver, editar y elimimar son generadas también por el asistente.&lt;br /&gt;&lt;br /&gt;Explorar en el Editor de páginas Facelets&lt;br /&gt;&lt;br /&gt;1.- Abra el archivo &lt;span style="font-weight: bold;"&gt;/consultor/List.xhtml&lt;/span&gt; en el editor. Línea 8 indica que la página se basa en el archivo Facelets template.xhtml para crearse.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_6I9HJQ7QnqA/S4v8RdGwIaI/AAAAAAAAATQ/xpUCY6l67xM/s1600-h/NetBeansJSF09.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 103px;" src="http://3.bp.blogspot.com/_6I9HJQ7QnqA/S4v8RdGwIaI/AAAAAAAAATQ/xpUCY6l67xM/s400/NetBeansJSF09.gif" alt="" id="BLOGGER_PHOTO_ID_5443721951408300450" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;2.- Usa la opción de &lt;span style="font-weight: bold;"&gt;Ir a archivo&lt;/span&gt; del IDE para abrir template.xhtml. Presiona &lt;span style="font-weight: bold;"&gt;Alt-Shift-O&lt;/span&gt;,  y luego comenzar a escribir la plantilla.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_6I9HJQ7QnqA/S4v9MYXUjtI/AAAAAAAAATY/ehNbSzILTbg/s1600-h/NetBeansJSF10.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 305px;" src="http://3.bp.blogspot.com/_6I9HJQ7QnqA/S4v9MYXUjtI/AAAAAAAAATY/ehNbSzILTbg/s400/NetBeansJSF10.gif" alt="" id="BLOGGER_PHOTO_ID_5443722963747901138" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Presiona Enter para entrar.&lt;br /&gt;&lt;br /&gt;3.- La plantilla se aplica la etiqueta &lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;&amp;lt;ui:insert&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt; para insertar contenido de otros archivos en su título y el cuerpo.   Coloca el cursor en la etiqueta &lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;&amp;lt;ui:insert&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;, a continuación, pulsa &lt;span style="font-weight: bold;"&gt;Ctrl-Espacio&lt;/span&gt; para invocar una ventana emergente de documentación.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_6I9HJQ7QnqA/S4v-mYGS83I/AAAAAAAAATg/T8LFe9iVDos/s1600-h/NetBeansJSF11.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 272px;" src="http://1.bp.blogspot.com/_6I9HJQ7QnqA/S4v-mYGS83I/AAAAAAAAATg/T8LFe9iVDos/s400/NetBeansJSF11.gif" alt="" id="BLOGGER_PHOTO_ID_5443724509864719218" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Puedes presionar &lt;span style="font-weight: bold;"&gt;Ctrl-Espacio&lt;/span&gt; en las etiquetas JSF y sus atributos para invocar un pop-up de documentación. La documentación que se ve es tomada de la descripción oficial de &lt;a href="https://javaserverfaces.dev.java.net/nonav/docs/2.0/pdldocs/facelets/index.html"&gt;JSF Tag Library Documentation&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;4.- Regresa al archivo &lt;span style="font-weight: bold;"&gt;List.xhtml&lt;/span&gt; (presiona &lt;span style="font-weight: bold;"&gt;Ctrl-Tab&lt;/span&gt;). La etiqueta &lt;code&gt;&lt;span style="font-weight: bold;"&gt;ui:define&lt;/span&gt; &lt;/code&gt; ui:define  se utiliza para definir el contenido que se aplicarán al título de la plantilla y el cuerpo. Este patrón se utiliza para todos los cuatro archivos de Facelets (&lt;span style="font-weight: bold;"&gt;Create.xhtml&lt;/span&gt;, &lt;span style="font-weight: bold;"&gt;Edit.xhtml&lt;/span&gt;, &lt;span style="font-weight: bold;"&gt;List.xhtml&lt;/span&gt;, y &lt;span style="font-weight: bold;"&gt;View.xhtml&lt;/span&gt;) generados para cada clase de entidad.&lt;br /&gt;&lt;br /&gt;5.- Coloca el cursor sobre cualquiera de las expresiones EL que usan los mensajes localizados contenida en el archivo &lt;span style="font-weight: bold;"&gt;Bundle.properties&lt;/span&gt;. &lt;span title="Press Ctrl-Space to view the localized message."&gt;Presiona &lt;span style="font-weight: bold;"&gt;Ctrl-Espacio &lt;/span&gt;para ver el mensaje localizado.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_6I9HJQ7QnqA/S4wA2ZaKDgI/AAAAAAAAATo/n9heLbGGGro/s1600-h/NetBeansJSF12.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 277px;" src="http://2.bp.blogspot.com/_6I9HJQ7QnqA/S4wA2ZaKDgI/AAAAAAAAATo/n9heLbGGGro/s400/NetBeansJSF12.gif" alt="" id="BLOGGER_PHOTO_ID_5443726984117620226" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;6.- Desplazate hasta el final del archivo y busca el código para el enlace &lt;span style="font-weight: bold;"&gt;Crear nuevo consultor&lt;/span&gt; (Línea 92). Este es el siguiente:&lt;br /&gt;&lt;br /&gt;&lt;pre face="Andale Mono,Lucida Console,Monaco,fixed,monospace" size="12px" style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); line-height: 14px; width: 100%;"&gt;&lt;code&gt;&amp;lt;h:commandLink action="#{consultorController.prepareCreate}" value="#{bundle.ListConsultorCreateLink}"/&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;7.- Presiona &lt;span style="font-weight: bold;"&gt;Ctrl-Espacio&lt;/span&gt; en la acción del atributo &lt;span style="font-weight: bold;"&gt; commandLink &lt;/span&gt;para invocar el pop-up de la documentación.&lt;br /&gt;&lt;br /&gt;El atributo action indica el método que controla la solicitud cuando se hace click en el enlace en el navegador. La siguiente documentación se proporciona:&lt;br /&gt;&lt;br /&gt;&lt;div dir="ltr" style="font-style: italic;"&gt;MethodExpression representa la acción de la aplicación que se invoca cuando este componente es activado por el usuario. La expresión debe evaluar un método público que no toma parámetros y devuelve un objeto (el método toString () se llama para obtener el resultado lógico), que se pasa a NavigationHandler para esta aplicación.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;En otras palabras, el valor de acción generalmente se refiere a un método en un bean JSF manejador que se evalúa  a una cadena. La cadena es utilizada por &lt;span style="font-weight: bold;"&gt;NavigationHandler &lt;/span&gt;de JSF de remitir la solicitud a la vista apropiada. Podrás verificar esto en los siguientes pasos.&lt;br /&gt;&lt;br /&gt;8.- Pon el cursor en &lt;span style="font-weight: bold;"&gt;consultorController  &lt;/span&gt;y presione &lt;span style="font-weight: bold;"&gt;Ctrl-Space&lt;/span&gt;. La funcionalidad de completado del editor, indica que &lt;span style="font-weight: bold;"&gt;consultorController  &lt;/span&gt;es un bean JSF controlador.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_6I9HJQ7QnqA/S4wH3wUEk0I/AAAAAAAAATw/Re4sV0JsOxo/s1600-h/NetBeansJSF13.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 42px;" src="http://2.bp.blogspot.com/_6I9HJQ7QnqA/S4wH3wUEk0I/AAAAAAAAATw/Re4sV0JsOxo/s400/NetBeansJSF13.gif" alt="" id="BLOGGER_PHOTO_ID_5443734704027374402" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;9.- Mueve el cursor a &lt;span style="font-weight: bold;"&gt;prepareCreate &lt;/span&gt;y pulsa &lt;span style="font-weight: bold;"&gt;Ctrl-Espacio&lt;/span&gt;. La función de completado de código enumera los métodos que figuran en el bean &lt;span style="font-weight: bold;"&gt;ConsultorController&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Explorando la integridad de base de datos con validación de campos&lt;br /&gt;&lt;br /&gt;1.- Desde la página con la Lista de Consultores en el navegador, haz click en '&lt;span style="font-weight: bold;"&gt;Create New Consultor&lt;/span&gt;". Deberá aparecer el formulario de creación de Consultores.&lt;br /&gt;&lt;br /&gt;2.- Ingresa los siguientes datos en el formulario. Por el momento, dejar los campos &lt;span style="font-weight: bold;"&gt;RecruiterId &lt;/span&gt;y &lt;span style="font-weight: bold;"&gt;StatusId &lt;/span&gt;en blanco.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th class="tblheader" scope="col"&gt;Campo&lt;/th&gt;                                 &lt;th class="tblheader" scope="col"&gt;Valor&lt;/th&gt;                             &lt;/tr&gt;                             &lt;tr&gt;                                 &lt;td class="tbltd1"&gt;ConsultorId&lt;/td&gt;                                 &lt;td class="tbltd1"&gt;2&lt;/td&gt;                             &lt;/tr&gt;                             &lt;tr&gt;                                 &lt;td class="tbltd1"&gt;Email&lt;/td&gt;                                 &lt;td class="tbltd1"&gt;&lt;script language="JavaScript" type="text/javascript"&gt;&lt;!-- var user = "&amp;#106;&amp;#97;&amp;#99;&amp;#107;&amp;#46;&amp;#115;&amp;#109;&amp;#97;&amp;#114;&amp;#116;"; var domain = "&amp;#106;&amp;#115;&amp;#102;&amp;#99;&amp;#114;&amp;#117;&amp;#100;&amp;#99;&amp;#111;&amp;#110;&amp;#115;&amp;#117;&amp;#108;&amp;#116;&amp;#97;&amp;#110;&amp;#116;&amp;#115;&amp;#46;&amp;#99;&amp;#111;&amp;#109;"; var at = "&amp;#x40;"; document.write(user + at + domain); //--&gt;&lt;/script&gt;jorge.listo@consultores.com&lt;noscript&gt;&lt;br /&gt;&lt;/noscript&gt;&lt;/td&gt;                             &lt;/tr&gt;                             &lt;tr&gt;                                 &lt;td class="tbltd1"&gt;Password&lt;/td&gt;                                 &lt;td class="tbltd1"&gt;jorge.listo&lt;/td&gt;                             &lt;/tr&gt;                             &lt;tr&gt;                                 &lt;td class="tbltd1"&gt;TarifaPor&lt;br /&gt;&lt;/td&gt;                                 &lt;td class="tbltd1"&gt;75&lt;/td&gt;                             &lt;/tr&gt;                             &lt;tr&gt;                                 &lt;td class="tbltd1"&gt;TarifaPorHoraFacturable&lt;/td&gt;                                 &lt;td class="tbltd1"&gt;110&lt;/td&gt;                             &lt;/tr&gt;                             &lt;tr&gt;&lt;td class="tbltd1"&gt;FechaContratacion&lt;/td&gt;                                 &lt;td class="tbltd1"&gt;07/22/2008&lt;/td&gt;                             &lt;/tr&gt;                             &lt;tr&gt;                                 &lt;td class="tbltd1"&gt;Resumen&lt;/td&gt;                                 &lt;td class="tbltd1"&gt;Soy el mejor ¡Contratame!&lt;br /&gt;&lt;/td&gt;                             &lt;/tr&gt;                             &lt;tr&gt;                                 &lt;td class="tbltd1"&gt;ReclutadorId&lt;/td&gt;                                 &lt;td class="tbltd1"&gt;---&lt;/td&gt;                             &lt;/tr&gt;                             &lt;tr&gt;                                 &lt;td class="tbltd1"&gt;EstatusId&lt;/td&gt;                                 &lt;td class="tbltd1"&gt;---&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;3.- Haz click en Guardar. Al hacerlo, un error de validación se marca para el campo &lt;span style="font-weight: bold;"&gt;EstatusId&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_6I9HJQ7QnqA/S4wNd59sC8I/AAAAAAAAAT4/RTsd6fEDJQE/s1600-h/NetBeansJSF15.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 376px;" src="http://2.bp.blogspot.com/_6I9HJQ7QnqA/S4wNd59sC8I/AAAAAAAAAT4/RTsd6fEDJQE/s400/NetBeansJSF15.gif" alt="" id="BLOGGER_PHOTO_ID_5443740857011014594" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;¿Por qué ocurrió esto? Reexamina el diagrama entidad-relación de la base de datos. Como se indica en la tabla de relaciones, &lt;span style="font-weight: bold;"&gt;CONSULTOR &lt;/span&gt;y &lt;span style="font-weight: bold;"&gt;ESTATUS&lt;/span&gt;_&lt;span style="font-weight: bold;"&gt;CONSULTOR&lt;/span&gt;  comparten una relación no-nula, uno-a-muchos. Por lo tanto, cada entrada en la tabla &lt;span style="font-weight: bold;"&gt;CONSULTOR &lt;/span&gt;debe contener una referencia a una entrada en la tabla &lt;span style="font-weight: bold;"&gt;ESTATUS&lt;/span&gt;_&lt;span style="font-weight: bold;"&gt;CONSULTOR&lt;/span&gt;. Esto se denota por la clave externa &lt;span style="font-weight: bold;"&gt;consultor_fk_estatus_consultor&lt;/span&gt; que une las dos tablas.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_6I9HJQ7QnqA/S4wP46N0wFI/AAAAAAAAAUA/rG75gH83pw4/s1600-h/NetBeansJSF16.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 354px;" src="http://2.bp.blogspot.com/_6I9HJQ7QnqA/S4wP46N0wFI/AAAAAAAAAUA/rG75gH83pw4/s400/NetBeansJSF16.gif" alt="" id="BLOGGER_PHOTO_ID_5443743519958417490" border="0" /&gt;&lt;/a&gt;4.- Para superar el error de validación,selecciona &lt;span style="font-weight: bold;"&gt;entity.ConsultorStatus&lt;/span&gt;  [EstatusId = A] de la lista de &lt;span style="font-weight: bold;"&gt;EstatusId &lt;/span&gt;desplegable.&lt;br /&gt;&lt;br /&gt;Nota: Puedes dejar el campo en blanco RecruiterId. Como se indica en el diagrama de relación, la relación entre &lt;span style="font-weight: bold;"&gt;CONSULTOR &lt;/span&gt;y la tabla de &lt;span style="font-weight: bold;"&gt;RECLUTADOR &lt;/span&gt;puede ser nula, uno-a-muchos, lo que significa que las entradas de &lt;span style="font-weight: bold;"&gt;CONSULTOR &lt;/span&gt;no necesitan estar asociadas con una entrada en &lt;span style="font-weight: bold;"&gt;RECLUTADOR&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;5.- Haz click en Guardar. Aparecerá un mensaje indicando que la entrada consultor se ha guardado correctamente. Si haces click en&lt;span style="font-weight: bold;"&gt; Show All Consultor Items&lt;/span&gt;, verás la entrada que se ha guardado en la tabla.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_6I9HJQ7QnqA/S4wTDbBSdLI/AAAAAAAAAUI/aC0H0IXRxJI/s1600-h/NetBeansJSF17.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 198px;" src="http://2.bp.blogspot.com/_6I9HJQ7QnqA/S4wTDbBSdLI/AAAAAAAAAUI/aC0H0IXRxJI/s400/NetBeansJSF17.gif" alt="" id="BLOGGER_PHOTO_ID_5443746999097783474" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;En general, las páginas &lt;span style="font-weight: bold;"&gt;Facelets &lt;/span&gt;generadas, proveen de errores para facilitar la entrada que el usuario introduce:&lt;br /&gt;&lt;br /&gt;* Campos vacíos para campos no-nulas.&lt;br /&gt;* Modificaciones a los datos que no puede ser alterados (por ejemplo, las claves primarias).&lt;br /&gt;* Introducción de datos que no son del tipo correcto.&lt;br /&gt;* Modificaciones a los datos cuando la vista de un usuario ya no está sincronizada con la base de datos.&lt;br /&gt;&lt;br /&gt;Editando las Clases de Entidad&lt;br /&gt;&lt;br /&gt;En la seccion anterior vimos cómo la lista desplegable de &lt;span style="font-weight: bold;"&gt;EstatusId&lt;/span&gt; no era muy amigable. Quizá ya te has dado cuenta de que el texto que se muestra para cada elemento es una representación en cadena de cada entidad &lt;span style="font-weight: bold;"&gt;EstatusConsultor&lt;/span&gt; encontrada.&lt;br /&gt;&lt;br /&gt;Veremos cómo usar completamente el editor de código, documentación y apoyo a la navegación como conclusión. También modificaremos el mensaje que se envía al usuario para que sea más amigable.&lt;br /&gt;&lt;br /&gt;1.- Abre el archivo &lt;span style="font-weight: bold;"&gt;/consultor/Create.xhtml&lt;/span&gt;. Este es el formulario &lt;span style="font-weight: bold;"&gt;Create                     New Consultor&lt;/span&gt; que acabas de ver en el navegador. Desplazate hacia abajo para ver el código del la lista desplegable &lt;span style="font-weight: bold;"&gt;EstatusId&lt;/span&gt; (en negrita a continuación).&lt;br /&gt;&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;                    &amp;lt;h:selectOneMenu id="reclutadorId" value="#{consultorController.selected.reclutadorId}" title="#{bundle.CreateConsultorTitle_reclutadorId}" &amp;gt;&lt;br /&gt;                     &amp;lt;f:selectItems value="#{reclutadorController.itemsAvailableSelectOne}"/&amp;gt;&lt;br /&gt;                 &amp;lt;/h:selectOneMenu&amp;gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;                    &amp;lt;h:outputLabel value="#{bundle.CreateConsultorLabel_estatusId}" for="estatusId" /&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;                    &amp;lt;h:selectOneMenu id="estatusId" value="#{consultorController.selected.estatusId}" title="#{bundle.CreateConsultorTitle_estatusId}" required="true" requiredMessage="#{bundle.CreateConsultorRequiredMessage_estatusId}"&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;                        &amp;lt;f:selectItems value="#{estatusConsultorController.itemsAvailableSelectOne}"/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;                    &amp;lt;/h:selectOneMenu&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;2.- Examina el valor aplicado a la etiqueta &lt;f:selectitems&gt;. El atributo "valor" determina el texto que se muestra para cada elemento de la lista desplegable.&lt;br /&gt;&lt;br /&gt;3.- Presione&lt;span style="font-weight: bold;"&gt; Ctrl-Espacio&lt;/span&gt; en &lt;span style="font-weight: bold;"&gt;itemsAvailableSelectOne&lt;/span&gt;. La función de completar código del editor indica que &lt;span style="font-weight: bold;"&gt;getItemsAvailableSelectOne()&lt;/span&gt; de EstatusConsultorController devuelve un arreglo de objetos &lt;span style="font-weight: bold;"&gt;selectItem&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;4.- Coloca el cursor sobre el valor de &lt;/f:selectitems&gt;retorno &lt;f:selectitems&gt; &lt;span style="font-weight: bold;"&gt;selectItem[]&lt;/span&gt; en la firma del método, y pulsa &lt;span style="font-weight: bold;"&gt;Ctrl-Space&lt;/span&gt; para invocar la documentación pop-up.&lt;br /&gt;&lt;br /&gt;&lt;/f:selectitems&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_6I9HJQ7QnqA/S4wzmqvFk9I/AAAAAAAAAUQ/2H4M-nQmpoM/s1600-h/NetBeansJSF18.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 262px;" src="http://2.bp.blogspot.com/_6I9HJQ7QnqA/S4wzmqvFk9I/AAAAAAAAAUQ/2H4M-nQmpoM/s400/NetBeansJSF18.gif" alt="" id="BLOGGER_PHOTO_ID_5443782788983919570" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Si lo deseas haz click en el navegador web (el icono del navegador web) para abrir la documentación Javadoc en un navegador web externo.&lt;br /&gt;&lt;br /&gt;Como puedes ver, la clase &lt;span style="font-weight: bold;"&gt;SelectItem &lt;/span&gt;pertenece al freamwork de JSF. El componente de &lt;span style="font-weight: bold;"&gt;UISelectOne&lt;/span&gt;, como se menciona en la documentación, está representado por la etiqueta de &lt;span style="font-weight: bold;"&gt;&lt;h:selectonemenu&gt;&lt;/h:selectonemenu&gt;&lt;/span&gt; que se examinó en el paso 1.&lt;br /&gt;&lt;br /&gt;5.- Presiona &lt;span style="font-weight: bold;"&gt;Ctrl&lt;/span&gt;, a continuación, pasa el ratón sobre el metodo &lt;span style="font-weight: bold;"&gt;findAll()&lt;/span&gt;. Un pop-up aparece mostrando la firma del método.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_6I9HJQ7QnqA/S4w1aufsuNI/AAAAAAAAAUY/8pF4t-OkF1E/s1600-h/NetBeansJSF19.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 41px;" src="http://1.bp.blogspot.com/_6I9HJQ7QnqA/S4w1aufsuNI/AAAAAAAAAUY/8pF4t-OkF1E/s400/NetBeansJSF19.gif" alt="" id="BLOGGER_PHOTO_ID_5443784782857943250" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Puedes ver que aquí &lt;span style="font-weight: bold;"&gt;ejbFacade.findAll()&lt;/span&gt; devuelve una lista de objetos ConsultantStatus.&lt;br /&gt;&lt;br /&gt;6.- Desplazate sobre a &lt;span style="font-weight: bold;"&gt;JsfUtil.getSelectItems&lt;/span&gt;. Mueve el ratón sobre &lt;span style="font-weight: bold;"&gt;getSelectItems &lt;/span&gt;y presiona la tecla &lt;span style="font-weight: bold;"&gt;Ctrl&lt;/span&gt;, a continuación, haz click en el enlace que aparece.&lt;br /&gt;&lt;br /&gt;Nota: Recuerda que &lt;span style="font-weight: bold;"&gt;JsfUtil &lt;/span&gt;es una de las clases de que se genera cuando se completó del asistente para &lt;span style="font-weight: bold;"&gt;JSF Pages from Entity Classes&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;El método que itera a través de la lista de entidades (es decir, la lista de objetos &lt;span style="font-weight: bold;"&gt;EstatusConsulor&lt;/span&gt;), creando un &lt;span style="font-weight: bold;"&gt;SelectItem &lt;/span&gt;para cada uno. Como se indica en negrita a continuación, cada &lt;span style="font-weight: bold;"&gt;SelectItem &lt;/span&gt;se crea usando el objeto de entidad y una etiqueta para el objeto.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;    public static SelectItem[] getSelectItems(List&amp;lt;?&amp;gt; entities, boolean selectOne) {&lt;br /&gt;      int size = selectOne ? entities.size() + 1 : entities.size();&lt;br /&gt;      SelectItem[] items = new SelectItem[size];&lt;br /&gt;      int i = 0;&lt;br /&gt;      if (selectOne) {&lt;br /&gt;          items[0] = new SelectItem("", "---");&lt;br /&gt;          i++;&lt;br /&gt;      }&lt;br /&gt;      for (Object x : entities) {&lt;br /&gt;          items[i++] = new SelectItem(x, x.toString());&lt;br /&gt;      }&lt;br /&gt;      return items;&lt;br /&gt;  }&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;La etiqueta se crea usando el método &lt;span style="font-weight: bold;"&gt;toString()&lt;/span&gt;, y es la representación del objeto. (Véase la definición Javadoc para el constructor SelectItem (valor java.lang.Object, java.lang.String etiqueta))&lt;br /&gt;&lt;br /&gt;Ahora que has comprobado que es el resultado de &lt;span style="font-weight: bold;"&gt;toString()&lt;/span&gt; es lo que se representa en el navegador al ver los elementos en una lista desplegable, modificaremos el método &lt;span style="font-weight: bold;"&gt;toString ()&lt;/span&gt; de &lt;span style="font-weight: bold;"&gt;EstatusConsultor&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;7.- Abre la clase &lt;span style="font-weight: bold;"&gt;EstatusConsultor &lt;/span&gt;en el editor. Modifica el método &lt;span style="font-weight: bold;"&gt;toString()&lt;/span&gt; para devolver el &lt;span style="font-weight: bold;"&gt;estatusId &lt;/span&gt;y &lt;span style="font-weight: bold;"&gt;descripcion&lt;/span&gt;. Estos son corresponden a las dos columnas de la tabla &lt;span style="font-weight: bold;"&gt;ESTATUS_CONSULTOR&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;    @Override&lt;br /&gt;  public String toString() {&lt;br /&gt;      return estatusId + ", " + descripcion;&lt;br /&gt;  }&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;8.- Ejecuta el proyecto de nuevo. Cuando el navegador muestra la página de bienvenida, haz click en el vínculo Mostrar todos los artículos de consultores, a continuación, haz click en Crear nuevo consultor.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Inspecciona la lista desplegable &lt;span style="font-weight: bold;"&gt;EstatusId&lt;/span&gt;. Verás que ahora muestra el &lt;span style="font-weight: bold;"&gt;ID&lt;/span&gt; de estado y la descripción para el expediente de la que figura en el cuadro &lt;span style="font-weight: bold;"&gt;ESTATUS_CONSUTOR&lt;/span&gt; de la base de datos.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_6I9HJQ7QnqA/S4w6l03EIVI/AAAAAAAAAUg/dYss0vKWhyE/s1600-h/NetBeansJSF21.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 392px; height: 189px;" src="http://2.bp.blogspot.com/_6I9HJQ7QnqA/S4w6l03EIVI/AAAAAAAAAUg/dYss0vKWhyE/s400/NetBeansJSF21.gif" alt="" id="BLOGGER_PHOTO_ID_5443790471103258962" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Listo, teminamos.  Este post esta basado en la traducción del ejemplo:&lt;br /&gt;&lt;br /&gt;&lt;a style="font-weight: bold;" href="http://netbeans.org/kb/docs/web/jsf20-crud.html"&gt;http://netbeans.org/kb/docs/web/jsf20-crud.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;para JSF 2.0 y NetBeans 6.8&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Espero que este ejemplo sea de utilidad para ustedes.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8262369655936226064-8803621664079770541?l=programacionconejemplos.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programacionconejemplos.blogspot.com/feeds/8803621664079770541/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://programacionconejemplos.blogspot.com/2010/02/javaserver-faces-20-crud.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8262369655936226064/posts/default/8803621664079770541'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8262369655936226064/posts/default/8803621664079770541'/><link rel='alternate' type='text/html' href='http://programacionconejemplos.blogspot.com/2010/02/javaserver-faces-20-crud.html' title='JavaServer Faces 2.0 CRUD'/><author><name>Ant</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_6I9HJQ7QnqA/S4VVsHPsPvI/AAAAAAAAAQQ/aTsbgdOXgQM/s72-c/NetBeansServicios.gif' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8262369655936226064.post-1365044968982549417</id><published>2010-01-30T18:48:00.010-06:00</published><updated>2010-01-31T21:27:16.070-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaServer Faces 2.0 - Hola Mundo'/><title type='text'>Ejemplo de JavaServer Faces 2.0, Hola Mundo</title><content type='html'>Que tal!, en esta ocasión les traigo este ejemplo de JavaServer Faces 2.0, un "Hola Mundo". Se trata de un ejemplo sencillo para familiarizarse con el framework.&lt;br /&gt;&lt;br /&gt;Para hacer el ejemplo necesitas tener instalados previamente:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;JDK &lt;/span&gt;1.6 o superior&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;NetBeans &lt;/span&gt;6.8 o superior&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Y los puedes descargar en:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://java.sun.com/javase/downloads/widget/jdk6.jsp"&gt;http://java.sun.com/javase/downloads/widget/jdk6.jsp&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.netbeans.com/"&gt;http://www.netbeans.com/&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Para este ejemplo he creado un video que espero te sea de utilidad.&lt;br /&gt;&lt;br /&gt;&lt;object height="340" width="560"&gt;&lt;param name="movie" value="http://www.youtube.com/v/BBPbBcEYC0Y&amp;amp;hl=en_US&amp;amp;fs=1&amp;amp;"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/BBPbBcEYC0Y&amp;amp;hl=en_US&amp;amp;fs=1&amp;amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" height="340" width="560"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;Si tienes problemas para ver el video da click en la opción de Fullscreen que aparece en las opciones de reproducción del YouTube.&lt;br /&gt;&lt;br /&gt;Por lo sencillo del ejemplo no he dejado una liga con el código, espero tener ejemplos mas elaborados y dejen claro las capacidades de esta tecnología.&lt;br /&gt;&lt;br /&gt;Hasta el próximo post.&lt;div style="border: 3px solid rgb(120, 79, 43); margin: 0px; padding: 0px; background: rgb(217, 198, 182) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; bottom: auto; height: auto; left: 247px; max-width: 350px; position: fixed; right: auto; text-align: left; top: 78px; width: auto; z-index: 1410065407; display: none;" class="translator-popup"&gt;&lt;div style="padding: 5px 7px; color: rgb(17, 17, 17); font-family: Helvetica,Arial,sans-serif; font-size: 14px;"&gt;http://java.sun.com/javase/downloads/widget/jdk6.jsp http://www.netbeans.com/&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8262369655936226064-1365044968982549417?l=programacionconejemplos.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programacionconejemplos.blogspot.com/feeds/1365044968982549417/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://programacionconejemplos.blogspot.com/2010/01/articulo-con-video.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8262369655936226064/posts/default/1365044968982549417'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8262369655936226064/posts/default/1365044968982549417'/><link rel='alternate' type='text/html' href='http://programacionconejemplos.blogspot.com/2010/01/articulo-con-video.html' title='Ejemplo de JavaServer Faces 2.0, Hola Mundo'/><author><name>Ant</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8262369655936226064.post-5780541121281514329</id><published>2009-10-13T23:58:00.009-05:00</published><updated>2010-01-31T13:53:32.885-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JSF2 Java Server Faces 2.0 y NetBeans'/><title type='text'>JSF2 Java Server Faces 2.0 y NetBeans</title><content type='html'>A partir de la version 6.8 de Netbeans es posible crear aplicaciones Web con el Framework de Sun para aplicaciones JSF en la versión 2.0.&lt;br /&gt;&lt;br /&gt;A la fecha de publicación de este blog, la versión disponible de NetBeans es la 6.8.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a href="http://www.netbeans.com/"&gt;http://www.netbeans.com/&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_6I9HJQ7QnqA/S2XfJoS5OPI/AAAAAAAAAPM/1FzXGVSqGaY/s1600-h/introNetbeans68.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 200px; height: 127px;" src="http://3.bp.blogspot.com/_6I9HJQ7QnqA/S2XfJoS5OPI/AAAAAAAAAPM/1FzXGVSqGaY/s200/introNetbeans68.jpg" alt="" id="BLOGGER_PHOTO_ID_5432993882020854002" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Una de las grandes ventajas de usar NetBeans es que las tecnologias de Sun para Java estan disponibles y bien integradas a la IDE, de tal forma que no es necesario preocuparse por instalar librerias o servidores Web para correr ejemplos o proyectos completos.  La gente de Sun se ha preocupado por integrar las tecnologías de mayor uso en el mercado, no importa si no son creadas o promocionadas por ellos mismos.   Sin embargo son los Frameworks de Sun los mejor integrados.&lt;br /&gt;&lt;br /&gt;JSF 2.0 presentará novedades en cuatro áreas principales: facilidad de desarrollo, desempeño, adopción y nuevas características. Seguidamente un resumen de éstas.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Facilidad de desarrollo: esta área permitirá la creación de componentes por medio de agregación, reducirá la configuración por medio de descriptores, remplazándola por un uso extensivo de anotaciones las cuales se usarán al desarrollar componentes, navigation rules etc. Por último se eliminará el desarrollo de Tag Handlers gracias a la integración con facelets. &lt;/li&gt;&lt;li&gt;Nuevas características: entre las nuevas características se puede ver una expansión del ciclo de vida del request para brindar soporte a peticiones Ajax, además se ofrecerá soporte de primera clase para el manejo de los recursos utilizados por los componentes JSF.&lt;/li&gt;&lt;li&gt;Desempeño: se propone renderizar deltas de los componentes JSF según se necesite en lugar de un renderizado completo de los componentes, se mejorará el manejo de eventos mediante PhaseListener y los componentes serán sin estado por defecto.&lt;/li&gt;&lt;li&gt;Adopción: para tener una mejor adopción JSF pretende mejorar la interoperabilidad entre librerías de diferentes vendedores, se agregará soporte para JSR 311,  Skinning o Themeing entre otros.&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-size:78%;"&gt;Tomada de: http://www.javahispano.org/&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Espero tener un ejemplo sencillo muy pronto.&lt;div style="border: 3px solid rgb(120, 79, 43); margin: 0px; padding: 0px; background: rgb(217, 198, 182) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; bottom: auto; height: auto; left: 251px; max-width: 350px; position: fixed; right: auto; text-align: left; top: 71px; width: auto; z-index: 1410065407; display: none;" class="translator-popup"&gt;&lt;div style="padding: 5px 7px; color: rgb(17, 17, 17); font-family: Helvetica,Arial,sans-serif; font-size: 14px;"&gt;http://www.netbeans.com/&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8262369655936226064-5780541121281514329?l=programacionconejemplos.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programacionconejemplos.blogspot.com/feeds/5780541121281514329/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://programacionconejemplos.blogspot.com/2009/10/jsf2-java-server-faces-20-y-netbeans.html#comment-form' title='4 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8262369655936226064/posts/default/5780541121281514329'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8262369655936226064/posts/default/5780541121281514329'/><link rel='alternate' type='text/html' href='http://programacionconejemplos.blogspot.com/2009/10/jsf2-java-server-faces-20-y-netbeans.html' title='JSF2 Java Server Faces 2.0 y NetBeans'/><author><name>Ant</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_6I9HJQ7QnqA/S2XfJoS5OPI/AAAAAAAAAPM/1FzXGVSqGaY/s72-c/introNetbeans68.jpg' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8262369655936226064.post-8880004518028547856</id><published>2009-09-30T19:26:00.013-05:00</published><updated>2010-01-09T01:55:48.763-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Verificación Visual en Formularios'/><title type='text'>Verificación Visual en Formularios, CAPTCHA</title><content type='html'>Seguramente sabes que significa &lt;a href="http://es.wikipedia.org/wiki/Captcha"&gt;&lt;span style="font-weight: bold;"&gt;Captcha &lt;/span&gt;&lt;/a&gt;. Bueno yo tampoco sabía, según Wikipedia es el acrónimo de Completely Automated Public Turing test to tell Computers and Humans Apart ó &lt;span style="font-weight: bold;"&gt;Prueba de Turing pública y automática para diferenciar máquinas y humanos&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;En algunas ocasiones te habrás topado con algún formulario donde aparece una imagen extraña donde debes teclear un código que en teoría solo un humano puede reconocer.  De esta forma se evita que robots entren y agreguen publicidad indeseada de forma automática en comentarios de blogs o en algunos foros.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_6I9HJQ7QnqA/Ss_PJDiZJfI/AAAAAAAAAL8/hUTpNhKW40k/s1600-h/nav00.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 249px; height: 162px;" src="http://3.bp.blogspot.com/_6I9HJQ7QnqA/Ss_PJDiZJfI/AAAAAAAAAL8/hUTpNhKW40k/s400/nav00.gif" alt="" id="BLOGGER_PHOTO_ID_5390755033461106162" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Haremos un ejemplo sencillo para mostrar esta funcionalidad, desde luego &lt;span style="font-weight: bold;"&gt;Struts2&lt;/span&gt; no tiene un método directo para hacerlo y de hecho la solución que damos puede ser usada sin ningún framework, pero aun asi veremos como se configura el &lt;span style="font-weight: bold;"&gt;Action&lt;/span&gt; para recibir la respuesta del usuario.&lt;br /&gt;&lt;br /&gt;Para este ejemplo debes descargarte la libreria &lt;span style="font-weight: bold;"&gt;SimpleCaptcha-1.1.1.jar&lt;/span&gt; y agregarla junto con las demas librerias de tu proyecto. La puedes encontrar y descargar aqui:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://simplecaptcha.sourceforge.net/"&gt;Página del proyecto&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="https://sourceforge.net/project/platformdownload.php?group_id=147810&amp;amp;sel_platform=13579"&gt;Descarga de la librería  &lt;span style="font-weight: bold;"&gt;SimpleCaptcha-1.1.1.jar&lt;/span&gt; &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;Este proyecto creado por James Childers es sencillo y fácil de utilizar, permite crear la imagen con el código de verificación utilizando un servlet que debe darse de alta en el archivo &lt;span style="font-weight: bold;"&gt;web.xml&lt;/span&gt; de nuestro proyecto.&lt;br /&gt;&lt;br /&gt;Te muestro el archivo a continuación.&lt;br /&gt;&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br /&gt;&amp;lt;web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"&amp;gt;&lt;br /&gt;&lt;br /&gt;   &amp;lt;servlet&amp;gt;&lt;br /&gt;       &amp;lt;servlet-name&amp;gt;SimpleCaptcha&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;       &amp;lt;servlet-class&amp;gt;nl.captcha.servlet.SimpleCaptchaServlet&amp;lt;/servlet-class&amp;gt;&lt;br /&gt;   &amp;lt;/servlet&amp;gt;&lt;br /&gt;   &amp;lt;servlet-mapping&amp;gt;&lt;br /&gt;       &amp;lt;servlet-name&amp;gt;SimpleCaptcha&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;       &amp;lt;url-pattern&amp;gt;/simpleImg.jpg&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;   &amp;lt;/servlet-mapping&amp;gt;&lt;br /&gt;&lt;br /&gt;   &amp;lt;filter&amp;gt;&lt;br /&gt;       &amp;lt;filter-name&amp;gt;struts2&amp;lt;/filter-name&amp;gt;&lt;br /&gt;       &amp;lt;filter-class&amp;gt;org.apache.struts2.dispatcher.FilterDispatcher&amp;lt;/filter-class&amp;gt;&lt;br /&gt;   &amp;lt;/filter&amp;gt;&lt;br /&gt;   &amp;lt;filter-mapping&amp;gt;&lt;br /&gt;       &amp;lt;filter-name&amp;gt;struts2&amp;lt;/filter-name&amp;gt;&lt;br /&gt;       &amp;lt;url-pattern&amp;gt;/*&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;   &amp;lt;/filter-mapping&amp;gt;&lt;br /&gt;&lt;br /&gt;   &amp;lt;session-config&amp;gt;&lt;br /&gt;       &amp;lt;session-timeout&amp;gt;&lt;br /&gt;           30&lt;br /&gt;       &amp;lt;/session-timeout&amp;gt;&lt;br /&gt;   &amp;lt;/session-config&amp;gt;&lt;br /&gt;   &amp;lt;welcome-file-list&amp;gt;&lt;br /&gt;       &amp;lt;welcome-file&amp;gt;index.jsp&amp;lt;/welcome-file&amp;gt;&lt;br /&gt;   &amp;lt;/welcome-file-list&amp;gt;&lt;br /&gt;&amp;lt;/web-app&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Agregamos el Action en struts.xml&lt;br /&gt;&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br /&gt;&amp;lt;!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"&amp;gt;&lt;br /&gt;&amp;lt;struts&amp;gt;&lt;br /&gt;   &amp;lt;constant name="struts.enable.DynamicMethodInvocation" value="false" /&amp;gt;&lt;br /&gt;   &amp;lt;constant name="struts.devMode" value="false" /&amp;gt;&lt;br /&gt;&lt;br /&gt;   &amp;lt;package name="default" namespace="/" extends="struts-default"&amp;gt;&lt;br /&gt;       &amp;lt;action name="Inicio"&amp;gt;&lt;br /&gt;           &amp;lt;result&amp;gt;/index.jsp&amp;lt;/result&amp;gt;&lt;br /&gt;       &amp;lt;/action&amp;gt;&lt;br /&gt;       &amp;lt;action name="Validar" class="ejemplos.struts2.actions.AccionValidarCodigo"&amp;gt;&lt;br /&gt;           &amp;lt;result name="input"&amp;gt;/index.jsp&amp;lt;/result&amp;gt;&lt;br /&gt;           &amp;lt;result name="error"&amp;gt;/index.jsp&amp;lt;/result&amp;gt;&lt;br /&gt;           &amp;lt;result&amp;gt;/validacionExitosa.jsp&amp;lt;/result&amp;gt;&lt;br /&gt;       &amp;lt;/action&amp;gt;&lt;br /&gt;   &amp;lt;/package&amp;gt;&lt;br /&gt;&amp;lt;/struts&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Puedes ver que solo agregamos un servlet, sin embargo, la librería SimpleCapcha tiene algunas opciones mas para soportar tamaños especificos de imagenes y juegos de caracteres.&lt;br /&gt;&lt;br /&gt;Aqui te muestro la clase Action que usaremos: &lt;span style="font-weight: bold;"&gt;AccionValidarCodigo&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;&lt;br /&gt;package ejemplos.struts2.actions;&lt;br /&gt;import com.opensymphony.xwork2.ActionContext;&lt;br /&gt;import com.opensymphony.xwork2.ActionSupport;&lt;br /&gt;import javax.servlet.http.HttpServletRequest;&lt;br /&gt;import javax.servlet.http.HttpSession;&lt;br /&gt;import nl.captcha.Captcha;&lt;br /&gt;&lt;br /&gt;public class AccionValidarCodigo extends ActionSupport {&lt;br /&gt;   @Override&lt;br /&gt;   public String execute() throws Exception {&lt;br /&gt;       HttpServletRequest request = (HttpServletRequest) ActionContext.getContext().get(org.apache.struts2.StrutsStatics.HTTP_REQUEST);&lt;br /&gt;       HttpSession session = request.getSession();&lt;br /&gt;       Captcha captcha = (Captcha) session.getAttribute(Captcha.NAME);&lt;br /&gt;       request.setCharacterEncoding("UTF-8");&lt;br /&gt;       String answer = request.getParameter("answer");&lt;br /&gt;       if (captcha.isCorrect(answer)) {&lt;br /&gt;           return SUCCESS;&lt;br /&gt;       } else {&lt;br /&gt;           addActionError("Código inválido, trate nuevamente.");&lt;br /&gt;           return ERROR;&lt;br /&gt;       }&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Como puedes ver, el servlet que dimos de alta guarda en la sesión la variable que será cotejada con el dato de entrada del formulario.&lt;br /&gt;Puedes ver que es muy sencilla, lo importante que debes notar es que el servlet de &lt;span style="font-weight: bold;"&gt;SimpleCaptcha&lt;/span&gt; es la que se encarga de generar la imagen con el código de verificación, siempre y cuando la llames igual que como la definiste en el archivo &lt;span style="font-weight: bold;"&gt;web.xml&lt;/span&gt;, es&lt;br /&gt;&lt;br /&gt;Usaremos dos JSPs parar este ejemplo, el que se encarga de mostrar el sencillo formulario y el que muestra el mensaje de validación exitosa.&lt;br /&gt;&lt;br /&gt;index.jsp&lt;br /&gt;&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;&amp;lt;%@page contentType="text/html" pageEncoding="UTF-8"%&amp;gt;&lt;br /&gt;&amp;lt;%@ taglib prefix="s" uri="/struts-tags" %&amp;gt;&lt;br /&gt;&amp;lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"&amp;gt;&lt;br /&gt;&amp;lt;html&amp;gt;&lt;br /&gt;   &amp;lt;head&amp;gt;&lt;br /&gt;       &amp;lt;title&amp;gt;Validacion Capcha&amp;lt;/title&amp;gt;&lt;br /&gt;       &amp;lt;style&amp;gt;&lt;br /&gt;           .errorMessage {&lt;br /&gt;               color: red;&lt;br /&gt;               font-size: 0.8em;&lt;br /&gt;           }&lt;br /&gt;           .label {&lt;br /&gt;               color:#000000;&lt;br /&gt;           }&lt;br /&gt;       &amp;lt;/style&amp;gt;&lt;br /&gt;   &amp;lt;/head&amp;gt;&lt;br /&gt;   &amp;lt;body&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;h1&amp;gt;Validacion Capcha&amp;lt;/h1&amp;gt;&lt;br /&gt;                   &amp;lt;s:form action="Validar" namespace="/" method="POST"&amp;gt;&lt;br /&gt;                       &amp;lt;s:actionerror /&amp;gt;&lt;br /&gt;                       &amp;lt;img src="simpleImg.jpg" border="0"&amp;gt;&lt;br /&gt;                       &amp;lt;s:textfield label="Code" name="answer" size="20" maxlength="10"/&amp;gt;&lt;br /&gt;                       &amp;lt;s:submit value="Verify" align="center" /&amp;gt;&lt;br /&gt;                   &amp;lt;/s:form&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;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;El jsp con el mensaje de éxito. validacionExitosa.jsp&lt;br /&gt;&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;&amp;lt;%@page contentType="text/html" pageEncoding="UTF-8"%&amp;gt;&lt;br /&gt;&amp;lt;%@ taglib prefix="s" uri="/struts-tags" %&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;html&amp;gt;&lt;br /&gt;   &amp;lt;head&amp;gt;&lt;br /&gt;       &amp;lt;title&amp;gt;Validacion Capcha&amp;lt;/title&amp;gt;&lt;br /&gt;   &amp;lt;/head&amp;gt;&lt;br /&gt;   &amp;lt;body&amp;gt;&lt;br /&gt;       &amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&amp;lt;h1&amp;gt;Validación exitosa&amp;lt;/h1&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&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;/pre&gt;&lt;br /&gt;Al ejecutar el ejemplo, la pantalla del navegador lucirá asi:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_6I9HJQ7QnqA/SsQh7pA1kLI/AAAAAAAAALs/PmzEkNf0VoA/s1600-h/nav01.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 399px; height: 400px;" src="http://2.bp.blogspot.com/_6I9HJQ7QnqA/SsQh7pA1kLI/AAAAAAAAALs/PmzEkNf0VoA/s400/nav01.gif" alt="" id="BLOGGER_PHOTO_ID_5387468362747318450" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Si se ingresa el código correcto el Framework nos redirige a la página de éxito.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_6I9HJQ7QnqA/SsQabce8ejI/AAAAAAAAALc/7-WC7msJz2I/s1600-h/nav02.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 400px;" src="http://4.bp.blogspot.com/_6I9HJQ7QnqA/SsQabce8ejI/AAAAAAAAALc/7-WC7msJz2I/s400/nav02.gif" alt="" id="BLOGGER_PHOTO_ID_5387460113046731314" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;En caso de error vuelver a aparecer el formulario.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_6I9HJQ7QnqA/SsQh7wRRtWI/AAAAAAAAAL0/sr5X5eLRMGo/s1600-h/nav03.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 400px;" src="http://3.bp.blogspot.com/_6I9HJQ7QnqA/SsQh7wRRtWI/AAAAAAAAAL0/sr5X5eLRMGo/s400/nav03.gif" alt="" id="BLOGGER_PHOTO_ID_5387468364695319906" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Bueno espero que sea de interés este post, dejen sus comentarios.&lt;br /&gt;&lt;br /&gt;Espero poner pronto el código. Hasta el próximo post.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8262369655936226064-8880004518028547856?l=programacionconejemplos.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programacionconejemplos.blogspot.com/feeds/8880004518028547856/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://programacionconejemplos.blogspot.com/2009/09/verificacion-viusal-en-formularios.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8262369655936226064/posts/default/8880004518028547856'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8262369655936226064/posts/default/8880004518028547856'/><link rel='alternate' type='text/html' href='http://programacionconejemplos.blogspot.com/2009/09/verificacion-viusal-en-formularios.html' title='Verificación Visual en Formularios, CAPTCHA'/><author><name>Ant</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_6I9HJQ7QnqA/Ss_PJDiZJfI/AAAAAAAAAL8/hUTpNhKW40k/s72-c/nav00.gif' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8262369655936226064.post-9057677499144631856</id><published>2009-08-19T12:47:00.011-05:00</published><updated>2010-01-09T01:12:12.966-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Struts2 - FileUpload - Carga de Archivos'/><title type='text'>Carga de archivo, Interceptor FileUpload con Struts2</title><content type='html'>En este ejemplo veremos nuevamente el uso interceptores, como ya hemos mencionado en otros post, Struts2 posee una amplia gama de funciones que permiten hacer mas ágil el desarrollo y que están puestas a disposición de los desarrolladores a través de los interceptores que vienen por default.&lt;br /&gt;&lt;br /&gt;En esta ocasión veremos un interceptor que nos permite realizar una de las funciones con la que comúnmente nos topamos en el desarrollo de aplicaciones empresariales, se trata de la carga de archivos.&lt;br /&gt;&lt;br /&gt;El interceptor &lt;span style="font-weight: bold;"&gt;FileUpload &lt;/span&gt;está dado de alta en la pila de interceptores del paquete default que maneja &lt;span style="font-weight: bold;"&gt;Struts2&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center; font-weight: bold;"&gt;org.apache.struts2.interceptor.FileUploadInterceptor&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Si ya tenemos configurado nuestro proyecto solo es necesario agregar estas librerías:&lt;br /&gt;&lt;ul&gt;&lt;li style="font-weight: bold;"&gt;commons-fileupload-1.2.1.jar&lt;/li&gt;&lt;li style="font-weight: bold;"&gt;commons-io-1.3.2.jar&lt;/li&gt;&lt;/ul&gt;Si no recuerdas que otras librerías son requeridas o como configurar tu proyecto para usar Struts2 puedes regresar al primer ejemplo que vimos en este mismo blog sobre como hacerlo:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a href="http://programacionconejemplos.blogspot.com/2009/06/1-ejemplo-struts2_17.html"&gt;&lt;span style="font-weight: bold;"&gt;El primer ejemplo de Struts2&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Lo primero que haremos es crear un formulario de carga de archivos, el código lo muestro a continuación:&lt;br /&gt;&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;&amp;lt;%@page contentType="text/html" pageEncoding="UTF-8"%&amp;gt;&lt;br /&gt;&amp;lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"&lt;br /&gt; "http://www.w3.org/TR/html4/loose.dtd"&amp;gt;&lt;br /&gt;&amp;lt;%@ taglib prefix="s" uri="/struts-tags" %&amp;gt;&lt;br /&gt;&amp;lt;html&amp;gt;&lt;br /&gt;  &amp;lt;head&amp;gt;&lt;br /&gt;      &amp;lt;meta http-equiv="Content-Type" content="text/html; charset=UTF-8"&amp;gt;&lt;br /&gt;      &amp;lt;title&amp;gt;Carga de archivos con interceptores&amp;lt;/title&amp;gt;&lt;br /&gt;  &amp;lt;/head&amp;gt;&lt;br /&gt;  &amp;lt;body&amp;gt;&lt;br /&gt;      &amp;lt;h1&amp;gt;Carga de archivos con interceptores&amp;lt;/h1&amp;gt;&lt;br /&gt;      &amp;lt;s:form action="CargaArchivo" method="post" enctype="multipart/form-data"&amp;gt;&lt;br /&gt;          &amp;lt;s:file name="archivo" label="Carga Archivo"/&amp;gt;&lt;br /&gt;          &amp;lt;s:submit value="Subir" align="center"/&amp;gt;&lt;br /&gt;      &amp;lt;/s:form&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;/pre&gt;&lt;br /&gt;Despues creamos la clase &lt;span style="font-weight: bold;"&gt;AccionCargaArchivo &lt;/span&gt;que se encargará de recibir y manejar el contenido del archivo.&lt;br /&gt;&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;package ejemplos.struts2.accion;&lt;br /&gt;import com.opensymphony.xwork2.ActionSupport;&lt;br /&gt;import java.io.BufferedReader;&lt;br /&gt;import java.io.File;&lt;br /&gt;import java.io.FileReader;&lt;br /&gt;&lt;br /&gt;public class AccionCargaArchivo extends ActionSupport {&lt;br /&gt;  private File archivo;&lt;br /&gt;  private String archivoContentType;&lt;br /&gt;  private String archivoFileName;&lt;br /&gt;  private String datos = "";&lt;br /&gt;&lt;br /&gt;  public String execute() {&lt;br /&gt;      try{&lt;br /&gt;          BufferedReader entrada = new BufferedReader( new FileReader( archivo ) );&lt;br /&gt;          if ( archivoContentType.equals("text/plain")){&lt;br /&gt;              String aux;&lt;br /&gt;              while((aux = entrada.readLine()) != null){&lt;br /&gt;                  datos += aux + "\n";&lt;br /&gt;              }&lt;br /&gt;          }&lt;br /&gt;      }catch(Exception e){&lt;br /&gt;          e.printStackTrace();&lt;br /&gt;      }&lt;br /&gt;      return SUCCESS;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public File getArchivo() {&lt;br /&gt;      return archivo;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public void setArchivo(File archivo) {&lt;br /&gt;      this.archivo = archivo;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public String getArchivoContentType() {&lt;br /&gt;      return archivoContentType;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public void setArchivoContentType(String archivoContentType) {&lt;br /&gt;      this.archivoContentType = archivoContentType;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public String getArchivoFileName() {&lt;br /&gt;      return archivoFileName;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public void setArchivoFileName(String archivoFileName) {&lt;br /&gt;      this.archivoFileName = archivoFileName;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public String getDatos() {&lt;br /&gt;      return datos;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public void setDatos(String datos) {&lt;br /&gt;      this.datos = datos;&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Del la clase Action anterior observa cuidadosamente las siguientes variables:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;File  &lt;/span&gt;nombreDeArchivo;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;String  &lt;/span&gt;nombreDeArchivo&lt;span style="font-weight: bold;"&gt;ContentType&lt;/span&gt;;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;String  &lt;/span&gt;nombreDeArchivo&lt;span style="font-weight: bold;"&gt;FileName&lt;/span&gt;;&lt;/li&gt;&lt;/ul&gt;Como puedes ver la variable de tipo &lt;span style="font-weight: bold;"&gt;File &lt;/span&gt;tiene un nombre arbitrario, sin embargo las otras dos deben cumplir con un formato establecido para que el interceptor pueda encontrarlas y establecer los datos correspondientes al tipo de contenido y al nombre del archivo.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;archivo &lt;/span&gt;- Es el nombre del archivo.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;archivoContentType  &lt;/span&gt;- Contiene el tipo de contenido del archivo.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;archivoFileName&lt;/span&gt;   - Contiene el nombre del archivo tal como fue almacenado en el servidor.&lt;/li&gt;&lt;/ul&gt;Esto es todo lo que debe hacerse para que el Framework a través del inteceptor tome el archivo y lo relacione con las variables que declaramos en el &lt;span style="font-weight: bold;"&gt;Action&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;También haremos la jsp de respuesta, que solo mostrará algunos datos del archivo que se esta subiendo al servidor.&lt;br /&gt;&lt;br /&gt;El código es el siguiente:&lt;br /&gt;&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;&amp;lt;%@page contentType="text/html" pageEncoding="UTF-8"%&amp;gt;&lt;br /&gt;&amp;lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"&lt;br /&gt; "http://www.w3.org/TR/html4/loose.dtd"&amp;gt;&lt;br /&gt;&amp;lt;%@ taglib prefix="s" uri="/struts-tags" %&amp;gt;&lt;br /&gt;&amp;lt;html&amp;gt;&lt;br /&gt;  &amp;lt;head&amp;gt;&lt;br /&gt;      &amp;lt;meta http-equiv="Content-Type" content="text/html; charset=UTF-8"&amp;gt;&lt;br /&gt;      &amp;lt;title&amp;gt;JSP Page&amp;lt;/title&amp;gt;&lt;br /&gt;  &amp;lt;/head&amp;gt;&lt;br /&gt;  &amp;lt;body&amp;gt;&lt;br /&gt;      &amp;lt;h1&amp;gt;El archivo fu&amp;amp;eacute; recibido con exito!&amp;lt;/h1&amp;gt;&lt;br /&gt;      El tipo del contenido es : &amp;lt;s:property value="archivoContentType"/&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;      Nombre del archivo es : &amp;lt;s:property value="archivoFileName"/&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;      Nombre del archivo temporal : &amp;lt;s:property value="archivo.name"/&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;      Contenido del archivo :&amp;lt;br&amp;gt;&lt;br /&gt;          &amp;lt;s:textarea name="dat" value="%{datos}" cols="50" /&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;/pre&gt;&lt;br /&gt;y por último haremos cambios necesarios en el archivo de configuración de Struts2 para hacer referencia a las clases y jsps que acabamos de crear.&lt;br /&gt;&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;&amp;lt;!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"&amp;gt;&lt;br /&gt;&amp;lt;struts&amp;gt;&lt;br /&gt;  &amp;lt;constant name="struts.enable.DynamicMethodInvocation" value="false" /&amp;gt;&lt;br /&gt;  &amp;lt;constant name="struts.devMode" value="false" /&amp;gt;&lt;br /&gt;  &amp;lt;package name="default" namespace="/" extends="struts-default"&amp;gt;&lt;br /&gt;      &amp;lt;action name="FormularioCargaArchivo" &amp;gt;&lt;br /&gt;          &amp;lt;result&amp;gt;/formularioDeCargaDeArchivo.jsp&amp;lt;/result&amp;gt;&lt;br /&gt;      &amp;lt;/action&amp;gt;&lt;br /&gt;      &amp;lt;action name="CargaArchivo" class="ejemplos.struts2.accion.AccionCargaArchivo"&amp;gt;&lt;br /&gt;          &amp;lt;result&amp;gt;/archivoCargado.jsp&amp;lt;/result&amp;gt;&lt;br /&gt;          &amp;lt;result name="input"&amp;gt;/formularioDeCargaDeArchivo.jsp&amp;lt;/result&amp;gt;&lt;br /&gt;      &amp;lt;/action&amp;gt;&lt;br /&gt;  &amp;lt;/package&amp;gt;&lt;br /&gt;&amp;lt;/struts&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;El código fuente de todos los archivos aqui:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://javandengi.svn.sourceforge.net/viewvc/javandengi/Struts2Ejemplo3/src/java/ejemplos/struts2/accion/AccionCargaArchivo.java"&gt;AccionCargaArchivo.java&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://javandengi.svn.sourceforge.net/viewvc/javandengi/Struts2Ejemplo3/src/java/struts.xml"&gt;struts.xml&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://javandengi.svn.sourceforge.net/viewvc/javandengi/Struts2Ejemplo3/web/formularioDeCargaDeArchivo.jsp"&gt;formularioDeCargaDeArchivo.jsp&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://javandengi.svn.sourceforge.net/viewvc/javandengi/Struts2Ejemplo3/web/archivoCargado.jsp"&gt;archivoCargado.jsp&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://javandengi.svn.sourceforge.net/viewvc/javandengi/Struts2Ejemplo3/web/WEB-INF/web.xml"&gt;web.xml&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;Si corres el ejemplo y mandas llamar al formulario de carga de archivo debe aparecerte algo como lo siguiente:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;formularioDeCargaDeArchivo.jsp&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_6I9HJQ7QnqA/Sox_dTgKKcI/AAAAAAAAAJo/0-rqp9IPPSs/s1600-h/formularioCargaDeArchivo.gif"&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/_6I9HJQ7QnqA/Sox_dTgKKcI/AAAAAAAAAJo/0-rqp9IPPSs/s400/formularioCargaDeArchivo.gif" alt="" id="BLOGGER_PHOTO_ID_5371808596974250434" border="0" /&gt;&lt;/a&gt;Como puedes ver nos aparece el campo para especificar el archivo que queremos subir.&lt;br /&gt;&lt;br /&gt;Para este ejemplo solo cargaremos archivos de texto plano y visualizaremos el contenido.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_6I9HJQ7QnqA/Sox_eTKf--I/AAAAAAAAAJ4/ediBWo2qlK0/s1600-h/formularioCargaDeArchivo3.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 294px; height: 189px;" src="http://3.bp.blogspot.com/_6I9HJQ7QnqA/Sox_eTKf--I/AAAAAAAAAJ4/ediBWo2qlK0/s400/formularioCargaDeArchivo3.gif" alt="" id="BLOGGER_PHOTO_ID_5371808614063274978" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_6I9HJQ7QnqA/Sox_d3-rvII/AAAAAAAAAJw/uHdLwNkxIGc/s1600-h/formularioCargaDeArchivo2.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 280px;" src="http://1.bp.blogspot.com/_6I9HJQ7QnqA/Sox_d3-rvII/AAAAAAAAAJw/uHdLwNkxIGc/s400/formularioCargaDeArchivo2.gif" alt="" id="BLOGGER_PHOTO_ID_5371808606765956226" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Damos click en el boton de Subir y tendremos una respuesta como esta:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_6I9HJQ7QnqA/Sox_fKx2D7I/AAAAAAAAAKA/r3yhudnroh8/s1600-h/formularioCargaDeArchivoResultado.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 280px;" src="http://1.bp.blogspot.com/_6I9HJQ7QnqA/Sox_fKx2D7I/AAAAAAAAAKA/r3yhudnroh8/s400/formularioCargaDeArchivoResultado.gif" alt="" id="BLOGGER_PHOTO_ID_5371808628992249778" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;En esta jsp mostramos el tipo de datos del archivo, el nombre del archivo y el nombre que tendrá temporalmente en el servidor mientras es procesado durante el tiempo que se ejecute nuestra acción.&lt;br /&gt;&lt;br /&gt;Despues mostramos simplemente el contenido.  Listo ya tenemos el ejemplo.&lt;br /&gt;&lt;br /&gt;Es importante que sepas que el archivo temporal se removera del servidor una vez que el ciclo de llamada a la acción termine.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_6I9HJQ7QnqA/SoyD1JyMVCI/AAAAAAAAAKI/rPEVeB-fhVQ/s1600-h/removerArchivo.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 28px;" src="http://3.bp.blogspot.com/_6I9HJQ7QnqA/SoyD1JyMVCI/AAAAAAAAAKI/rPEVeB-fhVQ/s400/removerArchivo.gif" alt="" id="BLOGGER_PHOTO_ID_5371813404728906786" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Espero que te sirva este ejemplo, si tienes alguna duda o comentario hazmelo saber. Hasta el proximo post.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8262369655936226064-9057677499144631856?l=programacionconejemplos.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programacionconejemplos.blogspot.com/feeds/9057677499144631856/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://programacionconejemplos.blogspot.com/2009/08/carga-de-archivo-interceptor-fileupload.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8262369655936226064/posts/default/9057677499144631856'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8262369655936226064/posts/default/9057677499144631856'/><link rel='alternate' type='text/html' href='http://programacionconejemplos.blogspot.com/2009/08/carga-de-archivo-interceptor-fileupload.html' title='Carga de archivo, Interceptor FileUpload con Struts2'/><author><name>Ant</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_6I9HJQ7QnqA/Sox_dTgKKcI/AAAAAAAAAJo/0-rqp9IPPSs/s72-c/formularioCargaDeArchivo.gif' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8262369655936226064.post-1147467010065130326</id><published>2009-07-30T19:14:00.007-05:00</published><updated>2009-08-08T12:50:16.489-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ventajas de Struts2'/><category scheme='http://www.blogger.com/atom/ns#' term='Struts1 vs Struts2'/><title type='text'>Struts1 vs Struts2</title><content type='html'>La siguiente es una comparación tomada y traducida de la página de Rose India, un pequeño articulo que anima a los desarrolladores de &lt;span style="font-weight: bold;"&gt;Struts1 &lt;/span&gt;a comenzar a usar &lt;span style="font-weight: bold;"&gt;Struts2&lt;/span&gt;&lt;br /&gt;Les pongo la liga de la página.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a href="http://www.roseindia.net/"&gt;http://www.roseindia.net&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;También puedes encontrar muchos otros ejemplos de programación en &lt;span style="font-weight: bold;"&gt;Java&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Struts1 vs Struts2&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Clases Action&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Struts1&lt;/span&gt;&lt;br /&gt;Se Requiere extender de la una clase &lt;span style="font-weight: bold;"&gt;Action &lt;/span&gt;abstracta.  El problema común en &lt;span style="font-weight: bold;"&gt;Struts1 &lt;/span&gt;es que se programan clases abstractas en lugar de interfaces.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Struts2&lt;/span&gt;&lt;br /&gt;Un &lt;span style="font-weight: bold;"&gt;Action &lt;/span&gt;puede implementar una interfaz &lt;span style="font-weight: bold;"&gt;Action&lt;/span&gt;, además de otras interfaces que le permitan integrar mas servicios. &lt;span style="font-weight: bold;"&gt; Struts2 &lt;/span&gt;provee de una clase base &lt;span style="font-weight: bold;"&gt;ActionSupport &lt;/span&gt;que implementa las interfaces comúnmente usadas. Además esta interfaz no es requerida.  Cualquier &lt;span style="font-weight: bold;"&gt;POJO &lt;/span&gt;con un método de ejecución puede ser usado como &lt;span style="font-weight: bold;"&gt;Action &lt;/span&gt;en &lt;span style="font-weight: bold;"&gt;Struts2&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Modelo de hilos&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Struts1&lt;/span&gt;&lt;br /&gt;Las &lt;span style="font-weight: bold;"&gt;Actions &lt;/span&gt;implementan el patrón singleton y deben ser &lt;span style="font-weight: bold;"&gt;thread-safe&lt;/span&gt; por lo que puede haber solo una instancia de una clase para manejar todas las peticiones para ese &lt;span style="font-weight: bold;"&gt;Action&lt;/span&gt;. La estrategia singleton pone restricciones sobre lo que podemos hacer con los Actions de Struts1 y se requiere un cuidado extra para desarrollar.  Los recursos  usados para los &lt;span style="font-weight: bold;"&gt;Actions &lt;/span&gt;deben ser &lt;span style="font-weight: bold;"&gt;thread-safe &lt;/span&gt;o &lt;span style="font-weight: bold;"&gt;sincronized&lt;/span&gt;.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Struts2&lt;/span&gt;&lt;br /&gt;Los objetos &lt;span style="font-weight: bold;"&gt;Action &lt;/span&gt;son instanciados por cada petición, por lo que no hay problemas de tipo con la seguridad de hilos.  En la práctica, los contenedores de servlets generan muchas instancias, así que un objeto mas no representa problemas de rendimiento y de impacto en el garbage collection&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Dependencia de los Servlets&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Struts1&lt;/span&gt;&lt;br /&gt;Las Actions tiene dependencias de la &lt;span style="font-weight: bold;"&gt;API &lt;/span&gt;de &lt;span style="font-weight: bold;"&gt;Servlets &lt;/span&gt;dado que &lt;span style="font-weight: bold;"&gt;HttpServletRequest &lt;/span&gt;y &lt;span style="font-weight: bold;"&gt;HttpServletResponse &lt;/span&gt;son pasados al método excecute cuando la &lt;span style="font-weight: bold;"&gt;Action &lt;/span&gt;es invocada.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Struts2&lt;/span&gt;&lt;br /&gt;Las &lt;span style="font-weight: bold;"&gt;Actions &lt;/span&gt;no están acopladas al contenedor.  A menudo el contexto de los servlets esta representado por simples &lt;span style="font-weight: bold;"&gt;Maps&lt;/span&gt;, permitiendo a las &lt;span style="font-weight: bold;"&gt;Actions &lt;/span&gt;ser probadas de forma aislada.   Las Actions de &lt;span style="font-weight: bold;"&gt;Struts2 &lt;/span&gt;puede mantener el uso del request y el response si se requiere.  De cualquier forma, otros elementos de la arquitectura reducen o eliminan la necesidad de acceder a &lt;span style="font-weight: bold;"&gt;HttpServetRequest &lt;/span&gt;o a &lt;span style="font-weight: bold;"&gt;HttpServletResponse &lt;/span&gt;directamente.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Manejo de pruebas&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Struts1&lt;/span&gt;&lt;br /&gt;El principal obstáculo para las &lt;span style="font-weight: bold;"&gt;Actions &lt;/span&gt;de &lt;span style="font-weight: bold;"&gt;Struts1 &lt;/span&gt;es que la ejecución de métodos requiere de la &lt;span style="font-weight: bold;"&gt;API &lt;/span&gt;de &lt;span style="font-weight: bold;"&gt;Servlets&lt;/span&gt;.  Una extensión de terceras partes, como &lt;span style="font-weight: bold;"&gt;Struts TestCase&lt;/span&gt;, que ofrece un conjunto de simuladores para objetos de &lt;span style="font-weight: bold;"&gt;Struts1&lt;/span&gt;.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Struts2&lt;/span&gt;&lt;br /&gt;Las &lt;span style="font-weight: bold;"&gt;Actions &lt;/span&gt;pueden ser probadas instanciado la &lt;span style="font-weight: bold;"&gt;Action&lt;/span&gt;, estableciendo propiedades e invocando métodos.  El soporte a la &lt;span style="font-weight: bold;"&gt;Inyección de Dependecias&lt;/span&gt; permite hacer las pruebas de forma simple.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Recolección de datos de entrada&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Struts1&lt;/span&gt;&lt;br /&gt;Es necesario el uso de un objeto &lt;span style="font-weight: bold;"&gt;ActionForm &lt;/span&gt;para capturar las entradas.  Como las &lt;span style="font-weight: bold;"&gt;Actions&lt;/span&gt;, todos los &lt;span style="font-weight: bold;"&gt;ActionForm &lt;/span&gt;deben extender de una clase.  Como algunos JavaBeans no implementan de &lt;span style="font-weight: bold;"&gt;ActionForm &lt;/span&gt;los desarrolladores a menudo crean clases redundantes para capturar a las entradas.  Los &lt;span style="font-weight: bold;"&gt;DynaBeans &lt;/span&gt;pueden ser usados de forma alternativa para crear clases ActionForm convencionales, pero, los desarrolladores deben JavaBeans existentes.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Struts2&lt;/span&gt;&lt;br /&gt;Usa las propiedades de las &lt;span style="font-weight: bold;"&gt;Actions &lt;/span&gt;para manejar las entradas, elimina la necesidad de un segundo objeto de entrada.  las propiedades de entrada pueden ser objetos de una amplia variedad que incluso pueden tener sus propias variables.   Las propiedades de las &lt;span style="font-weight: bold;"&gt;Action &lt;/span&gt;pueden usadas por la pagina Web por medio de los &lt;span style="font-weight: bold;"&gt;TagLibs&lt;/span&gt;. &lt;span style="font-weight: bold;"&gt; Struts2 &lt;/span&gt;soporta incluso el patrón de ActionForm, asi como objetos y acciones &lt;span style="font-weight: bold;"&gt;POJO&lt;/span&gt;.  Tipos de objetos, incluyendo negocios o objetos de dominio, pueden ser usados como objetos en entrada y salida.  La característica &lt;span style="font-weight: bold;"&gt;ModelDriven&lt;/span&gt; simplifica las referencias por taglib a objetos &lt;span style="font-weight: bold;"&gt;POJO&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Lenguaje de Expresiones&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Struts1&lt;/span&gt;&lt;br /&gt;Esta integrado con &lt;span style="font-weight: bold;"&gt;JSTL&lt;/span&gt;, así que usa el &lt;span style="font-weight: bold;"&gt;JSTL EL&lt;/span&gt;.  El &lt;span style="font-weight: bold;"&gt;EL &lt;/span&gt;tiene una traza grafica de objetos básica y una relativamente pobre colección e indexación de soporte a propiedades.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Struts2&lt;/span&gt;&lt;br /&gt;Puede usarse &lt;span style="font-weight: bold;"&gt;JSTL&lt;/span&gt;, pero el marco de trabajo soporta ademas un lenguaje de expresiones mas poderoso y flexible llamado "&lt;span style="font-weight: bold;"&gt;Object Graph Notation Language&lt;/span&gt;" (&lt;span style="font-weight: bold;"&gt;OGNL&lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Vinculación de objetos de la vista&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Struts1&lt;/span&gt;&lt;br /&gt; Usa el mecanismo estándar de &lt;span style="font-weight: bold;"&gt;JSPS &lt;/span&gt;para el vincular objetos en el contexto de las páginas.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Struts2&lt;/span&gt;&lt;br /&gt;Usa una tecnología llamada "&lt;span style="font-weight: bold;"&gt;ValueStack&lt;/span&gt;" donde los taglibs pueden acceder a valores sin estar acoplados a la vista donde el tipo de objeto se renderea.  La estrategia del "&lt;span style="font-weight: bold;"&gt;ValueStack&lt;/span&gt;" permite reutilizar vistas gracias al rango de variables que pueden tener el mismo nombre pero tipo diferente tipos de propiedades.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Conversion de tipo&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Struts1&lt;/span&gt;&lt;br /&gt;Las propiedades de los &lt;span style="font-weight: bold;"&gt;ActionForm &lt;/span&gt;son usualmente &lt;span style="font-weight: bold;"&gt;Strings&lt;/span&gt;.  Struts1 usa comúnmente &lt;span style="font-weight: bold;"&gt;Commons-Beanutils&lt;/span&gt; para la conversión de tipos.  Las conversiones son configurables por clase y no por instancia.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Struts2&lt;/span&gt;&lt;br /&gt;Usa &lt;span style="font-weight: bold;"&gt;OGNL &lt;/span&gt;para la conversión de tipos.   El marco de trabajo incluye convertidores para  objetos básicos y tipos primitivos.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Validación&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Struts1&lt;/span&gt;&lt;br /&gt;Soporta validación manual por medio de métodos en el &lt;span style="font-weight: bold;"&gt;ActionForm&lt;/span&gt;, o a través de una extensión de los &lt;span style="font-weight: bold;"&gt;Commons Validator&lt;/span&gt;.  Las clases pueden tener diferentes contextos de validación para la misma clase, pero no pueden encadenar validaciones en sub objetos.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Struts2&lt;/span&gt;&lt;br /&gt;Soporta validación manual por medio de métodos y por el marco de trabajo &lt;span style="font-weight: bold;"&gt;XWork Validation&lt;/span&gt;.  El &lt;span style="font-weight: bold;"&gt;XWork &lt;/span&gt;soporta encadenamiento de validaciones en las subpropiedades usando las validaciones definidas para las propiedades de la clase y el contexto de validación.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Control de la ejecución del Action&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Struts1&lt;/span&gt;&lt;br /&gt;Soporta &lt;span style="font-weight: bold;"&gt;Request Porcessors&lt;/span&gt; (Ciclos de vida) separados por cada módulo, pero todas las &lt;span style="font-weight: bold;"&gt;Actions &lt;/span&gt;en el módulo deben compartir el mismo ciclo de vida.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Struts2&lt;/span&gt;&lt;br /&gt;Soporta ciclos de vida diferentes, uno por &lt;span style="font-weight: bold;"&gt;Action &lt;/span&gt;por medio de la pila de interceptores.  Pilas configurables pueden ser creadas y usadas con diferentes &lt;span style="font-weight: bold;"&gt;Actions &lt;/span&gt;si es necesario.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Esta es una tabla excelente para observar solo algunas de las mejoras en &lt;span style="font-weight: bold;"&gt;Struts2&lt;/span&gt;, sin embargo yo pondría especial énfasis en las ventajas que ofrecen los interceptores en &lt;span style="font-weight: bold;"&gt;Struts2&lt;/span&gt;, ya que permiten aislar gran parte de operaciones de control que son comunes en todas las aplicaciones Web, entre ellas una muy importante, el manejo de la sesión y la restricción de acceso a usuarios con permisos.   Aislando estas operaciones es mas fácil reutilizar el código en otras aplicaciones.&lt;br /&gt;Además los interceptores que vienen por default en el marco de trabajo resuelven y aislan una gran cantidad trabajo, como carga de archivos, validaciones, intenacionalizacion y mas.  Solo tendremos que usar lo que los desarrolladores de &lt;span style="font-weight: bold;"&gt;Struts2&lt;/span&gt; ponen a nuestra disposición.&lt;br /&gt;&lt;br /&gt;Espero que este post les sea de utilidad, no olviden dejar sus comentarios si tienen alguna duda sobre los ejemplos o si tienen alguna sugerencia para el blog.&lt;br /&gt;&lt;br /&gt;Hasta el próximo post.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8262369655936226064-1147467010065130326?l=programacionconejemplos.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programacionconejemplos.blogspot.com/feeds/1147467010065130326/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://programacionconejemplos.blogspot.com/2009/07/struts1-vs-struts2.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8262369655936226064/posts/default/1147467010065130326'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8262369655936226064/posts/default/1147467010065130326'/><link rel='alternate' type='text/html' href='http://programacionconejemplos.blogspot.com/2009/07/struts1-vs-struts2.html' title='Struts1 vs Struts2'/><author><name>Ant</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8262369655936226064.post-2040794358064164499</id><published>2009-06-27T11:24:00.024-05:00</published><updated>2010-01-09T01:08:35.913-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Struts2 - 2.1.- Manejo de la Sesión'/><title type='text'>2.1 - Manejo de Sesión en Struts2</title><content type='html'>&lt;b&gt;2.1.- Primeros Pasos&lt;/b&gt;&lt;br /&gt;&lt;a href="http://programacionconejemplos.blogspot.com/2009/06/2-segundo-ejemplo-de-struts2-manejo-de.html"&gt;2.2.- La configuración de struts.xml&lt;/a&gt;&lt;br /&gt;&lt;a href="http://programacionconejemplos.blogspot.com/2009/06/3-segundo-ejemplo-de-struts2-manejo-de.html"&gt;2.3.- La clase Action que desplegará la lista&lt;/a&gt;&lt;br /&gt;&lt;a href="http://programacionconejemplos.blogspot.com/2009/06/4-segundo-ejemplo-de-struts2-manejo-de.html"&gt;2.4.- El Interceptor y la sesión&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;En este ejemplo, el segundo de &lt;span style="font-weight: bold;"&gt;Struts2&lt;/span&gt;, veremos como restringir el acceso a páginas privadas mediante el uso de la sesión y de los interceptores, también mostraremos como desplegar una lista de resultados utilizando las etiquetas de &lt;span style="font-weight: bold;"&gt;Struts2&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Antes de comenzar es necesario tener a la mano el código del ejemplo anterior pues lo usaremos como base, puedes verlo dando click acá:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://programacionconejemplos.blogspot.com/2009/06/1-ejemplo-struts2_17.html"&gt;El Primer Ejemplo&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Haremos algunos cambios en el código, pero es necesario que notes algunas cosas que el primer ejemplo adelantaba sobre el manejo de la sesión.&lt;br /&gt;&lt;br /&gt;Como podrás ver la clase &lt;span style="font-weight: bold;"&gt;AccionEntrar.java&lt;/span&gt; esta extendiendo de &lt;span style="font-weight: bold;"&gt;ActionSupport&lt;/span&gt; y también se implementan los métodos de la interfaz &lt;span style="font-weight: bold;"&gt;SessionAware&lt;/span&gt;, esta última es la que nos permitirá hacer uso de la sesión dentro del marco de trabajo.&lt;br /&gt;&lt;br /&gt;&lt;pre   style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); line-height: 14px; width: 100%;font-family:Andale Mono,Lucida Console,Monaco,fixed,monospace;font-size:12px;"&gt;&lt;code&gt;public class &lt;span style="font-weight: bold;"&gt;AccionEntrar&lt;/span&gt; extends ActionSupport implements SessionAware{&lt;br /&gt;  private Map session;&lt;br /&gt;  private String mensajeError;&lt;br /&gt;  private String usr;&lt;br /&gt;  private String pas;&lt;br /&gt;…&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Al implementar &lt;span style="font-weight: bold;"&gt;SessionAware&lt;/span&gt; se definen los métodos:&lt;br /&gt;&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;        public Map getSession() {&lt;br /&gt;          return session;&lt;br /&gt;      }&lt;br /&gt;&lt;br /&gt;      public void setSession(Map session) {&lt;br /&gt;          this.session = session;&lt;br /&gt;      }&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;y desde luego declaramos la variable &lt;span style="font-weight: bold;"&gt;session&lt;/span&gt;, que es de la clase &lt;span style="font-weight: bold;"&gt;Map&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;En nuestra clase &lt;span style="font-weight: bold;"&gt;AccionEntrar&lt;/span&gt; verificamos los datos del usuario.  De ser válidos daremos acceso a la página de bienvenida, si son incorrectos redirigimos a la página de entrada nuevamente.  Todo este flujo también esta definido en nuestro archivo de configuración &lt;a href="http://javandengi.svn.sourceforge.net/viewvc/javandengi/Struts2Ejemplo2/src/java/struts.xml"&gt;struts.xml.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Pero que pasa si ahora queremos que en nuestra aplicación se despliegue una lista de datos privados que solo pueda verse después de una autenticación válida, mostraremos como hacer eso.  Comencemos por agregar una liga para desplegar una lista de usuarios en nuestra página de bienvenida.&lt;br /&gt;&lt;br /&gt;Después de la etiqueta de bienvenida agrega esta línea:&lt;br /&gt;&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;&amp;lt;s:a href="DesplegarLista.action"&amp;gt;Desplegar lista de productos&amp;lt;/s:a&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;El código de tu jsp deberá quedar así:&lt;br /&gt;&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;&amp;lt;%@page contentType="text/html" pageEncoding="UTF-8"%&amp;gt;&lt;br /&gt;&amp;lt;%@ taglib prefix="s" uri="/struts-tags" %&amp;gt;&lt;br /&gt;&amp;lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"&lt;br /&gt; "http://www.w3.org/TR/html4/loose.dtd"&amp;gt;&lt;br /&gt;&amp;lt;html&amp;gt;&lt;br /&gt;  &amp;lt;head&amp;gt;&lt;br /&gt;      &amp;lt;meta http-equiv="Content-Type" content="text/html; charset=UTF-8"&amp;gt;&lt;br /&gt;      &amp;lt;title&amp;gt;Pagina de Bienvenida&amp;lt;/title&amp;gt;&lt;br /&gt;  &amp;lt;/head&amp;gt;&lt;br /&gt;  &amp;lt;body&amp;gt;&lt;br /&gt;      &amp;lt;h1&amp;gt;Bienvenido, has entrado al sistema!&amp;lt;/h1&amp;gt;&lt;br /&gt;      &amp;lt;s:a href="DesplegarLista.action"&amp;gt;Desplegar lista de usuarios&amp;lt;/s:a&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;/pre&gt;&lt;br /&gt;para descargar &lt;a href="http://javandengi.svn.sourceforge.net/viewvc/javandengi/Struts2Ejemplo2/web/paginaBienvenida.jsp"&gt;paginaBienvenida.jsp&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;No olvides poner la declaración de etiquetas de &lt;span style="font-weight: bold;"&gt;Struts2&lt;/span&gt; cuando sea necesario.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;&amp;lt;%@ taglib prefix="s" uri="/struts-tags" %&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;2.1.- Primeros Pasos&lt;/b&gt;&lt;br /&gt;&lt;a href="http://programacionconejemplos.blogspot.com/2009/06/2-segundo-ejemplo-de-struts2-manejo-de.html"&gt;2.2.- La configuración de struts.xml&lt;/a&gt;&lt;br /&gt;&lt;a href="http://programacionconejemplos.blogspot.com/2009/06/3-segundo-ejemplo-de-struts2-manejo-de.html"&gt;2.3.- La clase Action que desplegará la lista&lt;/a&gt;&lt;br /&gt;&lt;a href="http://programacionconejemplos.blogspot.com/2009/06/4-segundo-ejemplo-de-struts2-manejo-de.html"&gt;2.4.- El Interceptor y la sesión&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8262369655936226064-2040794358064164499?l=programacionconejemplos.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programacionconejemplos.blogspot.com/feeds/2040794358064164499/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://programacionconejemplos.blogspot.com/2009/06/1-segundo-ejemplo-de-struts2-manejo-de.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8262369655936226064/posts/default/2040794358064164499'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8262369655936226064/posts/default/2040794358064164499'/><link rel='alternate' type='text/html' href='http://programacionconejemplos.blogspot.com/2009/06/1-segundo-ejemplo-de-struts2-manejo-de.html' title='2.1 - Manejo de Sesión en Struts2'/><author><name>Ant</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8262369655936226064.post-2973152985319440780</id><published>2009-06-27T11:22:00.013-05:00</published><updated>2011-12-18T23:39:40.800-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Struts2 - 2.2.- Manejo de la Sesión'/><title type='text'>2.2 - Manejo de Sesión en Struts2</title><content type='html'>&lt;a href="http://programacionconejemplos.blogspot.com/2009/06/1-segundo-ejemplo-de-struts2-manejo-de.html"&gt;2.1.- Primeros Pasos&lt;/a&gt;&lt;br /&gt;&lt;b&gt;2.2.- La configuración de struts.xml&lt;/b&gt;&lt;br /&gt;&lt;a href="http://programacionconejemplos.blogspot.com/2009/06/3-segundo-ejemplo-de-struts2-manejo-de.html"&gt;2.3.- La clase Action que desplegará la lista&lt;/a&gt;&lt;br /&gt;&lt;a href="http://programacionconejemplos.blogspot.com/2009/06/4-segundo-ejemplo-de-struts2-manejo-de.html"&gt;2.4.- El Interceptor y la sesión&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;La configuración de struts.xml&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;También debemos modificar el archivo de configuración &lt;span style="font-weight: bold;"&gt;struts.xml&lt;/span&gt;. Debes agregar la siguiente linea:&lt;br /&gt;&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); color: black; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;&amp;lt;include file="sistema.xml"/&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Tu archivo debe quedar asi al final:&lt;br /&gt;&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); color: black; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;&amp;lt;!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"&amp;gt;&lt;br /&gt;&amp;lt;struts&amp;gt;&lt;br /&gt;  &amp;lt;constant name="struts.enable.DynamicMethodInvocation" value="false" /&amp;gt;&lt;br /&gt;  &amp;lt;constant name="struts.devMode" value="false" /&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;package name="default" namespace="/" extends="struts-default"&amp;gt;&lt;br /&gt;      &amp;lt;action name="FormularioEntrada"&amp;gt;&lt;br /&gt;          &amp;lt;result&amp;gt;/formularioEntrada.jsp&amp;lt;/result&amp;gt;&lt;br /&gt;      &amp;lt;/action&amp;gt;&lt;br /&gt;      &amp;lt;action name="Entrar" class="ejemplos.struts2.action.AccionEntrar"&amp;gt;&lt;br /&gt;          &amp;lt;result name="input"&amp;gt;/formularioEntrada.jsp&amp;lt;/result&amp;gt;&lt;br /&gt;          &amp;lt;result name="error"&amp;gt;/formularioEntrada.jsp&amp;lt;/result&amp;gt;&lt;br /&gt;          &amp;lt;result&amp;gt;/paginaBienvenida.jsp&amp;lt;/result&amp;gt;&lt;br /&gt;      &amp;lt;/action&amp;gt;&lt;br /&gt;  &amp;lt;/package&amp;gt;&lt;br /&gt;  &amp;lt;include file="sistema.xml"/&amp;gt;&lt;br /&gt;&amp;lt;/struts&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Como podrás ver ahora hacemos referencia a otro archivo de configuración de &lt;span style="font-weight: bold;"&gt;Struts2&lt;/span&gt; en donde están las peticiones que se hacen solo por usuarios que están identificados por nuestra aplicación como válidos.  El archivo &lt;span style="font-weight: bold;"&gt;sistema.xml&lt;/span&gt; deberá ser algo como esto:&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); color: black; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br /&gt;&amp;lt;!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"&amp;gt;&lt;br /&gt;&amp;lt;struts&amp;gt;&lt;br /&gt;  &amp;lt;package name="sistema" namespace="/" extends="struts-default"&amp;gt;&lt;br /&gt;      &amp;lt;interceptors&amp;gt;&lt;br /&gt;          &amp;lt;interceptor name="&lt;/code&gt;&lt;code&gt;iterceptorAtuenticacion&lt;/code&gt;&lt;code&gt;" class="ejemplos.struts2.inter.InterAutenticacion" /&amp;gt;&lt;br /&gt;          &amp;lt;interceptor-stack name="secureStack"&amp;gt;&lt;br /&gt;              &amp;lt;interceptor-ref name="iterceptorAtuenticacion" /&amp;gt;&lt;br /&gt;              &amp;lt;interceptor-ref name="defaultStack" /&amp;gt;&lt;br /&gt;          &amp;lt;/interceptor-stack&amp;gt;&lt;br /&gt;      &amp;lt;/interceptors&amp;gt;&lt;br /&gt;      &amp;lt;default-interceptor-ref name="secureStack" /&amp;gt;&lt;br /&gt;&lt;br /&gt;      &amp;lt;global-results&amp;gt;&lt;br /&gt;          &amp;lt;result name="login" type="redirect"&amp;gt;/FormularioEntrada.action&amp;lt;/result&amp;gt;&lt;br /&gt;      &amp;lt;/global-results&amp;gt;&lt;br /&gt;&lt;br /&gt;      &amp;lt;action name="DesplegarLista" class="ejemplos.struts2.action.AccionDesplegarLista"&amp;gt;&lt;br /&gt;          &amp;lt;result name="error"&amp;gt;/formularioEntrada.jsp&amp;lt;/result&amp;gt;&lt;br /&gt;          &amp;lt;result&amp;gt;/desplegarLista.jsp&amp;lt;/result&amp;gt;&lt;br /&gt;      &amp;lt;/action&amp;gt;&lt;br /&gt;  &amp;lt;/package&amp;gt;&lt;br /&gt;&amp;lt;/struts&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Hay algunas cosas nuevas en este archivo de configuración.  Ahora estamos creando un “paquete” de declaración para nuestros Actions.&lt;br /&gt;&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); color: black; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;    &amp;lt;package name="sistema" namespace="/" extends="struts-default"&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;También estamos haciendo la declaración de nuestro interceptor &lt;span style="font-weight: bold;"&gt;InterAutenticacion&lt;/span&gt;, el cual aún no hemos creado.&lt;br /&gt;&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); color: black; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;        &amp;lt;interceptors&amp;gt;&lt;br /&gt;          &amp;lt;interceptor name="iterceptorAtuenticacion" class="ejemplos.struts2.inter.InterAutenticacion" /&amp;gt;&lt;br /&gt;          &amp;lt;interceptor-stack name="secureStack"&amp;gt;&lt;br /&gt;              &amp;lt;interceptor-ref name="iterceptorAtuenticacion" /&amp;gt;&lt;br /&gt;              &amp;lt;interceptor-ref name="defaultStack" /&amp;gt;&lt;br /&gt;          &amp;lt;/interceptor-stack&amp;gt;&lt;br /&gt;      &amp;lt;/interceptors&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Otra cosa importante que hacemos es declarar una pila de interceptores nueva, que agrega nuestro nuevo interceptor a la lista de interceptores que existen por default en el marco de trabajo.  Este paso es importante.&lt;br /&gt;&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); color: black; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;    &amp;lt;default-interceptor-ref name="secureStack" /&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;También hemos agregado un redireccionamiento global para los casos en que no axista una sesión válida y que devuelve al usuario al formulario de entrada:&lt;br /&gt;&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); color: black; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;        &amp;lt;global-results&amp;gt;&lt;br /&gt;          &amp;lt;result name="login" type="redirect"&amp;gt;/FormularioEntrada.action&amp;lt;/result&amp;gt;&lt;br /&gt;      &amp;lt;/global-results&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Y por último, la declaración de nuestra acción &lt;span style="font-weight: bold;"&gt;DesplegarLista&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); color: black; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;        &amp;lt;action name="DesplegarLista" class="ejemplos.struts2.action.AccionDesplegarLista"&amp;gt;&lt;br /&gt;          &amp;lt;result name="error"&amp;gt;/formularioEntrada.jsp&amp;lt;/result&amp;gt;&lt;br /&gt;          &amp;lt;result&amp;gt;/desplegarLista.jsp&amp;lt;/result&amp;gt;&lt;br /&gt;      &amp;lt;/action&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Bien, hemos terminado con la configuración del archivo nuevo &lt;span style="font-weight: bold;"&gt;sistema.xml&lt;/span&gt;. Pero ahora debemos crear la clase que se encargará de desplegar la lista y del interceptor que nos permitirá discriminar las peticiones válidas de las que no lo son.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://programacionconejemplos.blogspot.com/2009/06/1-segundo-ejemplo-de-struts2-manejo-de.html"&gt;2.1.- Primeros Pasos&lt;/a&gt;&lt;br /&gt;&lt;b&gt;2.2.- La configuración de struts.xml&lt;/b&gt;&lt;br /&gt;&lt;a href="http://programacionconejemplos.blogspot.com/2009/06/3-segundo-ejemplo-de-struts2-manejo-de.html"&gt;2.3.- La clase Action que desplegará la lista&lt;/a&gt;&lt;br /&gt;&lt;a href="http://programacionconejemplos.blogspot.com/2009/06/4-segundo-ejemplo-de-struts2-manejo-de.html"&gt;2.4.- El Interceptor y la sesión&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8262369655936226064-2973152985319440780?l=programacionconejemplos.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programacionconejemplos.blogspot.com/feeds/2973152985319440780/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://programacionconejemplos.blogspot.com/2009/06/2-segundo-ejemplo-de-struts2-manejo-de.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8262369655936226064/posts/default/2973152985319440780'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8262369655936226064/posts/default/2973152985319440780'/><link rel='alternate' type='text/html' href='http://programacionconejemplos.blogspot.com/2009/06/2-segundo-ejemplo-de-struts2-manejo-de.html' title='2.2 - Manejo de Sesión en Struts2'/><author><name>Ant</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8262369655936226064.post-3052975257694085253</id><published>2009-06-27T11:20:00.011-05:00</published><updated>2010-01-09T01:08:59.031-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Struts2 - 2.3.- Manejo de la Sesión'/><title type='text'>2.3 - Manejo de Sesión en Struts2</title><content type='html'>&lt;a href="http://programacionconejemplos.blogspot.com/2009/06/1-segundo-ejemplo-de-struts2-manejo-de.html"&gt;2.1.- Primeros Pasos&lt;/a&gt;&lt;br /&gt;&lt;a href="http://programacionconejemplos.blogspot.com/2009/06/2-segundo-ejemplo-de-struts2-manejo-de.html"&gt;2.2.- La configuración de struts.xml&lt;/a&gt;&lt;br /&gt;&lt;b&gt;2.3.- La clase Action que desplegará la lista&lt;/b&gt;&lt;br /&gt;&lt;a href="http://programacionconejemplos.blogspot.com/2009/06/4-segundo-ejemplo-de-struts2-manejo-de.html"&gt;2.4.- El Interceptor y la sesión&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;La clase Action que desplegará la lista&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Nuestra clase Action será algo como esto:&lt;br /&gt;&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;package ejemplos.struts2.action;&lt;br /&gt;import ejemplos.struts2.beans.Usuario;&lt;br /&gt;import java.util.Map;&lt;br /&gt;import java.util.List;&lt;br /&gt;import java.util.ArrayList;&lt;br /&gt;import com.opensymphony.xwork2.ActionSupport;&lt;br /&gt;import org.apache.struts2.interceptor.SessionAware;&lt;br /&gt;import ejemplos.struts2.utilidades.UsuarioHabilitado;&lt;br /&gt;&lt;br /&gt;public class AccionDesplegarLista extends ActionSupport implements SessionAware,UsuarioHabilitado{&lt;br /&gt;  private Map session;&lt;br /&gt;  private Usuario usuario;&lt;br /&gt;  private String mensajeError;&lt;br /&gt;  private List miLista;&lt;br /&gt;&lt;br /&gt;  public String execute() throws Exception {&lt;br /&gt;      llenarArreglo();&lt;br /&gt;      return SUCCESS;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public void llenarArreglo(){&lt;br /&gt;      miLista = new ArrayList();&lt;br /&gt;      Usuario usuario1 = new Usuario();&lt;br /&gt;      Usuario usuario2 = new Usuario();&lt;br /&gt;      Usuario usuario3 = new Usuario();&lt;br /&gt;      Usuario usuario4 = new Usuario();&lt;br /&gt;      usuario1.setNombre("Fulano de tal 1");&lt;br /&gt;      usuario2.setNombre("Fulano de tal 2");&lt;br /&gt;      usuario3.setNombre("Fulano de tal 3");&lt;br /&gt;      usuario4.setNombre("Fulano de tal 4");&lt;br /&gt;      miLista.add(usuario1);&lt;br /&gt;      miLista.add(usuario2);&lt;br /&gt;      miLista.add(usuario3);&lt;br /&gt;      miLista.add(usuario4);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public List getMiLista(){&lt;br /&gt;      return miLista;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public Map getSession() {&lt;br /&gt;      return session;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public void setSession(Map session) {&lt;br /&gt;      this.session = session;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public void setUsuario(Usuario usuario){&lt;br /&gt;      this.usuario = usuario;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public Usuario getUsuario(){&lt;br /&gt;      return usuario;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public void setMensajeError(String mensajeError) {&lt;br /&gt;      this.mensajeError = mensajeError;&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Para descargar &lt;a href="http://javandengi.svn.sourceforge.net/viewvc/javandengi/Struts2Ejemplo2/src/java/ejemplos/struts2/action/AccionDesplegarLista.java"&gt;AccionDesplegarLista.java&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Hay varias cosas que se deben notar en esta clase, la primera de ellas es que aunque tenemos declarada una variable de sesión, no verificamos si es nula o no, simplemente la usamos, mas adelante veremos porque.&lt;br /&gt;&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;    usuario = (Usuario)session.get("usuario");&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;No hacemos ninguna validación sobre si existe o no sesión y por lo tanto, tampoco verificamos si hay una instancia de “usuario” referenciada en la sesion.  Será el interceptor el que se encargue de hacer la validación. En esta clase simplemente llenamos un arreglo con los datos de nuestra lista.&lt;br /&gt;&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;    public String execute() throws Exception {&lt;br /&gt;      usuario = (Usuario)session.get("usuario");&lt;br /&gt;      llenarArreglo();&lt;br /&gt;      return SUCCESS;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public void llenarArreglo(){&lt;br /&gt;      miLista = new ArrayList();&lt;br /&gt;      Usuario usuario1 = new Usuario();&lt;br /&gt;      Usuario usuario2 = new Usuario();&lt;br /&gt;      Usuario usuario3 = new Usuario();&lt;br /&gt;      Usuario usuario4 = new Usuario();&lt;br /&gt;      usuario1.setNombre("Fulano de tal 1");&lt;br /&gt;      usuario2.setNombre("Fulano de tal 2");&lt;br /&gt;      usuario3.setNombre("Fulano de tal 3");&lt;br /&gt;      usuario4.setNombre("Fulano de tal 4");&lt;br /&gt;      miLista.add(usuario1);&lt;br /&gt;      miLista.add(usuario2);&lt;br /&gt;      miLista.add(usuario3);&lt;br /&gt;      miLista.add(usuario4);&lt;br /&gt;  }&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Antes de ver como es el interceptor, mostraremos como debe quedar el jsp que se encarga de desplegar los datos.&lt;br /&gt;&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;&amp;lt;%@page contentType="text/html" pageEncoding="UTF-8"%&amp;gt;&lt;br /&gt;&amp;lt;%@ taglib prefix="s" uri="/struts-tags" %&amp;gt;&lt;br /&gt;&amp;lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"&lt;br /&gt;  "http://www.w3.org/TR/html4/loose.dtd"&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;html&amp;gt;&lt;br /&gt;  &amp;lt;head&amp;gt;&lt;br /&gt;      &amp;lt;meta http-equiv="Content-Type" content="text/html; charset=UTF-8"&amp;gt;&lt;br /&gt;      &amp;lt;title&amp;gt;Ejemplos con Struts 2&amp;lt;/title&amp;gt;&lt;br /&gt;  &amp;lt;/head&amp;gt;&lt;br /&gt;  &amp;lt;body&amp;gt;&lt;br /&gt;      &amp;lt;h1&amp;gt;Lista de usuarios del sistema&amp;lt;/h1&amp;gt;&lt;br /&gt;      Usuario:&amp;lt;s:property value="usuario.nombre" /&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;      &amp;lt;s:iterator value="miLista"&amp;gt;&lt;br /&gt;          &amp;lt;s:property value="nombre" /&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;      &amp;lt;/s:iterator&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;/pre&gt;&lt;br /&gt;Para descargar &lt;a href="http://javandengi.svn.sourceforge.net/viewvc/javandengi/Struts2Ejemplo2/web/desplegarLista.jsp"&gt;desplegarLista.jsp&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;El jsp es muy sencillo, pero debes notar que estamos haciendo uso de dos de las instancias a las que hacemos referencia o creamos en nuestra clase &lt;span style="font-weight: bold;"&gt;AccionDesplegarLista&lt;/span&gt;, y son:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;usuario.nombre&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;miLista&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Te preguntarás como llegarán hasta ahí esos datos cuando se despliegue el jsp, no te preocupes el framework se encargará de “llenar” tu jsp con los valores correctos siempre y cuando estén declarados con el mismo nombre en la clase &lt;span style="font-weight: bold;"&gt;AccionDesplegarLista&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://programacionconejemplos.blogspot.com/2009/06/1-segundo-ejemplo-de-struts2-manejo-de.html"&gt;2.1.- Primeros Pasos&lt;/a&gt;&lt;br /&gt;&lt;a href="http://programacionconejemplos.blogspot.com/2009/06/2-segundo-ejemplo-de-struts2-manejo-de.html"&gt;2.2.- La configuración de struts.xml&lt;/a&gt;&lt;br /&gt;&lt;b&gt;2.3.- La clase Action que desplegará la lista&lt;/b&gt;&lt;br /&gt;&lt;a href="http://programacionconejemplos.blogspot.com/2009/06/4-segundo-ejemplo-de-struts2-manejo-de.html"&gt;2.4.- El Interceptor y la sesión&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8262369655936226064-3052975257694085253?l=programacionconejemplos.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programacionconejemplos.blogspot.com/feeds/3052975257694085253/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://programacionconejemplos.blogspot.com/2009/06/3-segundo-ejemplo-de-struts2-manejo-de.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8262369655936226064/posts/default/3052975257694085253'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8262369655936226064/posts/default/3052975257694085253'/><link rel='alternate' type='text/html' href='http://programacionconejemplos.blogspot.com/2009/06/3-segundo-ejemplo-de-struts2-manejo-de.html' title='2.3 - Manejo de Sesión en Struts2'/><author><name>Ant</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8262369655936226064.post-1647283501641348942</id><published>2009-06-27T11:18:00.033-05:00</published><updated>2011-12-03T14:15:57.837-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Struts2 - 2.4.- Manejo de la Sesión'/><title type='text'>2.4 - Manejo de Sesión en Struts2</title><content type='html'>&lt;a href="http://programacionconejemplos.blogspot.com/2009/06/1-segundo-ejemplo-de-struts2-manejo-de.html"&gt;2.1.- Primeros Pasos&lt;/a&gt;&lt;br /&gt;&lt;a href="http://programacionconejemplos.blogspot.com/2009/06/2-segundo-ejemplo-de-struts2-manejo-de.html"&gt;2.2.- La configuración de struts.xml&lt;/a&gt;&lt;br /&gt;&lt;a href="http://programacionconejemplos.blogspot.com/2009/06/3-segundo-ejemplo-de-struts2-manejo-de.html"&gt;2.3.- La clase Action que desplegará la lista&lt;/a&gt;&lt;br /&gt;&lt;b&gt;2.4.- El Interceptor y la sesión&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;El Interceptor y la sesión&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Ahora veremos como debe ser el interceptor. El código se muestra a continuación:&lt;br /&gt;&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); color: black; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;package ejemplos.struts2.inter;&lt;br /&gt;import com.opensymphony.xwork2.Action;&lt;br /&gt;import com.opensymphony.xwork2.ActionInvocation;&lt;br /&gt;import com.opensymphony.xwork2.interceptor.Interceptor;&lt;br /&gt;import java.util.Map;&lt;br /&gt;import ejemplos.struts2.beans.Usuario;&lt;br /&gt;import ejemplos.struts2.utilidades.UsuarioHabilitado;&lt;br /&gt;&lt;br /&gt;public class InterAutenticacion implements Interceptor {&lt;br /&gt;&lt;br /&gt;  public void destroy() { }&lt;br /&gt;  public void init() { }&lt;br /&gt;  public String intercept(ActionInvocation actionInvocation) throws Exception {&lt;br /&gt;      Map session = actionInvocation.getInvocationContext().getSession();&lt;br /&gt;      Usuario usuario = (Usuario) session.get("usuario");&lt;br /&gt;      if (usuario == null) {&lt;br /&gt;          return Action.LOGIN;&lt;br /&gt;      } else {&lt;br /&gt;          Action action = (Action) actionInvocation.getAction();&lt;br /&gt;          if (action instanceof UsuarioHabilitado) {&lt;br /&gt;              ((UsuarioHabilitado) action).setUsuario(usuario);&lt;br /&gt;          }&lt;br /&gt;          return actionInvocation.invoke();&lt;br /&gt;      }&lt;br /&gt;  }&lt;br /&gt;}&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Se hacen algunas cosas interesantes, la primera de ellas es que se toma la sesión y se verifica si ya existe una instancia de la clase &lt;span style="font-weight: bold;"&gt;Usuario&lt;/span&gt;, buscando al objeto referenciado por la cadena &lt;span style="font-weight: bold;"&gt;"usuario"&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); color: black; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;        Map session = actionInvocation.getInvocationContext().getSession();&lt;br /&gt;      Usuario usuario = (Usuario) session.get("usuario");&lt;br /&gt;      if (usuario == null) {&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Si todo está bien y se hace una petición a una acción a la que el usuario tiene permiso, entonces pasamos la referencia del objeto &lt;span style="font-weight: bold;"&gt;usuario&lt;/span&gt; a la acción para que la pueda usar.  Para eso tenemos que hacer que nuestras acciones implementen de &lt;span style="font-weight: bold;"&gt;UsuarioHabilitado&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); color: black; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;            Action action = (Action) actionInvocation.getAction();&lt;br /&gt;          if (action instanceof UsuarioHabilitado) {&lt;br /&gt;              ((UsuarioHabilitado) action).setUsuario(usuario);&lt;br /&gt;          }&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Implementar de esta interfaz podría permitirnos hacer una validación adicional, para aseguramos que solo cuando nuestras clases implementen a &lt;span style="font-weight: bold;"&gt;UsuarioHabilitado&lt;/span&gt; podran ser llamadas, de lo contrario se cambia el flujo al formulario de entrada.  En nuestro ejemplo solo sirve para pasar los datos del usuario a la acción.&lt;br /&gt;&lt;br /&gt;La interfaz se muestra a continuación:&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); color: black; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;package ejemplos.struts2.utilidades;&lt;br /&gt;import ejemplos.struts2.beans.Usuario;&lt;br /&gt;&lt;br /&gt;public interface UsuarioHabilitado {&lt;br /&gt;  public void setUsuario(Usuario usuario);&lt;br /&gt;}&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Para descargar &lt;a href="http://javandengi.svn.sourceforge.net/viewvc/javandengi/Struts2Ejemplo2/src/java/ejemplos/struts2/utilidades/UsuarioHabilitado.java"&gt;UsuarioHabilitado.java&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;En donde se declara un solo método &lt;span style="font-weight: bold;"&gt;setUsuario&lt;/span&gt; y servirá para pasar la referencia del objeto usuario que le corresponda al usuario que esta haciendo la petición de datos.&lt;br /&gt;&lt;br /&gt;Y eso es todo. Ya podemos echar a andar nuestro ejemplo, no olvides como siempre, verificar que las clases que hemos creado estén en los paquetes correctos y si vas a crear tus propias clases sin copiar el código, no olvides ser cuidadoso con los nombres de tus clases al crear los archivos de configuración de &lt;span style="font-weight: bold;"&gt;Struts2&lt;/span&gt;, ya que es muy común equivocarse con las mayusculas y las cosas tardan en funcionar.&lt;br /&gt;&lt;br /&gt;Al correr el ejemplo y después de pasar por el formulario de username y password deberá aparecer lo siguiente&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_6I9HJQ7QnqA/SkZVkzLnhII/AAAAAAAAAFc/hSfPaTe8g_I/s1600-h/NavegadorMuestraOpciones.gif"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5352059297879000194" src="http://3.bp.blogspot.com/_6I9HJQ7QnqA/SkZVkzLnhII/AAAAAAAAAFc/hSfPaTe8g_I/s400/NavegadorMuestraOpciones.gif" style="cursor: pointer; display: block; height: 163px; margin: 0px auto 10px; text-align: center; width: 400px;" /&gt;&lt;/a&gt;&lt;br /&gt;Despues das click en desplegar lista&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_6I9HJQ7QnqA/SkZVlWOlD9I/AAAAAAAAAFk/7TgX802hrQE/s1600-h/NavegadorDespliegaLista.gif"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5352059307286663122" src="http://3.bp.blogspot.com/_6I9HJQ7QnqA/SkZVlWOlD9I/AAAAAAAAAFk/7TgX802hrQE/s400/NavegadorDespliegaLista.gif" style="cursor: pointer; display: block; height: 189px; margin: 0px auto 10px; text-align: center; width: 400px;" /&gt;&lt;/a&gt;&lt;br /&gt;¡Aparace la lista de usuarios!&lt;br /&gt;&lt;br /&gt;Pero si intentas llamar a DesplegarLista desde el navegador sin haber pasado por el formulario de entrada de forma directa...&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); color: black; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;http://localhost:8080/Struts2Ejemplo2/DesplegarLista.action&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Podras ver como el marco de trabajo te envía nuevamente al formulario de entrada&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_6I9HJQ7QnqA/SkZVlqDNh8I/AAAAAAAAAFs/Rl6P3PrVJEQ/s1600-h/NavegadorFormularioDeInicio.gif"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5352059312607692738" src="http://4.bp.blogspot.com/_6I9HJQ7QnqA/SkZVlqDNh8I/AAAAAAAAAFs/Rl6P3PrVJEQ/s400/NavegadorFormularioDeInicio.gif" style="cursor: pointer; display: block; height: 189px; margin: 0px auto 10px; text-align: center; width: 400px;" /&gt;&lt;/a&gt;&lt;br /&gt;(Quiza deberás reiniciar el servidor web para observar esto)&lt;br /&gt;&lt;br /&gt;Es el interceptor el que se encargará de redirigir  al usuario al formulario de entrada.&lt;br /&gt;&lt;br /&gt;Este es un ejemplo bastante simple como podras ver, los flujos de redirección de páginas dependerán mucho de como diseñes tu aplicación.  Espero que este ejemplo te sirva para darte una idea de como hacerlo.&lt;br /&gt;&lt;br /&gt;Todo el código lo podras descargar de &lt;a href="http://javandengi.svn.sourceforge.net/viewvc/javandengi/Struts2Ejemplo2/"&gt;&lt;b&gt;aqui&lt;/b&gt;&lt;/a&gt;.&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;div id="fb-root"&gt;&lt;/div&gt;&lt;script&gt;(function(d, s, id) {  var js, fjs = d.getElementsByTagName(s)[0];  if (d.getElementById(id)) {return;}  js = d.createElement(s); js.id = id;  js.src = "//connect.facebook.net/en_US/all.js#xfbml=1";  fjs.parentNode.insertBefore(js, fjs);}(document, 'script', 'facebook-jssdk'));&lt;/script&gt;&lt;br /&gt;&lt;div class="fb-like-box" data-header="false" data-height="100" data-href="http://www.facebook.com/pages/Programaci%C3%B3n-con-Java/121398617957102" data-show-faces="false" data-stream="false" data-width="292"&gt;&lt;/div&gt;&lt;br /&gt;¡Listo! Eso es todo por el momento, espero que el ejemplo sea de utilidad.  Hasta el próximo post.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://programacionconejemplos.blogspot.com/2009/06/1-segundo-ejemplo-de-struts2-manejo-de.html"&gt;2.1.- Primeros Pasos&lt;/a&gt;&lt;br /&gt;&lt;a href="http://programacionconejemplos.blogspot.com/2009/06/2-segundo-ejemplo-de-struts2-manejo-de.html"&gt;2.2.- La configuración de struts.xml&lt;/a&gt;&lt;br /&gt;&lt;a href="http://programacionconejemplos.blogspot.com/2009/06/3-segundo-ejemplo-de-struts2-manejo-de.html"&gt;2.3.- La clase Action que desplegará la lista&lt;/a&gt;&lt;br /&gt;&lt;b&gt;2.4.- El Interceptor y la sesión&lt;/b&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8262369655936226064-1647283501641348942?l=programacionconejemplos.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programacionconejemplos.blogspot.com/feeds/1647283501641348942/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://programacionconejemplos.blogspot.com/2009/06/4-segundo-ejemplo-de-struts2-manejo-de.html#comment-form' title='5 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8262369655936226064/posts/default/1647283501641348942'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8262369655936226064/posts/default/1647283501641348942'/><link rel='alternate' type='text/html' href='http://programacionconejemplos.blogspot.com/2009/06/4-segundo-ejemplo-de-struts2-manejo-de.html' title='2.4 - Manejo de Sesión en Struts2'/><author><name>Ant</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_6I9HJQ7QnqA/SkZVkzLnhII/AAAAAAAAAFc/hSfPaTe8g_I/s72-c/NavegadorMuestraOpciones.gif' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8262369655936226064.post-5167806008599215930</id><published>2009-06-17T15:47:00.025-05:00</published><updated>2011-12-18T20:00:13.322-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Struts2 - 1.1. - Ejemplo de Struts2'/><title type='text'>1.1 - Ejemplo de Struts2, el hola mundo</title><content type='html'>&lt;b&gt;1.1.- Requisitos&lt;/b&gt;&lt;br /&gt;&lt;a href="http://programacionconejemplos.blogspot.com/2009/06/2-ejemplo-struts2_17.html"&gt;1.2.- Crear el proyecto en NetBeans&lt;/a&gt;&lt;br /&gt;&lt;a href="http://programacionconejemplos.blogspot.com/2009/06/3-ejemplo-struts2_17.html"&gt;1.3.- Configurar el proyecto para usar Struts 2&lt;/a&gt;&lt;br /&gt;&lt;a href="http://programacionconejemplos.blogspot.com/2009/06/4-ejemplo-struts2_17.html"&gt;1.4.- La vista de nuestro proyecto&lt;/a&gt;&lt;br /&gt;&lt;a href="http://programacionconejemplos.blogspot.com/2009/06/5-ejemplo-struts2_17.html"&gt;1.5.- La capa de negocios&lt;/a&gt;&lt;br /&gt;&lt;a href="http://programacionconejemplos.blogspot.com/2009/06/6-ejemplo-struts2_17.html"&gt;1.6.- Ejecutar el proyecto&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Struts 2 es un marco de trabajo (o framework en ingles) que ofrece muchas ventajas para desarrollar aplicaciones Web con Java y cuenta con nuevas características que facilitan el desarrollo aún mas que en la versión de Struts anterior. Haremos un ejemplo sencillo paso a paso de tal forma que puedas comenzar a trabajar con el marco de trabajo sin demasiada teoria.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_6I9HJQ7QnqA/SnIxIVUoFrI/AAAAAAAAAH0/iKBwi_8rN6U/s1600-h/Struts2LogoPeque.jpg"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5364404125384054450" src="http://2.bp.blogspot.com/_6I9HJQ7QnqA/SnIxIVUoFrI/AAAAAAAAAH0/iKBwi_8rN6U/s400/Struts2LogoPeque.jpg" style="cursor: pointer; display: block; height: 79px; margin: 0px auto 10px; text-align: center; width: 269px;" /&gt;&lt;/a&gt;&lt;br /&gt;Nuestro ejemplo de Struts2 será algo asi como el Hola Mundo, aunque no tan básico y lo haremos siguiendo estos pasos:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://programacionconejemplos.blogspot.com/2009/06/1-ejemplo-struts2_17.html"&gt;Requisitos&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://programacionconejemplos.blogspot.com/2009/06/2-ejemplo-struts2_17.html"&gt;Crear el proyecto en NetBeans&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://programacionconejemplos.blogspot.com/2009/06/3-ejemplo-struts2_17.html"&gt;Configurar el proyecto para usar Struts 2&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://programacionconejemplos.blogspot.com/2009/06/4-ejemplo-struts2_17.html"&gt;La vista de nuestro proyecto&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://programacionconejemplos.blogspot.com/2009/06/5-ejemplo-struts2_17.html"&gt;La capa de negocios&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://programacionconejemplos.blogspot.com/2009/06/6%29ejemplo-struts2_17.html"&gt;Ejecutar el proyecto&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Requisitos&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Utilizaremos la IDE de Sun Microsystems &lt;span style="font-weight: bold;"&gt;NetBeans &lt;/span&gt;6.5.1 para hacer el ejemplo, si no lo tienes puedes descargar la última versión en el siguiente link: &lt;a href="http://www.netbeans.org/downloads/index.html"&gt;http://www.netbeans.org/downloads/index.html&lt;/a&gt;. Para evitarte problemas, baja la version completa, asi te aseguras que tiene lo necesario para crear tu proyecto Web. Cuando instales &lt;span style="font-weight: bold;"&gt;NetBeans&lt;/span&gt;, asegurate tambien de incluir &lt;span style="font-weight: bold;"&gt;Tomcat &lt;/span&gt;6.x en la lista de servidores que puede manejar, ya que es con ese servidor web con el que haremos nuestro ejemplo&lt;br /&gt;&lt;br /&gt;Deberás descargar de la pagina de Struts 2 las siguientes librerias&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;commons-fileupload-1.2.2.jar&lt;/li&gt;&lt;li&gt; commons-io-2.0.1.jar&lt;/li&gt;&lt;li&gt; commons-lang-2.5.jar&lt;/li&gt;&lt;li&gt; commons-logging-1.1.1.jar&lt;/li&gt;&lt;li&gt; freemarker-2.3.16.jar&lt;/li&gt;&lt;li&gt;javassist-3.11.0.GA.jar &lt;/li&gt;&lt;li&gt;ognl-3.0.1.jar&lt;/li&gt;&lt;li&gt;struts2-core-2.2.3.1.jar&lt;/li&gt;&lt;li&gt; xwork-core-2.2.3.1.jar&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Las puedes obtener aqui: &lt;a href="http://apache.mirrors.tds.net/struts/library/"&gt;http://apache.mirrors.tds.net/struts/library/&lt;/a&gt;&lt;a href="http://struts.apache.org/download.cgi#struts216"&gt;&lt;/a&gt;, toma en cuenta que estas librerias van actualizandose con el tiempo y las últiias versiones de estos archivos pueden cambiar, te recomiendo que bajes solo las &lt;span style="font-weight: bold;"&gt;Essential Dependencies&lt;/span&gt; que es un archivo comprimido que contienen solo las librerias de &lt;span style="font-weight: bold;"&gt;Struts2 &lt;/span&gt;necesarias.  Es importante que bajes las versiones que vienen en estos paquetes, de lo contrario prodrias tener problemas de compatibilidad entre los mismos, este es un problema común al usar las librerias de Apache.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Essential Dependencies&lt;/span&gt; &lt;a href="http://apache.webxcreen.org/struts/library/"&gt;http://apache.webxcreen.org/struts/library/struts-2.2.3.1-lib.zip&lt;/a&gt;&lt;a href="http://apache.mirrors.tds.net/struts/library/struts-2.1.6-lib.zip"&gt;&lt;/a&gt;&lt;br /&gt;Comencemos con nuestro Hola Mundo de Struts2, espero que les sea de utilidad.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;1.1.- Requisitos&lt;/b&gt;&lt;br /&gt;&lt;a href="http://programacionconejemplos.blogspot.com/2009/06/2-ejemplo-struts2_17.html"&gt;1.2.- Crear el proyecto en NetBeans&lt;/a&gt;&lt;br /&gt;&lt;a href="http://programacionconejemplos.blogspot.com/2009/06/3-ejemplo-struts2_17.html"&gt;1.3.- Configurar el proyecto para usar Struts 2&lt;/a&gt;&lt;br /&gt;&lt;a href="http://programacionconejemplos.blogspot.com/2009/06/4-ejemplo-struts2_17.html"&gt;1.4.- La vista de nuestro proyecto&lt;/a&gt;&lt;br /&gt;&lt;a href="http://programacionconejemplos.blogspot.com/2009/06/5-ejemplo-struts2_17.html"&gt;1.5.- La capa de negocios&lt;/a&gt;&lt;br /&gt;&lt;a href="http://programacionconejemplos.blogspot.com/2009/06/6-ejemplo-struts2_17.html"&gt;1.6.- Ejecutar el proyecto&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8262369655936226064-5167806008599215930?l=programacionconejemplos.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programacionconejemplos.blogspot.com/feeds/5167806008599215930/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://programacionconejemplos.blogspot.com/2009/06/1-ejemplo-struts2_17.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8262369655936226064/posts/default/5167806008599215930'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8262369655936226064/posts/default/5167806008599215930'/><link rel='alternate' type='text/html' href='http://programacionconejemplos.blogspot.com/2009/06/1-ejemplo-struts2_17.html' title='1.1 - Ejemplo de Struts2, el hola mundo'/><author><name>Ant</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_6I9HJQ7QnqA/SnIxIVUoFrI/AAAAAAAAAH0/iKBwi_8rN6U/s72-c/Struts2LogoPeque.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8262369655936226064.post-113769608935533798</id><published>2009-06-17T15:46:00.012-05:00</published><updated>2010-02-18T14:14:32.178-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Struts2 - 1.2. - Ejemplo de Struts2'/><title type='text'>1.2 - Ejemplo de Struts2, el hola mundo</title><content type='html'>&lt;a href="http://programacionconejemplos.blogspot.com/2009/06/1-ejemplo-struts2_17.html"&gt;1.1.- Requisitos&lt;/a&gt;&lt;br /&gt;&lt;b&gt;1.2.- Crear el proyecto en NetBeans&lt;/b&gt;&lt;br /&gt;&lt;a href="http://programacionconejemplos.blogspot.com/2009/06/3-ejemplo-struts2_17.html"&gt;1.3.- Configurar el proyecto para usar Struts 2&lt;/a&gt;&lt;br /&gt;&lt;a href="http://programacionconejemplos.blogspot.com/2009/06/4-ejemplo-struts2_17.html"&gt;1.4.- La vista de nuestro proyecto&lt;/a&gt;&lt;br /&gt;&lt;a href="http://programacionconejemplos.blogspot.com/2009/06/5-ejemplo-struts2_17.html"&gt;1.5.- La capa de negocios&lt;/a&gt;&lt;br /&gt;&lt;a href="http://programacionconejemplos.blogspot.com/2009/06/6-ejemplo-struts2_17.html"&gt;1.6.- Ejecutar el proyecto&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Crear el proyecto en NetBeans&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Una vez instalado NetBeans, crea un nuevo proyecto Web con el nombre &lt;span style="font-weight: bold;"&gt;EjemploStruts2&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;File&gt;New Project&gt;Java Web&gt;Web Application&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_6I9HJQ7QnqA/SjkCl_FU6GI/AAAAAAAAADU/6H--aopPM34/s1600-h/NetBeans_CrearProyecto1.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 200px; height: 128px;" src="http://3.bp.blogspot.com/_6I9HJQ7QnqA/SjkCl_FU6GI/AAAAAAAAADU/6H--aopPM34/s200/NetBeans_CrearProyecto1.gif" alt="" id="BLOGGER_PHOTO_ID_5348308884091365474" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Cuando estes creando el proyecto usa un folder dedicado para almacenar tus librerias, habilita el checbox &lt;span style="font-weight: bold;"&gt;Use Dedicated Folder for Storing Libraries&lt;/span&gt; para almacenar mas tarde las librerias de Struts 2.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_6I9HJQ7QnqA/SjkCmFltAJI/AAAAAAAAADc/xNcctM65zw0/s1600-h/NetBeans_CrearProyecto2.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 200px; height: 138px;" src="http://1.bp.blogspot.com/_6I9HJQ7QnqA/SjkCmFltAJI/AAAAAAAAADc/xNcctM65zw0/s200/NetBeans_CrearProyecto2.gif" alt="" id="BLOGGER_PHOTO_ID_5348308885837774994" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Selecciona &lt;span style="font-weight: bold;"&gt;Apache Tomcat&lt;/span&gt; 6.0.18 o la versión que esté disponible superior a la 6.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_6I9HJQ7QnqA/SjkCmtfS6hI/AAAAAAAAADk/NMK3qTW2qro/s1600-h/NetBeans_CrearProyecto3.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 200px; height: 138px;" src="http://4.bp.blogspot.com/_6I9HJQ7QnqA/SjkCmtfS6hI/AAAAAAAAADk/NMK3qTW2qro/s200/NetBeans_CrearProyecto3.gif" alt="" id="BLOGGER_PHOTO_ID_5348308896548317714" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Esa es toda la configuración que necesitaremos, asi que puedes dar click al boton de &lt;span style="font-weight: bold;"&gt;finish&lt;/span&gt; al asistente de NetBeans.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_6I9HJQ7QnqA/SjkCmxsjLYI/AAAAAAAAADs/J5-1v5hkup0/s1600-h/NetBeans_CrearProyecto4.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 200px; height: 132px;" src="http://2.bp.blogspot.com/_6I9HJQ7QnqA/SjkCmxsjLYI/AAAAAAAAADs/J5-1v5hkup0/s200/NetBeans_CrearProyecto4.gif" alt="" id="BLOGGER_PHOTO_ID_5348308897677651330" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Una vez hecho esto hay que crear la carpeta en la que alojaremos las librerias de &lt;span style="font-weight: bold;"&gt;Struts 2&lt;/span&gt;, te sugiero que lo llames &lt;span style="font-weight: bold;"&gt;Struts2&lt;/span&gt;. Aunque puedes mandar llamar las librerias desde donde quieras a veces es mejor poner todo lo necesario en la misma carpeta que tu proyecto y dejar que NetBeans las ponga en el lugar correcto.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_6I9HJQ7QnqA/SjkCnMrXA_I/AAAAAAAAAD0/l2VIwGXwMlU/s1600-h/NetBeans_CrearProyecto5.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 200px; height: 117px;" src="http://3.bp.blogspot.com/_6I9HJQ7QnqA/SjkCnMrXA_I/AAAAAAAAAD0/l2VIwGXwMlU/s200/NetBeans_CrearProyecto5.gif" alt="" id="BLOGGER_PHOTO_ID_5348308904920417266" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Despues de creado el proyecto, importa las librerias dandole click derecho a la carpeta de proyecto, despues en propiedades, librerias y por último selecciona los archivos de Struts donde las hayas despositado y agregalos.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://programacionconejemplos.blogspot.com/2009/06/1-ejemplo-struts2_17.html"&gt;1.1.- Requisitos&lt;/a&gt;&lt;br /&gt;&lt;b&gt;1.2.- Crear el proyecto en NetBeans&lt;/b&gt;&lt;br /&gt;&lt;a href="http://programacionconejemplos.blogspot.com/2009/06/3-ejemplo-struts2_17.html"&gt;1.3.- Configurar el proyecto para usar Struts 2&lt;/a&gt;&lt;br /&gt;&lt;a href="http://programacionconejemplos.blogspot.com/2009/06/4-ejemplo-struts2_17.html"&gt;1.4.- La vista de nuestro proyecto&lt;/a&gt;&lt;br /&gt;&lt;a href="http://programacionconejemplos.blogspot.com/2009/06/5-ejemplo-struts2_17.html"&gt;1.5.- La capa de negocios&lt;/a&gt;&lt;br /&gt;&lt;a href="http://programacionconejemplos.blogspot.com/2009/06/6-ejemplo-struts2_17.html"&gt;1.6.- Ejecutar el proyecto&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8262369655936226064-113769608935533798?l=programacionconejemplos.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programacionconejemplos.blogspot.com/feeds/113769608935533798/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://programacionconejemplos.blogspot.com/2009/06/2-ejemplo-struts2_17.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8262369655936226064/posts/default/113769608935533798'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8262369655936226064/posts/default/113769608935533798'/><link rel='alternate' type='text/html' href='http://programacionconejemplos.blogspot.com/2009/06/2-ejemplo-struts2_17.html' title='1.2 - Ejemplo de Struts2, el hola mundo'/><author><name>Ant</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_6I9HJQ7QnqA/SjkCl_FU6GI/AAAAAAAAADU/6H--aopPM34/s72-c/NetBeans_CrearProyecto1.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8262369655936226064.post-2292922178529103892</id><published>2009-06-17T15:45:00.013-05:00</published><updated>2010-01-09T01:10:47.691-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Struts2 - 1.3. - Ejemplo de Struts2'/><title type='text'>1.3 - Ejemplo de Struts2, el hola mundo</title><content type='html'>&lt;a href="http://programacionconejemplos.blogspot.com/2009/06/1-ejemplo-struts2_17.html"&gt;1.1.- Requisitos&lt;/a&gt;&lt;br /&gt;&lt;a href="http://programacionconejemplos.blogspot.com/2009/06/2-ejemplo-struts2_17.html"&gt;1.2.- Crear el proyecto en NetBeans&lt;/a&gt;&lt;br /&gt;&lt;b&gt;1.3.- Configurar el proyecto para usar Struts 2&lt;/b&gt;&lt;br /&gt;&lt;a href="http://programacionconejemplos.blogspot.com/2009/06/4-ejemplo-struts2_17.html"&gt;1.4.- La vista de nuestro proyecto&lt;/a&gt;&lt;br /&gt;&lt;a href="http://programacionconejemplos.blogspot.com/2009/06/5-ejemplo-struts2_17.html"&gt;1.5.- La capa de negocios&lt;/a&gt;&lt;br /&gt;&lt;a href="http://programacionconejemplos.blogspot.com/2009/06/6-ejemplo-struts2_17.html"&gt;1.6.- Ejecutar el proyecto&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Configurar el proyecto para usar Struts 2&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Al crear tu proyecto en NetBeans, se creará por default un archivo web.xml que tendremos que modificar para agregar el filtro mediante el cual se gestionarán las peticiones a Struts 2.  Estas son las lineas que te permitirán hacer dar de alta el filtro:&lt;br /&gt;&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;&amp;lt;filter&amp;gt;&lt;br /&gt;   &amp;lt;filter-name&amp;gt;struts2&amp;lt;/filter-name&amp;gt;&lt;br /&gt;   &amp;lt;filter-class&amp;gt;org.apache.struts2.dispatcher.FilterDispatcher&amp;lt;/filter-class&amp;gt;&lt;br /&gt;&amp;lt;/filter&amp;gt;&lt;br /&gt;&amp;lt;filter-mapping&amp;gt;&lt;br /&gt;   &amp;lt;filter-name&amp;gt;struts2&amp;lt;/filter-name&amp;gt;&lt;br /&gt;   &amp;lt;url-pattern&amp;gt;/*&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;&amp;lt;/filter-mapping&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Puedes descargar el archivo &lt;a href="http://javandengi.svn.sourceforge.net/viewvc/javandengi/Struts2Ejemplo1/web/WEB-INF/web.xml"&gt;web.xml&lt;/a&gt;, pero trata de modifcarlo directamente en tu proyecto.&lt;br /&gt;&lt;br /&gt;Otro archivo que será necesario crear es struts.xml, este archivo es uno de los mas importantes para el marco de trabajo de Struts 2.  Lo debes crear en el paquete default del proyecto.&lt;br /&gt;&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;&amp;lt;!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"&amp;gt;&lt;br /&gt;&amp;lt;struts&amp;gt;&lt;br /&gt;   &amp;lt;constant name="struts.enable.DynamicMethodInvocation" value="false" /&amp;gt;&lt;br /&gt;   &amp;lt;constant name="struts.devMode" value="false" /&amp;gt;&lt;br /&gt;&lt;br /&gt;   &amp;lt;package name="default" namespace="/" extends="struts-default"&amp;gt;&lt;br /&gt;&lt;br /&gt;   //Declaracion de Acciones&lt;br /&gt;&lt;br /&gt;   &amp;lt;/package&amp;gt;&lt;br /&gt;&amp;lt;/struts&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Como podras ver le aún le faltan algunas cosas al archivo,  pero lo completaremos a continuación.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://programacionconejemplos.blogspot.com/2009/06/1-ejemplo-struts2_17.html"&gt;1.1.- Requisitos&lt;/a&gt;&lt;br /&gt;&lt;a href="http://programacionconejemplos.blogspot.com/2009/06/2-ejemplo-struts2_17.html"&gt;1.2.- Crear el proyecto en NetBeans&lt;/a&gt;&lt;br /&gt;&lt;b&gt;1.3.- Configurar el proyecto para usar Struts 2&lt;/b&gt;&lt;br /&gt;&lt;a href="http://programacionconejemplos.blogspot.com/2009/06/4-ejemplo-struts2_17.html"&gt;1.4.- La vista de nuestro proyecto&lt;/a&gt;&lt;br /&gt;&lt;a href="http://programacionconejemplos.blogspot.com/2009/06/5-ejemplo-struts2_17.html"&gt;1.5.- La capa de negocios&lt;/a&gt;&lt;br /&gt;&lt;a href="http://programacionconejemplos.blogspot.com/2009/06/6-ejemplo-struts2_17.html"&gt;1.6.- Ejecutar el proyecto&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8262369655936226064-2292922178529103892?l=programacionconejemplos.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programacionconejemplos.blogspot.com/feeds/2292922178529103892/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://programacionconejemplos.blogspot.com/2009/06/3-ejemplo-struts2_17.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8262369655936226064/posts/default/2292922178529103892'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8262369655936226064/posts/default/2292922178529103892'/><link rel='alternate' type='text/html' href='http://programacionconejemplos.blogspot.com/2009/06/3-ejemplo-struts2_17.html' title='1.3 - Ejemplo de Struts2, el hola mundo'/><author><name>Ant</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8262369655936226064.post-6461233022691967247</id><published>2009-06-17T15:44:00.018-05:00</published><updated>2011-12-18T13:18:00.369-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Struts2 - 1.4. - Ejemplo de Struts2'/><title type='text'>1.4 - Ejemplo de Struts2, el hola mundo</title><content type='html'>&lt;a href="http://programacionconejemplos.blogspot.com/2009/06/1-ejemplo-struts2_17.html"&gt;1.1.- Requisitos&lt;/a&gt;&lt;br /&gt;&lt;a href="http://programacionconejemplos.blogspot.com/2009/06/2-ejemplo-struts2_17.html"&gt;1.2.- Crear el proyecto en NetBeans&lt;/a&gt;&lt;br /&gt;&lt;a href="http://programacionconejemplos.blogspot.com/2009/06/3-ejemplo-struts2_17.html"&gt;1.3.- Configurar el proyecto para usar Struts 2&lt;/a&gt;&lt;br /&gt;&lt;b&gt;1.4.- La vista de nuestro proyecto&lt;/b&gt;&lt;br /&gt;&lt;a href="http://programacionconejemplos.blogspot.com/2009/06/5-ejemplo-struts2_17.html"&gt;1.5.- La capa de negocios&lt;/a&gt;&lt;br /&gt;&lt;a href="http://programacionconejemplos.blogspot.com/2009/06/6-ejemplo-struts2_17.html"&gt;1.6.- Ejecutar el proyecto&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;La vista de nuestro proyecto&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Lo primero que haremos será modificar el archivo index.jsp&lt;br /&gt;&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); color: black; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;&amp;lt;%@page contentType="text/html" pageEncoding="UTF-8"%&amp;gt;&lt;br /&gt;&amp;lt;%@ taglib prefix="s" uri="/struts-tags" %&amp;gt;&lt;br /&gt;&amp;lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"&lt;br /&gt;   "http://www.w3.org/TR/html4/loose.dtd"&amp;gt;&lt;br /&gt;  &lt;br /&gt;&amp;lt;html&amp;gt;&lt;br /&gt;   &amp;lt;head&amp;gt;&lt;br /&gt;       &amp;lt;meta http-equiv="Content-Type" content="text/html; charset=UTF-8"&amp;gt;&lt;br /&gt;       &amp;lt;title&amp;gt;Ejemplos con Struts 2&amp;lt;/title&amp;gt;&lt;br /&gt;   &amp;lt;/head&amp;gt;&lt;br /&gt;   &amp;lt;body&amp;gt;&lt;br /&gt;       &amp;lt;h1&amp;gt;Pagina de Inicio&amp;lt;/h1&amp;gt;&lt;br /&gt;       &amp;lt;s:a href="FormularioEntrada.action"&amp;gt;Formulario Entrada&amp;lt;/s:a&amp;gt;&lt;br /&gt;   &amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;En este archivo jsp estamos incluyendo una linea que hace uso de las etiquetas de Struts2.&lt;br /&gt;&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); color: black; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;&amp;lt;s:a href="FormularioEntrada.action"&amp;gt;Formulario Entrada&amp;lt;/s:a&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Esta etiqueta hace referencia a nuestra primera acción y solo se encarga de llamar al formulario de login y password.  Asi que también tendremos que modificar el archivo struts.xml para que haga correctamente esta petición.&lt;br /&gt;&lt;br /&gt;Para descargar el archivo da click aqui: &lt;a href="http://javandengi.svn.sourceforge.net/viewvc/javandengi/Struts2Ejemplo1/web/index.jsp"&gt;index.jsp&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Entre las etiquetas del paquete default de struts.xml deberás insertar las siguientes lineas:&lt;br /&gt;&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); color: black; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;        &amp;lt;action name="FormularioEntrada"&amp;gt;&lt;br /&gt;           &amp;lt;result&amp;gt;/formularioEntrada.jsp&amp;lt;/result&amp;gt;&lt;br /&gt;       &amp;lt;/action&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Como te habrás dado cuenta nos hace falta crear el jsp donde se encuentra el formulario de entrada o de login y password.&lt;br /&gt;&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); color: black; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;&amp;lt;%@page contentType="text/html" pageEncoding="UTF-8"%&amp;gt;&lt;br /&gt;&amp;lt;%@ taglib prefix="s" uri="/struts-tags" %&amp;gt;&lt;br /&gt;&amp;lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"&lt;br /&gt;   "http://www.w3.org/TR/html4/loose.dtd"&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;html&amp;gt;&lt;br /&gt;   &amp;lt;head&amp;gt;&lt;br /&gt;       &amp;lt;title&amp;gt;Ejemplos con Struts 2&amp;lt;/title&amp;gt;&lt;br /&gt;       &amp;lt;link href="&amp;lt;s:url value="/css/main.css"/&amp;gt;" rel="stylesheet" type="text/css"/&amp;gt;&lt;br /&gt;   &amp;lt;/head&amp;gt;&lt;br /&gt;   &amp;lt;body&amp;gt;&lt;br /&gt;       &amp;lt;s:form action="Entrar" namespace="/" method="POST"&amp;gt;&lt;br /&gt;           &amp;lt;tr&amp;gt;&lt;br /&gt;               &amp;lt;td colspan="2"&amp;gt;Introduzca su login y su password&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 colspan="2"&amp;gt;&lt;br /&gt;                   &amp;lt;s:actionerror /&amp;gt;&lt;br /&gt;                   &amp;lt;s:fielderror /&amp;gt;&lt;br /&gt;               &amp;lt;/td&amp;gt;&lt;br /&gt;           &amp;lt;/tr&amp;gt;&lt;br /&gt;           &amp;lt;s:textfield name="usr" label="Username"/&amp;gt;&lt;br /&gt;           &amp;lt;s:password name="pas" label="Password"/&amp;gt;&lt;br /&gt;           &amp;lt;s:submit value="Login" align="center"/&amp;gt;&lt;br /&gt;       &amp;lt;/s:form&amp;gt;&lt;br /&gt;   &amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Para descargar el archivo `a click aqui: &lt;a href="http://javandengi.svn.sourceforge.net/viewvc/javandengi/Struts2Ejemplo1/web/formularioEntrada.jsp"&gt;formularioEntrada.jsp&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Tambien necesitaremos nuestra página de bienvenida para el usuario que entra con sus datos correctos.&lt;br /&gt;&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); color: black; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;&amp;lt;%@page contentType="text/html" pageEncoding="UTF-8"%&amp;gt;&lt;br /&gt;&amp;lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"&lt;br /&gt;  "http://www.w3.org/TR/html4/loose.dtd"&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;html&amp;gt;&lt;br /&gt;   &amp;lt;head&amp;gt;&lt;br /&gt;       &amp;lt;meta http-equiv="Content-Type" content="text/html; charset=UTF-8"&amp;gt;&lt;br /&gt;       &amp;lt;title&amp;gt;Pagina de Bienvenida&amp;lt;/title&amp;gt;&lt;br /&gt;   &amp;lt;/head&amp;gt;&lt;br /&gt;   &amp;lt;body&amp;gt;&lt;br /&gt;       &amp;lt;h1&amp;gt;Bienvenido, has entrado al sistema!&amp;lt;/h1&amp;gt;&lt;br /&gt;   &amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Para descargar el archivo da click aqui: &lt;a href="http://javandengi.svn.sourceforge.net/viewvc/javandengi/Struts2Ejemplo1/web/paginaBienvenida.jsp"&gt;paginaBienvenida.jsp&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;El archivo formularioEntrada.jsp contiene mas etiquetas de Struts2, la etiqueta form, hace petición a la accion &lt;span style="font-weight: bold;"&gt;Entrar&lt;/span&gt;, misma que deberemos declarar en nuestro archivo struts.xml nuevamente.&lt;br /&gt;&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); color: black; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;        &amp;lt;action name="Entrar" class="ejemplos.struts2.action.AccionEntrar"&amp;gt;&lt;br /&gt;           &amp;lt;result name="input"&amp;gt;/formularioEntrada.jsp&amp;lt;/result&amp;gt;&lt;br /&gt;           &amp;lt;result name="error"&amp;gt;/formularioEntrada.jsp&amp;lt;/result&amp;gt;&lt;br /&gt;           &amp;lt;result&amp;gt;/paginaBienvenida.jsp&amp;lt;/result&amp;gt;&lt;br /&gt;       &amp;lt;/action&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Con estas declaraciones estamos diciendo al marco de trabajo cual es la clase que se encargará de atender la peticion &lt;span style="font-weight: bold;"&gt;Entrar&lt;/span&gt; y también estamos definiendo cual será el flujo de trabajo que deberá seguir en caso de que la petición sea exitosa o que suceda un error.&lt;br /&gt;&lt;br /&gt;Con la creación de estas páginas nuestro archivo de configuración de Struts debe ser modificado nuevamente para que puedan ser llamadas desde una acción:&lt;br /&gt;&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); color: black; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;&amp;amp;ht;!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"&amp;gt;&lt;br /&gt;&amp;lt;struts&amp;gt;&lt;br /&gt;   &amp;lt;constant name="struts.enable.DynamicMethodInvocation" value="false" /&amp;gt;&lt;br /&gt;   &amp;lt;constant name="struts.devMode" value="false" /&amp;gt;&lt;br /&gt;&lt;br /&gt;   &amp;lt;package name="default" namespace="/" extends="struts-default"&amp;gt;&lt;br /&gt;       &amp;lt;action name="FormularioEntrada"&amp;gt;&lt;br /&gt;           &amp;lt;result&amp;gt;/formularioEntrada.jsp&amp;lt;/result&amp;gt;&lt;br /&gt;       &amp;lt;/action&amp;gt;&lt;br /&gt;       &amp;lt;action name="Entrar" class="ejemplos.struts2.action.AccionEntrar"&amp;gt;&lt;br /&gt;           &amp;lt;result name="input"&amp;gt;/formularioEntrada.jsp&amp;lt;/result&amp;gt;&lt;br /&gt;           &amp;lt;result name="error"&amp;gt;/formularioEntrada.jsp&amp;lt;/result&amp;gt;&lt;br /&gt;           &amp;lt;result&amp;gt;/paginaBienvenida.jsp&amp;lt;/result&amp;gt;&lt;br /&gt;       &amp;lt;/action&amp;gt;&lt;br /&gt;   &amp;lt;/package&amp;amp;ct;&lt;br /&gt;&amp;lt;/struts&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Descarga &lt;a href="http://javandengi.svn.sourceforge.net/viewvc/javandengi/Struts2Ejemplo1/src/java/struts.xml"&gt;struts.xml&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://programacionconejemplos.blogspot.com/2009/06/1-ejemplo-struts2_17.html"&gt;1.1.- Requisitos&lt;/a&gt;&lt;br /&gt;&lt;a href="http://programacionconejemplos.blogspot.com/2009/06/2-ejemplo-struts2_17.html"&gt;1.2.- Crear el proyecto en NetBeans&lt;/a&gt;&lt;br /&gt;&lt;a href="http://programacionconejemplos.blogspot.com/2009/06/3-ejemplo-struts2_17.html"&gt;1.3.- Configurar el proyecto para usar Struts 2&lt;/a&gt;&lt;br /&gt;&lt;b&gt;1.4.- La vista de nuestro proyecto&lt;/b&gt;&lt;br /&gt;&lt;a href="http://programacionconejemplos.blogspot.com/2009/06/5-ejemplo-struts2_17.html"&gt;1.5.- La capa de negocios&lt;/a&gt;&lt;br /&gt;&lt;a href="http://programacionconejemplos.blogspot.com/2009/06/6-ejemplo-struts2_17.html"&gt;1.6.- Ejecutar el proyecto&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8262369655936226064-6461233022691967247?l=programacionconejemplos.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programacionconejemplos.blogspot.com/feeds/6461233022691967247/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://programacionconejemplos.blogspot.com/2009/06/4-ejemplo-struts2_17.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8262369655936226064/posts/default/6461233022691967247'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8262369655936226064/posts/default/6461233022691967247'/><link rel='alternate' type='text/html' href='http://programacionconejemplos.blogspot.com/2009/06/4-ejemplo-struts2_17.html' title='1.4 - Ejemplo de Struts2, el hola mundo'/><author><name>Ant</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8262369655936226064.post-6535087525237605630</id><published>2009-06-17T15:43:00.011-05:00</published><updated>2010-01-09T01:11:18.774-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Struts2 - 1.5. - Ejemplo de Struts2'/><title type='text'>1.5 - Ejemplo de Struts2, el hola mundo</title><content type='html'>&lt;a href="http://programacionconejemplos.blogspot.com/2009/06/1-ejemplo-struts2_17.html"&gt;1.1.- Requisitos&lt;/a&gt;&lt;br /&gt;&lt;a href="http://programacionconejemplos.blogspot.com/2009/06/2-ejemplo-struts2_17.html"&gt;1.2.- Crear el proyecto en NetBeans&lt;/a&gt;&lt;br /&gt;&lt;a href="http://programacionconejemplos.blogspot.com/2009/06/3-ejemplo-struts2_17.html"&gt;1.3.- Configurar el proyecto para usar Struts 2&lt;/a&gt;&lt;br /&gt;&lt;a href="http://programacionconejemplos.blogspot.com/2009/06/4-ejemplo-struts2_17.html"&gt;1.4.- La vista de nuestro proyecto&lt;/a&gt;&lt;br /&gt;&lt;b&gt;1.5.- La capa de negocios&lt;/b&gt;&lt;br /&gt;&lt;a href="http://programacionconejemplos.blogspot.com/2009/06/6-ejemplo-struts2_17.html"&gt;1.6.- Ejecutar el proyecto&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;La Capa de Negocios&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Como habrás podido ver aún nos falta definir una parte importante en el proyecto y es la clase que se encargará de atender la petición del formulario de entrada.  Para eso usaremos la siguiente clase:&lt;br /&gt;&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;package ejemplos.struts2.action;&lt;br /&gt;import ejemplos.struts2.beans.Usuario;&lt;br /&gt;import java.util.Map;&lt;br /&gt;import com.opensymphony.xwork2.ActionSupport;&lt;br /&gt;import org.apache.struts2.interceptor.SessionAware;&lt;br /&gt;&lt;br /&gt;public class AccionEntrar extends ActionSupport implements SessionAware{&lt;br /&gt;   private Map session;&lt;br /&gt;   private String mensajeError;&lt;br /&gt;   private String usr;&lt;br /&gt;   private String pas;&lt;br /&gt;&lt;br /&gt;   public String execute() throws Exception {&lt;br /&gt;      &lt;br /&gt;       if (getUsr() != null &amp;amp;&amp;amp; getPas() != null){    //Verificamos que los datos no sean nulos&lt;br /&gt;&lt;br /&gt;           Usuario usuario = null;&lt;br /&gt;           // Aqui haremos como que buscamos a nuestro usuario en la base de datos.&lt;br /&gt;           // Si el login y password coinciden normalmente devolveriamos una instancia&lt;br /&gt;           // de usuario con los datos de la cuenta&lt;br /&gt;           // Esto normalmente no se haria en esta capa de codigo!&lt;br /&gt;               if(getUsr().equals("user") &amp;amp;&amp;amp; getPas().equals("123")){&lt;br /&gt;                   usuario = new Usuario();&lt;br /&gt;                   usuario.setId(1l);&lt;br /&gt;                   usuario.setNombre("Invitado");&lt;br /&gt;                   usuario.setLogin("user");&lt;br /&gt;                   usuario.setPassword("123");&lt;br /&gt;               }&lt;br /&gt;           //Fin de busqueda&lt;br /&gt;&lt;br /&gt;           if(usuario != null){    //Si el usuario se encuentra se agrega a la sesion&lt;br /&gt;               session.put("usuario",usuario);&lt;br /&gt;           }else{                    //Si no se encuentra se devuelve un error&lt;br /&gt;               addActionError("No existe esta cuenta");&lt;br /&gt;               setMensajeError("No existe esta cuenta");&lt;br /&gt;               return ERROR;&lt;br /&gt;           }&lt;br /&gt;       } else {&lt;br /&gt;           addActionError("Inserte datos correctos");&lt;br /&gt;           setMensajeError("Inserte datos correctos");&lt;br /&gt;           return ERROR;&lt;br /&gt;       }&lt;br /&gt;       return SUCCESS;&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;   public Map getSession() {&lt;br /&gt;       return session;&lt;br /&gt;   }&lt;br /&gt;   public void setSession(Map session) {&lt;br /&gt;       this.session = session;&lt;br /&gt;   }&lt;br /&gt;   public String getUsr() {&lt;br /&gt;       return usr;&lt;br /&gt;   }&lt;br /&gt;   public void setUsr(String usr) {&lt;br /&gt;       this.usr = usr;&lt;br /&gt;   }&lt;br /&gt;   public String getPas() {&lt;br /&gt;       return pas;&lt;br /&gt;   }&lt;br /&gt;   public void setPas(String pas) {&lt;br /&gt;       this.pas = pas;&lt;br /&gt;   }&lt;br /&gt;   public void setMensajeError(String mensajeError) {&lt;br /&gt;       this.mensajeError = mensajeError;&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;descargar: &lt;a href="http://javandengi.svn.sourceforge.net/viewvc/javandengi/Struts2Ejemplo1/src/java/ejemplos/struts2/action/AccionEntrar.java"&gt;AccionEntrar.java&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Hay muchas cosas que aprender de la clase AccionEntrar, sin embargo por el momento solo comentaremos que, entre otras cosas, se encarga de manejar los parametros de entrada del formulario y si son validos los datos, de redirigir al usuario a una página de bienvenida o si no de regresarlo nuevamente al formulario de entrada.&lt;br /&gt;&lt;br /&gt;Necesitamos una clase mas, que nos permitirá guardar y controlar la sesión en nuestro proyecto.  Aunque en este ejemplo no tiene mayor efecto.&lt;br /&gt;&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;package ejemplos.struts2.beans;&lt;br /&gt;public class Usuario {&lt;br /&gt;   private Long id;&lt;br /&gt;   private String nombre;&lt;br /&gt;   private String login;&lt;br /&gt;   private String password;&lt;br /&gt;&lt;br /&gt;   public Long getId() {&lt;br /&gt;       return id;&lt;br /&gt;   }&lt;br /&gt;   public void setId(Long id) {&lt;br /&gt;       this.id = id;&lt;br /&gt;   }&lt;br /&gt;   public String getNombre() {&lt;br /&gt;       return nombre;&lt;br /&gt;   }&lt;br /&gt;   public void setNombre(String nombre) {&lt;br /&gt;       this.nombre = nombre;&lt;br /&gt;   }&lt;br /&gt;   public String getLogin() {&lt;br /&gt;       return login;&lt;br /&gt;   }&lt;br /&gt;   public void setLogin(String login) {&lt;br /&gt;       this.login = login;&lt;br /&gt;   }&lt;br /&gt;   public String getPassword() {&lt;br /&gt;       return password;&lt;br /&gt;   }&lt;br /&gt;   public void setPassword(String password) {&lt;br /&gt;       this.password = password;&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;descargar: &lt;a href="http://javandengi.svn.sourceforge.net/viewvc/javandengi/Struts2Ejemplo1/src/java/ejemplos/struts2/beans/Usuario.java"&gt;Usuario.java&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;La clase &lt;span style="font-weight: bold;"&gt;Usuario&lt;/span&gt; solo tiene sentido si consideras en un futuro el uso de sesiones para restringir el acceso a páginas privadas y que requieran autenticación.  Por el momento no tiene mayor efecto.&lt;br /&gt;&lt;br /&gt;No olvides depositar a cada clase en su paquete correspondiente.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://programacionconejemplos.blogspot.com/2009/06/1-ejemplo-struts2_17.html"&gt;1.1.- Requisitos&lt;/a&gt;&lt;br /&gt;&lt;a href="http://programacionconejemplos.blogspot.com/2009/06/2-ejemplo-struts2_17.html"&gt;1.2.- Crear el proyecto en NetBeans&lt;/a&gt;&lt;br /&gt;&lt;a href="http://programacionconejemplos.blogspot.com/2009/06/3-ejemplo-struts2_17.html"&gt;1.3.- Configurar el proyecto para usar Struts 2&lt;/a&gt;&lt;br /&gt;&lt;a href="http://programacionconejemplos.blogspot.com/2009/06/4-ejemplo-struts2_17.html"&gt;1.4.- La vista de nuestro proyecto&lt;/a&gt;&lt;br /&gt;&lt;b&gt;1.5.- La capa de negocios&lt;/b&gt;&lt;br /&gt;&lt;a href="http://programacionconejemplos.blogspot.com/2009/06/6-ejemplo-struts2_17.html"&gt;1.6.- Ejecutar el proyecto&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8262369655936226064-6535087525237605630?l=programacionconejemplos.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programacionconejemplos.blogspot.com/feeds/6535087525237605630/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://programacionconejemplos.blogspot.com/2009/06/5-ejemplo-struts2_17.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8262369655936226064/posts/default/6535087525237605630'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8262369655936226064/posts/default/6535087525237605630'/><link rel='alternate' type='text/html' href='http://programacionconejemplos.blogspot.com/2009/06/5-ejemplo-struts2_17.html' title='1.5 - Ejemplo de Struts2, el hola mundo'/><author><name>Ant</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8262369655936226064.post-1747947511105078683</id><published>2009-06-17T15:39:00.013-05:00</published><updated>2010-01-09T01:11:33.692-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Struts2 - 1.6. - Ejemplo de Struts2'/><title type='text'>1.6 - Ejemplo de Struts2, el hola mundo</title><content type='html'>&lt;a href="http://programacionconejemplos.blogspot.com/2009/06/1-ejemplo-struts2_17.html"&gt;1.1.- Requisitos&lt;/a&gt;&lt;br /&gt;&lt;a href="http://programacionconejemplos.blogspot.com/2009/06/2-ejemplo-struts2_17.html"&gt;1.2.- Crear el proyecto en NetBeans&lt;/a&gt;&lt;br /&gt;&lt;a href="http://programacionconejemplos.blogspot.com/2009/06/3-ejemplo-struts2_17.html"&gt;1.3.- Configurar el proyecto para usar Struts 2&lt;/a&gt;&lt;br /&gt;&lt;a href="http://programacionconejemplos.blogspot.com/2009/06/4-ejemplo-struts2_17.html"&gt;1.4.- La vista de nuestro proyecto&lt;/a&gt;&lt;br /&gt;&lt;a href="http://programacionconejemplos.blogspot.com/2009/06/5-ejemplo-struts2_17.html"&gt;1.5.- La capa de negocios&lt;/a&gt;&lt;br /&gt;&lt;b&gt;1.6.- Ejecutar el proyecto&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Ejecutar el proyecto&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Ya tenemos todo lo necesario para correr nuestro primer ejemplo, esta es una vista final de como quedarian nuestros archivos en el proyecto de &lt;span style="font-weight: bold;"&gt;NetBeans&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_6I9HJQ7QnqA/Sjkh1NH-inI/AAAAAAAAAEc/qjoV6dBk-4c/s1600-h/NetBeans_VistaArchivos.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 238px; height: 400px;" src="http://2.bp.blogspot.com/_6I9HJQ7QnqA/Sjkh1NH-inI/AAAAAAAAAEc/qjoV6dBk-4c/s400/NetBeans_VistaArchivos.gif" alt="" id="BLOGGER_PHOTO_ID_5348343230419077746" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Ahora solo tienes que dar un click derecho en la carpeta de proyecto y darle otro click a la opción de correr o "&lt;span style="font-weight: bold;"&gt;Run&lt;/span&gt;"&lt;br /&gt;&lt;br /&gt;En nuestro navegador se desplegará la siguiente pantalla&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_6I9HJQ7QnqA/Sjkh1Zbd6zI/AAAAAAAAAEk/ZRwyZFp-g-Q/s1600-h/NavegadorInicio.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 225px;" src="http://2.bp.blogspot.com/_6I9HJQ7QnqA/Sjkh1Zbd6zI/AAAAAAAAAEk/ZRwyZFp-g-Q/s400/NavegadorInicio.gif" alt="" id="BLOGGER_PHOTO_ID_5348343233722051378" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Si le damos a la liga para ir al formulario de entrada en nuestro navegador aparecerá lo siguiente:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_6I9HJQ7QnqA/Sjkgyoa1yuI/AAAAAAAAAEE/hSF5Js0YMVE/s1600-h/NavegadorEntrada.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 160px;" src="http://3.bp.blogspot.com/_6I9HJQ7QnqA/Sjkgyoa1yuI/AAAAAAAAAEE/hSF5Js0YMVE/s400/NavegadorEntrada.gif" alt="" id="BLOGGER_PHOTO_ID_5348342086694718178" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Si se ponen datos incorrectos en el formulario de login, el framework se engargará de gestionar la petición y nos enviará a la pantalla de error gracias al flujo que hemos definido en el archivo de &lt;span style="font-weight: bold;"&gt;struts.xml&lt;/span&gt; y al manejo de los datos que hace nuestra clase &lt;span style="font-weight: bold;"&gt;AccionEntrar.java&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_6I9HJQ7QnqA/Sjkgyxq7eVI/AAAAAAAAAEM/HQELOowvTAY/s1600-h/NavegadorError.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 160px;" src="http://2.bp.blogspot.com/_6I9HJQ7QnqA/Sjkgyxq7eVI/AAAAAAAAAEM/HQELOowvTAY/s400/NavegadorError.gif" alt="" id="BLOGGER_PHOTO_ID_5348342089178118482" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Si se introducen los datos correctos, una pantalla de bienvenida se desplegará.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_6I9HJQ7QnqA/Sjkgy3p9SZI/AAAAAAAAAEU/SXFWTMvOXbQ/s1600-h/NavegadorBienvenida.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 160px;" src="http://4.bp.blogspot.com/_6I9HJQ7QnqA/Sjkgy3p9SZI/AAAAAAAAAEU/SXFWTMvOXbQ/s400/NavegadorBienvenida.gif" alt="" id="BLOGGER_PHOTO_ID_5348342090784655762" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;¡Listo! Ya tenemos nuestro primer ejemplo terminado.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Struts2&lt;/span&gt; provee a los desarrolladores de herramientas muy poderosas para facilitar su trabajo, algunas de ellas son los interceptores, que te permiten hacer muchas cosas que normalmente se tenian que programar enteramente en &lt;span style="font-weight: bold;"&gt;Struts1&lt;/span&gt;, por ejemplo, el manejo de la session para usuarios con permisos o la carga de archivos desde el cliente.  Los interceptores son una pieza fundamental en este marco de trabajo y haremos algunos ejemplos mas adelante.&lt;br /&gt;&lt;br /&gt;Por el momento es todo, espero que este pequeño ejemplo les sirva para familiarizarse con &lt;span style="font-weight: bold;"&gt;Struts2&lt;/span&gt;. Hasta el siguiente post&lt;br /&gt;&lt;br /&gt;&lt;a href="http://programacionconejemplos.blogspot.com/2009/06/1-ejemplo-struts2_17.html"&gt;1.1.- Requisitos&lt;/a&gt;&lt;br /&gt;&lt;a href="http://programacionconejemplos.blogspot.com/2009/06/2-ejemplo-struts2_17.html"&gt;1.2.- Crear el proyecto en NetBeans&lt;/a&gt;&lt;br /&gt;&lt;a href="http://programacionconejemplos.blogspot.com/2009/06/3-ejemplo-struts2_17.html"&gt;1.3.- Configurar el proyecto para usar Struts 2&lt;/a&gt;&lt;br /&gt;&lt;a href="http://programacionconejemplos.blogspot.com/2009/06/4-ejemplo-struts2_17.html"&gt;1.4.- La vista de nuestro proyecto&lt;/a&gt;&lt;br /&gt;&lt;a href="http://programacionconejemplos.blogspot.com/2009/06/5-ejemplo-struts2_17.html"&gt;1.5.- La capa de negocios&lt;/a&gt;&lt;br /&gt;&lt;b&gt;1.6.- Ejecutar el proyecto&lt;/b&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8262369655936226064-1747947511105078683?l=programacionconejemplos.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programacionconejemplos.blogspot.com/feeds/1747947511105078683/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://programacionconejemplos.blogspot.com/2009/06/6-ejemplo-struts2_17.html#comment-form' title='7 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8262369655936226064/posts/default/1747947511105078683'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8262369655936226064/posts/default/1747947511105078683'/><link rel='alternate' type='text/html' href='http://programacionconejemplos.blogspot.com/2009/06/6-ejemplo-struts2_17.html' title='1.6 - Ejemplo de Struts2, el hola mundo'/><author><name>Ant</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_6I9HJQ7QnqA/Sjkh1NH-inI/AAAAAAAAAEc/qjoV6dBk-4c/s72-c/NetBeans_VistaArchivos.gif' height='72' width='72'/><thr:total>7</thr:total></entry></feed>
