<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Desarrollando Ideas &#187; JSF</title>
	<atom:link href="http://desarrollandoideas.com.ar/category/jsf/feed/" rel="self" type="application/rss+xml" />
	<link>http://desarrollandoideas.com.ar</link>
	<description>Abandon all hope, ye who enter here...</description>
	<lastBuildDate>Tue, 28 Feb 2012 18:48:40 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Abandono del Tutorial de JSF</title>
		<link>http://desarrollandoideas.com.ar/2008/09/10/abandono-del-tutorial-de-jsf/</link>
		<comments>http://desarrollandoideas.com.ar/2008/09/10/abandono-del-tutorial-de-jsf/#comments</comments>
		<pubDate>Wed, 10 Sep 2008 14:30:24 +0000</pubDate>
		<dc:creator>Paul M Dorr</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[JSF]]></category>
		<category><![CDATA[Tutoriales]]></category>

		<guid isPermaLink="false">http://brilliantideasstock.com.ar/?p=36</guid>
		<description><![CDATA[Voy a dejar de escribir el tutorial de JSF que venía haciendo por varios motivos: Nadie lee este miserable blog Nadie lee el tutorial JSF/Java/Etc me están decepcionando mucho Hace rato que estoy por empezar a usar Django&#8230; &#8230; ya falta poco para que empiece a usarlo Ya salió la versión 1 de Django Django [...]]]></description>
			<content:encoded><![CDATA[<p>Voy a dejar de escribir el tutorial de JSF que venía haciendo por varios motivos:</p>
<ol>
<li>Nadie lee este miserable blog <img src='http://desarrollandoideas.com.ar/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </li>
<li>Nadie lee el tutorial</li>
<li>JSF/Java/Etc me están decepcionando mucho</li>
<li>Hace rato que estoy por empezar a usar Django&#8230;</li>
<li>&#8230; ya falta poco para que empiece a usarlo</li>
<li>Ya salió la versión 1 de Django</li>
<li>Django es más lindo</li>
<li>Más rápido</li>
<li>Más liviano</li>
<li>Menos rompebolas</li>
<li>Está en Python</li>
<li>Me fui de tema&#8230;</li>
<li>En fin, porque no tiene sentido ya seguir con este tutorial</li>
</ol>
<p>Espero que a alguien le haya servido lo poco que escribí, y que le sirva lo que escribiré más adelante cuando tenga tiempo, sobre otros temas de desarrollo.</p>
<p>El blog sigue la misma onda, pero intentaré incorporar más que nada noticias del mundo del desarrollo y demás yerbas&#8230;</p>
<p>Apenas tenga algo de tiempo y ganas, pretendo darle a este blog la vida que no tiene y que no tuvo el anterior.</p>
<p>Saludos!</p>
<p><em><strong>The Doctor</strong></em></p>
]]></content:encoded>
			<wfw:commentRss>http://desarrollandoideas.com.ar/2008/09/10/abandono-del-tutorial-de-jsf/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>JSF Expression Language [EL]</title>
		<link>http://desarrollandoideas.com.ar/2008/08/14/jsf-expression-language-el/</link>
		<comments>http://desarrollandoideas.com.ar/2008/08/14/jsf-expression-language-el/#comments</comments>
		<pubDate>Thu, 14 Aug 2008 16:05:10 +0000</pubDate>
		<dc:creator>Paul M Dorr</dc:creator>
				<category><![CDATA[Desarrollo Web]]></category>
		<category><![CDATA[JSF]]></category>
		<category><![CDATA[Tutoriales]]></category>

		<guid isPermaLink="false">http://brilliantideasstock.com.ar/?p=18</guid>
		<description><![CDATA[En la entrega anterior hablé un poco del Expression Language, sin entrar en mucho detalle. En la presente intentaré explayarme un poco más sobre el tema. Con el Expression Language (Leguaje de expresión o EL) podemos acceder directamente a las propiedades o métodos de los beans desde el código de las páginas (JSP, XHTML, etc), [...]]]></description>
			<content:encoded><![CDATA[<p>En la entrega anterior hablé un poco del Expression Language, sin entrar en mucho detalle. En la presente intentaré explayarme un poco más sobre el tema.</p>
<p>Con el Expression Language (Leguaje de expresión o EL) podemos acceder directamente a las propiedades o métodos de los beans desde el código de las páginas (JSP, XHTML, etc), sin más trámite que el siguiente:</p>
<p><code>#{nombreDelBean.propiedad}</code></p>
<p>Fácil, ¿no? Ahora vamos a profundizar un poco porque sino no tiene sentido hacer una nueva entrega del tutorial =D.</p>
<p>Empecemos describiendo las ventajas del EL</p>
<ul>
<li>Notación breve</li>
<li>Acceso a colecciones. Ej: <em>#{variable[indiceOKeyWord]}</em></li>
<li>Acceso a datos de &#8220;request&#8221;. Ej: <em>#{propertiesVar['nombre']}</em> (accediendo a un archivo de propiedades previamente cargado en la página)</li>
<li>Uso de operadores (aritméticos, lógicos, etc)</li>
<li>Salida condicional. Ej:<em> #{test ? opcion1 : opcion2}</em></li>
<li>Conversión de tipos automática</li>
<li>Valores vacíos en caso de String nulo</li>
</ul>
<p><span id="more-18"></span>Para poder utilizar JSF EL es necesario un server que soporte JSP 2.0 (como Tomcat 5)  o superior (servlet 2.4 al menos), lo cual nos lleva a tener un web.xml como el del código siguiente:</p>
<p><code><br />
&lt;?xml version="1.0" encoding="ISO-8859-1"?&gt;<br />
&lt;web-app xmlns="http://java.sun.com/xml/ns/j2ee"<br />
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"<br />
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee web-app_2_4.xsd"<br />
version="2.4"&gt;<br />
…<br />
&lt;/web-app&gt;<br />
</code></p>
<p>Accediendo a propiedades anidadas de un bean</p>
<p>En la entrega anterior vimos como se accedía a propiedades y métodos de los beans en el caso de que estos estén directamente declarados en el mismo bean (cabe aclarar que para poder acceder deben poseer sus respectivos getters y setters.) Ahora veremos como se accede a propiedades de objetos más complejos declarados en el bean (aunque no cambia mucho de la anterior.) Supongamos que en el managed bean tenemos un atributo del tipo Usuario, el cual posee a su vez dos atributos String, nombre y apellido; para obtener por ejemplo el <em>nombre </em>del atributo <em>usuario</em> de <em>managedBean </em>mediante EL, haríamos:</p>
<p><code>#{managedBean.usuario.nombre}</code></p>
<p>Esto hace que EL busque primero una variable o un managed bean, luego acceda a la propiedad &#8220;usuario&#8221; de éste, y por ultimo acceda  la propiedad nombre desde allí (todo mediante los getters, ej: getUsuario). Así de fácil, prácticamente igual que acceder a una propiedad simple.</p>
<p>En el caso de que en vez de mostrar esta propiedad mediante, por ejemplo, un <em>&lt;h:ouputText /&gt;</em>, queramos modificarla con un <em>&lt;h:inputText /&gt;</em>, la forma de utilizar EL será la misma, simplemente lo colocaremos en el atributo <em>value </em>del <em>tag</em>. La diferencia radica en que <strong>JSF </strong>buscará un setter aparte del getter, a la hora de acceder a la propiedad (el getter en el momento de renderizar y el setter al hacer submit.)</p>
<p>Accediendo a colecciones</p>
<p>Acceder a colecciones utilizando EL es muy sencillo y utiliza la misma notación para varios tipos de colecciones, veamos un ejemplo:<br />
<code><br />
#{managedBean.coleccion[index]}</code></p>
<p>ó</p>
<p><code>#{managedBean.coleccion[key]}</code></p>
<p>Esto funciona con:</p>
<p><strong>Array</strong>: <em>unArray[index]</em></p>
<p><strong>List</strong>: <em>unaLista.get(index)</em> ó <em>unaLista.add(index, valor)</em></p>
<p><strong>Map</strong>: <em>unMapa.get(key)</em> ó <em>unMapa.put(key, valor)</em></p>
<p>En el caso de los HashMap, una forma equivalente puede ser:</p>
<p><code>#{unHashMap.key}</code></p>
<p>Como pueden ver, la forma en que EL accede a las colecciones es muy fácil e intuitiva, como ya veníamos viendo.</p>
<p>El Expression Language de JSF tiene también variables predefinidas (objetos implícitos) al igual que JSP (son casi los mismos), pueden leer un poco más sobre eso <a title="JSF Implicit Objects" href="http://one-size-doesnt-fit-all.blogspot.com/2007/03/some-explicit-language-about-implicit.html" target="_blank">siguiendo este link</a>, y sobre el mismo tema pero en JSP (para ver que objetos existen) <a title="JSP Implicit Objects" href="http://www.exforsys.com/tutorials/jsp/jsp-implicit-and-session-objects.html" target="_blank">siguiendo este otro</a>. Ambas páginas en inglés.</p>
<p>Operadores de EL</p>
<p>En caso de que sea necesario hacer comparaciones para tomar alguna decisión de renderizado, pueden utilizarse operadores en EL:</p>
<p><strong>Aritméticos</strong>: <em>+ &#8211; * / div % mod</em><br />
<strong>Relacionales</strong>: <em>== eq != ne &lt; lt &gt; gt &lt;= le &gt;= ge</em><br />
<strong>Lógicos</strong>: <em>&amp;&amp; and || or ! Not</em><br />
<strong>Empty</strong>: <em>empty es True para null, empty string, empty array, empty list, empty map. False en otro caso.</em></p>
<p>Puede utilizarse evaluacíon condicional de la forma #{test  ? exp1 : exp2}, pero en estos casos generalmente es más recomendable recurrir a JSTL, que es más completo y funciona mejor.</p>
<p>Espero que les haya sido de utilidad esta entrega del Tutorial de JSF, que a pesar de las demoras entre artículo y artículo, seguiré publicando en la medida que pueda. No olviden dejar sus comentarios y dudas, me animan a seguir escribiendo!</p>
]]></content:encoded>
			<wfw:commentRss>http://desarrollandoideas.com.ar/2008/08/14/jsf-expression-language-el/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Navegación de Páginas en JSF</title>
		<link>http://desarrollandoideas.com.ar/2008/07/08/navegacion-de-paginas-en-jsf/</link>
		<comments>http://desarrollandoideas.com.ar/2008/07/08/navegacion-de-paginas-en-jsf/#comments</comments>
		<pubDate>Tue, 08 Jul 2008 17:01:50 +0000</pubDate>
		<dc:creator>Paul M Dorr</dc:creator>
				<category><![CDATA[Desarrollo Web]]></category>
		<category><![CDATA[JSF]]></category>
		<category><![CDATA[Tutoriales]]></category>

		<guid isPermaLink="false">http://brilliantideasstock.com.ar/?p=13</guid>
		<description><![CDATA[En esta segunda entrega del tutorial de JSF (que espero no seguir postergando), podría hablar de configuración e inicio de un proyecto con JSF, pero dado que el tema es fácil de encontrar y además me resulta bastante aburrido, comenzaré directamente desde lo básico de navegación, dado por sentado que tienen configurado un entorno. Pueden [...]]]></description>
			<content:encoded><![CDATA[<p>En esta segunda entrega del tutorial de JSF (que espero no seguir postergando), podría hablar de configuración e inicio de un proyecto con JSF, pero dado que el tema es fácil de encontrar y además me resulta bastante aburrido, comenzaré directamente desde lo básico de navegación, dado por sentado que tienen configurado un entorno. Pueden bajarse una estructura de proyecto en blanco <a href="http://www.coreservlets.com/JSF-Tutorial/code/jsf-blank-Sun-RI.zip">desde acá</a>. Comencemos!</p>
<p>Flujo de control de navegación simplificado</p>
<ul>
<li>Se muestra un form</li>
<li>El form se hace submit a sí mismo</li>
<li>Se instancia el bean</li>
<li>Se llama al método de la acción</li>
<li>El método de la acción retorna una condición</li>
<li>Se muestra una pantalla de resultado</li>
</ul>
<p>Para poder desarrollar esta parte del tutorial, vamos a necesitar:</p>
<ul>
<li>Mapeos en el archivo faces-config.xml</li>
<li>Un form</li>
<li>Un managed bean</li>
</ul>
<p><span id="more-13"></span></p>
<p>Vayamos paso por paso, primero:</p>
<p><strong></p>
<p>Los mapeos</p>
<p></strong></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
</pre></td><td class="code"><pre class="xml" style="font-family:monospace;">...
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;faces-config<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;managed-bean<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;managed-bean-name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>loginBean<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/managed-bean-name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;managed-bean-class<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>com.ejemplo.login.LoginBean<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/managed-bean-class<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;managed-bean-scope<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>session<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/managed-bean-scope<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/managed-bean<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;navigation-rule<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;display-name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>Login page<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/display-name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;from-view-id<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>/public/login/login.jsp<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/from-view-id<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;navigation-case<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
   <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;from-outcome<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>success<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/from-outcome<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
   <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;to-view-id<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>/public/login/loggedin.jsp<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/to-view-id<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
   <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;redirect</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/navigation-case<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;navigation-case<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
   <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;from-outcome<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>failure<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/from-outcome<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
   <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;to-view-id<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>/public/login/loginerror.jsp<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/to-view-id<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
   <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;redirect</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/navigation-case<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/navigation-rule<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 ...
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/faces-config<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></td></tr></table></div>

<p>Con este archivo de configuración hemos hecho dos cosas:<br />
Declarar el managed bean como de sesión, para que mantenga su estado entre llamadas, y además Indicar reglas de navegación para que al recibir un String desde el login.jsp, jsf pueda determinar que camino tomar, en nuestro caso:</p>
<ul>
<li>&#8220;success&#8221;: redirecciona a loggedin.jsp</li>
<li>&#8220;failure&#8221;: redirecciona a loginerror.jsp</li>
</ul>
<p>Ya veremos luego como hacer que lleguen estos strings a JSF para que pueda decidir, es más facil de lo que pueden llegar a imaginarse, pero por ahora pasemos a&#8230;</p>
<p><strong></p>
<p>El form</p>
<p></strong></p>
<p>El form es la parte del sistema mediante la cual el usuario se comunicará con el managed bean, y el código para crearlo sería más o menos como el que sigue:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
</pre></td><td class="code"><pre class="html4strict" style="font-family:monospace;"><span style="color: #009900;">&lt;h:form <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;loginForm&quot;</span>&gt;</span>
    <span style="color: #009900;">&lt;h:outputLabel <span style="color: #000066;">value</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;Usuario&quot;</span> <span style="color: #66cc66;">/</span>&gt;</span>
    <span style="color: #009900;">&lt;h:inputText <span style="color: #000066;">value</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;#{loginBean.userName}&quot;</span></span>
<span style="color: #009900;">        <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;usernameInput&quot;</span> <span style="color: #000066;">size</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;20&quot;</span> <span style="color: #000066;">tabindex</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;1&quot;</span>&gt;</span>
    <span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span>h:inputText&gt;</span>
&nbsp;
    <span style="color: #009900;">&lt;h:outputLabel <span style="color: #000066;">value</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;Contraseña&quot;</span> <span style="color: #66cc66;">/</span>&gt;</span>
    <span style="color: #009900;">&lt;h:inputSecret <span style="color: #000066;">value</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;#{loginBean.password}&quot;</span></span>
<span style="color: #009900;">	<span style="color: #000066;">id</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;loginPasswordInput&quot;</span> <span style="color: #000066;">size</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;20&quot;</span> <span style="color: #000066;">tabindex</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;2&quot;</span>&gt;</span>
    <span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span>h:inputSecret&gt;</span>
&nbsp;
    <span style="color: #009900;">&lt;h:commandButton <span style="color: #000066;">value</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;Entrar&quot;</span> <span style="color: #000066;">action</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;#{loginBean.logged}&quot;</span> <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;login&quot;</span> <span style="color: #66cc66;">/</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span>h:form&gt;</span></pre></td></tr></table></div>

<p>Vamos a destriparlo un poco para ver si se entiende mejor. Descartemos en principio las partes menos importantes, los atributos <em>size</em> y <em>tabindex</em>, y los tag no son realmente necesarios para el ejemplo, pero los coloqué igual para que quedara un poco mejor presentado el form. Considerando que los <em>h:outputLabel</em> sólo muestran las etiquetas de las cajas de texto, sólo nos quedan los inputs y el button, que son lo que importa.</p>
<p>Veamos los inputs, de a uno:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code"><pre class="html4strict" style="font-family:monospace;"><span style="color: #009900;">&lt;h:inputText <span style="color: #000066;">value</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;#{loginBean.userName}&quot;</span></span>
<span style="color: #009900;">    <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;usernameInput&quot;</span> <span style="color: #000066;">size</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;20&quot;</span> <span style="color: #000066;">tabindex</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;1&quot;</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span>h:inputText&gt;</span></pre></td></tr></table></div>

<p>Este tag es sencillo, genera un Input HTML del tipo &#8220;text&#8221;, y se conecta al atributo userName de nuestro managed bean (el cual aún no hemos codificado) mediante el <em>value=&#8221;#{loginBean.userName}&#8221;</em>, utilizando el nombre que declaramos para el bean en el faces-config.xml (<em>loginBean</em>, con minúscula al comienzo). Ahora ya empezamos a ver cosas &#8220;raras&#8221; como <em>#{loginBean.userName}</em>, y quizás tenga que explicar un poco más de que se trata. Si bien podría estar largo rato explayandome sobre este tema, me parece más correcto resumirlo sólo para saber para que lo utilizaremos. Cuando necesitemos acceder a atributos o métodos de los managed beans, usaremos algo llamado Expression Language (EL), implementado inicialmente por JSP en la forma <em>${bean.atributo}</em> y luego modificado para JSF, con ciertas mejoras y un ligero cambio en su sintaxis: <em>#{bean.atributo}</em>; sí, sólo cambia el &#8220;$&#8221; por el &#8220;#&#8221;. Como podrán darse cuenta, este método de acceso a los atributos y métodos del managed bean puede simplificarnos mucho la vida <img src='http://desarrollandoideas.com.ar/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> .</p>
<p>Ahora vamos con el de la contraseña:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code"><pre class="html4strict" style="font-family:monospace;"><span style="color: #009900;">&lt;h:inputSecret <span style="color: #000066;">value</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;#{loginBean.password}&quot;</span></span>
<span style="color: #009900;">    <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;loginPasswordInput&quot;</span> <span style="color: #000066;">size</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;20&quot;</span> <span style="color: #000066;">tabindex</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;2&quot;</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span>h:inputSecret&gt;</span></pre></td></tr></table></div>

<p>¿Qué tiene de diferente este con el anterior? Bien, sólo que en vez de renderizarse como un Input tipo &#8220;text&#8221; HTML, lo hace como uno del tipo &#8220;password&#8221; así se enmascara el texto escrito en él. Simple, ¿No?</p>
<p>Ahora pasamos al button, que también es muy facil de entender.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="html4strict" style="font-family:monospace;"><span style="color: #009900;">&lt;h:commandButton <span style="color: #000066;">value</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;Entrar&quot;</span> <span style="color: #000066;">action</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;#{loginBean.logged}&quot;</span> <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;login&quot;</span> <span style="color: #66cc66;">/</span>&gt;</span></pre></td></tr></table></div>

<p>En este caso, <em>value</em> es el texto que se muestra en el botón, mientras que el atributo <em>action=&#8221;#{loginBean.logged}&#8221;</em> le está indicando al form que llame al método <em>logged</em> del managed bean <em>loginBean</em>. Ahora, dependiendo del String que devuelva este bean, jsf elegirá uno u otro camino, como configuramos antes en el faces-config. Por lo tanto, es hora de que pasemos a ver</p>
<p><strong></p>
<p>El managed bean</p>
<p></strong></p>
<p>El managed bean es el que se encarga de manejar la lógica de nuestra página jsp, además de ser también quien contiene los atributos (cadenas, valores, listas, etc) que serán accedidos desde la pantalla tanto para mostrarlos al usuario, como para almacenarlos en memoria. Codifiquemos ahora un managed bean muy simple para nuestro ejemplo:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
</pre></td><td class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> LoginBean <span style="color: #009900;">&#123;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #003399;">String</span> userName<span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #003399;">String</span> password<span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399;">String</span> logged<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
        <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>checkPassword<span style="color: #009900;">&#40;</span>userName, password<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
            <span style="color: #000000; font-weight: bold;">return</span> <span style="color: #0000ff;">&quot;success&quot;</span><span style="color: #339933;">;</span>
        <span style="color: #000000; font-weight: bold;">else</span>
            <span style="color: #000000; font-weight: bold;">return</span> <span style="color: #0000ff;">&quot;failure&quot;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> setUserName<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> userName<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">userName</span> <span style="color: #339933;">=</span> userName<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399;">String</span> getUserName<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">return</span> userName<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> setPassword<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> password<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">password</span> <span style="color: #339933;">=</span> password<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399;">String</span> getPassword<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">return</span> password<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>En este managed bean simplemente tenemos un método llamado <em>logged</em>, además de los atributos <em>userName</em> y <em>password</em> con sus respectivos get/set, de modo que podamos acceder a ellos desde la interfaz. El método del ejemplo es bastante sencillo, sólo &#8220;chequea&#8221; el nombre de usuario y la contraseña (usando el método checkPassword, el cual no es necesario implementar para este tutorial), devolviendo luego un String que será el que le indique a JSF que camino tomar según lo especificado por nosotros en el faces-config.xml. Por lo tanto si el nombre de usuario es válido se redigirá a la página <em>logged.jsp</em>, mientras que en caso de no serlo será redirigido a <em>loginerror.jsp</em>.</p>
<p>Creo que esto será todo por ahora. La idea de este tutorial es ser lo más simple y conciso posible, pero cualquier duda que tengan o si necesitan que sea más extenso en ciertos temas, no duden en decirlo en los comentarios. Ya veremos que nos depara la próxima entrega de este tutorial (esperemos que no se demore tanto como esta).</p>
]]></content:encoded>
			<wfw:commentRss>http://desarrollandoideas.com.ar/2008/07/08/navegacion-de-paginas-en-jsf/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>JSF validators y Modal Panel de Richfaces</title>
		<link>http://desarrollandoideas.com.ar/2008/05/27/jsf-validators-y-modal-panel-de-richfaces/</link>
		<comments>http://desarrollandoideas.com.ar/2008/05/27/jsf-validators-y-modal-panel-de-richfaces/#comments</comments>
		<pubDate>Wed, 28 May 2008 02:59:24 +0000</pubDate>
		<dc:creator>Paul M Dorr</dc:creator>
				<category><![CDATA[Desarrollo Web]]></category>
		<category><![CDATA[JSF]]></category>
		<category><![CDATA[tips]]></category>

		<guid isPermaLink="false">http://brilliantideasstock.com.ar/?p=7</guid>
		<description><![CDATA[Esto es algo para gente que esté un poco avanzada ya con JSF, así que si no sabes nada&#8230; ¡mejor no leas!&#8230; Bueno está bien, echa un vistazo que te puede servir. La cosa es así: Cuando se usa un Modal Panel de Richfaces para mostrar un formulario de JSF, al ocurrir un error de [...]]]></description>
			<content:encoded><![CDATA[<p>Esto es algo para gente que esté un poco avanzada ya con <a title="JSF" href="http://java.sun.com/javaee/javaserverfaces/" target="_blank">JSF</a>, así que si no sabes nada&#8230; ¡mejor no leas!&#8230; Bueno está bien, echa un vistazo que te puede servir.</p>
<p>La cosa es así:</p>
<p>Cuando se usa un Modal Panel de Richfaces para mostrar un formulario de JSF, al ocurrir un error de validación, en vez de mostrarnos los mensajes que hayamos puesto, el Modal Panel (MP) se cierra sin más, lo cual no es ni de cerca el comportamiento que queremos. Si llegamos a abrir de nuevo el MP, podremos ver que los mensajes en realidad habían aparecido, pero al ocultarse el contenedor no pudimos verlos. Cuando pregunté a <a title="José Google" href="http://www.google.com" target="_blank">José Google</a> acerca de esto, me dió la siguiente respuesta:</p>
<p><a title="Permanent Link to Keep Rich-Faces modal panel open when form validation errors occur" rel="bookmark" href="http://www.martinahrer.at/blog/2008/03/05/keep-rich-faces-modal-panel-open-when-form-validation-errors-occur/">Keep Rich-Faces modal panel open when form validation errors occur</a></p>
<p>de la cual podemos extraer aún más soluciones al problema: <a title="JBoss wiki" href="http://wiki.jboss.org/wiki/ModalPanelValidation" target="_blank">una en la wiki de JBoss</a> y otra en <a title="JBoss Forums" href="http://www.jboss.com/index.html?module=bb&amp;op=viewtopic&amp;p=4061517" target="_blank">los foros de JBoss</a>, ambas bastante similares en su forma de resolverlo.</p>
<p>La idea de estas dos últimas soluciones se basa en crear una función de JavaScript que se fije si el form tiene errores, mientras que la primera realiza algo similar utilizando un método del managed bean para verificar esto, e insertando este valor (booleano) en un hidden input.</p>
<p>Ahora, con tantas vueltas que dan estos muchachos ¿No se preguntan ustedes si no existe una forma más sencilla de realizar esto? ¿No debería ser esta forma aparte de sencilla, rápida y lógica? Pues la respuesta es que existe, y es totalmente sencilla, rápida y lógica.</p>
<p><span id="more-9"></span></p>
<p>Luego de pelear un rato con la opción de la wiki (la segunda de las tres que puse antes), y de darme cuenta de que tenía un comportamiento algo errático, comprendí que la solución real estaba en <strong>usar un botón de a4j como submit del form que haga un reRender del mismo</strong>, y no toda esa parafernalia de <em>&#8220;un botón que llama a una función en JS que se fija si hay errores y entonces muestra mediante ajax el mensaje y sino le hace un hide al panel&#8221; . </em> Como podrán apreciar a continuación, la solución que ofrezco es mucho más sencilla y lógica que las que había encontrado, e incluso me parece mucho más correcta. A pesar de esto, para ser sincere no he probado de cambiar diversos factores, ya sea poner un form a4j o cambiar algo en otros fields, pero lo importante es el botón a4j y el reRender, esa es la solución real. Ahí les va el ejemplo:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
</pre></td><td class="code"><pre class="html4strict" style="font-family:monospace;"><span style="color: #009900;">&lt;h:form styleClass<span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;form&quot;</span> <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;loginForm&quot;</span>&gt;</span>
	<span style="color: #009900;">&lt;h:outputText <span style="color: #000066;">value</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;Nombre de usuario&quot;</span> styleClass<span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;username&quot;</span> <span style="color: #66cc66;">/</span>&gt;</span>
	<span style="color: #009900;">&lt;h:inputText <span style="color: #000066;">value</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;#{loginBean.userName}&quot;</span> required<span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;true&quot;</span> <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;usernameInput&quot;</span> <span style="color: #000066;">size</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;20&quot;</span> <span style="color: #66cc66;">/</span>&gt;</span>
        <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">br</span> <span style="color: #66cc66;">/</span>&gt;</span>
	<span style="color: #009900;">&lt;h:message <span style="color: #000066;">for</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;usernameInput&quot;</span> styleClass<span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;error&quot;</span> <span style="color: #66cc66;">/</span>&gt;&lt;<span style="color: #000000; font-weight: bold;">br</span> <span style="color: #66cc66;">/</span>&gt;</span>
&nbsp;
	<span style="color: #009900;">&lt;a4j:commandButton <span style="color: #000066;">value</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;Entrar al sistema&quot;</span></span>
<span style="color: #009900;">		reRender<span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;loginForm&quot;</span> <span style="color: #000066;">action</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;#{loginBean.logged}&quot;</span> styleClass<span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;loginbutton&quot;</span> <span style="color: #66cc66;">/</span>&gt;&lt;<span style="color: #000000; font-weight: bold;">br</span> <span style="color: #66cc66;">/</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span>h:form&gt;</span></pre></td></tr></table></div>

<p>Noten que el <em>a4j:commandButton</em> sólo hace reRender del form, con eso debería bastar para que el mismo muestre los mensajes de error en lugar de cerrarse sin más. El problema es que si agregamos un botón de &#8220;Cancelar&#8221;, al cerrarse el Modal Panel con mensajes de error mostrándose, éstos quedarán &#8220;abiertos&#8221; cuando mostremos el Modal Panel de nuevo. Si bien esto es fácil de solucionar, sería bueno que si alguien pasa por aquí deje su forma de hacerlo en un comentario, así participan del blog <img src='http://desarrollandoideas.com.ar/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> . En caso contrario lo estaré publicando en una próxima entrada. Espero haber sido de utilidad ¡Nos vemos!</p>
<p><strong><em>Geranio Bigotes</em></strong></p>
]]></content:encoded>
			<wfw:commentRss>http://desarrollandoideas.com.ar/2008/05/27/jsf-validators-y-modal-panel-de-richfaces/feed/</wfw:commentRss>
		<slash:comments>19</slash:comments>
		</item>
		<item>
		<title>Empezando con JSF (Java Server Faces)</title>
		<link>http://desarrollandoideas.com.ar/2008/05/25/empezando-con-jsf-java-server-faces/</link>
		<comments>http://desarrollandoideas.com.ar/2008/05/25/empezando-con-jsf-java-server-faces/#comments</comments>
		<pubDate>Sun, 25 May 2008 04:31:16 +0000</pubDate>
		<dc:creator>Paul M Dorr</dc:creator>
				<category><![CDATA[Desarrollo Web]]></category>
		<category><![CDATA[JSF]]></category>
		<category><![CDATA[Tutoriales]]></category>

		<guid isPermaLink="false">http://briliantideasstock.no-ip.org/blog/?p=4</guid>
		<description><![CDATA[En la medida que vaya teniendo tiempo y ganas, iré publicando posts que formarán parte de un &#8220;mini tutorial&#8221; de JSF. Si bien no soy quizás el más indicado para explicar al resto del universo el funcionamiento de este framework, podrán ver que no hay mucho contenido sobre el mismo en internet (y menos en [...]]]></description>
			<content:encoded><![CDATA[<p>En la medida que vaya teniendo tiempo y ganas, iré publicando posts que formarán parte de un &#8220;mini tutorial&#8221; de JSF. Si bien no soy quizás el más indicado para explicar al resto del universo el funcionamiento de este framework, podrán ver que no hay mucho contenido sobre el mismo en internet (y menos en español), de manera que intentaré llenar ese espacio con mi minúsculo granito de arena.</p>
<p>¡Let&#8217;s begin!</p>
<p><strong>¿Qué es JSF?</strong></p>
<p>JSF es un framework para aplicaciones J2EE que implementa el modelo MVC.</p>
<p><span id="more-6"></span></p>
<p><strong>Características</strong></p>
<ul>
<li>Es similar a Struts (un poco más facil de implementar)</li>
<li>Provee tags HTML propios para interfaces complejas</li>
<li>Posee sistema de validaciones intrínseco</li>
<li>Manejo de eventos de los tags</li>
<li>Acceso simplificado a propiedades de los beans</li>
<li>Conversión y validación de los campos de formularios</li>
<li>Configuración centralizada mediante archivos (XML)</li>
<li>Definición simple de controladores y beans (a diferencia de Struts)</li>
<li>Permite crear componentes de GUI personalizados</li>
</ul>
<p><strong>Desventajas</strong></p>
<ul>
<li>Poca documentación (aquí es donde pondré mi granito de arena)</li>
<li>Los validadores no son tan completos como en Struts. Esto se puede solucionar fácilmente con validadores propios (JSF da una forma bastante intuitiva de crearlos) o si no gustas de trabajar tanto, podrías usar los validadores de MyFaces.</li>
<li>No tiene validación del lado del cliente. Esto se puede remediar usando el framework Shale, pero pienso que, a menos que necesites hacer una validación en la que realmente se note la diferencia al hacerse en el servidor y no en el cliente, no necesitarás más de lo que JSF ofrece.</li>
<li>No soporta GET, lo cual da cierta seguridad, pero quita flexibilidad y en algunos casos &#8220;direccionabilidad&#8221;, lo cual puede ser muy molesto.</li>
</ul>
<p>Como habrán podido apreciar en esta breve descripción de características y desventajas de JSF, la idea es básicamente ser una opción a Struts, pero más flexible (en algunos aspectos) y con interesantes opciones que ésta no ofrece. Yo he trabajado con ambos frameworks y, más allá de ciertos dolores de cabeza que me ha dado (y quizás aún lo siga haciendo) elijo JSF antes que Struts. Si estás realizando algún proyecto web con Struts, lo recomendable es seguirlo con ese framework; pero si estás a punto de empezar con uno y aún no te decides, la opción es JSF, por lo menos desde mi humilde punto de vista.</p>
<p>Bien, espero que a alguien le sirva esto si está a punto de comenzar con JSF. No dejen de pasar por aqui en los próximos días, ya que empezaré con las &#8220;clases&#8221; en serio: Cómo instalar y configurar JSF.</p>
<p>Hasta la próxima!</p>
]]></content:encoded>
			<wfw:commentRss>http://desarrollandoideas.com.ar/2008/05/25/empezando-con-jsf-java-server-faces/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

