<?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/"
	>

<channel>
	<title>Trinidad y Tobago</title>
	<atom:link href="http://trinidadytobago.org/feed" rel="self" type="application/rss+xml" />
	<link>http://trinidadytobago.org</link>
	<description></description>
	<pubDate>Mon, 02 Feb 2009 22:36:40 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.7.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Ciclo de vida en peticiones JSF</title>
		<link>http://trinidadytobago.org/archives/46</link>
		<comments>http://trinidadytobago.org/archives/46#comments</comments>
		<pubDate>Sun, 01 Feb 2009 13:00:44 +0000</pubDate>
		<dc:creator>ueshiba</dc:creator>
		
		<category><![CDATA[Desarrollo]]></category>

		<category><![CDATA[Java ServerFaces]]></category>

		<guid isPermaLink="false">http://r18714.ovh.net/~trinidad/?p=46</guid>
		<description><![CDATA[Antes de redactar artículos explicando como interactuar con ciertos componentes o como realizar diversas tareas, quería hablar un poco de algo que hay que tener muy en cuenta a la hora de desarrollar una aplicación usando JSF.  El ciclo de vida de una petición JSF, son los diferentes caminos por donde irá pasando la [...]]]></description>
			<content:encoded><![CDATA[<p>Antes de redactar artículos explicando como interactuar con ciertos componentes o como realizar diversas tareas, quería hablar un poco de algo que hay que tener muy en cuenta a la hora de desarrollar una aplicación usando <strong>JSF</strong>.  El ciclo de vida de una petición <strong>JSF</strong>, son los diferentes caminos por donde irá pasando la petición realizada. Dependiendo de ciertos factores, este ciclo puede ser interrumpido o modificado. A continuación voy a explicar, a mi modo de ver lo que representa cada fase. Tambien conoceremos el funcionamiento de una propiedad que en ciertas ocasiones puede volvernos loco, como es la propiedad <strong>inmediate.</strong></p>
<p><span id="more-46"></span></p>
<h3>Fase 1: Restore View</h3>
<p>Es esta primera fase se empieza a construir el árbol de componentes, llama al objeto <strong><code>UIViewRoot </code></strong>contenido en el FacesContext, del cual se obtendrá la información referente a la página.  En esta fase el objeto <strong><code>UIViewRoot</code></strong>se puede encontrar en tres estados diferentes:</p>
<p><strong>New View</strong>: Construye un nuevo <strong><code>UIViewRoot</code></strong> y asocia los eventos y validadores a los componentes (Se hace una petición).</p>
<p><strong>Initial View: </strong>Avanza directamente a la Fase 6. Esta vista se realiza cuando se carga la página por primera vez.</p>
<p><strong>PostBack View</strong>:  Cuando se vuelve atrás, se recupera la vista que esta guardada en el <strong><code>FacesContext</code></strong>.</p>
<h3>Fase 2: Apply Request Values</h3>
<p>En esta fase se asocian los valores que se encuentran en la petición a los componentes. Se comprueba el valor de la propiedad <strong><code>INMEDIATE</code></strong> que tienen los componentes. Esta propiedad sirve para capturar eventos y validaciones en esta fase del ciclo.  El valor de la propiedad Inmediate es un Booleano:</p>
<p><strong>False:</strong> Los valores simplemente se convierten, es decir, si para un campo se esperaba un entero se convierte el valor recogido a entero.Si se produce un error se guarda en el <strong><code>FacesContext</code></strong> y lo mostrará durante la Fase 6. </p>
<p><strong>True:</strong> Le componentos valores se convierten y se validan. Si hay eventos asociados a eses se capturan también. Igual que anteriormente si se produce un error se mostrará en la Fase 6. Cuando captures el evento para estos casos, podemos obligar a que directamente pase a la Fase 6 y validamos/convertimos solo pequeñas partes de la página si se producen eventos.<br />
 </p>
<h3>Fase 3: Process Validations</h3>
<p>En esta fase se comprueban las reglas de validación que tienen asociadas los componentes. Si se produce algún fallo en la validación se corta el ciclo y se pasa directamente a la Fase 6. Los mensajes de error generados se guarda en el <strong><code>FacesContext</code></strong>.        </p>
<h3>Fase 4: Update Model Values</h3>
<p>En esta fase se actualizan el valor de las propiedades de los componentes en la clase Java. Se setean los valores de los componentes en el lado del servidor. Si no se validaron correctamente los componentes, obviamente los componentes del backing bean no se han actualizado.        </p>
<h3>Fase 5: Invoke Application</h3>
<p>Se capturan los envíos y peticiones que realiza el <strong><code>Form</code></strong>. Como los valores ya han sido convertidos, validados y aplicados a los componentes, se ejecuta la lógica de la página. Se controlarían en esta fase los eventos, la navegación entre páginas, etc.   <br />
     </p>
<h3>Fase 6: Render Response</h3>
<p>Se muestra el <strong><code>UIViewRoot</code></strong> con todos los componentes en el estado que tengan asignado. Esto se recupera a través del <strong><code>FacesContext</code></strong>.  Estas son las 6 fases por la que puede navegar la petición, si en cualquiera de ellas quisieramos pasar a la fase 6 directamente podríamos hacerlo mediante el metodo <strong><code>renderResponde()</code></strong> del <strong><code>FacesContext</code></strong>. Animo a crear un <strong><a href="http://trinidadytobago.org/ejemplo-interceptor-jsf/">interceptor</a></strong> e ir probando con la propiedad inmediate y/o <em>&#8220;cortocircuitar&#8221;</em> fases para poder entenderlo mucho mejor.  Como dije al principio del tema, esta explicado de la manera que yo lo he entendido, si alguien no está de acuerdo o quiere agregar más información, será bien recibida.</p>
]]></content:encoded>
			<wfw:commentRss>http://trinidadytobago.org/archives/46/feed</wfw:commentRss>
		</item>
		<item>
		<title>Proyecto SEAM+ADF en Eclipse</title>
		<link>http://trinidadytobago.org/archives/44</link>
		<comments>http://trinidadytobago.org/archives/44#comments</comments>
		<pubDate>Sun, 01 Feb 2009 13:00:12 +0000</pubDate>
		<dc:creator>ueshiba</dc:creator>
		
		<category><![CDATA[Desarrollo]]></category>

		<category><![CDATA[JBoss Seam]]></category>

		<guid isPermaLink="false">http://r18714.ovh.net/~trinidad/?p=44</guid>
		<description><![CDATA[En este documento vamos a mostrar como crear un nuevo proyecto en eclipse que haga uso de las tecnologías Hibernate, Seam, JSF y ADF. Las versiones de software utilizadas para este ejemplo son:  

adf-faces-10_1_3_0_4.zip
JBoss Seam 1.1 1.1.1 GA

El Framework Jboss Seam lo podemos descargar directamente de la página oficial:
http://www.jboss.com/products/seam


En el paquete que nos descargaremos encontraremos las [...]]]></description>
			<content:encoded><![CDATA[<p>En este documento vamos a mostrar como crear un nuevo proyecto en eclipse que haga uso de las tecnologías Hibernate, Seam, JSF y ADF. Las versiones de software utilizadas para este ejemplo son:  </p>
<ul>
<li><strong>adf-faces-10_1_3_0_4.zip</strong></li>
<li><strong>JBoss Seam 1.1 1.1.1 GA</strong></li>
</ul>
<p>El Framework Jboss Seam lo podemos descargar directamente de la página oficial:<br />
<a href="http://www.jboss.com/products/seam">http://www.jboss.com/products/seam<br />
</a></p>
<p><span id="more-44"></span></p>
<p>En el paquete que nos descargaremos encontraremos las librerías necesarias, además de documentación y algunos ejemplos para que podamos ver el potencial del Framework. Entre las librerías que contiene, podemos encontrar las librerías de Hibernate y JSF, por tanto no será necesario que nos las bajemos nuevamente. Es conveniente estar al tanto de las actualizaciones que se hacen del Framework, pues corrigen muchos bugs y añaden nuevas funciones. Además si en algún momento exponemos alguna duda en los foros de Jboss, se nos exigirá estar utilizando la última versión disponible. Para descargar ADF debemos dirigirnos a la pagina Web de Oracle y descargarnos el paquete de librerías y ejemplos.</p>
<p><a>http://www.oracle.com/technology/products/jdev/ htdocs/partners/addins/exchange/jsf/index.html</a></p>
<p>En el paquete que actualmente hay para descargar (versión adf-faces-10_1_3_0_4.zip) hay un pequeño error. En la carpeta lib no aparece una librería que es necesaria para usar ADF. El nombre de esta librería es: adf-share.jar Abrimos Eclipse y procedemos a la creación de un nuevo proyecto. Añadimos a la carpeta lib las librerías necesarias.</p>
<p>Una vez que ya tenemos insertadas las librerías, lo único que nos quedaría por hacer es configurar el proyecto. Creamos un fichero vacio llamado seam.properties en el directorio raíz directorio src. En WEB-INF/ debemos crear 2 ficheros de configuración:  </p>
<p>1. <strong><code>faces-config.xml</code></strong>: información referente al render-kit y el listener de Seam para los componentes.</p>
<p><code>&lt;faces-config&gt;<br />
    &lt;!-- Select one of the standard transaction models for the Seam application --&gt;<br />
    &lt;lifecycle&gt;<br />
        &lt;phase-listener&gt;<br />
        org.jboss.seam.jsf.SeamPhaseListener<br />
        &lt;/phase-listener&gt;<br />
    &lt;/lifecycle&gt;<br />
    &lt;application&gt;<br />
        &lt;default-render-kit-id&gt;oracle.adf.core&lt;/default-render-kit-id&gt;<br />
    &lt;/application&gt;<br />
&lt;/faces-config&gt;</code></p>
<p>2. <strong>adf-faces-config.xml</strong>: información referente al skin que usaremos en los componentes ADF</p>
<p><code>&lt;adf-faces-config xmlns="http://xmlns.oracle.com/adf/view/faces/config"&gt;<br />
    &lt;debug-output&gt;true&lt;/debug-output&gt;<br />
        &lt;!--client-validation-disabled&gt;true&lt;/client-validation-disabled--&gt;<br />
        &lt;accessibility-mode&gt;<br />
        #{prefs.proxy.accessibilityMode}<br />
        &lt;/accessibility-mode&gt;<br />
        &lt;!-- you can use EL to get the skin. This allows the skin to change between requests. --&gt;<br />
        &lt;skin-family&gt;#{prefs.proxy.skinFamily}&lt;/skin-family&gt;<br />
        &lt;!--skin-family&gt;oracle&lt;/skin-family--&gt;&lt;!-- Uncomment any of these to enable them --&gt;<br />
        &lt;!-- accessibility-mode&gt;inaccessible&lt;/accessibility-mode --&gt;<br />
        &lt;!-- A silly use of EL: English users get Simple Skin, others get Oracle Skin --&gt;<br />
       &lt;!-- &lt;skin-family&gt;#{facesContext.viewRoot.locale.language=='en' ? 'simple' : 'oracle'}&lt;/skin-family --&gt;<br />
    &lt;!-- oracle-help-servlet-url&gt;<br />
        http://helponline.oracle.com/jdeveloper/help/<br />
        &lt;/oracle-help-servlet-url --&gt;<br />
&lt;/adf-faces-config&gt;</code></p>
<p>Lo último que nos quedaría por hacer sería configurar en el fichero web.xml, los servlets de Seam, JSF y ADF para que mapeen nuestros ficheros JSP.</p>
<p><code>&lt;web-app version="2.4" 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 http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"&gt;<br />
    &lt;context-param&gt;<br />
        &lt;param-name&gt;javax.faces.DEFAULT_SUFFIX&lt;/param-name&gt;<br />
        &lt;param-value&gt;.jsp&lt;/param-value&gt;<br />
    &lt;/context-param&gt;<br />
    &lt;context-param&gt;<br />
        &lt;param-name&gt;facelets.REFRESH_PERIOD&lt;/param-name&gt;<br />
        &lt;param-value&gt;2&lt;/param-value&gt;<br />
    &lt;/context-param&gt;<br />
    &lt;context-param&gt;<br />
        &lt;param-name&gt;facelets.DEVELOPMENT&lt;/param-name&gt;<br />
        &lt;param-value&gt;true&lt;/param-value&gt;<br />
    &lt;/context-param&gt;<br />
    &lt;context-param&gt;<br />
        &lt;param-name&gt;javax.faces.STATE_SAVING_METHOD&lt;/param-name&gt;<br />
        &lt;param-value&gt;client&lt;/param-value&gt;<br />
    &lt;/context-param&gt;<br />
    &lt;context-param&gt;<br />
        &lt;param-name&gt;com.sun.faces.validateXml&lt;/param-name&gt;<br />
        &lt;param-value&gt;true&lt;/param-value&gt;<br />
    &lt;/context-param&gt;<br />
    &lt;context-param&gt;<br />
        &lt;param-name&gt;com.sun.faces.verifyObjects&lt;/param-name&gt;<br />
        &lt;param-value&gt;true&lt;/param-value&gt;<br />
    &lt;/context-param&gt;<br />
    &lt;context-param&gt;<br />
        &lt;param-name&gt;<br />
            oracle.adf.view.faces.ALTERNATE_VIEW_HANDLER<br />
        &lt;/param-name&gt;<br />
        &lt;param-value&gt;com.sun.facelets.FaceletViewHandler&lt;/param-value&gt;<br />
    &lt;/context-param&gt;<br />
    &lt;!-- Seam --&gt;<br />
    &lt;listener&gt;<br />
        &lt;listener-class&gt;<br />
            org.jboss.seam.servlet.SeamListener<br />
        &lt;/listener-class&gt;<br />
    &lt;/listener&gt;<br />
    &lt;!-- MyFaces --&gt;<br />
    &lt;listener&gt;<br />
        &lt;listener-class&gt;<br />
            org.apache.myfaces.webapp.StartupServletContextListener<br />
        &lt;/listener-class&gt;<br />
    &lt;/listener&gt;<br />
    &lt;servlet&gt;<br />
        &lt;servlet-name&gt;Faces Servlet&lt;/servlet-name&gt;<br />
        &lt;servlet-class&gt;javax.faces.webapp.FacesServlet&lt;/servlet-class&gt;<br />
        &lt;load-on-startup&gt;1&lt;/load-on-startup&gt;<br />
    &lt;/servlet&gt;<br />
    &lt;!-- resource loader servlet --&gt;<br />
    &lt;servlet&gt;<br />
        &lt;servlet-name&gt;resources&lt;/servlet-name&gt;<br />
        &lt;servlet-class&gt;<br />
            oracle.adf.view.faces.webapp.ResourceServlet<br />
        &lt;/servlet-class&gt;<br />
    &lt;/servlet&gt;<br />
    &lt;servlet-mapping&gt;<br />
        &lt;servlet-name&gt;Faces Servlet&lt;/servlet-name&gt;<br />
        &lt;url-pattern&gt;*.jsp&lt;/url-pattern&gt;<br />
    &lt;/servlet-mapping&gt;<br />
    &lt;servlet-mapping&gt;<br />
        &lt;servlet-name&gt;resources&lt;/servlet-name&gt;<br />
        &lt;url-pattern&gt;/adf/*&lt;/url-pattern&gt;<br />
    &lt;/servlet-mapping&gt;<br />
    &lt;!-- Faces Servlet Mapping --&gt;<br />
    &lt;servlet-mapping&gt;<br />
        &lt;servlet-name&gt;Faces Servlet&lt;/servlet-name&gt;<br />
        &lt;url-pattern&gt;*.seam&lt;/url-pattern&gt;<br />
    &lt;/servlet-mapping&gt;<br />
    &lt;filter&gt;<br />
        &lt;filter-name&gt;adfFaces&lt;/filter-name&gt;<br />
        &lt;filter-class&gt;<br />
            oracle.adf.view.faces.webapp.AdfFacesFilter<br />
        &lt;/filter-class&gt;<br />
    &lt;/filter&gt;<br />
    &lt;filter-mapping&gt;<br />
        &lt;filter-name&gt;adfFaces&lt;/filter-name&gt;<br />
        &lt;servlet-name&gt;Faces Servlet&lt;/servlet-name&gt;<br />
    &lt;/filter-mapping&gt;<br />
    &lt;welcome-file-list&gt;<br />
        &lt;welcome-file&gt;index.html&lt;/welcome-file&gt;<br />
    &lt;/welcome-file-list&gt;<br />
&lt;/web-app&gt;</code></p>
<p>Tras realizar todos estos pasos, ya estariamos preparados para comenzar nuestro nuevo proyecto web.</p>
]]></content:encoded>
			<wfw:commentRss>http://trinidadytobago.org/archives/44/feed</wfw:commentRss>
		</item>
		<item>
		<title>Navagación entre páginas JSF</title>
		<link>http://trinidadytobago.org/archives/42</link>
		<comments>http://trinidadytobago.org/archives/42#comments</comments>
		<pubDate>Sun, 01 Feb 2009 12:59:14 +0000</pubDate>
		<dc:creator>ueshiba</dc:creator>
		
		<category><![CDATA[Desarrollo]]></category>

		<category><![CDATA[Java ServerFaces]]></category>

		<guid isPermaLink="false">http://r18714.ovh.net/~trinidad/?p=42</guid>
		<description><![CDATA[La navegación entre diferentes páginas se mapean en el fichero faces-config.xml, la forma de realizarla es del siguiente modo:
&#60;navigation-rule&#62;
    &#60;navigation-case&#62;
        &#60;from-outcome&#62;
            cadenaDeTexto
            &#60;to-view-id&#62;/ejemplo2.jspx
    &#60;/navigation-case&#62;
&#60;/navigation-rule&#62;

Si en algún componente le definimos un Action y en el metodo del bean le hacemos devolver una cadena. Este ira a buscar al faces-config si existe [...]]]></description>
			<content:encoded><![CDATA[<p>La navegación entre diferentes páginas se mapean en el fichero faces-config.xml, la forma de realizarla es del siguiente modo:</p>
<p><code>&lt;navigation-rule&gt;<br />
    &lt;navigation-case&gt;<br />
        &lt;from-outcome&gt;<br />
            cadenaDeTexto<br />
            &lt;to-view-id&gt;/ejemplo2.jspx<br />
    &lt;/navigation-case&gt;<br />
&lt;/navigation-rule&gt;</code></p>
<p><span id="more-42"></span></p>
<p>Si en algún componente le definimos un Action y en el metodo del bean le hacemos devolver una cadena. Este ira a buscar al <code>faces-config</code> si existe alguna regla de navegacion. Comparará la cadena que hemos devuelto con los from-outcome de los navigation-case.<br />
 <br />
Por tanto si en un metodo devolvemos como cadena : <em>&#8220;cadenaDeTexto&#8221;</em> nos redirigirá a la pagina ejemplo2.jspx.  Si lo que quisieramos fuera redirigir a un popup cambiaria la manera de definir la regla de navegación y quedaría de la siguiente manera:</p>
<p><code>&lt;navigation-rule&gt;<br />
    &lt;from-view-id&gt;<br />
        /ejemplo1.jspx<br />
        &lt;navigation-case&gt;<br />
            &lt;from-outcome&gt;<br />
                dialog:resumenPedido<br />
                &lt;to-view-id&gt;/ejemplo2.jspx<br />
        &lt;/navigation-case&gt;<br />
&lt;/navigation-rule&gt;</code></p>
<p>La cadena de texto que debemos devolver ahora sería <em>&#8220;dialog:resumenPedido&#8221;</em> y de esta manera la página se abriría similar a un popup modal.</p>
]]></content:encoded>
			<wfw:commentRss>http://trinidadytobago.org/archives/42/feed</wfw:commentRss>
		</item>
		<item>
		<title>Primera página con ADF</title>
		<link>http://trinidadytobago.org/archives/40</link>
		<comments>http://trinidadytobago.org/archives/40#comments</comments>
		<pubDate>Sun, 01 Feb 2009 12:58:34 +0000</pubDate>
		<dc:creator>ueshiba</dc:creator>
		
		<category><![CDATA[Desarrollo]]></category>

		<category><![CDATA[ADF]]></category>

		<guid isPermaLink="false">http://r18714.ovh.net/~trinidad/?p=40</guid>
		<description><![CDATA[Vamos a realizar una pagina con dos inputText y hacer una pantalla de logueo. Si se hace correcta ir a una segunda página y si no es válida sacar un mensaje por el FacesContext.


Para realizar este ejemplo simplemente tenemos que ir añadiendo los componentes en la página, colocarlos a nuestro gusto, y darle el comportamiento [...]]]></description>
			<content:encoded><![CDATA[<p>Vamos a realizar una pagina con dos <strong><code>inputText</code></strong> y hacer una pantalla de logueo. Si se hace correcta ir a una segunda página y si no es válida sacar un mensaje por el <strong><code>FacesContext</code>.<br />
</strong></p>
<p><span id="more-40"></span></p>
<p>Para realizar este ejemplo simplemente tenemos que ir añadiendo los componentes en la página, colocarlos a nuestro gusto, y darle el comportamiento deseado. Dependiendo del <strong>IDE</strong> que utilizemos para <strong>ADF</strong>, el código de estos componentes se nos generará solo, o tendremos que escribirlo nosotros mismos. Una buena idea al empezar sería descargar el <strong>IDE</strong> gratuito de <strong>Oracle</strong>, <strong>JDeveloper</strong>, e ir investigando el código que generan los componentes.</p>
<p>Vamos a usar un componente llamado <strong><code>CorePanelForm</code></strong> para englobar en el a los dos cuadros de texto y al boton de envio del formulario. Vamos a crear también un objeto <strong><code>CoreMessages</code></strong> para sacar por la ventana un mensaje de error si el usuario no se loguea correctamente. Por tanto en la clase java tendremos que añadir los siguientes elementos:<br />
 <br />
<code>private CoreMessages messages1;<br />
private CorePanelForm panelForm1;<br />
private CoreInputText inputText1;<br />
private CoreInputText inputText2;<br />
private CoreCommandButton commandButton1;</code></p>
<p>A estos objetos le añadiremos sus respectivos metodos <strong><code>get/set</code></strong>. Ahora lo que habría que hacer sería asociarle una acción al boton de envio del formulario, esto se puede hacer asociandole en la propiedad <em>&#8220;Action&#8221;</em> del boton el nombre del metodo mediante <strong>EL</strong>, y crearlo a mano en la clase java.</p>
<p>Un ejemplo de una accion que le prodríamos asociar al botón sería el siguiente:</p>
<p><code>public String enviarLogin(){<br />
    <br />
    if(getInputText1().getValue().equals("siglo") &amp;&amp;<br />
    getInputText2().getValue().equals("siglo"))<br />
    return "loginCorrecto";<br />
    <br />
    FacesContext.getCurrentInstance().addMessage(“Login Incorrecto”,<br />
    new FacesMessage(FacesMessage.SEVERITY_WARN,<br />
    "Login Incorrecto","Login Incorrecto"));<br />
    <br />
    return null;<br />
}</code></p>
<p>Devolvemos un null pero podríamos haber devuelto cualquier otra cadena, mientras no este en la regla de navegación del <strong><code>faces-config</code></strong> irá dirigida la petición contra la página actual.</p>
<p>Lo único que quedaría por hacer sería añadir en el <strong><code>faces-config</code></strong> la regla de navegación:</p>
<p><code>&lt;navigation-rule&gt;<br />
    &lt;navigation-case&gt;<br />
        &lt;from-outcome&gt;<br />
            loginCorrecto<br />
            &lt;to-view-id&gt;/ejemplo2.jspx<br />
    &lt;/navigation-case&gt;<br />
&lt;/navigation-rule&gt;</code></p>
<p>Ya estaría completado este ejemplo.</p>
]]></content:encoded>
			<wfw:commentRss>http://trinidadytobago.org/archives/40/feed</wfw:commentRss>
		</item>
		<item>
		<title>Crear componentes en ejecución</title>
		<link>http://trinidadytobago.org/archives/38</link>
		<comments>http://trinidadytobago.org/archives/38#comments</comments>
		<pubDate>Sun, 01 Feb 2009 12:56:38 +0000</pubDate>
		<dc:creator>ueshiba</dc:creator>
		
		<category><![CDATA[Desarrollo]]></category>

		<category><![CDATA[Java ServerFaces]]></category>

		<guid isPermaLink="false">http://r18714.ovh.net/~trinidad/?p=38</guid>
		<description><![CDATA[A veces, puede darse el caso, que queremos crear componentes diferentes según el estado de la página o según alguna acción que se ha ejecutado en la misma. Una solución para mostrar el componente deseado sería crear un switcher e ir rotando la visibilidad del componente deseado en cada momento, pero esto muchas veces puede [...]]]></description>
			<content:encoded><![CDATA[<p>A veces, puede darse el caso, que queremos crear componentes diferentes según el estado de la página o según alguna acción que se ha ejecutado en la misma. Una solución para mostrar el componente deseado sería crear un <strong>switcher</strong> e ir rotando la visibilidad del componente deseado en cada momento, pero esto muchas veces puede ser una técnica bastante limitada y a veces &#8220;engorrosa&#8221; de escribir el fichero <strong>jspx </strong>de nuestra página.</p>
<p><span id="more-38"></span></p>
<p>Una posibilidad bastante útil es la de crear el componente en tiempo de ejecución, así ahorraríamos codigo extra en el fichero <strong>jspx</strong> y además nos da mucho más control de lo que queremos mostrar en la página. Con esto quitaríamos un peso innecesario a la carga inicial de la página, pues sólo cargaremos los componentes cuando los necesitemos.</p>
<p>La manera de crear un componente sería así:</p>
<p>    <code>FacesContext.getCurrentInstance().getApplication().<br />
        createComponent(<strong>COMPONENTE.</strong>COMPONENT_TYPE);</code></p>
<p>Esta llamada nos daría como resultado un <strong>Object</strong> que debemos castear al componente deseado:</p>
<p>   <code>CoreInputText input = (CoreInputText)FacesContext.<br />
        getCurrentInstance().getApplication().<br />
        createComponent(CoreInputText.COMPONENT_TYPE);</code></p>
<p>Una vez que tenemos creado el componente, ya sólo nos quedaría darle los valores típicos de modo semejante a como lo hacemos en el <strong>jspx</strong>:</p>
<p>  <code> input.setId("id1");<br />
    input.setLabel("Etiqueta");</code></p>
<p>Del mismo modo que podemos crear componentes, podemos crear también validadores o converters en tiempo de ejecución, lo único que cambiaría es que en vez pasar como parametro la constante <strong>COMPONENT_TYPE</strong> pasaríamos otra constante llamada <strong>COMPONENT_FAMILY</strong>:</p>
<p><code>FacesContext.getCurrentInstance().getApplication().<br />
        createComponent(Validator.COMPONENT_FAMILY);</code></p>
<p>Habrá veces que además de crear el componente, querramos asociarle acciones al mismo, y nos haga falta asociarle a un <strong>action</strong> un <strong>MethodBinding</strong>, la manera de crearlo no es muy complicada simplemente tenemos que saber cual es el nombre asociado al <strong>backing_bean</strong> y que valores va a recibir como parámetro el método al que lo vamos a asociar. La forma de realizarlo es usando el siguiente método:</p>
<p><code>FacesContext.getCurrentInstance().getApplication().<br />
        createMethodBinding(<strong>String</strong>, <strong>Class[]</strong>);</code></p>
<p>Donde la cadena que recibe corresponde a la etiqueta<strong> EL</strong> que referencia al método que queremos llamar, es decir, <strong>&#8220;#{nombre_backing_bean.metodo}&#8221;</strong>, y como segundo parámetro recibe un array de las clases que va a recibir como parametros, como por ejemplo:</p>
<p><code>Class[] array = new Class[1];<br />
    array[0] = ValueChangeEvent.class;</code></p>
<p>Este <strong>MethodBinding</strong> que recibiremos lo tenemos que asociar al componente, mediante su correspondiente <strong>setter</strong>.</p>
<p>Cuando creamos componentes, aunque no es requerido, siempre es conveniente setearle un <strong>id</strong>, hay un método que se puede acceder a él a través del FacesContext, que nos generá un <strong>id </strong>único para ese componente en la página, pero en páginas donde usemos a la misma vez varios objetos <strong>UIViewRoot</strong> este método puede causarnos muchos problemas, más que ayudarnos. Esto ocurre porque ese método simplemente recorre la lista de componentes existentes para ese objeto viewRoot y le asigna un valor correlativo al último encontrado. Por tanto, lo mejor siempre será asignarle el id de una manera segura y única para todos los casos que se puedan dar en la página. El método es el siguiente:</p>
<p>   <code> FacesContext.getCurrentInstance().getViewRoot().<br />
        createUniqueId();</code></p>
<p>Una vez que ya sabemos como crear componentes, validadores, etc sólo nos queda mostrarlos en algún lugar de la página, pues los tenemos creados, pero no posicionados. La manera de insertarlo en algún lugar de la página es muy sencilla, sería accediendo al metodo <strong>getChildren()</strong> de algún componente que permita insertarle hijos, y añadir nuestro componente. La forma de hacerlo es siempre la misma:</p>
<p><code>getPanel().getChildren().add(input);</code></p>
]]></content:encoded>
			<wfw:commentRss>http://trinidadytobago.org/archives/38/feed</wfw:commentRss>
		</item>
		<item>
		<title>Validaciones, immediate true o false?</title>
		<link>http://trinidadytobago.org/archives/36</link>
		<comments>http://trinidadytobago.org/archives/36#comments</comments>
		<pubDate>Sun, 01 Feb 2009 12:47:58 +0000</pubDate>
		<dc:creator>ueshiba</dc:creator>
		
		<category><![CDATA[Desarrollo]]></category>

		<category><![CDATA[Java ServerFaces]]></category>

		<guid isPermaLink="false">http://r18714.ovh.net/~trinidad/?p=36</guid>
		<description><![CDATA[En este artículo vamos a validar un campo de texto con el framework ADF, y veremos que sentido tiene setearle un valor true o false a la propiedad immediate. 
Como ya comentamos en la página donde explicábamos las fases que se recorren durante el ciclo de vida, los diferentes valores que acepta la propiedad immediate serán [...]]]></description>
			<content:encoded><![CDATA[<p>En este artículo vamos a validar un campo de texto con el framework ADF, y veremos que sentido tiene setearle un valor true o false a la propiedad immediate. </p>
<p>Como ya comentamos en la página donde explicábamos las fases que se recorren durante el <a href="http://trinidadytobago.org/ciclo-de-vida-de-una-peticion-jsf/">ciclo de vida,</a> los diferentes valores que acepta la propiedad immediate serán <strong>true</strong> o <strong>false</strong> dependiendo de la fase donde queramos que se produzca la acción deseada. En el caso de las validaciones un valor u otro afecta a que tipo de validación se va a realizar, si de lado del servidor o de lado del cliente.</p>
<p><span id="more-36"></span></p>
<ul>
<li>   <strong>True: </strong>La validación en este caso se haría del lado del servidor, es decir, al setear la propiedad immediate a <strong>true</strong> hemos provocado que la validación se realize en la <strong>fase 2</strong> y por tanto una vez que se envían los datos, antes de setear la propiedad al componente, se comprobará que se cumple la regla establecida. Si dicha validación es incorrecta, se generá un mensaje de error que es enviado al FacesContext. Dicho mensaje se mostraría por pantalla al usuario mediante el componente <strong>Messages</strong>.</li>
</ul>
<ul>
<li><strong>   False: </strong>La validación se haría del lado del cliente, pues el componente ya tiene la propiedad seteada y la comprobación se realizaría en la <strong>fase 3</strong>, cuando se realice la validación los componentes ya tienen seteados los nuevos valores, y el aspecto de la validación cambia, ahora se realiza dicha validación mediante <strong>javascript</strong>.</li>
</ul>
<p>Hemos visto que la propiedad <strong>immediate </strong>modifica el comportamiento de los componentes según su valor, obliga a los componentes a validarse, convertirse y capturar sus eventos en unas fase u otra. Esto es algo a tener muy en cuenta pues si empezamos a setear el valor de esta propiedad de manera indiscriminada en la página podemos encontrarnos muchos quebraderos de cabeza que a simple vista no notaremos que son producidos por el valor de dicha propiedad. Normalmente, se usa el valor <strong>true </strong>para que los eventos, validaciones, etc los podamos capturar antes de que se les setee el valor a los componentes.</p>
<p>A continuación vamos a añadirle un validador a un campo de texto para ver el efecto de la propiedad immediate, si hacemos uso del primer ejemplo de <a href="http://trinidadytobago.org/nuestra-primera-pagina-con-adf/">login </a>que hicimos podemos añadirle al campo de texto del login un componente de tipo <strong>RegExpValidator</strong>, dependiendo del IDE que utilizemos, podemos arrastrar el componente dentro del <strong>inputText</strong> o bien añadimos las siguientes etiquetas al JSP:</p>
<p><code>&lt;af:inputText<br />
    label="Escriba aqui"<br />
    binding="#{condiciones.inputText1}"<br />
    id="inputText1"<br />
    autoSubmit="true"<br />
    immediate="false"&gt;<br />
    &lt;af:validateRegExp pattern="[a-z]*&#8221;<br />
     noMatchMessageDetail=&#8221;Validacion Erronea&#8221;/&gt;<br />
&lt;/af:inputText&gt;</code></p>
<p>Los objetos de tipo <strong>RegExpValidator</strong> tienen 3 propiedades que son : <strong>pattern, noMatchMessageDetail </strong>e <strong>id</strong>. En este ejemplo el patrón que le hemos puesto sirve para que solo acepte caracteres en minúscula. Si ejecutasemos la aplicación y metemos unos campos erroneos, aparecera el mensaje de error.</p>
<p>Como hemos comprobado si tenemos puesta la propiedad immediate a <strong>false</strong> la validación se realiza con javascript, si cambiamos el valor de la propiedad a <strong>true</strong> veremos como esta se realizá ahora en el lado del servidor, enviando un mensaje de error al FacesContext. Tenemos que asegurarnos que tenemos en el JSP insertado un componente de tipo <strong>Messages</strong>:</p>
<p><code>&lt;af:messages binding="#{condiciones.messages1}" id="messages1"/&gt;</code></p>
<p>Espero que os haya servido este tutorial para aprender no ya de los validadores, sino de los efectos que pueden causar en la aplicación los valores de esta propiedad. Podeís probar a validar muchos campos a la vez y ver que es lo que más conviene para cada formulario.</p>
]]></content:encoded>
			<wfw:commentRss>http://trinidadytobago.org/archives/36/feed</wfw:commentRss>
		</item>
		<item>
		<title>Componente ProcessTrain</title>
		<link>http://trinidadytobago.org/archives/34</link>
		<comments>http://trinidadytobago.org/archives/34#comments</comments>
		<pubDate>Sun, 01 Feb 2009 12:47:09 +0000</pubDate>
		<dc:creator>ueshiba</dc:creator>
		
		<category><![CDATA[Desarrollo]]></category>

		<category><![CDATA[ADF]]></category>

		<guid isPermaLink="false">http://r18714.ovh.net/~trinidad/?p=34</guid>
		<description><![CDATA[Este tutorial esta pensado para usuarios que tengan cierto conocimiento sobre el funcionamiento del framework ADF. Pues en este se usan terminos que no han sido explicados previamente y pueden resultar complejos para usuarios novatos.  
El componente processTrain es un componente ADF del tipo menú. Consiste en crear varias páginas JSF que están enlazadas entre sí. [...]]]></description>
			<content:encoded><![CDATA[<p>Este tutorial esta pensado para usuarios que tengan cierto conocimiento sobre el funcionamiento del framework ADF. Pues en este se usan terminos que no han sido explicados previamente y pueden resultar complejos para usuarios novatos.  </p>
<p>El componente processTrain es un componente ADF del tipo menú. Consiste en crear varias páginas JSF que están enlazadas entre sí. Este componente actualmente está en discusión entre los creadores de ADF, pues su lógica se realiza en el fichero de configuración faces-config.</p>
<p><span id="more-34"></span></p>
<p>Las clases que se necesitan realizar para que funcione el componente básicamente son dos. Una nombrada por ellos como MenuItem y otra TrainModelAdapter. Estas dos clases están hechas ya por oracle, simplemente definen algunas propiedades que tendremos que usar luego desde el faces-config a la hora de definir los managed-bean y desde las páginas JSF para algunos valores del componente.</p>
<p><code>Clase MenuItem.java:<br />
public class MenuItem {</p>
<p>private String _label;<br />
private String _outcome;<br />
private String _viewId;<br />
//extended security attributes<br />
private boolean _readOnly = false;<br />
private boolean _shown = true;<br />
public void setLabel(String label) {<br />
this._label = label;<br />
}<br />
public String getLabel() {<br />
return _label;<br />
}<br />
public void setOutcome(String outcome) {<br />
this._outcome = outcome;<br />
}<br />
public String getOutcome() {<br />
return _outcome;<br />
}<br />
public void setViewId(String viewId) {<br />
this._viewId = viewId;<br />
}<br />
public String getViewId() {<br />
return _viewId;<br />
}<br />
public void setReadOnly(boolean readOnly) {<br />
this._readOnly = readOnly;<br />
}<br />
public boolean isReadOnly() {<br />
return _readOnly;<br />
}<br />
public void setShown(boolean shown) {<br />
this._shown = shown;<br />
}<br />
public boolean isShown() {<br />
return _shown;<br />
}<br />
}<br />
Clase TrainModelAdapter.java:<br />
public class TrainModelAdapter implements Serializable {<br />
private String _propertyName = null;<br />
private Object _instance = null;<br />
private transient MenuModel _model = null;<br />
private Object _maxPathKey = null;</p>
<p>public MenuModel getModel() {<br />
if (_model == null){<br />
try {<br />
_model = new ProcessMenuModel(getInstance(),<br />
getViewIdProperty();<br />
getMaxPathKey());<br />
} catch (IntrospectionException e) {<br />
// TODO<br />
}<br />
}<br />
return _model;<br />
}</p>
<p>public String getViewIdProperty() {<br />
return _propertyName;<br />
}</p>
<p>/**<br />
* Sets the property to use to get at view id<br />
* @param propertyName<br />
*/<br />
public void setViewIdProperty(String propertyName) {<br />
_propertyName = propertyName;<br />
_model = null;<br />
}<br />
public Object getInstance() {<br />
return _instance;<br />
}<br />
/**<br />
* Sets the treeModel<br />
* @param instance must be something that can be converted into a TreeModel<br />
*/<br />
public void setInstance(Object instance) {<br />
_instance = instance;<br />
_model = null;<br />
}<br />
public Object getMaxPathKey(){<br />
return _maxPathKey;<br />
}<br />
public void setMaxPathKey(Object maxPathKey){<br />
_maxPathKey = maxPathKey;<br />
}<br />
}<br />
</code><br />
 <br />
Una vez tengamos las páginas JSF que queramos meter en el menu, vamos al fichero faces-config y definimos los beans. Indicamos que el backing_bean es de tipo MenuItem y seteandole las propiedades por defecto. Un ejemplo sería el siguiente:</p>
<p><code>&lt;managed-bean&gt;<br />
&lt;managed-bean-name&gt;paso1&lt;/managed-bean-name&gt;<br />
&lt;managed-bean-class&gt;view.backing.MenuItem&lt;/managed-bean-class&gt;<br />
&lt;managed-bean-scope&gt;application&lt;/managed-bean-scope&gt;<br />
&lt;managed-property&gt;<br />
&lt;property-name&gt;label&lt;/property-name&gt;<br />
&lt;value&gt;Paso1&lt;/value&gt;<br />
&lt;/managed-property&gt;<br />
&lt;managed-property&gt;<br />
&lt;property-name&gt;viewId&lt;/property-name&gt;<br />
&lt;value&gt;/paso1.jspx&lt;/value&gt;<br />
&lt;/managed-property&gt;<br />
&lt;managed-property&gt;<br />
&lt;property-name&gt;outcome&lt;/property-name&gt;<br />
&lt;value&gt;paso1&lt;/value&gt;<br />
&lt;/managed-property&gt;<br />
&lt;/managed-bean&gt;</code></p>
<p>Ahora debemos irnos al faces-config y definir en él un backing-bean. Este  realmente no lo tenemos creado como una clase se genera en tiempo de ejecucion. Definiremos que este backing-bean sea de tipo  ArrayList y tendrá como valor los backing_bean que estan asociados con las  páginas que queremos mostrar en el processTrain.</p>
<p><code>&lt;managed-bean&gt;<br />
&lt;managed-bean-name&gt;createTrainNodes&lt;/managed-bean-name&gt;<br />
&lt;managed-bean-class&gt;java.util.ArrayList&lt;/managed-bean-class&gt;<br />
&lt;managed-bean-scope&gt;application&lt;/managed-bean-scope&gt;<br />
&lt;list-entries&gt;<br />
&lt;value-class&gt;view.backing.MenuItem&lt;/value-class&gt;<br />
&lt;value&gt;#{paso1}&lt;/value&gt;<br />
&lt;value&gt;#{paso2}&lt;/value&gt;<br />
&lt;value&gt;#{paso3}&lt;/value&gt;<br />
&lt;/list-entries&gt;<br />
&lt;/managed-bean&gt;</code></p>
<p>Y por último definimos la clase TrainModelAdapter en el mismo fichero de configuración faces-config:</p>
<p><code>&lt;managed-bean&gt;<br />
&lt;managed-bean-name&gt;createTrainMenuModel&lt;/managed-bean-name&gt;<br />
&lt;managed-bean-class&gt;view.backing.TrainModelAdapter&lt;/managed-bean-class&gt;<br />
&lt;managed-bean-scope&gt;application&lt;/managed-bean-scope&gt;<br />
&lt;managed-property&gt;<br />
&lt;property-name&gt;viewIdProperty&lt;/property-name&gt;<br />
&lt;value&gt;viewId&lt;/value&gt;<br />
&lt;/managed-property&gt;<br />
&lt;managed-property&gt;<br />
&lt;property-name&gt;instance&lt;/property-name&gt;<br />
&lt;value&gt;#{createTrainNodes}&lt;/value&gt;<br />
&lt;/managed-property&gt;<br />
&lt;/managed-bean&gt;</code></p>
<p> <br />
Existen dos tipos de configuraciones para el componente processTrain, Plus One y Max Visited.<br />
Si elejimos PlusOne el comportamiento será que el usuario puede avanzar los nodos de uno en uno de manera secuencial. Avanzaría del nodo 1 al 2, del 2 al 3, pero nunca del 1 al 5 por ejemplo. Pero si el usuario retrocede desde el nodo 5 al 1, cuando vuelva a avanzar tendría que pasar por todos los nodos anteriores.<br />
Con MaxVisited el comportamiento sería semejante al anterior, pero se puede dirigir directamente a cualquier nodo que haya ya visitado.</p>
<p>Estos valores se definen en el managed-bean anterior, si ponemos la siguiente propiedad:</p>
<p><code>&lt;managed-property&gt;<br />
&lt;property-name&gt;maxPathKey&lt;/property-name&gt;<br />
&lt;value&gt;TRAIN_DEMO_MAX_PATH_KEY&lt;/value&gt;<br />
&lt;/managed-property&gt;</code></p>
<p>Aquí estaríamos usando la opción MaxVisited, si no pusieramos nada (null) usaría PlusOne.</p>
<p>Ya solo quedaría definir las reglas de navegación entre las páginas en el faces-config, la cadena que obtiene el componente para comprobar a donde se redirige se captura por la propiedad outcome definida para la clase MenuItem.</p>
<p><code>&lt;navigation-rule&gt;<br />
&lt;from-view-id&gt;/paso2.jspx&lt;/from-view-id&gt;<br />
&lt;navigation-case&gt;<br />
&lt;from-outcome&gt;paso1&lt;/from-outcome&gt;<br />
&lt;to-view-id&gt;/paso1.jspx&lt;/to-view-id&gt;<br />
&lt;/navigation-case&gt;<br />
&lt;navigation-case&gt;<br />
&lt;from-outcome&gt;paso3&lt;/from-outcome&gt;<br />
&lt;to-view-id&gt;/paso3.jspx&lt;/to-view-id&gt;<br />
&lt;/navigation-case&gt;<br />
&lt;/navigation-rule&gt;</code></p>
<p>Por último, en las páginas JSF, debemos de crear los componentes:</p>
<p><code>&lt;af:processTrain var="train" value="#{createTrainMenuModel.model}"&gt;<br />
&lt;f:facet name="nodeStamp"&gt;<br />
&lt;af:commandMenuItem text="#{train.label}"<br />
action="#{train.getOutcome}"<br />
readOnly="#{createTrainMenuModel.model.readOnly}"<br />
immediate="false"/&gt;<br />
&lt;/f:facet&gt;<br />
&lt;/af:processTrain&gt;</code></p>
<p>El processTrain obtiene el modelo que se crea con la clase TrainModelAdapter y se lo setea como valor.</p>
<p>Él dinamicamente sabrá en cual página está y cual backing-bean usa en cada caso por la propiedad viewId.</p>
<p>Se puede añadir también a la página un componente processChoiceBar en el facet actions del panelPage. Este inserta en la parte superior e inferior de la página una guía de la navegación que tendría los mismos valores que el processTrain. Bastaría con añadir lo siguiente:</p>
<p><code>&lt;f:facet name="actions"&gt;<br />
&lt;af:processChoiceBar var="choice"<br />
value="#{createTrainMenuModel.model}"&gt;<br />
&lt;f:facet name="nodeStamp"&gt;<br />
&lt;af:commandMenuItem text="#{choice.label}"<br />
action="#{choice.getOutcome}"<br />
readOnly="#{createTrainMenuModel.model.readOnly}"<br />
immediate="false"/&gt;<br />
&lt;/f:facet&gt;<br />
&lt;/af:processChoiceBar&gt;<br />
&lt;/f:facet&gt;</code></p>
<p>Una vez completados estos pasos, si ejectusemos nuestra aplicación nos aparecería por pantalla el componente con las reglas de navegación que hayamos establecido anteriormente.</p>
]]></content:encoded>
			<wfw:commentRss>http://trinidadytobago.org/archives/34/feed</wfw:commentRss>
		</item>
		<item>
		<title>Captcha en Seam y ADF</title>
		<link>http://trinidadytobago.org/archives/32</link>
		<comments>http://trinidadytobago.org/archives/32#comments</comments>
		<pubDate>Sun, 01 Feb 2009 12:46:29 +0000</pubDate>
		<dc:creator>ueshiba</dc:creator>
		
		<category><![CDATA[Desarrollo]]></category>

		<category><![CDATA[Java ServerFaces]]></category>

		<category><![CDATA[JBoss Seam]]></category>

		<guid isPermaLink="false">http://r18714.ovh.net/~trinidad/?p=32</guid>
		<description><![CDATA[Muchas veces, queremos que el usuario que se vaya a registrar en nuestra página, meta un código de validación, con el cual, protejamos nuestro sitio, de posibles ataques al mismo.
Una solución bastante efectiva es hacer uso de las librerías Captcha con la cual generabamos una imagen con un código que obligaba al usuario a introducirlo. [...]]]></description>
			<content:encoded><![CDATA[<p>Muchas veces, queremos que el usuario que se vaya a registrar en nuestra página, meta un código de validación, con el cual, protejamos nuestro sitio, de posibles ataques al mismo.</p>
<p>Una solución bastante efectiva es hacer uso de las librerías <strong>Captcha</strong> con la cual generabamos una imagen con un código que obligaba al usuario a introducirlo. En la nueva versión de <strong>JBoss Seam (1.1.6)</strong> esta librería viene integrada en el propio framework, permitiéndonos de una manera bastante sencilla integrarlo en nuestros proyectos.</p>
<p><span id="more-32"></span></p>
<p>En este tutorial vamos a explicar los pasos que tenemos que seguir para validar nuestros formularios con Captcha:</p>
<p>El funcionamiento de Captcha es un servlet, que nos genera la imagen con el código, y accediento al contexto de la página podemos sacar cuál es dicho código y validarlo. Por tanto, lo primero que debemos hacer, es definir el servlet en nuestro fichero de configuración web.xml:</p>
<p><code>&lt;servlet&gt;<br />
&lt;servlet-name&gt;Captcha Servlet&lt;/servlet-name&gt;<br />
&lt;servlet-class&gt;<br />
org.jboss.seam.servlet.CaptchaServlet<br />
&lt;/servlet-class&gt;<br />
&lt;/servlet&gt;</p>
<p>&lt;servlet-mapping&gt;<br />
&lt;servlet-name&gt;Captcha Servlet&lt;/servlet-name&gt;<br />
&lt;url-pattern&gt;/captcha&lt;/url-pattern&gt;<br />
&lt;/servlet-mapping&gt;</code></p>
<p>La manera de mostrar la imagen y validarla la realizaremos a través del framework JBoss Seam, para ello, como es habitual, usaremos también el framework ADF en la capa de vista, que es donde se mostrará la imagen con el código y por donde a través de dicho framework accederemos al contexto donde Seam tiene referenciado al servlet.</p>
<p>En la página JSF-ADF donde tengamos el formulario debemos de definir un componente objectImage donde mostraremos la imagen generada por Captcha:</p>
<p><code>&lt;af:objectImage source="/captcha?#{captcha.id}" /&gt;</code></p>
<p>Sólo quedaría definir un componente inputText donde el usuario pueda teclear el valor aparecido en la imagen, y así, validarlo:</p>
<p><code>&lt;af:panelLabelAndMessage<br />
label="Codigo de la imagen"&gt;<br />
&lt;af:inputText value="#{captcha.response}"<br />
requiredMessageDetail=<br />
"El valor debe coincidir con la imagen"<br />
required="true" immediate="true"&gt;<br />
&lt;s:validate /&gt;<br />
&lt;/af:inputText&gt;<br />
&lt;/af:panelLabelAndMessage&gt;</code></p>
<p>Seam, internamente, y haciendo uso de las librerías de Captcha, capturará el valor de la caja de texto y lo validará con el código de la imagen, cuando nuestro usuario pulse el botón para confirmar el usuario. Esto se produce gracias al valor true de la propiedad required. El valor introducido se guarda en el metodo del objeto Captcha alojado en el contexto de Aplicación que genera Seam. Si no ha sido validada la imagen, dicho metodo no se ejecutará.</p>
]]></content:encoded>
			<wfw:commentRss>http://trinidadytobago.org/archives/32/feed</wfw:commentRss>
		</item>
		<item>
		<title>Mensajes en el FacesContext</title>
		<link>http://trinidadytobago.org/archives/30</link>
		<comments>http://trinidadytobago.org/archives/30#comments</comments>
		<pubDate>Sun, 01 Feb 2009 12:45:35 +0000</pubDate>
		<dc:creator>ueshiba</dc:creator>
		
		<category><![CDATA[Desarrollo]]></category>

		<category><![CDATA[Java ServerFaces]]></category>

		<guid isPermaLink="false">http://r18714.ovh.net/~trinidad/?p=30</guid>
		<description><![CDATA[Aunque insertar mensajes de error o información en el FacesContext, puede ser para muchos algo bastante sencillo, nunca esta de más explicarlo para aquellas personas que se están iniciando en JSF. En el siguiente tutorial vamos a aprender como crearlos y hacer que se muestren en nuestra página con la implementación ADF.

Para insertar mensajes de [...]]]></description>
			<content:encoded><![CDATA[<p>Aunque insertar mensajes de error o información en el <strong>FacesContext</strong>, puede ser para muchos algo bastante sencillo, nunca esta de más explicarlo para aquellas personas que se están iniciando en <strong>JSF</strong>. En el siguiente tutorial vamos a aprender como crearlos y hacer que se muestren en nuestra página con la implementación <strong>ADF</strong>.</p>
<p><span id="more-30"></span></p>
<p>Para insertar mensajes de error simplemente debemos llamar al objeto estático <strong>FacesContext </strong>y acceder al contexto actual de la página:</p>
<p><code>FacesContext facesContext = FacesContext.getCurrentInstance();</code></p>
<p>Una vez hemos recogido el objeto, debemos de llamar a uno de sus métodos que es addMessage(&#8230;), de manera intuitiva, gracias al javaDoc vamos a insertarle los valores a los parámetros que nos hacen falta:</p>
<p><code>facesContext.addMessage("cadena", new FacesMessage(FacesMessage.SEVERITY_ERROR, "cadena", "cadena"));</code></p>
<p>Si nos fijamos, el objeto <strong>FacesMessage </strong>es el que nos generá el tipo de mensaje que vamos a mostrar, que puede ser o de error, información, advertencia, etc.</p>
<p>Ahora vamos a recordar, que componente de <strong>ADF </strong>nos muestra la información generada por el <strong>FacesContext</strong>:</p>
<p><code>&lt;af:messages&gt;</code></p>
<p>Añadiendo este componente, cuando las peticiones lleguen a la Fase 6 del ciclo de vida, se seteará automaticamente el valor del componente con los mensajes que haya contenido en el FacesContext.</p>
<p>Además de para insertar mensajes, el objeto FacesContext tiene otras funcionalidades, que ya iremos viendo en futuros tutoriales.</p>
]]></content:encoded>
			<wfw:commentRss>http://trinidadytobago.org/archives/30/feed</wfw:commentRss>
		</item>
		<item>
		<title>Navegación con popup</title>
		<link>http://trinidadytobago.org/archives/28</link>
		<comments>http://trinidadytobago.org/archives/28#comments</comments>
		<pubDate>Sun, 01 Feb 2009 12:44:47 +0000</pubDate>
		<dc:creator>ueshiba</dc:creator>
		
		<category><![CDATA[Desarrollo]]></category>

		<category><![CDATA[ADF]]></category>

		<category><![CDATA[Java ServerFaces]]></category>

		<guid isPermaLink="false">http://r18714.ovh.net/~trinidad/?p=28</guid>
		<description><![CDATA[La creación de popups varía según la implementación de JSF que utilicemos para cada proyecto. Cada implementación nos da la opción de crear popups modales o no modales. Hoy vamos a hablar sobre los popups en ADF, los cuales son modales.

Para crear un popup en ADF simplemente debemos definir una regla de navegación específica, la [...]]]></description>
			<content:encoded><![CDATA[<p>La creación de popups varía según la implementación de JSF que utilicemos para cada proyecto. Cada implementación nos da la opción de crear popups modales o no modales. Hoy vamos a hablar sobre los popups en ADF, los cuales son modales.</p>
<p><span id="more-28"></span></p>
<p>Para crear un popup en ADF simplemente debemos definir una regla de navegación específica, la cual abrirá la nueva ventana en forma de popup, para ello, en el fichero faces-config.xml debemos escribir lo siguiente:</p>
<p><code>&lt;navigation-rule&gt;<br />
&lt;from-view-id&gt;/ejemplo1.jspx&lt;/from-view-id&gt;<br />
&lt;navigation-case&gt;<br />
&lt;from-outcome&gt;dialog:abrirPopup&lt;/from-outcome&gt;<br />
&lt;to-view-id&gt;/ejemplo2.jsxp&lt;/to-view-id&gt;<br />
&lt;/navigation-case&gt;<br />
&lt;/navigation-rule&gt;</code></p>
<p>Al igual que cualquier otra regla de navegación, al ejecutar un metodo y devolver una cadena formateada como &#8220;dialog:abrirPopup&#8221; nos redirigirá a dicha página, pero esta vez en forma de popup.</p>
<p>Se puede dar el caso que queramos pasar valores a la nueva página que estamos abriendo, pues de igual modo que ocurriría si no fuera un popup, deberíamos llamar a la clase estatica AdfFacesContext y hacer lo siguiente en nuestro método asociado al action:</p>
<p>    <code>AdfFacesContext().getCurrentInstance().getProcessScope().put ( " key " , " objeto " );</code></p>
<p>Si desde el backing_bean asociado al popup quisieramos recoger dichos valores se haría de la misma manera, pero en vez de setear los valores los recogeríamos:</p>
<p>    <code>AdfFacesContext().getCurrentInstance().getProcessScope().get( " key " );</code></p>
<p>Lo único que nos quedaría por hacer sería asociarle una propiedad al botón que vaya a abrir el popup:<br />
   <br />
    <code>useWindow = true;</code></p>
<p>De esta manera habríamos creado un sencillo popup en nuestra página. Existen otros medios para poder pasarle valores al popup, y sería asociandole un evento de tipo launchEvent al botón, y lo único que habría que hacer es capturar el componente y pasarle los valores de manera similiar a como hemos explicado anteriormente. El problema a esto es que a veces, queremos que según que tipo de condición se realice en el método asociado al evento se realice una navegación u otra, o que no se abra ningún popup.</p>
<p>Puede ocurrir que tengamos en el evento una condición que según el tamaño de una lista, se le envíen al popup ciertos valores, nuestra intención sería que si esa lista está vacia no se lance el popup sino que se envíe un mensaje al FacesContext. Los parametros se asociarían accediendo al launchEvent, recogiendo el componente y ejecutando el método <code>getDialogParameters().put(....);</code></p>
<p>A la misma vez, se esta asociando un action al botón que lanza el popup, que se ejecutaría antes que el evento anterior, por tanto, se está estableciendo ya la cadena que se debe de retornar para lanzar el popup (dialog:&#8230;).</p>
<p>Si se nos diera el caso que no debemos lanzar el popup, mandamos el mensaje de error al FacesContext, aparecería pintado en la pantalla, pero como se ha definido la regla de navegación antes que se ejecute el evento, se nos abre también el popup.</p>
<p>La solución al problema sería eliminar ese launchEvent y ejecutar la lógica en el action, y los valores del popup pasarlos a traves del AdfFacesContext como se explico al principio del tutorial.</p>
]]></content:encoded>
			<wfw:commentRss>http://trinidadytobago.org/archives/28/feed</wfw:commentRss>
		</item>
	</channel>
</rss>
