<?xml version="1.0" encoding="UTF-8"?><!-- generator="wordpress.com" -->
<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/"
	>

<channel>
	<title>echo2 &amp;laquo; WordPress.com Tag Feed</title>
	<link>http://wordpress.com/tag/echo2/</link>
	<description>Feed of posts on WordPress.com tagged "echo2"</description>
	<pubDate>Sat, 11 Oct 2008 07:48:43 +0000</pubDate>

	<generator>http://wordpress.com/tags/</generator>
	<language>en</language>

<item>
<title><![CDATA[Echo2 Web Framework- Like GWT]]></title>
<link>http://vinaytech.wordpress.com/?p=106</link>
<pubDate>Wed, 24 Sep 2008 07:34:54 +0000</pubDate>
<dc:creator>Vinay J</dc:creator>
<guid>http://vinaytech.fr.wordpress.com/2008/09/24/echo2-web-framework-like-gwt/</guid>
<description><![CDATA[Echo is a platform for building web-based applications that approach the capabilities of rich client]]></description>
<content:encoded><![CDATA[<p>Echo is a platform for building web-based applications that approach the capabilities of rich clients. The applications are developed using a component-oriented and event-driven API, eliminating the need to deal with the "page-based" nature of browsers. To the developer, Echo works just like a user interface toolkit.</p>
<p>Echo2 is the current stable version of the framework. The 2.1RC releases are recommended for production use. A 2.1.0 version will be released in the very near future.</p>
<p><img class="aligncenter size-full wp-image-107" title="echo2demo300" src="http://vinaytech.wordpress.com/files/2008/09/echo2demo300.png" alt="" width="300" height="265" /></p>
<p>Download <a href="http://echo.nextapp.com/site/echo2/download" target="_blank">Echo2</a></p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[J3 : Key West]]></title>
<link>http://sejourenfloride.wordpress.com/?p=17</link>
<pubDate>Thu, 28 Aug 2008 21:00:25 +0000</pubDate>
<dc:creator>sejourenfloride</dc:creator>
<guid>http://sejourenfloride.fr.wordpress.com/2008/08/28/j3-key-west/</guid>
<description><![CDATA[Un conseil : ne partez pas de Key West sans avoir fait un tour en mer! Les eaux bleues turquoises de]]></description>
<content:encoded><![CDATA[<p class="wp-caption-dt">Un conseil : ne partez pas de Key West sans avoir fait un tour en mer! Les eaux bleues turquoises de l'île hébergent une faune aquatique fabuleuse! Dauphins, requins (pas les grands blancs, rassurez-vous)mais aussi langoustes, crabes, poissons volants et la fameuse Conche, un coquillage typique de l'archipel.</p>
[caption id="attachment_21" align="alignleft" width="300" caption="Sortie en catamaran"]<img class="size-medium wp-image-21" src="http://sejourenfloride.wordpress.com/files/2008/08/dscn17421.jpg?w=300" alt="Sortie en catamaran" width="300" height="225" />[/caption]
<p>Nous avons choisi de faire une sortie de 4 heures en catamaran avec <a title="Echo2 catamaran" href="http://dolphinecho.com/" target="_blank">Echo2</a>. Au programme : ballade au large de Key West, au milieu d'îles désertes avec rencontre de dauphins (qui malheureusement n'ont pas été au rendez-vous, ce sont des choses qui arrivent, il faut le savoir) et plongée masque et tuba (snorkeling), un moment inoubliable! Nous avons même vu un requin des sables et une raie. A bord, nous n'étions que 2 couples de touristes et le personnel de bord, à savoir la skipper et le barman, et oui, un barman pour nous servir (sodas, vin, bières, et fruits exotiques histoire d'essayer de garder la ligne ce qui n'est pas gagné!). Bref, un équipage jeune et super sympa.</p>
<p>L'après-midi, ballade dans l'île. Tout se fait à pied mais vous pouvez aussi louer scooters, bicyclettes ou encore voiturettes.</p>
<p>Autre chose à ne pas rater à Key West : le coucher du soleil sur Mallory Square, très romantique!</p>
<p>Puis dîner chez <a title="Willie T&#34;s, Key West" href="http://www.williets.com/Key_West/" target="_blank">Willie T's</a> sur Duval Street. Dégustation d'un plat local : un poisson frais et son chutney d'ananas, fricassée de patates douces et légumes sautés au wok...un régale!</p>
[caption id="attachment_22" align="alignnone" width="300" caption="Spécialité culinaire des Keys"]<img class="size-medium wp-image-22" src="http://sejourenfloride.wordpress.com/files/2008/08/dscn17951.jpg?w=300" alt="Spécialité culinaire des Keys" width="300" height="225" />[/caption]
<p> Chez Willie T's, il est possible de laisser un témoignage de son passage en écrivant un petit mot sur un billet d'1 dollar que la serveuse vous proposera d'agrapher au mur! Dépéchez-vous, il ne reste plus beaucoup de place, même le plafond est tapissé de billets! Peut-être y verrez-vous le nôtre :-)</p>
<p> </p>
<div class="mceTemp">
<dt class="wp-caption-dt"></dt>
<dd class="wp-caption-dd"></dd>
</div>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Un lien Echo2]]></title>
<link>http://hadf.wordpress.com/2007/11/09/un-lien-echo2/</link>
<pubDate>Fri, 09 Nov 2007 15:18:36 +0000</pubDate>
<dc:creator>hadf</dc:creator>
<guid>http://hadf.fr.wordpress.com/2007/11/09/un-lien-echo2/</guid>
<description><![CDATA[Une bonne présentation générale du framework Echo2 pour ceux qui veulent comprendre avant de fair]]></description>
<content:encoded><![CDATA[<p>Une bonne présentation générale du framework Echo2 pour ceux qui veulent comprendre avant de faire leur choix entre Echo2 et GWT.</p>
<p><a href="http://jl2tho.blogspot.com/2007/10/resume-decideurs-echo2-ajax-java.html">http://jl2tho.blogspot.com/2007/10/resume-decideurs-echo2-ajax-java.html</a></p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Les frameworks Ajax]]></title>
<link>http://hadf.wordpress.com/2007/08/22/les-frameworks-ajax/</link>
<pubDate>Wed, 22 Aug 2007 13:04:47 +0000</pubDate>
<dc:creator>hadf</dc:creator>
<guid>http://hadf.fr.wordpress.com/2007/08/22/les-frameworks-ajax/</guid>
<description><![CDATA[Les frameworks de développement Web reposant sur JSP on l&#8217;inconvénient majeur de nécessiter]]></description>
<content:encoded><![CDATA[<p>Les <a href="http://fr.wikipedia.org/wiki/Framework">frameworks</a> de développement Web reposant sur JSP on l'inconvénient majeur de nécessiter une bonne connaissance de <a href="http://fr.wikipedia.org/wiki/JavaScript">JavaScript</a> pour pouvoir développer un site en <a href="http://fr.wikipedia.org/wiki/Asynchronous_JavaScript_And_XML">Ajax</a>. Pendant longtemps, ces frameworks ne prennaient pas en compte cette dimension du développement Web. Mais un nouveau type de frameworks spécialement conçu autour de la technologie Ajax a fait son apparition depuis environ un an. Leur particularité est de permettre à un développeur <a href="http://fr.wikipedia.org/wiki/Java_%28langage%29">Java</a> d'écrire une application Ajax sans aucune connaissance de JavaScript.</p>
<p>Il existe deux frameworks plus ou moins équivalents que sont <a href="http://code.google.com/webtoolkit/">GWT</a> (Google Web Toolkit) et <a href="http://www.nextapp.com/platform/echo2/echo/">Echo2</a>. L'un comme l'autre permet de concevoir une application Ajax sans écrire une seule ligne de code en JavaScript. Leur principe est de proposer une librairie Java et un <a href="http://fr.wikipedia.org/wiki/Compilateur">compilateur</a> qui converti le code de cette librairie en JavaScript. Mais bien que reposant sur le même principe général, ces deux frameworks sont en fait très différents.</p>
<p>GWT distingue de façon très nette les parties cliente et serveur. La première est intégralement compilée en JavaScript et peut être exportée vers n'importe quel serveur Web tel que <a href="http://httpd.apache.org/">Apache</a>, tandis que la partie serveur est destinée à tourner sur un conteneur de Servlet tel <a href="http://tomcat.apache.org/">Tomcat</a>. Bien sûr, il est possible de faire tourner le tout sur Tomcat, mais seules les librairies pouvant être compilées en JavaScript peuvent être inclues dans le code de la partie cliente.</p>
<p>En revanche, Echo2 n'offre pas de cadre pour distinguer le côté serveur et le côté client, il appartient au développeur de s'en tenir au <a href="http://fr.wikipedia.org/wiki/Patron_de_conception">design pattern</a> adéquate. Et à la différence de GWT, Echo2 génère une véritable application Java dont le code est intégralement délivré par des Servlets. Il n'est donc pas possible d'exporter une application Echo2 vers un simple serveur Web.</p>
<p>Quel que soit le choix de la technologie, les frameworks Ajax ont l'avantage, pour un développeur Java, de pouvoir se lancer dans l'écriture de Services Web complexes. On signalera enfin l'existence d'une librairie Ajax conçue spécifiquement pour le framework JSF et qui s'appelle Ajax4Jsf, nous aurons l'occasion d'y revenir.</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Tutorial de echo2 en español]]></title>
<link>http://rubensa.wordpress.com/2007/04/02/echo2-tutorial/</link>
<pubDate>Mon, 02 Apr 2007 08:00:11 +0000</pubDate>
<dc:creator>rubensa</dc:creator>
<guid>http://rubensa.fr.wordpress.com/2007/04/02/echo2-tutorial/</guid>
<description><![CDATA[
Recientemente he traducido el tutorial oficial de Echo2 al español y está disponible en mi págin]]></description>
<content:encoded><![CDATA[<p><img src="http://rubensa.wordpress.com/files/2006/11/echo2.png" alt="Echo2" /></p>
<p>Recientemente he traducido el <a href="http://www.nextapp.com/platform/echo2/echo/doc/tutorial/">tutorial oficial de Echo2</a> al español y está disponible en <a href="http://rubensa.eu.org/tutorial-echo2 ">mi página web</a> para todo aquel que esté interesado en introducirse en este framework de desarrollo basado en AJAX.</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Componentes personalizados en Echo2 - Parte III]]></title>
<link>http://rubensa.wordpress.com/2006/11/21/echo2-component-part2-2/</link>
<pubDate>Tue, 21 Nov 2006 15:52:30 +0000</pubDate>
<dc:creator>rubensa</dc:creator>
<guid>http://rubensa.fr.wordpress.com/2006/11/21/echo2-component-part3/</guid>
<description><![CDATA[
Este es el tercero de una serie de artículos acerca de la creación de componentes para Echo2:

Co]]></description>
<content:encoded><![CDATA[<p><img src='http://rubensa.wordpress.com/files/2006/11/echo2_devel.jpg' alt='Desarrollo con Echo2' /><br />
Este es el tercero de una serie de artículos acerca de la creación de componentes para <a href="http://nextapp.com/platform/echo2/echo/">Echo2</a>:</p>
<ul>
<li><a href="http://rubensa.wordpress.com/2006/11/16/echo2-component-part1/">Componentes personalizados en Echo2 - Parte I</a></li>
<li><a href="http://rubensa.wordpress.com/2006/11/21/echo2-component-part2/">Componentes personalizados en Echo2 - Parte II</a></li>
<li>Componentes personalizados en Echo2 - Parte III</li>
</ul>
<p>En los anteriores artículos vimos cómo crear ocmponentes personalizados para Echo2 con sus propios elementos de representación y código de lado cliente.  Esto se realizó completamente dentro del contexto de Echo2 y el modelo de programación Java del lado del servidor.</p>
<p>Sin embargo existe un inconveniente en esta método, la productividad de desarrollo, y especialmente temas relacionados con la depuración del JavaScript del lado del cliente.  Este artículo trata una nuevo modo de desarrollo de un nuevo componentes personalizado que permite una sesión de desarrollo muy productiva y componentes bien depurados, cuyo resultado se pude utilizar dentro del framework Echo2.</p>
<p><!--more--><strong>Explicación del Problema de la Productividad</strong></p>
<p>La depuración JavaScript de un componente personalizado puede llevar hasta el 50% del tiempo de desarrollo.  Es relativamente sencillo inventar propiedades del componente, crear una representación XHTML y diseñar los mensajes XML para el códiog del lado cliente, sin embargo es más difícil asegurarse de que el JavaScript funciona como es debido.</p>
<p>Echo2 tiene un mecanismo para asegurarse de que solamente se descarga el JavaScript necesario para un componente.  Esto hace que una aplicación web Echo2 sea solamente tan grande como necesite ser.</p>
<p>Esto lo consigue enviando el JavaScript necesario en mensajes AJAX y evaluando dinámicamente el código.  Es posible que te preguntes porqué no, sencillamente, crea dinámicamente elementos script XHTML y utiliza el código JavaScript en cuestion.  El problema es que algunos navegadores, como Safari, no permiten esto y por tanto la evaluación dinámica era la mejor solución multinavegador.</p>
<p>Por otro lado, lo malo es que los depuradores JavaScript existentes, Venkman, IE Script Debugger y FireBug, tienen problemas en ver este código JavaScript y por tanto es muy difícil poner puntos de interrupción donde quieres y hace que el ciclo de depuración sea más difícil de lo que debería.</p>
<p>De alguna manera esto se puede subsanar escribiendo sentencias <code>debugger;</code> en el código fuente pero esto requiere cambios en el código fuente simplemente para poner un punto de interrupción.</p>
<p>Además debes reiniciar tu servidor de aplicaciones para que cualquier cambio en el JavaScript tenga efecto.</p>
<p>El uso de evaluar dinámicamente el JavaScript descargado hace que nuestro código tenga que escribirse de un modo determinado.</p>
<p>Por ejemplo funciones como esta:</p>
<blockquote><p>
function fred () {<br />
  alert('fred called');<br />
}
</p></blockquote>
<p>deben escribirse como</p>
<blockquote><p>
fred = funcion() {<br />
  alert('fred called');<br />
};
</p></blockquote>
<p><strong>El Método - Prototipado Estático</strong></p>
<p>La idea básica es que desarrollaremos el 90% del código JavaScript y XHTML fuera del framework Echo2, lo haremos funcionar usando simples archivo XHTML y JavaScript locales, y después lo convertiremos en código Java.</p>
<p>Echo2 impone un esqueleto bastene ligero en el que se colocan los componentes.  En esencia es una inclusión estática de script al código del motor del cliente <code>ClientEngine.js</code> y una declación de documento XHTML transicional.  Por ejemplo la aplicación de demo de Chat de Echo2 al iniciarse se ve del siguiente modo:</p>
<blockquote><p>
&#60;!DOCTYPE Html PUBLIC "-//W3C//DTD XHTML 1.0 Transitionsl//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&#62;<br />
&#60;html xmlns="http://www.w3.org/1999/xhtml"&#62;<br />
&#60;head&#62;<br />
&#60;title&#62; &#60;/title&#62;&#60;meta content="NextApp Echo v2.1.0.beta1" name="generator"/&#62;<br />
&#60;script src="/ChatClient/app=serviceId=Echo.ClientEngine" type="text/javascript"&#62;<br />
&#60;/script&#62;<br />
&#60;/head&#62;<br />
&#60;boty onload="EchoClientEngine.init('/ChatClient/app', true);" style="position:absolute;font-family:verdana, arial, helvetica, sans-serif;font-size:10pt;height:100%;width:100%;padding:0px;margin:0px;overflow:hidden;"&#62;<br />
&#60;form action="#" id="c_root" onsubmit="return false;" style="padding:0px;margin:0px;"/&#62;<br />
&#60;/body&#62;<br />
&#60;/html&#62;
</p></blockquote>
<p>Eso es todo.  El resto de las aplicaciones web Echo2 se ensambla dinámicamente mediante inserciones DOM dinámicas, obtenidas mediante llamadas AJAX.</p>
<p>Por tanto podemos crar un archivo XHTML estático similar al anterior y trabajar dentro del mismo.</p>
<p>La clave aquí está en utilizar una declaración XTHML transicional.  Esto afecta al modo de trabajo del navegador.  La otra clave está en la inclusión del <code>ClientEngine.js</code> mediante el sistema de archivos y no mediante URLs dinámicas, del siguiente modo:</p>
<blockquote><p>
&#60;script type="text/javascript" src="file:///java/NextApp_Echo2/SourceCode/src/webrender/java/nextapp/echo2/webrender/resource/clientEngine.js"&#62;
</p></blockquote>
<p>A partir de quí puede comenzar a prototipar tu componente.</p>
<p><strong>Un Esqueleto de Archivo XHTML</strong></p>
<p>A continuación tenemos un esqueleto de archivo XHTML que se puede utilizar para comenzar a prototipar tu nuevo componente.  Obviamente debes arreglar los caminos absolutos utilizados para ajustarlos a tu sigutación.</p>
<blockquote><p>
&#60;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&#62;<br />
&#60;html xmlns="http://www.w3.org/1999/xhtml"&#62;<br />
&#60;head&#62;<br />
&#60;title&#62; &#60;/title&#62;<br />
&#60;meta content="NextApp Echo v2.1.0.beta1" name="generator"/&#62;<br />
&#60;script type="text/javascript"<br />
    src="file:///c:/java/NextApp_Echo2/SourceCode/src/webrender/java/nextapp/echo2/webrender/resource/ClientEngine.js"&#62;<br />
&#60;script type="text/javascript"<br />
    src="file:///c:/java/echopointng/projects/jar/src/ui/java/echopointng/ui/resource/js/ep.js"&#62;</p>
<p>&#60;script type="text/javascript"&#62;</p>
<p>yourOnLoadInit = function() {<br />
        //<br />
        // aquí va tu código o puedes crear otro archivo .js que se incluya como el de arriba<br />
};</p>
<p>&#60;/script&#62;</p>
<p>&#60;/head&#62;<br />
&#60;body onload="yourOnLoadInit()" style="position:absolute;font-family:verdana, arial, helvetica, sans-serif;font-size:10pt;height:100%;width:100%;padding:0px;margin:0px;overflow:hidden;"&#62;</p>
<p>&#60;form action="#" id="c_root" onsubmit="return false;" style="padding:0px;margin:0px;"&#62;</p>
<p>        &#60;!-- en Echo2 tu XHTML será hijo de este elemento y así debes hacerlo también --&#62;</p>
<p>&#60;/form&#62;<br />
&#60;/body&#62;<br />
&#60;/html&#62;
</p></blockquote>
<p><strong>Diseño Previo de la Representación del Componente</strong></p>
<p>Ahora hay que realizar un trabajo de diseño previo.  Por ejemplo debes decidir el nombre de tu componente, que propiedades tendrá (en términos Java) y cómo se propagarán estas propiedades al cliente.</p>
<p>Supongamos que queremos un control con 5 propiedades del interfaz de usuario y con un comportamiento particular.  No empieces a codificar hasta que conozcas esto.</p>
<p>También tendrás que decidir acerca de la estratégica de representación en tu XHTML.  Debes decidir si vas a <strong>pre-representar el XHTML</strong> en el elemento de representación antes de que se invoque al código del cliente o si vas a "generar dinámicamente" los elementos DOM tú mismo en JavaScript basándote en los datos enviados al procesador de mensajes del lado cliente.</p>
<p><strong>Estrategia de Pre Representación de XHTML</strong></p>
<p>En esta estrategia, el XHTML es generado en el lado del servidor y enviado al cliente como un mensaje estándar de inserción DOM.  En el momento en que se ejecuta el procesador del mensajes del lado cliente, todo el DOM XHTML debería estar en su lugar.  Esto es genial si la mayoría del conocimiento necesario para construir la salida reside en el lado servidor.  Por ejemplo un componente <code>Table</code> debe ejecutar sus <code>TableCellRender</code>s en el lado servidor para crear el aspecto de las filas.  Y por tanto tiene sentido hacer esto en el servidor y crear el XHTML según se ejecutan.</p>
<p>El código JavaScript de cliente del componente realizará la asunción de que todo el XHTML que necesita ya está ahí.</p>
<p>Así que cuando prototipamos estáticamente dicho componente tenemos que asegurarnos que escribimos el XHTML que el componente esperaría que fuese procesado por el servidor.</p>
<p><strong>Estrategia de Generación en el Cliente</strong></p>
<p>En este diseño de estrategia, la generación de XHTML se realiza completamente en el lado cliente.  El manejador de mensajes del lado cliente recibe todos los datos que necesita para poder crear elementos DOM dinámicamente para la representación del componente.  Este tipo de componentes se ajusta bien al <strong>prototipado estático</strong> ya que está autocontenido en el propio código JavaScript.</p>
<p><strong>Ejemplo - Estrategia de Generación Cliente - ColorChooser</strong></p>
<p>El componente <code>ColorChooser</code> está desarrollado de tal modo que todo el DOM se crea en el código del lado cliente.</p>
<p>Todo lo que tenemos que hacer es proporcionar un contenedor padre en el que se colocará el selector de color.  Esto reproduce lo que ocurre dentro del framework Echo2.</p>
<blockquote><p>
&#60;div id="c_177_parent"&#62;
</p></blockquote>
<p>El otro truco consiste en simular el mensaje XML que llegaría al procesador de mensajes de <code>ColorChooser</code> desde su elemento de representación.  De nuevo podemos hacerlos con un JavaScript hecho a mano.  Simplemente creamos una estructura DOM XML equivalente a lo que llegaría desde el framework Echo2.  Por ejemplo:</p>
<blockquote><p>
var itemXML = document.createElement('item');<br />
itemXML.setAttribute('eid', 'c_177');<br />
itemXML.setAttribute('container-eid', 'c_177_parent');<br />
itemXML.setAttribute('swatchesPerRow', '17');<br />
itemXML.setAttribute('enabled', 'true');</p>
<p>itemXML.setAttribute('styleDefault', 'padding:1px;boder:1px solid #317082;');<br />
itemXML.setAttribute('styleSwatch', 'width:10px,height:10px;border:1px solid #000000;');</p>
<p>//itemXML.setAttribute('colors', '#1234#...&#124;...&#124;...');<br />
itemXML.setAttribue('colorTitles', '');</p>
<p>itemXML.setAttribute('interestedPartyId', 'c_189');<br />
itemXML.setAttribute('currentColorSelection', '#ff33ff');<br />
itemXML.setAttribute('showCurrentColorSelectionSwatch', 'true');<br />
itemXML.setAttribute('currentColorSelectionText', 'Current Color : ');</p>
<p>var colorChooser = new EPColorChooser('c_177');<br />
colorChooser.init(itemXML);
</p></blockquote>
<p>Aquí estamos creando un elemento XML item y luego le fijamos atributos.  Este es el modo exacto en que el elemento de representación de <code>ColorChooser</code> enviaría sus valores de propiedades.  De echo esto ayuda a diseñar los nombres de las propiedades usados y el formato de los valores de las propiedades.</p>
<p><strong>Ejemplo - Estrategia de Pre Representación de XHTML - TabEx</strong></p>
<p><code>TabEx</code> es un ejemplo en el que se utiliza la estrategia de pre-renpresentación xHTML.  Se quería añadir la posibilidad de desplazar el cuerpo de la tabla sin mover la cabecera de la tabla a la vez que hacer que las columnas cambien de tamaño usando movimientos del ratón.</p>
<p>Se eligió esta estrategia por 2 motivos.  El primero, que ya se tenía el XHTML codificado para representarlo en el servidor y además para que si el usuario no ponía el <code>TableEx</code> en modo "scrollable" no se quería que cambiase nada desde el punto de vista de la salida.</p>
<p>Así que se creó un archivo XHTML estático que incluía la librería básica Echo2 y las librerías EPNG.</p>
<p>Después se creó la estructura <code>TabEx</code> en XHTML estático como la generaría el elemento de representación de <code>TabEx</code><br />
&#60;style&#62;<br />
...<br />
...<br />
.contentDivClass {<br />
                width:100%;<br />
                background-color:#00ff00;<br />
                height:200px;<br />
                overflow:scroll<br />
}</p>
<p>td.cell1 {<br />
        border:1px blue solid;<br />
        overflow:hidden;<br />
        background-color:#DCDCDC;<br />
        overflow:hidden;<br />
        white-space:nowrap;<br />
}</p>
<p>td.cell2 {<br />
        border:1px blue solid;<br />
        overflow:hidden;<br />
        background-color:#E9967A;<br />
        overflow:hidden;<br />
        white-space:nowrap;<br />
}</p>
<p>td.cell3 {<br />
        border:1px blue solid;<br />
        overflow:hidden;<br />
        background-color:#FF8C00;<br />
        overflow:hidden;<br />
        white-space:nowrap;<br />
}<br />
&#60;/style&#62;<br />
...<br />
...</p>
<p>&#60;div id="contentDiv" class="contentDivClass"&#62;<br />
...<br />
...<br />
        &#60;/tr&#62;<br />
                &#60;tr&#62;<br />
                &#60;td class="cell1"&#62;Column 1&#60;/td&#62;<br />
                &#60;td class="cell2"&#62;Column 2&#60;/td&#62;<br />
                &#60;td class="cell3"&#62;Column 3&#60;/td&#62;<br />
        &#60;/tr&#62;<br />
                &#60;tr&#62;<br />
                &#60;td class="cell1"&#62;XXXXX X&#60;/td&#62;<br />
                &#60;td class="cell2"&#62;XXXXX X&#60;/td&#62;<br />
                &#60;td class="cell3"&#62;XXXXX X&#60;/td&#62;<br />
                &#60;/tr&#62;</p>
<p>Aunque en el XHTML estático usamos clases CSS, Echo2 no utiliza nombres de clase al generar los elementos (ya que muchos navegadores no soportan elementos de estilo dinámicos) sino que genera directamente el atributo <code>style="xxxx;yyyy;"</code>.</p>
<p>Desde el punto de vista de codificación no nos preocupa ya que la salida XHTML se realiza en un bucle de programa y tiene el mismo esfuerzo tanto si tiene una celda como cientos.  Pero en XHTML estático es un montón de Copiar y Pegar y parece mucho mas sencillo utilizar declaraciones de clases CSS.</p>
<p>Sin embargo un elemento a tener en cuenta de las clases CSS es que el JavaScript podría no hacer lo que queremos.  Por ejemplo, dado el ejemplo de arriba, al llamar a este código:</p>
<blockquote><p>
var value = document.getElementById('cotentDiv').style.width;<br />
alert(value);
</p></blockquote>
<p>¿Nos devolverá 100%? ¿Quizás el ancho actual del elemento?  No, devolverá la cadena vacía.  Ya que el atributo de estilo del elemento no ha sido fijado a ningún valor.</p>
<p>Ahora escribiríamos todo el código como si estuviésemos en el framework Echo2 al final lo copiaríamos y pegaríamos de nuevo en el <code>tableex.js</code> real del proyecto EPNG y nos iríamos a la tarea de ajustar el <code>TableExPeer</code> para que genere el XHTML necesario para crear la tabla desplazable.</p>
<p><a href="http://wiki.nextapp.com/echowiki/WritingYourOwnComponentPeersPart3">Vía</a></p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Componentes personalizados en Echo2 - Parte II]]></title>
<link>http://rubensa.wordpress.com/2006/11/21/echo2-component-part2/</link>
<pubDate>Tue, 21 Nov 2006 10:11:06 +0000</pubDate>
<dc:creator>rubensa</dc:creator>
<guid>http://rubensa.fr.wordpress.com/2006/11/21/echo2-component-part2/</guid>
<description><![CDATA[
Este es el segundo de una serie de artículos acerca de la creación de componentes para Echo2:

Co]]></description>
<content:encoded><![CDATA[<p><img src='http://rubensa.wordpress.com/files/2006/11/echo2_devel.jpg' alt='Desarrollo con Echo2' /><br />
Este es el segundo de una serie de artículos acerca de la creación de componentes para <a href="http://nextapp.com/platform/echo2/echo/">Echo2</a>:</p>
<ul>
<li><a href="http://rubensa.wordpress.com/2006/11/16/echo2-component-part1/">Componentes personalizados en Echo2 - Parte I</a></li>
<li>Componentes personalizados en Echo2 - Parte II</li>
<li><a href="http://rubensa.wordpress.com/2006/11/21/echo2-component-part3/">Componentes personalizados en Echo2 - Parte III</a></li>
</ul>
<p>En este artículo continuaremos examinando mas características que podemos añadir a los componentes para convertirlos en mas ricos de cara al usuario.  Usaremos como componente de ejemplo el echopoint.ExpandableSection de EchoPointNG.  Tal vez quieras bajarte su código fuente para estudiarlo según avanzamos.</p>
<p><!--more--><strong>Procesador de Mensajes</strong></p>
<p>Echo2 tienen un motor JavaScript en el cliente que se encarga de mantener el lado del servidor y del cliente sincronizados.  Con nuestro anterior componente de ejemplo <code>RulerLine</code>, el estado del componente no podía cambiar y por tanto no se necesitaba ningún código JavaScript.</p>
<p>Sin embargo ¿qué ocurre con un componaente más complejo que se pueda pulsar o editar o expandir?    ¿Cómo son estas configuraciones del componente y cómo se reflejan los cambios de estado de vuelta en el servidor?</p>
<p>Aquí es donde aparece el motor cliente de Echo2 y es donde aparece su uso del <em>Procesador de Mensajes</em> de JavaScript.</p>
<p>Cuando se representa un componente en el servidor usando su método <code>renderAdd()</code>, se obtiene el XHTML y se envía como un mensaje XML al motor del lado cliente.  Este tiene un código conocido como el <code>EchoDomUpdate.MessageProcesor</code> que es el responsable de interpretar el mensaje XML y de colocar el XHTML en el DOM del navegador.</p>
<p>No necesitas escribir nada de JavaScript para que esto ocurra.  Es código estándar del framework.</p>
<p>Sin embargo puedes escribir tus propios procesadores de mensajes del lado cliente.  Esto te permitirá realizar funciones extra como la adición y eliminación de manejadores de eventos XHTML o la inicialización del estado del componente en el cliente de algún modo.</p>
<p>Un procesador de mensajes es simplemente una función JavaScript con el nombre estandar de <code>process</code>.</p>
<p>Por ejemplo, el componente EPNG <code>ExpandableSection</code> tienen un procesador de mensajes llamado <code>EPExpandableSection.MessageProcesor.process</code>.</p>
<p>Cuando el motor cliente de Echo2 recibe un mensaje XML, este viene marcado con el nombre del procesador de mensajes a invocar.  Es responsabilidad del procesador de mensajes el hacer algo con dicho mensaje.  El elemento de representación del lado del servidor creará el mensaje XML para que sea enviado al procesador de mensajes del lado cliente.  Por ejemplo, aquí tenemos un trozo de código de <code>ExpandableSection</code> que se llama cuando se añade el componente por primera vez a la jerarquía.</p>
<blockquote><p>
protected void createInitDirective(RenderingContext rc, ExpandableSection es, Style fallbackStyle) {<br />
  Element itemizedUpdateElement = rc.getServerMessage().getItemizedDirective(ServerMessage.GROUP_ID_POSTUPDATE, "EPExpandableSection.MessageProcessor", "init", new String[0], new String[0]);<br />
  Element itemElement = rc.getServerMessage().getDocument().createElement("item");<br />
  itemElement.setAttribute("eid", rc.getElementId());<br />
  itemElement.setAttribute("expanded", String.valueOf(es.isExpanded()));<br />
  ExpansionGroup group = (ExpansionGroup)rc.getRP(ExpandableSection.PROPERTY_EXPANSION_GROUP, fallbackStyle);<br />
  if (group != null) {<br />
    itemElement.setAttribute("groupId", group.getRenderId());<br />
    itemElement.setAttribute("acoordionMode", String.valueOf(group.isAcocordionMode()));<br />
  }<br />
  TitleBar tb = (TitleBar)rc.getRP(ExpandableSection.PROPERTY_TITLEBAR, fallbackStyle);<br />
  if (tb != null) {<br />
    itemElement.setAttribute("titleBarId", ContainerInstance.getElementId(tb));<br />
  }<br />
  itemizedUpdateElement.appendChild(itemElement);<br />
}
</p></blockquote>
<p>Fíjate en la parte de <code>getServerMessage().getItemizedDirective(...)</code>.  Esto crea un mensaje de directiva XML y marca su procesador de mensajes como "EPExpandableSection.MessageProcesor".  Esto es lo que permite al motor del lado cliente conocer a qué procesador de mensajes invocar.</p>
<p>El código de arriba fija algunos atributos XML en el elemento XML basados en las propiedades de <code>ExpandableSection</code>.  Más acerca de esto después.</p>
<p>Lo más normal es hacer un <strong>init</strong> o <strong>dispose</strong> de algún modo en el componente.  Por ejemplo, aquí está el código JavaScript del cliente para el procesador de mensajes de <code>ExpandableSection</code>.</p>
<blockquote><p>
EPExpandableSection.MessageProcessor.process = function(messagePartElement) {<br />
  for (var i=0; i&#60;messagePartElement.childNodes.length; ++i) {<br />
    if (messagePartElement.childNodels[i].nodeType == 1) {<br />
      switch (messagePartElement.childNodes[i].tagName) {<br />
        case "init":<br />
          EPExpandableSection.MessageProcessor.processInit(messagePartElement.childNodes[i]);<br />
          break;<br />
        case "dispose":<br />
          EPExpandableSection.MessageProcessor.processDispose(messagePartElement.childNodes[i]);<br />
          break;<br />
        case "expansion":<br />
          EPExpandableSection.MessageProcessor.processExpansion(messageParteElement.childNodes[i]);<br />
          break;<br />
        }<br />
      }<br />
  }<br />
};
</p></blockquote>
<p>Puede manejar 3 tipos diferentes de mensajes.  Un mensajes XML <strong>init</strong>, un mensaje XML <strong>dispose</strong> y un mensaje XML <strong>expansion</strong>.  Veamos el procesamiento del mensaje <strong>init</strong>.</p>
<blockquote><p>
EPExpandableSection.MessageProcessor.processInit = function(initMessageElement) {<br />
  //debugger;<br />
  for (var item=initMessageElement.firstChild; item; item=item.nextSibling) {<br />
    var elementId = item.getAttribute("eid");<br />
    EP.ObjectMap.destroy(elementoId);<br />
    var es = new EPExpandableSection(elementId);<br />
    if (item.getAttribute("enabled") == "false") {<br />
      EchoDomPropertyStore.setPropertyValue(elementId, "EchoClientEngine.inputDisabled", true);<br />
    }<br />
    var groupId = item.getAttribute("groupId");<br />
    if (groupId) {<br />
      es.setButtonGroup(elementId, groupId);<br />
    }<br />
    es.accordionMode = (item.getAttribute("accordionMode") == 'true');<br />
    es.titleBarId = item.getAttribute("titleBarId");<br />
    es.contentE = document.getElementById(elementId+'&#124;Content');<br />
  }<br />
}
</p></blockquote>
<p>Este código recorre los hijos de nivel superior del mensajes XML.  Para cada hijo de nivel superior comprueba el valor del atributo <code>eid</code>.  Este es el <strong>id</strong> del componente.  Entonces el código crea un objetos "del lado cliente" para el <code>ExpandableSection</code> y le fija varias propiedades según los valores del mensaje XML.</p>
<p>Como puedes ver el estado del servidor se <em>transfiere</em> al cliente mediante mensajes de directiva XML y el procesador de mensajes.</p>
<p>Siguiendo con el ejemplo completo, mira al atributo <code>enabled</code> en la directiva XML.  Si este es <code>false</code> significa que el componente debería estar deshabilitado en el cliente.  El código especial que aparece se asegura que el componente esté marcado como <em>no disponible</em>.</p>
<p>El otro mensaje del ciclo de vida es <code>dispose</code>.  Este se crea en el método <code>renderDispose()</code> en el lado del servidor.  Este es el modo que tiene el framework de indicar al elemento de representación que el componente no va a ser necesario más tanto en el lado del servidor como en el lado del navegador cliente.</p>
<p>El <code>ExpandableSectionPeer</code> hace lo siguiente en el servidor</p>
<blockquote><p>
public void renderDispose(RenderContext rc, ServerComponentUpdate update, Component component) {<br />
  super.renderDispose(rc, update, component);<br />
  createDisposeDirective(rc.getServerMessage(), component);<br />
}</p>
<p>protected void createDisposeDirective(ServerMessage serverMessage, Component component) {<br />
  Element itemizedUpdateElement = serverMessage.getItemizedDirective(ServerMessage.GROUP_ID_PREREMOVE, "EPExpandableSection.MessageProcessor", "dispose", new String[0], new String[0]);<br />
  Element itemElement = serverMessage.getDocument().createElement("item");<br />
  itemElement.setAttribute("eid", ContainerInstance.getElementId(component));<br />
  itemizedUpdateElement.appendChild(itemElement);<br />
}
</p></blockquote>
<p>Este código crea un mensaje de directiva XML de "dispose" para enviarlo al cliente y para ser manejado por el procesador de mensajes <code>EPExpandableSection.MessageProcessor</code>.</p>
<p>Esto permite al código del lado cliente limpiar cualquier recurso del componente del lado cliente como manejadores de evento, etc...  Aquí tenemos el código del procesador de mensajes <code>ExpandableSection</code>:</p>
<blockquote><p>
EPExpandableSection.MessageProcessor.processDispose = function(disposeMessageElement) {<br />
  for (var item=disposeMessageElement.firstChild; item; item=item.nextSibling) {<br />
    var elementId = item.getAttribute("eid");<br />
    EP.ObjectMap.destroy(elementId);<br />
  }<br />
};
</p></blockquote>
<p>Este código usa una librería JavaScript de EchoPointNG para limpiar el objeto del lado cliente.</p>
<p><strong>Actualizaziones Parciales y Procesadores de Mensaje</strong></p>
<p>Ahora todo componente que tiene un procesador de mensajes tendrá, por convenio, un <code>init</code> y un <code>dispose</code>, ya que esto refleja el ciclo de vida de prácticamente todos los componentes.</p>
<p>Pero ¿qué pasa con el resto de eventos o cambios de estado que ocurren en el servidor?</p>
<p><code>ExpandableSection</code> tienen una propiedad '<code>expansion</code>' que se envía al lado cliente de representación del componente.  Cuando es <code>true</code>, el código cliente debe <em>expandir</em> el área de contenido del componente.  Cuando es <code>false</code>, debe <em>contraer</em> el área de contenido.</p>
<p>Ahora el componente <code>ExpandableSection</code> escucha a su <em>modelo de expansion</em> para controlar su estado de expansión.  Aquí tenemos el código:</p>
<blockquote><p>
private class InternalExpansionModelListener implements ChangeListener {<br />
  /*<br />
   * @see nextapp.echo2.app.event.ChangeListener#stateChanged(nextapp.echo2.app.event.ChangeEvent)<br />
   */<br />
  public void stateChange(ChangeEvent e) {<br />
    ExpansionModel expansionModel = (ExpansionModel) e.getSource();<br />
    //<br />
    // if an expansion model other than ours, ie the titlebar, tells<br />
    // us of an expansion event, then update out model.<br />
    if (expansionModel != null) {<br />
      if (expansionModel != getExpansionModel()) {<br />
        setExpanded(expansionModel.isExpanded());<br />
     } else {<br />
       // set the titlebar to reflect our expansion<br />
       if (getTitleBar() != null &#38;&#38; getTitleBar().getExpansionModel() != null) {<br />
         getTitleBar().getExpansionModel().setExpanded(expansionModel.isExpanded());<br />
       }<br />
     }<br />
     firePropertyChange(EXPANDED_CHANGED_PROPERTY, null, null);<br />
    }<br />
  }<br />
}<br />
private ChangeListener internalExpansionListener = new InternalExpansionModelListener();
</p></blockquote>
<p>Lanza la propiedad EXPANDED_CHANGED_PROPERTY cuando el modelo cambia.  Esto hace que el componente sea marcado como <em>necesita actualización</em> por el framework Echo2.  El elemento de representación será <em>invocado</em> para representar el objeto <em>sucio</em>.</p>
<p>Supongamos que el estado de expansión es la única propiedad que ha cambiado y que la <code>ExpandableSection</code> ya existe en la gerarquía de componentes.  En este caso se llamará al método <code>renderUpdate()</code>.  Echémosle un ojo.  Realmente se toma de su clase padre <code>AbstractEchoPointContainerPeer</code>.</p>
<blockquote><p>
public boolean renderUpdate(RenderContext rc, ServerComponentUpdate update, String targetId) {<br />
  boolean fullReplace = false;<br />
  if (update.hasUpdatedLayoutDataChildren()) {<br />
    fullReplace = true;<br />
  }<br />
  if (update.hasUPdatedProperties()) {<br />
    if (partialUpdateManager.canProcess(rc, update)) {<br />
      partialUpdateManager.process(rc, update);<br />
    } else {<br />
      fullReplace = true;<br />
    }<br />
  }<br />
  return renderUpdateBaseImpl(rc, update, targetId, fullReplace);<br />
}
</p></blockquote>
<p>La explicación de este método es un poco complicada.</p>
<p>El objeto <code>ServerComponentUpdate</code> contiene información acerca de los cambios.  En este caso la propiedad <code>expanded</code> ha cambiado.  El elemento de representación utiliza un objeto <code>PartialUpdateManager</code> para determinar si puede manejar los cambios de propiedades.</p>
<p>El <code>PartialUpdateManager</code> contiene una serie de objetos <code>PartialUPdateParticipan</code> cuya clave son los nombres de propiedades.  El que maneja la propiedad "<code>expanded</code>" es el siguiente:</p>
<blockquote><p>
partialUpdateManager.add(ExpandableSection.EXPANDED_CHANGE_PROPERTY, new PartialUpdateParticipant() {<br />
  /**<br />
   * @see nextapp.echo2.webcontainer.PartialUpdateParticipan@canRenderProperty(nextapp.echo2.webcontainer.RenderContext, nextapp.echo2.app.update.ServerComponentUpdate)<br />
   */<br />
  public boolean canRenderProperty(RenderConext rc, ServerComponentUpdate update) {<br />
    return true;<br />
  }</p>
<p>  /**<br />
   * @see nextapp.echo2.webcontainer.PartialUPdateParticipant#renderProperty(nextapp.echo2.webcontainer.RenderConext, nextapp.echo2.app.update.ServerComponentUpdate)<br />
    */<br />
  public void renderProperty(RenderContext rc, ServerComponentUpdate update) {<br />
    ExpandableSection tb (ExpandableSection) update.getParent();<br />
    boolean isExpanded = tb.isExpanded();<br />
    // an XML message directive please to tell the popup to expand!<br />
    Element itemizedUpdateElement = rc.getServerMessage().getItemizedDirective(ServerMessage.GROUP_ID_POSTUPDATE, "EPExpandableSection.MessageProcessor", "expansion", new String[0], new String[0]);<br />
    Element itemElement = rc.getServerMessage().getDocument().createElement("item");<br />
    itemElement.setAttribute("eid", ContainerInstance.getElementId(tb));<br />
    itemElement.setAttribute("expanded", String.valueOf(isExpanded));<br />
    itemElement.appendChild(itemElement);<br />
  }<br />
});
</p></blockquote>
<p>Lo que hace esto es comprobar las actualizaciones de la propiedad <code>expanded</code>.  Coge el valor del componente y crea un mensaje de directiva XML para el <code>ExpandableSection.MessageProcessor</code> y le asigna la clave con el nombre <code>expansion</code> y se fija el valor del estado de expansión.</p>
<p>Este mensaje viaja al cliente y el código JavaScript del cliente es el responsable de actualizar el estado de <code>ExpandableSection</code> para abrirlo o cerrarlo, dependiendo del valor.   Esto se realiza usando este código:</p>
<blockquote><p>
EPExpandableSection.MessageProcessor.processExpansion = function(disposeMessageElement) {<br />
  // debugger;<br />
  for (var item = disposeMessageElement.firstChild; item; item = item.nextSibling) {<br />
    var elementId = item.getAttribute("eid");<br />
    var expanded = (item.getAttribute("expanded") == 'true');<br />
    var es = EP.ObjectMap.get(elementId);<br />
    if (es != null) {<br />
      es.onTibleBarExpansion(expanded);<br />
    }<br />
  }<br />
};
</p></blockquote>
<p>No se ha añadido XHTML al cliente.  No se ha realizado ni un solo añadido o eliminación al DOM.  Solamente se ha enviado al cliente el cambio de la propiedad <code>expansion</code> y éste se ha reflejado.</p>
<p>Este mecanismo de <em>actualización parcial</em> significa que las aplicaciones Echo2 pueden realizar grandes trucos visuales sin la sobrecarga de grandes mensajes XML o eliminación y adición extra de XHTML.</p>
<p>El framework de actualización de Echo2 y <code>PartialUpdateManager</code> en particular, es suficientemente potente para que sepa si una serie de cambios de propiedades se pueden manejar o no.  En este caso si las actualziaciones no se pueden manejar por el  <code>PartialUpdateManager</code>, entonces devolverá <code>false</code> y se lleavará a cabo una sustitución completa (eliminación DOM/adición DOM).</p>
<p>La frecuencia con la que se llevará a cabo una sustitución total depende de tí como diseñador del elemento de representación.  Un control más fino de las propiedades puede significar más código y estado en el cliente y el servidor pero menos tráfico de mensajes XML/XHTML y menos actualizaciones del DOM.</p>
<p>Un control menos fino de actualizaciones de propiedades hacen que el código de representación sea más sencillo y puede ser más sensible a muchos cambios de propiedades.</p>
<p><em>Algo que habrán notado los lectores más astutos es que la creación de la directiva de mensaje XML realmente contiene un mensaje XML de múltiples partes.</p>
<p>El framework Echo2 hace esto para que su sistema de mensajería sea más eficiente.  Supongamos que tenemos 20 <code>ExpandableSections</code> (en un grupo) y que una hay que abrirla y el resto hay que cerrarlas.  Los mensajes de directiva XML para esto irán en un mensaje XML, uno por componente identificados por el <code>elementId</code>.</p>
<p>  for (var i=0; i&#60;messageParteElement.childNodes.length; i++) {<br />
    if (mesaageParteElement.childNodes[i].nodeType == 1) {<br />
      switch (messagePartElement.childNodes[i].tagName) {<br />
        ...<br />
      }<br />
    }<br />
  }</p>
<p>El procesador de mensajes por tanto debe recorrer en un bucle cada parte del mensaje y ejecutar el código apropiado para cada <code>elementId</code>.  Esto signifiaca mucha mas "eficiencia de mensajería" que mensajes individuales para cada componente.</em></p>
<p><strong>Actualizaciones Parciales y actualizaciones DOM estándar</strong></p>
<p>Algunas propiedades de los componentes se pueden manejar de un modo sencillo de manera estándar.  Por ejemplo si cambiamos el color de fondo de un componente, generalmente solamente es necesario modificar el estilo de color de fondo del elemento XHTML.</p>
<p>Echo2 tiene varios <code>PartialUpdateParticipant</code> predefinidos como el <code>ColorUpdate</code>, el <code>BorderUpdate</code> y el <code>InsetsUpdate</code>.  En esencia crean un mensaje DOM especial que simplemente cambia propiedades específicas de estilo.  Por ejemplo el código de <code>ColorUpdate</code> es algo así:</p>
<blockquote><p>
public void renderProperty(RenderContext rc, ServerComponentUpdate update) {<br />
  Color color = (Color)update.getParent().getRenderProperty(Component.PropertyName);<br />
  String elementId = idSuffix == null ? ContainerInstance.getElementId(update.getParent()) : ContainerInstance.getElementId(update.getParent()) + idSuffix;<br />
  if (color == null) {<br />
    DomUpdate.renderStyleUpdate(rc.getServerMessage(), elementId, cssAttributeName, "");<br />
  } else {<br />
    DomUpdate.renderStyleUpdate(rc.getServerMessage(), elementId, cssAttributeName, ColorRender.renderCssAttributeValue(color));<br />
  }<br />
}
</p></blockquote>
<p>El código <code>DomUpdate.renderStyleUpdate()</code> crea para tí el XML de actualización de estilo DOM de un modo estándar que el <code>EchoDomUpdate.MessageProcessor</code> pueda entender.</p>
<p><strong>Manejadores de Eventos del Lado Cliente</strong></p>
<p>Supongamos que queremos representar un componente similar a un <code>Button</code> en el que se pueda pulsar, en cuyo caso enviará un evento al servidor, informándole acerca de la pulsación.  Desde luego podríamos hacer esto:</p>
<blockquote><p>
&#60;button onclick="myfunction(event)"&#62;Click me&lat;button&#62;
</p></blockquote>
<p>Realmente no todos los navegadores soportan la adición "automática" de manejadores de evento como la de arriba.  Así que debemos añadir dinámicamente los manejadores de evento en la fase de <em>inicialización</em> (init) del procesador de mensajes del componente.  El siguiente código está tomado del procesador de mensages del <code>Button</code> de Echo2.</p>
<blockquote><p>
EchoEventProcessor.addHandler(elementId, "click", "EchoButton.processClick");<br />
EchoEventProcessor.addHandler(elementId, "keypress", "EchoButton.processKeyPressed");<br />
EchoEventProcessor.addHandler(elementId, "mousedown", "EchoButton.processPressed");<br />
EchoEventProcessor.addHandler(elementId, "mouseout", "EchoButton.processRolloverExit");<br />
EchoEventProcessor.addHandler(elementId, "mouseover", "EchoButton.processRolloverEnter");<br />
EchoEventProcessor.addHandler(elementId, "mouseup", "EchoButton.processReleased");
</p></blockquote>
<p>El motor cliente de Echo2 proporciona el <code>EchoEventProcessor.addHandler</code> para añadir eventos a elementos XHTML con nombre.  El framework JavaScript maneja por tí los diferentes modos de añadir manejadores de eventos.</p>
<p>Así, cuando el ratón pasa sobre el botón (un evento <code>mouseover</code>) se llamará a la función JavaScript <code>EchoButton.processRolloverEnter</code>.</p>
<p>Ahora, cuando no se necesitará más el componente, los manejadores de eventos deben ser eliminados, de otro modo pueden ocrrurir errores de memoria.  Aquí está el código para el manejador de la fase <code>dispose</code> del <code>Button</code> de Echo2.</p>
<blockquote><p>
EchoButton.MessageProcessor.processDispose = function (disposeMessageElement) {<br />
  for (var item = disposeMessageElement.firstChild; item; item = item.nextSibling) {<br />
    var elementId = item.getAttribute("eid");<br />
    EchoEventProcessor.removeHandler(elementId, "click");<br />
    EchoEventProcessor.removeHandler(elementId, "keypress");<br />
    EchoEventProcessor.removeHandler(elementId, "mousedown");<br />
    EchoEventProcessor.removeHandler(elementId, "mouseout");<br />
    EchoEventProcessor.removeHandler(elementId, "mouseover");<br />
    EchoEventProcessor.removeHandler(elementId, "mouseup");<br />
  }<br />
}
</p></blockquote>
<p><strong>Propiedades de Componente contra Propiedades de Representación de Componente</strong></p>
<p>Los componentes Echo2 tienen propiedades normales Java tales como <code>getBackground()</code> y <code>getFont()</code>.  Y se puede utilizar para fijar propiedades visuales para controlar cómo se comporta y aparece un componente.  Y llamaremos a los getters y setters normales de Java para fijar estas propiedades, ej: <code>component.setColor(Color.RED);</code></p>
<p>Echo2 tiene otro mecanismo llamado <code>Style</code>s (Estilos) que permite que se fijen y se apliquen propiedades visuales a una serie de componentes.  Esto permite que un conjunto de propiedades visuales se apliquen a varios componentes.</p>
<p>Otra variación es esto son las <code>StyleSheet</code>s (Hojas de Estilo) que son una colección de <code>Style</code>s clasificados por clase de componente y nombre de estilo.  Se puede obtener más información relativa a este asunto en <a href="http://nextapp.com/platform/echo2/doc/tutorial/styles.html">http://nextapp.com/platform/echo2/doc/tutorial/styles.html</a></p>
<p>Cuando el elemento de representación accede a las propiedades del componente para "representarlo" DEBE utilizar el método <code>getRenderedProperty</code> para acceder al valor de la propiedad, no a los métodos getter normales.  Esto asegura que se siga el orden apropiado para buscar los valores de las proiedades.  Este es el código de <code>Component.getRenderedProperty()</code> donde podemos ver el orden en acción.</p>
<blockquote><p>
public final Object getRenderProperty(String propertyName, Object defaultValue) {<br />
  Object propertyValue = localStyle.getProperty(propertyName);<br />
  if (propertyValue != null) {<br />
    return propertyValue;<br />
  }<br />
  if (sharedStyle != null) {<br />
    propertyValue = sharedStyle.getProperty(propertyName);<br />
    if (propertyValue != null) {<br />
      return propertyValue;<br />
    }<br />
  }<br />
  if (application != null) {<br />
    Style applicationStyle = applicationInstance.getStyle(getClass(), styleName);<br />
    if (applicationStyle != null) {<br />
      // Return style value specified in application.<br />
      propertyValue = applicationStyle.getProperty(propertyName);<br />
      if (propertyValue != null) {<br />
        return propertyValue;<br />
      }<br />
    }<br />
  }<br />
  return defaultValue;<br />
}
</p></blockquote>
<p>Así, por ejemplo, para obtener el color de fondo de un componente debemos escribir:</p>
<blockquote><p>
Color background = (Color)mycomponent.getRenderedProperty(Component.PROPERTY_BACKGROUND);
</p></blockquote>
<p>y no esto:</p>
<blockquote><p>
Color background = mycomponent.getBackground();
</p></blockquote>
<p>Echo2 tiene una serie de clases de ayuda que puede manejar propiedades visuales estandar como Colores, Fuentes y Bordes en representaciones CSS.  Por ejemplo aquí tenemos parte del código de representación del <code>Button</code> que trabaja con propiedades visuales:</p>
<blockquote><p>
  ...<br />
  border = (Border) button.getRenderProperty(AbstractButton.PROPERTY_BORDER);<br />
  foreground = (Color) button.getRenderProperty(AbstractButton.PROPERTY_FOREGROUND);<br />
  background = (Color) button.getRenderProperty(AbstractButton.PROPERTY_BACKGROUND);<br />
  font = (Font) button.getRenderProperty(AbstractButton.PROPERTY_FONT);<br />
  backgroundImage = (FillImage)  button.getRenderProperty(AbstractButton.PROPERTY_BACKGROUND_IMAGE);<br />
}</p>
<p>BorderRender.renderToStyle(cssStyle, border);<br />
ColorRender.renderToStyle(cssStyle, foreground, background);<br />
FontRender.renderTyStyle(cssTyle, font);<br />
FillImageRender.renderToStyle(cssStyle, rc, this, button, IMAGE_ID_BRACKGROUND, backgroundImage, FillImageRender.FLAG_DISBLE_FIXED_MODE);<br />
InsetsRender.renderToStyle(cssStyle, "padding", (Insets)button.getRenderProperty(AbstractButton.PROPERTY_INSETS));
</p></blockquote>
<p><a href="http://wiki.nextapp.com/echowiki/WritingYourOwnComponentPeersPart2">Vía</a></p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Componentes personalizados en Echo2 - Parte I]]></title>
<link>http://rubensa.wordpress.com/2006/11/16/echo2-component-part1/</link>
<pubDate>Thu, 16 Nov 2006 10:27:09 +0000</pubDate>
<dc:creator>rubensa</dc:creator>
<guid>http://rubensa.fr.wordpress.com/2006/11/16/echo2-component-part1/</guid>
<description><![CDATA[
Este es el primero de una serie de artículos acerca de la creación de componentes para Echo2:

Co]]></description>
<content:encoded><![CDATA[<p><img src='http://rubensa.wordpress.com/files/2006/11/echo2_devel.jpg' alt='Desarrollo con Echo2' /><br />
Este es el primero de una serie de artículos acerca de la creación de componentes para <a href="http://nextapp.com/platform/echo2/echo/">Echo2</a>:</p>
<ul>
<li>Componentes personalizados en Echo2 - Parte I</li>
<li><a href="http://rubensa.wordpress.com/2006/11/21/echo2-component-part2/">Componentes personalizados en Echo2 - Parte II</a></li>
<li><a href="http://rubensa.wordpress.com/2006/11/21/echo2-component-part3/">Componentes personalizados en Echo2 - Parte III</a></li>
</ul>
<p>El framework <a href="http://nextapp.com/platform/echo2/echo/">Echo2</a> viene con una serie de componentes predefinidos que te permiten construir una aplicación Web.  Sin embargo quizás quieras construir los tuyos propios que vayan mas allá de los básicos que trae el framework.</p>
<p>Una forma de crearte tus propios componentes consistiría en la composición de varios de los ya existentes.  Por ejemplo podríamos crearnos nuestro propio componente <em>LoginPanel</em> como una simple composición de un <em>Grid</em>, un <em>TextField</em> y un <em>Button</em>.  Y podríamos añadirles <em>document listener</em>s y <em>action listener</em>s para que actuen como un único componente.</p>
<p>Pero ¿qué ocurre si queremos crear un componente que simplemente no existe o si lo que queremos es modificar significativamente el modo en que trabaja un componente?  Para conseguir esto tenemos que escribir nuestro propio componente con su correspondiente elemento de representación (rendering peer).</p>
<p><!--more--><strong>Un ejemplo sencillo</strong></p>
<p>Comencemos creando un sencillo componente llamado RulerLine.  Este componente nos pemitirá dibujar una línea horizontal en la parte cliente.  Aunque es un componente tremendamente sencillo ya que no tiene entrada por parte del usuario y no necesita un control de estado especial nos servirá como comienzo.</p>
<blockquote><p>
/**<br />
  * &#60;code&#62;RulerLine&#60;/code&#62; es un componente muy sencillo<br />
  */<br />
 public class RulerLine extends Component {<br />
 }
</p></blockquote>
<p>Aunque podría parecer que aún no tenemos nada, lo cierto es que con esto ya tenemos un componente que soporta colores de fondo y de primer plano, sus propias fuentes y que además puede formar parte de la gerarquía de componententes de Echo2.</p>
<p><strong>Mapeo de componente con su par de representación</strong></p>
<p>Echo2 utiliza un truco de recursos Java para mapear un componente a su representación.  Cuando tienen un componente que representar, busca todas las instacias de un archivo de propiedades especial y busca en estas instancias el mapeo entre la clase del componente y su clase correspondiente de representación.</p>
<p>El nombre del archivo de propiedades es:</p>
<p><code>/META-INF/nextapp/echo2/SynchronizePeerBindings.properties</code></p>
<p>Solamente necesitas situar este archivo en el raiz de tu archivo JAR y Echo2 lo encontrará haciendo uso de su nombre y lo revisará para encontrar el mapeo necesario. </p>
<p>Siguiendo con nuestro ejemplo, crearemos el archivo /META-INF/nextapp/echo2/SynchronizePeerBingins.properties en nuestro archvio JAR y escribiremos lo siguiente:</p>
<blockquote><p>example.RulerLine example.ui.RulerLinePeer</p></blockquote>
<p>Lo que indicará al framework Echo2 que el componente <code>RulerLine</code> es representado por su par de representación <code>RulerLinePeer</code>.</p>
<p><strong>Elementos de representación</strong></p>
<p>Los elementos de representación en Echo2 no tienen estado.  Se utiliza una misma instancia de un elemento de representación para TODOS los componentes que están mapeados con ella.  Esto ayuda a reducir la cantidad de memoria de una aplicación web Echo2.  Esto también quiere decir que debemos ser cuidadosos al escribir el código de los elementos de representación y asegurarnos de no fijar variables de instancia, etc...</p>
<p>El elemento de representación se encarga de "representar" XML y normalmente contenido XHTML en unos mensajes XML especiales que se envían al motor AJAX de Echo2 que se encuentra en el navegador cliente.</p>
<p>El motor AJAX cliente sabe como interpertar muchos de estos mensajes y realiza acciones como la adición/eliminación DOM y cosas por el estilo.</p>
<p>No explicaremos la estructura de los mensajes XML ya que raramente es necesario conocerla.  Echo2 realiza un buen trabajo en cuanto a la "encapsulación" de los mismos en llamadas a un API Java de tal modo que nunca veas el XML que viaja.  En su lugar, todo se transforma de y en objetos Java.</p>
<p><em>Puedes ver los mensajes XML enviados y devueltos añadiendo el parámetro "debug" a la URL de tu aplicación Echo2.  Esto abre un panel de depuración que muestra todas las comunicaciones con el servidor en tiempo real.</p>
<p>Por ejemplo <a href="http://demo.nextapp.com/Email/app?debug">http://demo.nextapp.com/Email/app?debug</a> mostrará la aplicación de ejemplo Email de Echo2 con el panel de depuración en acción.</em></p>
<p><strong>Añadiendo XHTML al DOM del cliente</strong></p>
<p>Un elemento de representación debe implementar una interfaz especial llamada</p>
<blockquote><p>nextapp.echo2.webcontainer.ComponentSynchronizePeer</p></blockquote>
<p>Durante el ciclo de vida del proceso de representación se llamará a los métodos de esta interfaz.</p>
<p>Se llama a <code>ComponentSynchronizePeer.renderAdd</code> para <strong>añadir</strong> la representación XHTML del componente en el navegador cliente.  Hay dos modos de realizar esto, pero nos centraremos en el más habitual que consiste en la adición DOM.</p>
<p><em>Existe un concepto de componente de representación puro de cliente.  Sin embargo se trata de un concepto avanzado que no contemplaremos en esta parte del tutorial.</em></p>
<p>Echo2 tiene una serie de características que permite añadir contenido XHTML al Document Object Model (DOM - Modelo de objetos de documento) en el navegador cliente.</p>
<p>Si tu elemento de representación utiliza este mecanismo para añadir XHTML al servidor (y la mayoría lo hacen) también debes soportar otro interfaz especial llamado</p>
<blockquote><p>nextapp.echo2.webcontainer.DomUpdateSupport</p></blockquote>
<p>Tiene un único método llamado <code>renderHtml</code> que puede llamarse para representar el XHTML que se enviará al navegador cliente y que será insertado en el DOM.</p>
<p>Aquí tenemos el código</p>
<blockquote><p>
public void renderHtml(RenderContext rc, ServerComponentUpdate update, Node parentNode, Component component) {<br />
  Document doc = rc.getServerMessage().getDocument();<br />
  Element hrE = doc.createElement("hr");<br />
  hrE.setAttribute("id", ContainerInstance.getElementId(component));<br />
  parentNode.appendChild(hrE);<br />
}
</p></blockquote>
<p>Este sencillo elemento de representación simplemente crea una instancia de <code>org.w3c.dom.Element</code> con la etiqueta de nombre <strong>hr</strong>.  Luego fija el <code>id</code> de la etiqueta XHTML con un valor único que identifica al componente.  El resultado en la red de todo esto es que se genera el siguiente XHTML</p>
<blockquote><p>&#60;hr id="c_1234" /&#62;</p></blockquote>
<p>Sin embargo realmente ocurren muchas cosas por detrás.  Los objetos <code>RenderContext</code> y <code>ServerComponentUpdate</code> mantienen una gran cantidad de información que puede ser importante para tu elemento de representación.  Estos permiten realizar "trucos" como la actualización parcial y cosas por el estilo.  Para dejar las cosas sencillas de momento no los usaremos.</p>
<p>Ahora veamos el método <code>renderAdd</code>.  Aquí es donde ocurre la "magia" realmente</p>
<blockquote><p>
public void renderAdd(RenderContext rc, ServerComponentUpdate update, String targetId, Component component) {<br />
  Elemnt domAddElement = DomUpdate.renderElementAdd(rc.getServerMessage());<br />
  DocumentFragment htmlFragment = rc.getServerMessage().getDocument().createDocumentFragment();<br />
  renderHtml(rc, update, htmlFragment, component);<br />
  DomUpdate.renderElementAddContent(rc.getServerMessage(), domAddElement, targetId, htmlFragment);<br />
}
</p></blockquote>
<p>Lo que hace esto es crear una directiva de mensaje XML especial que informa al motor del lado cliente de Echo2 que queremos añadir XHTML al DOM.</p>
<p>Esto se realiza mediante el siguiente código Java</p>
<blockquote><p>
Element domAddElement = DomUpdate.renderElementAdd(rc.getServerMessage());
</p></blockquote>
<p>Si miramos más a fondo en la clase <code>DomUpdate</code> veremos cómo crear una sección especial en el documento XML que será interpretada en el navegador cliente por el motor AJAX de Echo2.</p>
<p>Luego se llama a este código</p>
<blockquote><p>
DocumentFragment htmlFragment = rc.getServerMessage().getDocument().createDocumentFragment();<br />
renderHtml(rc, update, htmlFragment, component);
</p></blockquote>
<p>La primera línea crear un objeto contenedor especial llamado <code>DocumentFragment</code> en el DOM w3c.  Se trata de un objeto marcador especial que no genera XML pero que permite las relaciones de padre/hijo en una estrucutra DOM.</p>
<p>La segunda línea llama a nuestro método <code>renderHtml</code> utilizando el fragmento de documento como nodo padre.  Se generará el XHTML <code>&#60;hr id="c_1234" /&#62;</code>.</p>
<blockquote><p>
DomUpdate.renderElementAddContent(rc.getServerMessage(), domAddElement, targetId, htmlFragment);
</p></blockquote>
<p>La última línea añade el XHTML generado al mensaje XML que se enviará al motor AJAX de Echo2 del navegador cliente.</p>
<p>Echo2 "agrupará" varias actualizaciónes de componententes y los pondrá en un mensaje XML para enviarlos al navegador cliente.  Esto es así por motivos de rendimiento.  Por ejemplo, la pulsación de un botón podría resultar en la modificación de 10 componentes.  Las 10 actualizaciones se enviarán de vuelta en una unica interacción XML servidor/cliente.</p>
<p>Cuando el motor AJAX de Echo2 del cliente recibe este mensaje XML añadirá nuestro XHTML en el lugar correcto del DOM cliente.</p>
<p><strong>Actualizando XHTML en el DOM cliente</strong></p>
<p>Imaginemos que cambia una propiedad en nuestro componente <code>RulerLine</code>.  Echo2 sabe que el componente ya está representado en el navegador cliente así que no lo volverá a añadir.  En su lugar, detectará este cambio de propiedad y llamará al método <code>renderUpdate</code>.</p>
<p>Así, tenemos la oportunidad de actualizar la representación del componente en el cliente.  Sin embargo como es un componente sencillo no aprovecharemos las maravillas de la "actualización parcial" sino que lo que haremos será eliminar el componente y volverlo a añadir.  Este es nuestro sencillo mecanismo de "actualización".  Posteriormente añadiremos soporte para actualizaciones parciales.</p>
<p>Veamos el método</p>
<blockquote><p>
public boolean renderUpdate(RenderContext rc, ServerComponentUpdate update, String targetId) {<br />
  DomUpdate.renderElementRemove(rc.getServerMessage(), ContainerInstance.getElementId(update.getParent()));<br />
  renderAdd(rc, update, targetId, update.getParent());<br />
  return false;<br />
}
</p></blockquote>
<p>La primera línea crear un mesaje de directiva XML que se utilizará para indicar al motor AJAX del cliente que elimine un cierto elemento DOM por id.</p>
<p>Ahora, si te fijas, verá que el id que aparece aquí no es el id de nuestro componente <code>RulerLine</code> sino un componente devuelto usando <code>update.getParent()</code>.</p>
<p>Bien, realmente eso no está bien.  El método <code>getParent()</code> no tiene demasiado sentido.  El padre en este caso es el componente en cuestion (<code>RulerLine</code>) y se llama padre (parent) porque puede haber tenido componentes <strong>hijos</strong> modificados.  Seguramente hubiese sido mejor llamar a este método algo así como <code>getTargetComponent()</code> para evitar confusiones.</p>
<p>Así que al final, lo que vemos es que el elemento con nuestra id será eliminado del DOM.</p>
<p>La segunda línea llama al método <code>renderAdd()</code> de nuevo para añadir el nuevo XHTML para el <code>RulerLine</code> ya que ya habrá sido eliminado.  Este es el modo más sencillo de actualizar la represencitación de un componente en el lado cliente, la llamada estrategia de eliminar/re-añadir.</p>
<p>El framework Echo2 es muy cuidadoso en cuanto al orden en el que procesa estos mensajes de directiva XML.  Las eliminaciones simpre se realizan antes que la adiciones.</p>
<p><strong>Eliminando XHTML del DOM cliente</strong></p>
<p>Para nuestro sencillo component no tenemos que hacer nada.  Echo2 conoce el id del componente en el DOM y por tanto puede "eliminarlo" enviando un mensaje de directiva XML por nosotros.</p>
<p>Sin embargo, si necesitamos limpiar alguna cosa se invoca al método <code>renderDispose()</code>.  En nuestro caso nosotros no hacemos nada sin embargo lo podríamos utilizar para enviar directivas XML especiales para limpiar los recursos del lado del cliente tales como manejadores de eventos y demás.</p>
<blockquote><p>
public void renderDispose(RenderContext rc, ServerComponentUpdate update, Component component) {<br />
  // no tenemos que hacer nada<br />
}
</p></blockquote>
<p><a href="http://wiki.nextapp.com/echowiki/WritingYourOwnComponentPeersPart1">Vía</a></p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Echo2, GWT, et al.]]></title>
<link>http://achillestortoise.wordpress.com/2006/09/29/6/</link>
<pubDate>Fri, 29 Sep 2006 19:06:15 +0000</pubDate>
<dc:creator>steve</dc:creator>
<guid>http://achillestortoise.fr.wordpress.com/2006/09/29/6/</guid>
<description><![CDATA[I describe in the openarchitectureware post about how I generate code from a model.  This process is]]></description>
<content:encoded><![CDATA[<p>I describe in the <a href="http://achillestortoise.wordpress.com/2006/09/29/openarchitectureware/" title="openarchitectureware">openarchitectureware</a> post about how I generate code from a model.  This process is better and more completely described in the <a href="http://www.eclipse.org/gmt/oaw/doc/4.1/30_emfExample.pdf" target="_blank">OAW 4.1 EMF Tutorial</a>.  Onward to what I have generated:</p>
<p>As a reminder, I created a meta-model that represented a web-based user interface.  The model is basically a set of containers:<br />
Scenarios contain Pages.  Pages contain Sections.  Sections can contain other sections<br />
or Widgets.  Widgets can be output text, input fields, menus, calendars, links to other pages, etc.</p>
<p>So, my first workflow creates a Java Server Faces (JSF) application.  The macros generate all JSP files and all pagecode Java files.  The web.xml and faces-config.xml files are also generated, including the navigation rules between the pages.</p>
<p>My second workflow creates HTML documentation and a input file to <a href="http://www.graphviz.org/" target="_blank">graphviz</a> (which is a great free tool from AT&#38;T for quick-and-easy graphing and I highly recommend you play with it).  &#60;blogPost topic="graphviz" todo="true"/&#62;</p>
<p>After much work on the JSF workflow (due to the requirement to produce a real working application), I have now moved on to an evaluation phase.  I am looking at more Ajaxy/Web 2.0-type applications.  (aknowledging that you <em>can</em> do Ajax with JSF).</p>
<p>My third workflow creates an Echo2 application.  <a href="http://nextapp.com/platform/echo2/echo/" target="_blank">Echo2</a> is an excellent framework from <a href="http://nextapp.com/" target="_blank">NextApp</a>.  Tod Liebeck, the lead developer of Echo2, has <a href="http://www.theserverside.com/news/thread.tss?thread_id=40804" target="_blank">an interesting article </a>comparing GWT and Echo2 on <a href="http://theserverside.com" target="_blank">theserverside.com</a>.   In order to generate the Echo2 code, I made the assumption that a "Page" model class mapped to a WindowPane in the Echo2 framework.  The result is a MDI (multiple document interface) application, where there is a menu bar along the top of the page and the various 'pages' popup as movable/resizable windows.  I am currently working on producing a single-document interface page that will give people something to compare with the MDI approach.</p>
<p>I think the MDI interface is somewhat dated looking, although many modern desktop applications work this way.</p>
<p>After I complete the SDI look, I will move to developing a GWT implementation workflow.</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Still the Champ]]></title>
<link>http://kofno.wordpress.com/2006/09/05/still-the-champ-2/</link>
<pubDate>Tue, 05 Sep 2006 17:44:00 +0000</pubDate>
<dc:creator>kofno</dc:creator>
<guid>http://kofno.fr.wordpress.com/2006/09/05/still-the-champ-2/</guid>
<description><![CDATA[NextApp&#8217;s Echo2 framework is still the sexiest Java web framework I&#8217;ve seen. This demo i]]></description>
<content:encoded><![CDATA[<p>NextApp's Echo2 framework is still the sexiest Java web framework I've seen. <a href="http://demo.nextapp.com/Demo/app">This</a> demo is mighty snazzy.</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Echo2]]></title>
<link>http://rubensa.wordpress.com/2006/03/01/echo2-intro/</link>
<pubDate>Tue, 28 Feb 2006 22:00:14 +0000</pubDate>
<dc:creator>rubensa</dc:creator>
<guid>http://rubensa.fr.wordpress.com/2006/03/01/echo2-intro/</guid>
<description><![CDATA[
Recientemente he estado haciendo una revisión de varios frameworks de desarrollo Web basados en AJ]]></description>
<content:encoded><![CDATA[<p><img src='http://rubensa.wordpress.com/files/2006/11/echo2.png' alt='Echo2' /><br />
Recientemente he estado haciendo una revisión de varios frameworks de desarrollo Web basados en AJAX y de entre todos los que he visto me ha impresionado uno cuya filosofía contrasta con el desarrollo habitual de aplicaciones Web y se acerca más al desarrollo habitual de escritorio en entornos como Swimng. Se trata del framework open-source <a href="http://www.nextapp.com/platform/echo2/echo/">echo2</a>.</p>
<p><!--more--><strong>echo2</strong></p>
<p>echo2 es una nueva versión del Framework Web Echo, una plataforma para desarrollar aplicaciones basadas en web que se aproximen a los clientes ricos. La versión 2.0 se mantiene fiel a los conceptos de Echo a la vez que proporciona una considerable mejora en el rendimiento y la experiencia del usuario gracias a su nuevo motor basado en Ajax.</p>
<p>Echo es un framework para el desarrollo de aplicaciones Web orientado a objetos y basado en eventos. Los frameworks de aplicaciones Web tradicionales siguen la orientación a página natural de interacciones HTTP, que puede ser muy incómoda para aplicaciones muy interactivas u orientadas a datos. Echo le abstrae de la naturaleza de petición-respuesta de HTTP y le permite centrarse en las interacciones de su aplicación utilizando los paradigmas de orientación a objetos y control de eventos habituales en la mayoría de tecnologías de cliente-rico. Gracias a la abstracción proporcionada por Echo, no necesita nococer HTML, HTTP, o JavaScript. Las aplicaciones se pueden instalar en cualquier contenedor de servlets Java. echo2, como su predecesor, es software de código abierto distribuido bajo los términos de la <a href="http://www.nextapp.com/products/mpl_license.html">Mozilla Public License</a> (o, si se prefiere, la <a href="http://www.nextapp.com/products/lgpl_license.html">GNU LGPL License</a>).</p>
<p>Los interfaces de usuario de Echo están compuestos por componentes reutilizables que le permiten controlar la estructura de la página y sus interacciones. La aproximación a orientación a componentes es muy similar a la que se encuentra en otras tecnologías de interfaz utilizadas en otros entornos orientados a objetos, como el Swing de Java o el VisualBasic de Microsoft.</p>
<p><strong>EchoStudio 2</strong></p>
<p><a href="http://www.nextapp.com/platform/echo2/echostudio/">EchoStudio</a> 2.0 es un plugin para la herramienta de desarrollo rápido de aplicaciones Eclipse 3.1 capaz de crear aplicaciones basadas en web que funcionan y se comportan como clientes ricos. Apoyándose en el Framework de código abierto echo2, EchoStudio ofrece herramientas fáciles de utilizar que permiten a los desarrolladores diseñar las interfaces de usuario en menos tiempo.</p>
<p>Las licencias de EchoStucio incluyen la actualización gratuita durante un año a las nuevas versiones del producto (las versiones de correcciones de errores están exentas del límite de un año).</p>
<p>El tipo de licencia utilizado es la licencia por desarrollador, modelo en el que simplemente se adquiere una licencia para cada desarrollador que utilice EchoStudio (1 licencia $499, 5 licencias $2199, 10 licencias $3899, 25 licencias $7999).</p>
<p>No es necesaria ninguna licencia de tiempo de ejecución. El software que se desarrolla utilizando EchoStudio se basa en la plataforma de código abierto Echo, y por tanto se puede distribuir libre de Royalties.</p>
]]></content:encoded>
</item>

</channel>
</rss>
