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

<channel>
	<title>.:: Seam City ::. &#187; seam</title>
	<atom:link href="http://seamcity.madeinxpain.com/archives/category/seam/feed" rel="self" type="application/rss+xml" />
	<link>http://seamcity.madeinxpain.com</link>
	<description>Sobre programación en general, y Seam en particular</description>
	<lastBuildDate>Thu, 22 Jan 2009 15:35:41 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Performance: Porqué usar @Factory en vez de getters</title>
		<link>http://seamcity.madeinxpain.com/archives/performance-%c2%bfpor-que-usar-factory-en-vez-de-getters</link>
		<comments>http://seamcity.madeinxpain.com/archives/performance-%c2%bfpor-que-usar-factory-en-vez-de-getters#comments</comments>
		<pubDate>Thu, 22 Jan 2009 13:59:57 +0000</pubDate>
		<dc:creator>Tes</dc:creator>
				<category><![CDATA[seam]]></category>

		<guid isPermaLink="false">http://seamcity.madeinxpain.com/?p=59</guid>
		<description><![CDATA[Cuando JSF resuelve una #{EL Expression} no cachea los resultados. Esto quiere decir que por cada expresión como #{user.name}, se hará una llamada al método User.getName().
Esto por sí mismo no es peligroso. Pero analicemos este caso típico


@Name&#40;"userManager"&#41;
public class UserManager &#123;
&#160; &#160; public List getUserList&#40;&#41; &#123;
&#160; &#160; &#160; &#160; return createUserList&#40;&#41;;
&#160; &#160; &#125;
&#125;





&#60;h :dataTable value="#{userManager.userList}" var="user"&#62;
&#160; [...]]]></description>
			<content:encoded><![CDATA[<p>Cuando JSF resuelve una #{EL Expression} no cachea los resultados. Esto quiere decir que por cada expresión como #{user.name}, se hará una llamada al método User.getName().</p>
<p>Esto por sí mismo no es peligroso. Pero analicemos este caso típico</p>
<div class="syntax_hilite">
<div id="java-6">
<div class="java">@<a href="http://www.google.com/search?q=allinurl%3AName+java.sun.com&amp;bntl=1" onclick="javascript:pageTracker._trackPageview('article_out/www.google.com');"><span style="color: #aaaadd; font-weight: bold;">Name</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">"userManager"</span><span style="color: #66cc66;">&#41;</span><br />
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> UserManager <span style="color: #66cc66;">&#123;</span></p>
<p>&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">public</span> <a href="http://www.google.com/search?q=allinurl%3AList+java.sun.com&amp;bntl=1" onclick="javascript:pageTracker._trackPageview('article_out/www.google.com');"><span style="color: #aaaadd; font-weight: bold;">List</span></a> getUserList<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">return</span> createUserList<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; &nbsp; <span style="color: #66cc66;">&#125;</span><br />
<span style="color: #66cc66;">&#125;</span></div>
</div>
</div>
<p></p>
<div class="syntax_hilite">
<div id="xml-7">
<div class="xml"><span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;h</span> :dataTable <span style="color: #000066;">value</span>=<span style="color: #ff0000;">"#{userManager.userList}"</span> <span style="color: #000066;">var</span>=<span style="color: #ff0000;">"user"</span><span style="font-weight: bold; color: black;">&gt;</span></span><br />
&nbsp; &nbsp; ...<br />
&nbsp; &nbsp; #{user.name}<br />
&nbsp; &nbsp; ...<br />
<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/h<span style="font-weight: bold; color: black;">&gt;</span></span></span></div>
</div>
</div>
<p></p>
<p>En este caso por cada fila de la tabla, se hará una llamada al método UserManager.getUserList() para obtener el usuario actual. Si el método UserManager.getUserList() implica una llamada a la base de datos, el tiempo de carga crece imcreíblemente.</p>
<p>Una primera solución es usar el patrón de diseño Carga Perezosa (LazyLoad).</p>
<div class="syntax_hilite">
<div id="java-8">
<div class="java">@<a href="http://www.google.com/search?q=allinurl%3AName+java.sun.com&amp;bntl=1" onclick="javascript:pageTracker._trackPageview('article_out/www.google.com');"><span style="color: #aaaadd; font-weight: bold;">Name</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">"userManager"</span><span style="color: #66cc66;">&#41;</span><br />
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> UserManager <span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">private</span> <a href="http://www.google.com/search?q=allinurl%3AList+java.sun.com&amp;bntl=1" onclick="javascript:pageTracker._trackPageview('article_out/www.google.com');"><span style="color: #aaaadd; font-weight: bold;">List</span></a> list;</p>
<p>&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">public</span> <a href="http://www.google.com/search?q=allinurl%3AList+java.sun.com&amp;bntl=1" onclick="javascript:pageTracker._trackPageview('article_out/www.google.com');"><span style="color: #aaaadd; font-weight: bold;">List</span></a> getUserList<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006600;">list</span> == <span style="color: #000000; font-weight: bold;">null</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006600;">list</span> = createUserList<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #66cc66;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">return</span> list;<br />
&nbsp; &nbsp; <span style="color: #66cc66;">&#125;</span><br />
<span style="color: #66cc66;">&#125;</span></div>
</div>
</div>
<p>
De esta forma la lista no se crea cada vez que se la llama desde la página JSF. Pero aún así se sigue invocando el método getUserList() multitud de veces.</p>
<p>La mejor solución es poner la lista en el contexto de la página, y acceder a ella directamente por su nombre en el contexto en vez de por el componente al que pertenece.<br />
Esto se puede hacer mediante la anotación @Out o la anotación @Factory</p>
<div class="syntax_hilite">
<div id="java-9">
<div class="java"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> UserManager <span style="color: #66cc66;">&#123;</span></p>
<p>&nbsp; &nbsp; @Factory<span style="color: #66cc66;">&#40;</span>value = <span style="color: #ff0000;">"userList"</span>, scope = ScopeType.<span style="color: #006600;">PAGE</span><span style="color: #66cc66;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">public</span> <a href="http://www.google.com/search?q=allinurl%3AList+java.sun.com&amp;bntl=1" onclick="javascript:pageTracker._trackPageview('article_out/www.google.com');"><span style="color: #aaaadd; font-weight: bold;">List</span></a> getUserList<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006600;">list</span> == <span style="color: #000000; font-weight: bold;">null</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006600;">list</span> = createUserList<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #66cc66;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">return</span> list;<br />
&nbsp; &nbsp; <span style="color: #66cc66;">&#125;</span><br />
<span style="color: #66cc66;">&#125;</span></div>
</div>
</div>
<p></p>
<div class="syntax_hilite">
<div id="xml-10">
<div class="xml"><span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;h</span> :dataTable <span style="color: #000066;">value</span>=<span style="color: #ff0000;">"#{userList}"</span> <span style="color: #000066;">var</span>=<span style="color: #ff0000;">"user"</span><span style="font-weight: bold; color: black;">&gt;</span></span> // invocamos la variable userList directamente<br />
&nbsp; &nbsp; ...<br />
&nbsp; &nbsp; #{user.name}<br />
&nbsp; &nbsp; ...<br />
<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/h<span style="font-weight: bold; color: black;">&gt;</span></span></span></div>
</div>
</div>
<p></p>
]]></content:encoded>
			<wfw:commentRss>http://seamcity.madeinxpain.com/archives/performance-%c2%bfpor-que-usar-factory-en-vez-de-getters/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cómo obtener un componente de seam sin usar la anotacion @In</title>
		<link>http://seamcity.madeinxpain.com/archives/como-obtener-un-componente-de-seam-sin-usar-la-anotacion-in</link>
		<comments>http://seamcity.madeinxpain.com/archives/como-obtener-un-componente-de-seam-sin-usar-la-anotacion-in#comments</comments>
		<pubDate>Thu, 22 Jan 2009 13:16:27 +0000</pubDate>
		<dc:creator>Tes</dc:creator>
				<category><![CDATA[seam]]></category>
		<category><![CDATA[Add new tag]]></category>

		<guid isPermaLink="false">http://seamcity.madeinxpain.com/?p=57</guid>
		<description><![CDATA[En seam, la forma más fácil de obtener un componente es usando la inyección de dependencias mediante la anotación @In. Sin embargo, las anotaciones para la bijection solo funcionan si se utilizan desde otro componente de Seam marcado mediante la anotación @Name.
Es decir, si en una clase 'normal' (sin la anotación @Name) utilizas un @In [...]]]></description>
			<content:encoded><![CDATA[<p>En seam, la forma más fácil de obtener un componente es usando la inyección de dependencias mediante la anotación @In. Sin embargo, las anotaciones para la bijection solo funcionan si se utilizan desde otro componente de Seam marcado mediante la anotación @Name.</p>
<p>Es decir, si en una clase 'normal' (sin la anotación @Name) utilizas un @In o un @Out o cualquier otra anotación propia de Seam, esta será ignorada. Aun así,  la API de Seam nos permite obtener instancias de otros componentes directamente, buscándolos a través de su nombre o de su clase.</p>
<div class="syntax_hilite">
<div id="java-12">
<div class="java"><span style="color: #808080; font-style: italic;">// Obtiene una instancia de un componente a través de su clase</span><br />
<a href="http://www.google.com/search?q=allinurl%3AComponent+java.sun.com&amp;bntl=1" onclick="javascript:pageTracker._trackPageview('article_out/www.google.com');"><span style="color: #aaaadd; font-weight: bold;">Component</span></a>.<span style="color: #006600;">getInstance</span><span style="color: #66cc66;">&#40;</span><span style="color: #000000; font-weight: bold;">Class</span> clazz<span style="color: #66cc66;">&#41;</span></p>
<p><span style="color: #808080; font-style: italic;">// Obtiene una instancia de un componente a través de su nombre</span><br />
<a href="http://www.google.com/search?q=allinurl%3AComponent+java.sun.com&amp;bntl=1" onclick="javascript:pageTracker._trackPageview('article_out/www.google.com');"><span style="color: #aaaadd; font-weight: bold;">Component</span></a>.<span style="color: #006600;">getInstance</span><span style="color: #66cc66;">&#40;</span><a href="http://www.google.com/search?q=allinurl%3AString+java.sun.com&amp;bntl=1" onclick="javascript:pageTracker._trackPageview('article_out/www.google.com');"><span style="color: #aaaadd; font-weight: bold;">String</span></a> name<span style="color: #66cc66;">&#41;</span></div>
</div>
</div>
<p>
El metodo getInstance también admite <a href="http://docs.jboss.org/seam/latest/api/org/jboss/seam/Component.html" onclick="javascript:pageTracker._trackPageview('article_out/docs.jboss.org');" target="_blank">otros parametros</a> para indicar si hay que crear el elemento, su contexto, etc..</p>
]]></content:encoded>
			<wfw:commentRss>http://seamcity.madeinxpain.com/archives/como-obtener-un-componente-de-seam-sin-usar-la-anotacion-in/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Eventos en Seam</title>
		<link>http://seamcity.madeinxpain.com/archives/eventos-en-seam</link>
		<comments>http://seamcity.madeinxpain.com/archives/eventos-en-seam#comments</comments>
		<pubDate>Sat, 06 Sep 2008 04:07:32 +0000</pubDate>
		<dc:creator>Tes</dc:creator>
				<category><![CDATA[seam]]></category>
		<category><![CDATA[aop]]></category>

		<guid isPermaLink="false">http://seamcity.madeinxpain.com/?p=53</guid>
		<description><![CDATA[Durante su funcionamiento, Seam lanza una serie de eventos predefinidos al realizar ciertas.
Estos eventos pueden ser escuchados por nuestra aplicación y actuar en consecuencia.
Algunos eventos interesantes son:

org.jboss.seam.validationFailed : Se lanza cuando hay un fallo de validación
org.jboss.seam.postCreate.&#60;name&#62; : Se lanza cuando el componente con nombre  &#60;name&#62; se instancia. Se puede usar de forma similar a [...]]]></description>
			<content:encoded><![CDATA[<p>Durante su funcionamiento, Seam lanza una serie de eventos predefinidos al realizar ciertas.<br />
Estos eventos pueden ser escuchados por nuestra aplicación y actuar en consecuencia.<br />
Algunos eventos interesantes son:</p>
<ul>
<li><em><strong>org.jboss.seam.validationFailed</strong></em> : Se lanza cuando hay un fallo de validación</li>
<li><em><strong>org.jboss.seam.postCreate.&lt;name&gt;</strong></em> : Se lanza cuando el componente con nombre <em> &lt;name&gt;</em> se instancia. Se puede usar de forma similar a la anotación <em>@Create</em> de los EJBs</li>
<li><em><strong>org.jboss.seam.exceptionNotHandled</strong></em> : Se lanza cuando salta una excepción que no es manejada por Seam.</li>
<li><em><strong>org.jboss.seam.beforePhase y org.jboss.seam.afterPhase</strong></em> : Se lanzan respectivamente antes del inicio y después del final de cada fase JSF. Este evento es lanzado con el parámetro PhaseEvent, que indica la fase que empieza/acaba</li>
</ul>
<p>La lista completa de eventos puede verse en el <a title="Contextual Events" href="http://docs.jboss.com/seam/2.0.1.GA/reference/en/html/events.html#d0e4167" onclick="javascript:pageTracker._trackPageview('article_out/docs.jboss.com');" target="_blank">manual</a></p>
<p>Para escuchar eventos en Seam debemos usar la anotación <em><strong>@Observe</strong></em> para anotar un método que se ejecutará en respuesta al evento. Este método deber ser siempre público y, en el caso de los eventos predefinidos, sin argumentos (con alguna excepcion).<br />
Hay que tener en cuenta que estos métodos se ejecutan en el mismo hilo que la traza principal, de forma que hasta que no terminen de ejecutarse la aplicación no continuará, por lo que hay que tener cuidado.</p>
<div class="syntax_hilite">
<div id="java-18">
<div class="java">@Observe<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">"nombre-del-evento"</span><span style="color: #66cc66;">&#41;</span><br />
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #993333;">void</span> metodoEscuchador<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp;<span style="color: #808080; font-style: italic;">// do domething</span><br />
<span style="color: #66cc66;">&#125;</span></div>
</div>
</div>
<p></p>
<p>Pero aparte de los eventos predefinidos, también podemos lanzar y escuchar nuestros propios eventos.<br />
Disponemos de varias formas de lanzar nuestros eventos personalizados:</p>
<ul>
<li><strong>Etiqueta <em>@RaiseEvent</em></strong><br />
Al ejecutar un método anotado con la etiqueta @RaiseEvent, se lanzará el evento indicado</p>
<div class="syntax_hilite">
<div id="java-19">
<div class="java">@RaiseEvent<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">"venta-confirmada"</span><span style="color: #66cc66;">&#41;</span><br />
<span style="color: #000000; font-weight: bold;">public</span> <a href="http://www.google.com/search?q=allinurl%3AString+java.sun.com&amp;bntl=1" onclick="javascript:pageTracker._trackPageview('article_out/www.google.com');"><span style="color: #aaaadd; font-weight: bold;">String</span></a> confirmarVenta<span style="color: #66cc66;">&#40;</span><span style="color: #993333;">int</span> idVenta<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span><br />
&nbsp; <span style="color: #808080; font-style: italic;">// cuerpo del metodo</span><br />
<span style="color: #66cc66;">&#125;</span></div>
</div>
</div>
<p>
</li>
<li><strong>Fichero de navegación <em>pages.xml</em></strong><br />
Puedes lanzar un evento mediante la etiqueta &lt;raise-event&gt;</p>
<div class="syntax_hilite">
<div id="xml-20">
<div class="xml"><span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;navigation</span> <span style="color: #000066;">from-action</span>=<span style="color: #ff0000;">"#{manager.confirmarVenta}"</span><span style="font-weight: bold; color: black;">&gt;</span></span><br />
&nbsp; &nbsp; <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;rule</span> <span style="color: #000066;">if-outcome</span>=<span style="color: #ff0000;">"success"</span><span style="font-weight: bold; color: black;">&gt;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;raise</span> -event <span style="color: #000066;">type</span>=<span style="color: #ff0000;">"venta-confirmada"</span> <span style="font-weight: bold; color: black;">/&gt;</span></span><br />
&nbsp; &nbsp; <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;redirect</span> <span style="color: #000066;">view-id</span>=<span style="color: #ff0000;">"home"</span><span style="font-weight: bold; color: black;">/&gt;</span></span><br />
&nbsp; &nbsp; <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/rule<span style="font-weight: bold; color: black;">&gt;</span></span></span><br />
<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/navigation<span style="font-weight: bold; color: black;">&gt;</span></span></span></div>
</div>
</div>
<p>
</li>
<li><strong>Mediante el componente <em>Events</em></strong><br />
Este componente permite lanzar eventos <strong>síncronos</strong> o <strong>asíncronos</strong> de manera programática.<br />
Los eventos lanzados de forma asíncrona se ejecutan en un hilo paralelo, por lo que son ideales para tareas pesadas o susceptibles de fallo que no deberían afectar al resto del sistema, como envío de emails, estadísticas...</p>
<p>Las ventajas de usar esta manera de lanzar eventos es que, aparte de poder lanzar eventos asíncronos, se pueden añadir <strong>parámetros</strong> al evento, que serán pasados como argumentos a la función que los observe en el orden en el que se añaden. Por ello, la función observadora debe tener como máximo el mismo número de argumentos de los que se envían al lanzar el evento, y siempre el mismo tipo.<br />
También permite lanzar eventos al cabo de un determinado tiempo o lanzarlos al final de la transacción en curso.</p>
<p>Aquí vemos un ejemplo que ejecuta un método a través de eventos cada vez que se confirma una venta.</p>
<div class="syntax_hilite">
<div id="java-21">
<div class="java"><span style="color: #000000; font-weight: bold;">public</span> <a href="http://www.google.com/search?q=allinurl%3AString+java.sun.com&amp;bntl=1" onclick="javascript:pageTracker._trackPageview('article_out/www.google.com');"><span style="color: #aaaadd; font-weight: bold;">String</span></a> confirmarVenta<span style="color: #66cc66;">&#40;</span><span style="color: #993333;">int</span> idVenta<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; Events.<span style="color: #006600;">instance</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>.<span style="color: #006600;">raiseEvent</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">"venta-confirmada"</span>, idVenta<span style="color: #66cc66;">&#41;</span>;<br />
<span style="color: #66cc66;">&#125;</span></p>
<p>@Observe<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">"venta-confirmada"</span><span style="color: #66cc66;">&#41;</span><br />
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #993333;">void</span> observarVentaConfirmada<span style="color: #66cc66;">&#40;</span><span style="color: #993333;">int</span> idVenta<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #808080; font-style: italic;">// do domething</span><br />
<span style="color: #66cc66;">&#125;</span></div>
</div>
</div>
<p>
También podemos optar por lanzar el evento de forma asíncrona y/o añadir más parámetros al evento, los cuales serán ignorado por las funciones observadoras con menor numero de argumentos</p>
<div class="syntax_hilite">
<div id="java-22">
<div class="java"><span style="color: #000000; font-weight: bold;">public</span> <a href="http://www.google.com/search?q=allinurl%3AString+java.sun.com&amp;bntl=1" onclick="javascript:pageTracker._trackPageview('article_out/www.google.com');"><span style="color: #aaaadd; font-weight: bold;">String</span></a> confirmarVenta<span style="color: #66cc66;">&#40;</span><span style="color: #993333;">int</span> idVenta<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; Events.<span style="color: #006600;">instance</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>.<span style="color: #006600;">raiseEvent</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">"venta-confirmada"</span>, idVenta, idVendedor<span style="color: #66cc66;">&#41;</span>;<br />
<span style="color: #66cc66;">&#125;</span></p>
<p>@Observe<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">"venta-confirmada"</span><span style="color: #66cc66;">&#41;</span><br />
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #993333;">void</span> registraVenta<span style="color: #66cc66;">&#40;</span><span style="color: #993333;">int</span> idVenta<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #808080; font-style: italic;">// solo nos interesa el identificador de venta</span><br />
<span style="color: #66cc66;">&#125;</span></p>
<p>@Observe<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">"venta-confirmada"</span><span style="color: #66cc66;">&#41;</span><br />
<span style="color: #000000; font-weight: bold;">public</span> <a href="http://www.google.com/search?q=allinurl%3AString+java.sun.com&amp;bntl=1" onclick="javascript:pageTracker._trackPageview('article_out/www.google.com');"><span style="color: #aaaadd; font-weight: bold;">String</span></a> otorgaComisionAlVendedor<span style="color: #66cc66;">&#40;</span><span style="color: #993333;">int</span> idVenta, <span style="color: #993333;">int</span> idVendedor<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #808080; font-style: italic;">// Obtenemos ambos parámetros</span><br />
<span style="color: #66cc66;">&#125;</span></div>
</div>
</div>
<p>
</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://seamcity.madeinxpain.com/archives/eventos-en-seam/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SEO-friendly URLs con Seam</title>
		<link>http://seamcity.madeinxpain.com/archives/seo-friendly-urls-con-seam</link>
		<comments>http://seamcity.madeinxpain.com/archives/seo-friendly-urls-con-seam#comments</comments>
		<pubDate>Thu, 17 Jul 2008 06:36:53 +0000</pubDate>
		<dc:creator>Tes</dc:creator>
				<category><![CDATA[seam]]></category>
		<category><![CDATA[seo]]></category>

		<guid isPermaLink="false">http://seamcity.madeinxpain.com/?p=51</guid>
		<description><![CDATA[Hoy en día están muy de moda las aplicaciones web y blogs con URLs amigables, tipo http://seamcity.madeinxpain.com/archives/category/seam.
Estas URLs además de ser más intuitivas y agradables a la vista, también son más agradables para buscadores de internet como google (o podríamos decir más agradables para EL BUSCADOR de internet).Esta es una de las técnicas seo más [...]]]></description>
			<content:encoded><![CDATA[<p>Hoy en día están muy de moda las aplicaciones web y blogs con URLs amigables, tipo http://seamcity.madeinxpain.com/archives/category/seam.</p>
<p>Estas URLs además de ser más intuitivas y agradables a la vista, también son más agradables para buscadores de internet como google (o podríamos decir más agradables para EL BUSCADOR de internet).Esta es una de las <a href="http://es.wikipedia.org/wiki/Barnizagaitas" onclick="javascript:pageTracker._trackPageview('article_out/es.wikipedia.org');" target="_blank">técnicas seo</a> más simples, destinadas a mejorar tu posicionamiento en buscadores.</p>
<p>En Seam podemos obtener estas URLs sencillas a través del filtro URLrewrite. Este filtro básicamente se encarga de traducir URLs, y es muy muy fácil de usar.<br />
Una de las principales ventajas es que es una capa independiente que se coloca por encima de la aplicación. No es necesario modificar ni una línea de código ya existente, simplemente definir cómo se van a traducir las direcciones.</p>
<ol>
<li>Añadir el archivo <strong>urlrewrite.jar</strong> que viene incluido en la distribución de Seam en la carpeta WEB-INF/lib del proyecto. La mejor forma de hacerlo es mediante el archivo de ant que crea el seam-gen</li>
<li><strong>Configurar el filtro</strong> UrlRewrite en el web.xml tal y como se indica <a href="http://tuckey.org/urlrewrite/" onclick="javascript:pageTracker._trackPageview('article_out/tuckey.org');">aqui</a></li>
<li>Crear el fichero <strong>urlrewrite.xml</strong> que contiene las reglas de traduccion de urls en la carpeta WEB-INF. Aqui pongo el  fichero del ejemplo <em>seambay</em>, pero lo mejor es mirar la <a href="http://tuckey.org/urlrewrite/manual/3.0/" onclick="javascript:pageTracker._trackPageview('article_out/tuckey.org');">documentacion oficial</a>
<div class="syntax_hilite">
<div id="xml-24">
<div class="xml"><span style="color: #00bbdd;">&lt;!DOCTYPE urlrewrite<br />
&nbsp; &nbsp; PUBLIC &quot;-//tuckey.org//DTD UrlRewrite 3.0//EN&quot;<br />
&nbsp; &nbsp; &quot;http://tuckey.org/res/dtds/urlrewrite3.0.dtd&quot;&gt;</span></p>
<p><span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;urlrewrite<span style="font-weight: bold; color: black;">&gt;</span></span></span></p>
<p>&nbsp; &nbsp;<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;rule<span style="font-weight: bold; color: black;">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp;<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;from<span style="font-weight: bold; color: black;">&gt;</span></span></span>^/feedback/([A-Za-z0-9]*)$<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/from<span style="font-weight: bold; color: black;">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp;<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;to</span> <span style="color: #000066;">last</span>=<span style="color: #ff0000;">"true"</span><span style="font-weight: bold; color: black;">&gt;</span></span>/feedback.seam?member=$1<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/to<span style="font-weight: bold; color: black;">&gt;</span></span></span><br />
&nbsp; &nbsp;<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/rule<span style="font-weight: bold; color: black;">&gt;</span></span></span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp;<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;rule<span style="font-weight: bold; color: black;">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp;<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;from<span style="font-weight: bold; color: black;">&gt;</span></span></span>^/itemdetail/([0-9]*)$<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/from<span style="font-weight: bold; color: black;">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp;<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;to</span> <span style="color: #000066;">last</span>=<span style="color: #ff0000;">"true"</span><span style="font-weight: bold; color: black;">&gt;</span></span>/auction.seam?id=$1<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/to<span style="font-weight: bold; color: black;">&gt;</span></span></span><br />
&nbsp; &nbsp;<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/rule<span style="font-weight: bold; color: black;">&gt;</span></span></span><br />
&nbsp; &nbsp;<br />
&nbsp; &nbsp;<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;rule<span style="font-weight: bold; color: black;">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp;<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;from<span style="font-weight: bold; color: black;">&gt;</span></span></span>^/bidhistory/([0-9]*)$<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/from<span style="font-weight: bold; color: black;">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp;<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;to</span> <span style="color: #000066;">last</span>=<span style="color: #ff0000;">"true"</span><span style="font-weight: bold; color: black;">&gt;</span></span>/bidhistory.seam?id=$1<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/to<span style="font-weight: bold; color: black;">&gt;</span></span></span><br />
&nbsp; &nbsp;<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/rule<span style="font-weight: bold; color: black;">&gt;</span></span></span></p>
<p><span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/urlrewrite<span style="font-weight: bold; color: black;">&gt;</span></span></span></div>
</div>
</div>
<p></li>
</ol>
<p>En otro post esplicaré con más detalle las posibilidades del fichero urlrewrite.xml, cómo usar parámetros, cómo traducir de nombres a identificadores numéricos, y cómo conseguir que las urls amigables las pueda generar nuestra aplicación tras el envío de formularios o acciones.</p>
]]></content:encoded>
			<wfw:commentRss>http://seamcity.madeinxpain.com/archives/seo-friendly-urls-con-seam/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Como inyectar un EntityManager en Seam</title>
		<link>http://seamcity.madeinxpain.com/archives/como-inyectar-un-entitymanager-en-seam</link>
		<comments>http://seamcity.madeinxpain.com/archives/como-inyectar-un-entitymanager-en-seam#comments</comments>
		<pubDate>Wed, 04 Jun 2008 07:21:01 +0000</pubDate>
		<dc:creator>Tes</dc:creator>
				<category><![CDATA[seam]]></category>
		<category><![CDATA[jpa]]></category>

		<guid isPermaLink="false">http://seamcity.madeinxpain.com/?p=50</guid>
		<description><![CDATA[Con la llegada de EJB 3 y JPA nace la figura del EntityManager para simplificar la persistencia de objetos.
Y gracias a las anotaciones, el EntityManager puede ser inyectado por el contenedor de EJBs.
Vamos a ver diferentes formas de obtener un EntityManager en Seam a través de anotaciones.




@PersistenceContext
EntityManager entityManager;



El EntityManager es inyectado directamente por el EJB [...]]]></description>
			<content:encoded><![CDATA[<p>Con la llegada de EJB 3 y JPA nace la figura del EntityManager para simplificar la persistencia de objetos.<br />
Y gracias a las anotaciones, el EntityManager puede ser inyectado por el contenedor de EJBs.<br />
Vamos a ver diferentes formas de obtener un EntityManager en Seam a través de anotaciones.</p>
<ul>
<li>
<div class="syntax_hilite">
<div id="java-29">
<div class="java">@PersistenceContext<br />
EntityManager entityManager;</div>
</div>
</div>
<p>
El EntityManager es inyectado directamente por el EJB container. El ciclo de vida del EntityManager inyectado de esta forma terminará cuando la transacción sea completada.<br />
Tras el cierre de la transacción, las entidades son desacopladas del contexto de persistencia, lo que puede dar lugar a una LazyLoadException.</li>
<li>
<div class="syntax_hilite">
<div id="java-30">
<div class="java">@PersistenceContext<span style="color: #66cc66;">&#40;</span>type=PersistenceContextType.<span style="color: #006600;">EXTENDED</span><span style="color: #66cc66;">&#41;</span><br />
EntityManager entityManager;</div>
</div>
</div>
<p>
El EntityManager es inyectado directamente por el EJB container, y estará disponible aún después de que la transacción haya sido completa.<br />
Las entidades pueden seguir asociadas al contexto de persistencia durante varias interacciones.</li>
<li>
<div class="syntax_hilite">
<div id="java-31">
<div class="java">@In<br />
EntityManager entityManager;</div>
</div>
</div>
<p>
De esta forma, el EntityManager es inyectado por Seam y asociado al contexto de conversación, con las mismmas características que un EntityManager de tipo extendido.</li>
<li>
<div class="syntax_hilite">
<div id="java-32">
<div class="java">@PersistenceUnit<br />
EntityManagerFactory;</p>
<p><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #993333;">void</span> getNewEmInstance<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span><br />
<span style="color: #000000; font-weight: bold;">return</span> emf.<span style="color: #006600;">createEntityManager</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;<br />
<span style="color: #66cc66;">&#125;</span></div>
</div>
</div>
<p>
Esta anotacion inyecta un EntityManagerFactory, que permite crear objetos EntityManager mediante el método EntityManagerFactory.createEntityManager();</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://seamcity.madeinxpain.com/archives/como-inyectar-un-entitymanager-en-seam/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Seam y Ajax con Seam Remoting</title>
		<link>http://seamcity.madeinxpain.com/archives/seam-y-ajax-con-seam-remoting</link>
		<comments>http://seamcity.madeinxpain.com/archives/seam-y-ajax-con-seam-remoting#comments</comments>
		<pubDate>Thu, 29 May 2008 09:16:35 +0000</pubDate>
		<dc:creator>Tes</dc:creator>
				<category><![CDATA[seam]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://seamcity.madeinxpain.com/?p=42</guid>
		<description><![CDATA[Realizar peticiones Ajax a tus componentes en Seam es increíblemente fácil gracias al framework Seam Remoting.
Con solo añadir un par de lineas de javascript, tu componente escrito en Java se convierte en un componente javascript, pudiendo acceder a sus campos y ejecutar sus métodos asíncronamente.
En simplemente tres pasos podemos invocar a un componente y manejar [...]]]></description>
			<content:encoded><![CDATA[<p>Realizar peticiones Ajax a tus componentes en Seam es increíblemente fácil gracias al framework Seam Remoting.<br />
Con solo añadir un par de lineas de javascript, tu componente escrito en Java se convierte en un componente javascript, pudiendo acceder a sus campos y ejecutar sus métodos asíncronamente.<br />
En simplemente tres pasos podemos invocar a un componente y manejar la respuesta.</p>
<p><strong>1) Indica los métodos que van a invocarse vía Ajax</strong><br />
Simplemente marca con la anotación @WebRemote los métodos que quieras invocar por Ajax.</p>
<div class="syntax_hilite">
<div id="java-40">
<div class="java">@<a href="http://www.google.com/search?q=allinurl%3AName+java.sun.com&amp;bntl=1" onclick="javascript:pageTracker._trackPageview('article_out/www.google.com');"><span style="color: #aaaadd; font-weight: bold;">Name</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">"calculadora"</span><span style="color: #66cc66;">&#41;</span><br />
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> Calculadora <span style="color: #66cc66;">&#123;</span></p>
<p>&nbsp; &nbsp;<span style="color: #000000; font-weight: bold;">private</span> float pi = <span style="color: #cc66cc;">3</span>.<span style="color: #cc66cc;">14</span>;<br />
&nbsp; &nbsp;<span style="color: #000000; font-weight: bold;">private</span> float n = <span style="color: #cc66cc;">10</span>;</p>
<p>&nbsp; &nbsp; @WebRemote<br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #993333;">int</span> suma<span style="color: #66cc66;">&#40;</span>float a, float b<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">return</span> a+b<br />
&nbsp; &nbsp; <span style="color: #66cc66;">&#125;</span></p>
<p>&nbsp; &nbsp; @WebRemote<br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #993333;">int</span> sumaConstante<span style="color: #66cc66;">&#40;</span>float a<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006600;">n</span> + a;<br />
&nbsp; &nbsp; <span style="color: #66cc66;">&#125;</span></p>
<p>&nbsp; &nbsp; <span style="color: #808080; font-style: italic;">// Este metodo no está marcado con @WebRemote, por lo que no se puede invocar desde javascript</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #993333;">void</span> metodoNoAjax<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #66cc66;">&#125;</span><br />
&nbsp; <br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">public</span> float getPi<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span> <span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006600;">pi</span>;<span style="color: #66cc66;">&#125;</span><br />
<span style="color: #66cc66;">&#125;</span></div>
</div>
</div>
<p></p>
<p>Si quisieses invocar un EJB en lugar de un POJO, las anotaciones @WebRemote deberán estar en la declaración los métodos de la interface del EJB.</p>
<p><strong>2) Importa los scripts necesarios</strong><br />
Primero debes importar el script que contiene el código que permite las llamadas remotas:</p>
<div class="syntax_hilite">
<div id="javascript-41">
<div class="javascript">&lt;script type=<span style="color: #3366CC;">"text/javascript"</span> src=<span style="color: #3366CC;">"seam/resource/remoting/resource/remote.js"</span>&gt;&lt;/script&gt;</div>
</div>
</div>
<p></p>
<p>Ahora por cada componente que contenga métodos que quieras invocar vía Ajax debes importar otro script en el que indicas el nombre del componente (el que has definido en la anotacion @Name).<br />
Este script contiene el stub del componente, que indica los métodos a los que puedes llamar y la definición de sus tipos.<br />
Por ejemplo, si tienes un componente anotado con @Name("calculadora") deberás incluir la siguiente linea</p>
<div class="syntax_hilite">
<div id="javascript-42">
<div class="javascript">&lt;script type=<span style="color: #3366CC;">"text/javascript"</span> src=<span style="color: #3366CC;">"seam/resource/remoting/interface.js?calculadora"</span>&gt;&lt;/script&gt;</div>
</div>
</div>
<p></p>
<p>Si quisieses acceder a más de un componente en la misma página puedes especificar varios componentes:</p>
<div class="syntax_hilite">
<div id="javascript-43">
<div class="javascript">&lt;script type=<span style="color: #3366CC;">"text/javascript"</span> src=<span style="color: #3366CC;">"seam/resource/remoting/interface.js?calculadora&amp;componente2&amp;componente3"</span>&gt;&lt;/script&gt;</div>
</div>
</div>
<p></p>
<p>También puedes importar el javascript de los componentes usando el tag s:remote.</p>
<div class="syntax_hilite">
<div id="javascript-44">
<div class="javascript">&lt;s :remote include=<span style="color: #3366CC;">"calculadora,componente2,componente3"</span>/&gt;</div>
</div>
</div>
<p></p>
<p><strong>3) Invoca el método y maneja la respuesta</strong><br />
Ahora podemos invocar los métodos de nuestra calculadora marcados con @WebRemote.<br />
Para obtener los objetos javascript que representan nuestros componentes debemos hacerlo a través de Seam.Component.<br />
En la llamada le pasamos los parámetros que tenga el método al que estemos invocando (admite sobrecarga) y un último parámetro que será la función a la que se invocará con el resultado de la invocación</p>
<div class="syntax_hilite">
<div id="javascript-45">
<div class="javascript">&lt;script type=<span style="color: #3366CC;">"text/javascript"</span>&gt;<br />
&nbsp; <span style="color: #009900; font-style: italic;">//&lt;![CDATA[</span></p>
<p>&nbsp; <span style="color: #003366; font-weight: bold;">function</span> suma<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; Seam.<span style="color: #006600;">Component</span>.<span style="color: #006600;">getInstance</span><span style="color: #66cc66;">&#40;</span><span style="color: #3366CC;">"calculadora"</span><span style="color: #66cc66;">&#41;</span>.<span style="color: #006600;">suma</span><span style="color: #66cc66;">&#40;</span><span style="color: #CC0000;">1</span>, <span style="color: #CC0000;">5</span>, muestraResultado<span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; <span style="color: #66cc66;">&#125;</span></p>
<p>&nbsp; <span style="color: #003366; font-weight: bold;">function</span> muestraResultado<span style="color: #66cc66;">&#40;</span>result<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #000066;">alert</span><span style="color: #66cc66;">&#40;</span>result<span style="color: #66cc66;">&#41;</span>; <span style="color: #009900; font-style: italic;">// --&gt; mostrará un 6</span><br />
&nbsp; <span style="color: #66cc66;">&#125;</span></p>
<p>&nbsp; &nbsp;<span style="color: #009900; font-style: italic;">// ]]&gt;</span><br />
&lt;/script&gt;</div>
</div>
</div>
<p></p>
<p>También puedes acceder a los campos del componente que tengan un getter asignar un valor a los que tengan un setter.</p>
<div class="syntax_hilite">
<div id="javascript-46">
<div class="javascript">&lt;script type=<span style="color: #3366CC;">"text/javascript"</span>&gt;<br />
&nbsp; <span style="color: #009900; font-style: italic;">//&lt;![CDATA[</span></p>
<p>&nbsp; <span style="color: #003366; font-weight: bold;">var</span> calc = Seam.<span style="color: #006600;">Component</span>.<span style="color: #006600;">getInstance</span><span style="color: #66cc66;">&#40;</span><span style="color: #3366CC;">"calculadora"</span><span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; <span style="color: #003366; font-weight: bold;">function</span> suma<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; calc.<span style="color: #006600;">n</span> = <span style="color: #CC0000;">25</span>;<br />
&nbsp; &nbsp; calc.<span style="color: #006600;">sumaConstante</span><span style="color: #66cc66;">&#40;</span><span style="color: #CC0000;">5</span>, muestraResultado<span style="color: #66cc66;">&#41;</span><br />
&nbsp; <span style="color: #66cc66;">&#125;</span></p>
<p>&nbsp; <span style="color: #003366; font-weight: bold;">function</span> muestraResultado<span style="color: #66cc66;">&#40;</span>result<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #000066;">alert</span><span style="color: #66cc66;">&#40;</span>result<span style="color: #66cc66;">&#41;</span>;&nbsp; &nbsp;<span style="color: #009900; font-style: italic;">// --&gt; mostrará 30</span><br />
&nbsp; &nbsp; <span style="color: #000066;">alert</span><span style="color: #66cc66;">&#40;</span>calc.<span style="color: #006600;">pi</span><span style="color: #66cc66;">&#41;</span>; <span style="color: #009900; font-style: italic;">// --&gt; mostrará 3.14</span><br />
&nbsp; <span style="color: #66cc66;">&#125;</span></p>
<p>&nbsp; &nbsp;<span style="color: #009900; font-style: italic;">// ]]&gt;</span><br />
&lt;/script&gt;</div>
</div>
</div>
<p></p>
<p>Seam Remoting también permite evaluar EL Expressions, trabajar con Collections, hacer debug de las llamadas enviadas y recibidas, suscribirse a una cola JMS.<br />
Toda esta información y más se encuentra disponible en la <a href="http://docs.jboss.com/seam/2.0.0.GA/reference/en/html/remoting.html" onclick="javascript:pageTracker._trackPageview('article_out/docs.jboss.com');">documentación</a> en inglés</p>
]]></content:encoded>
			<wfw:commentRss>http://seamcity.madeinxpain.com/archives/seam-y-ajax-con-seam-remoting/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Obtener un EntityManager sin inyección de dependencias</title>
		<link>http://seamcity.madeinxpain.com/archives/obtener-un-entitymanager-sin-inyeccion-de-dependencias</link>
		<comments>http://seamcity.madeinxpain.com/archives/obtener-un-entitymanager-sin-inyeccion-de-dependencias#comments</comments>
		<pubDate>Wed, 28 May 2008 07:31:42 +0000</pubDate>
		<dc:creator>Tes</dc:creator>
				<category><![CDATA[seam]]></category>
		<category><![CDATA[jpa]]></category>

		<guid isPermaLink="false">http://seamcity.madeinxpain.com/?p=47</guid>
		<description><![CDATA[Para obtener un EntityManager en un componente Seam, la vía más fácil es usar la anotación @In y disfrutar de las ventajas del mecanismo de inyección de dependencias de Seam.


@In
EntityManager entityManager;



Pero estas ventajas solo están disponibles dentro de los componentes, es decir, en aquellas clases anotadas con @Name.
Si en una clase normal quisiésemos obtener el [...]]]></description>
			<content:encoded><![CDATA[<p>Para obtener un EntityManager en un componente Seam, la vía más fácil es usar la anotación <em>@In</em> y disfrutar de las ventajas del mecanismo de inyección de dependencias de Seam.</p>
<div class="syntax_hilite">
<div id="java-49">
<div class="java">@In<br />
EntityManager entityManager;</div>
</div>
</div>
<p></p>
<p>Pero estas ventajas solo están disponibles dentro de los componentes, es decir, en aquellas clases anotadas con <em>@Name</em>.<br />
Si en una clase <em>normal</em> quisiésemos obtener el EntityManager, deberíamos hacerlo manualmente.</p>
<div class="syntax_hilite">
<div id="java-50">
<div class="java"><span style="color: #808080; font-style: italic;">// PERSISTENCE_UNIT_NAME es el nombre del persistence-unit definido en el archivo persistence.xml</span><br />
EntityManagerFactory emf = Persistence.<span style="color: #006600;">createEntityManagerFactory</span><span style="color: #66cc66;">&#40;</span>PERSISTENCE_UNIT_NAME<span style="color: #66cc66;">&#41;</span>;<br />
EntityManager em = emf.<span style="color: #006600;">createEntityManager</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;</div>
</div>
</div>
<p></p>
]]></content:encoded>
			<wfw:commentRss>http://seamcity.madeinxpain.com/archives/obtener-un-entitymanager-sin-inyeccion-de-dependencias/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Seam Generator (seam-gen)</title>
		<link>http://seamcity.madeinxpain.com/archives/seam-generator-seam-gen</link>
		<comments>http://seamcity.madeinxpain.com/archives/seam-generator-seam-gen#comments</comments>
		<pubDate>Mon, 11 Feb 2008 10:14:16 +0000</pubDate>
		<dc:creator>Tes</dc:creator>
				<category><![CDATA[seam]]></category>

		<guid isPermaLink="false">http://seamcity.madeinxpain.com/archives/32</guid>
		<description><![CDATA[La distribución de Seam incluye una aplicación de linea de comandos para crear y mantener aplicaciones Seam.
Esta herramienta es capaz de generar un proyecto Seam que contenga el esqueleto de una aplicación, incluyendo configuración y librerías. Esta es la forma más rápida de empezar un desarrollo con Seam. Genera una aplicación en blanco con facelets, [...]]]></description>
			<content:encoded><![CDATA[<p>La distribución de Seam incluye una aplicación de linea de comandos para crear y mantener aplicaciones Seam.<br />
Esta herramienta es capaz de generar un proyecto Seam que contenga el esqueleto de una aplicación, incluyendo configuración y librerías. Esta es la forma más rápida de empezar un desarrollo con Seam. Genera una aplicación en blanco con facelets, drools (seguridad), página de login y bienvenida, configuración de la base de datos... así como scripts para su compilación, empaquetación y despliegue.<br />
Las opciones que ofrece esta herramienta son las siguientes:</p>
<ul>
<li><strong>setup</strong>: Sirve para configurar el proyecto. Te pregunta entre otras cosas el directorio de instalación de JBoss, si quieres desplegar un archivo war (sin EJBs) o un ear (con EJBs), el nombre del paquete donde irán las clases, y parámetros de la conexión con la base de datos.</li>
<li><strong>new-project:</strong> Crea un proyecto para eclipse con todas las dependencias y la configuración básica a partir de los datos proporcionados a través del setup.</li>
<li><strong>update-project:</strong> Actualiza el proyecto con las últimas dependencias.</li>
<li><strong>delete-project</strong>: borra el proyecto</li>
<li><strong>deploy:</strong> Despliega el proyecto y el datasource en JBoss</li>
<li><strong>undeploy:</strong> Replega el proyecto y el datasource.</li>
<li><strong>explode:</strong> Desplega el proyecto y el datasource en JBoss como una estructura de ficheros, sin empaquetar.</li>
<li><strong>restart:</strong> Resetea el proyectodesplegado con ”explode”</li>
<li> <strong>unexplode</strong>: Replega el proyecto y el datasource desplegado con ”explode”</li>
<li><strong>new-action</strong>: Crea un nuevo Stateless Session Bean con su correspondiente interface y sus anotaciones.</li>
<li><strong>new-form</strong>: Crea un nuevo Stateful Session Bean con su correspondiente interface y sus anotaciones.</li>
<li><strong>new-conversation</strong>: Crea un nuevo Stateful Session Bean con su correspondiente interface y sus anotaciones. Añade anotaciones y esqueletos de métodos para trabajar con Tasks. También crea una clase de Test que puede usarse para simular el ciclo de petición/respuesta de JSF.</li>
<li><strong>new-entity</strong>: Crea un nuevo Entity Bean con sus anotaciones.</li>
<li><strong> generate-entities</strong>: Genera Entity Beans a partir de un modelo existente en la base de datos</li>
</ul>
<p>Aunque seamgen está pensado para trabajar principalmente con eclipse y JBoss AS, también puede configurarse para crear aplicaciones para netbeans y glassfish, que tiene diferentes archivos de configuración.<br />
Además puedes modificarla facilmente, ya que no deja de ser un simple script que trabaja con ant.</p>
<p>Al usar la opción new-project se crea un nuevo proyecto con una estructura de directorios que a primera vista parece algo compleja. Sin embargo vamos a ver como cada carpeta tiene una función o<br />
definida.</p>
<ul>
<li><strong>bootstrap:</strong> Contiene el JBoss Embeddable EJB 3.0 container, para poder desplegar EJBs fuera del servidor de aplicaciones.</li>
<li><strong>classes:</strong> Contienen los archivos de bytecodes (.class) de los componentes definidos por el desarrollador.</li>
<li><strong>dist</strong>: Contiene los archivos empaquetados (ear, war, jar) que serán desplegados en el servidor de aplicaciones.</li>
<li><strong> exploded-archives</strong>: Contiene la estructura de directorios que se puede desplegar directamente en el servidor de aplicaciones.</li>
<li><strong>lib</strong>: Contiene todas las librerías(.jar) con las dependencias necesarias para la compilación y ejecución de la apliación.</li>
<li><strong>nbproject:</strong> Contiene los archivos necesarios para trabajar en el proyecto con netbeans.</li>
<li><strong>resources</strong>: Contiene todos los archivos de configuración.</li>
<li><strong>src</strong>: Contiene el código fuente de los componentes definidos por el desarrollador, separados en tres bloques: entidades, acciones y test.</li>
<li><strong>test-build</strong>: Esta carpeta está destinada a almacenar los test de integración.</li>
<li><strong>view</strong>: Contiene todos los elementos relativos a la vista, como archivos css, imágenes, archivos xhtml...</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://seamcity.madeinxpain.com/archives/seam-generator-seam-gen/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Archivos de configuración de Seam</title>
		<link>http://seamcity.madeinxpain.com/archives/archivos-de-configuracion-de-seam</link>
		<comments>http://seamcity.madeinxpain.com/archives/archivos-de-configuracion-de-seam#comments</comments>
		<pubDate>Fri, 08 Feb 2008 13:41:47 +0000</pubDate>
		<dc:creator>Tes</dc:creator>
				<category><![CDATA[seam]]></category>

		<guid isPermaLink="false">http://seamcity.madeinxpain.com/archives/30</guid>
		<description><![CDATA[JBoss Seam intenta minimizar todo lo posible la cantidad de xml necesario para configurar la aplica-
ción.
Sin embargo, parte de la configuración es preferible tenerla en archivos xml, como reglas de navegación o configuración de componentes del framework, para así aislarla del código java y poderla
cambiar sin recompilar. En otros casos, como los descriptores, es obligatorio [...]]]></description>
			<content:encoded><![CDATA[<p>JBoss Seam intenta minimizar todo lo posible la cantidad de xml necesario para configurar la aplica-<br />
ción.<br />
Sin embargo, parte de la configuración es preferible tenerla en archivos xml, como reglas de navegación o configuración de componentes del framework, para así aislarla del código java y poderla<br />
cambiar sin recompilar. En otros casos, como los descriptores, es obligatorio tener los archivos xml para cumplir las especificaciones.</p>
<p>Vamos a ver los archivos de configuración que podemos encontrarnos en un proyecto Seam, su localización y cometido.</p>
<ul>
<li><strong>*-ds.xml</strong>: Contiene los par ́metros de conexión a la base de datos. Este archivo debe desplegarse en el directorio "deploy" de JBoss</li>
<li><strong>seam.properties</strong>: Este archivo debe estar presente obligatoriamente (aunque esté vacío) en la carpeta raíz del archivo jar que va a desplegarse o en la carpeta classes del archivo war.<br />
Este archivo se usa para configurar las propiedades de los componentes.<br />
components.xml: Puede aparecer en tres lugares; el directorio "META-INF" del archivo jar, el directorio "WEB-INF" del archivo war, o cualquier directorio que contenga clases anotadas con @Name. En él se declaran y configuran componentes.</li>
<li><strong>components.properties</strong>: Especifica el valor de variables que pueden usarse en el archivo components.xml, como @debug@. Estas variables se reemplazan cuando se despliega la aplicación.</li>
<li><strong>persistence.xml</strong>: Se sitú en el directorio "META-INF"" del archivo jar y en él se declaran las unidades de persistencia.</li>
<li><strong>security.drl</strong>: En él se declaran las reglas de autorización del subsistema Drools. Se coloca en la raíz del archivo ear o en el directorio "classes" en el caso de desplegar en un archivo war.</li>
<li><strong>application.xml</strong>: Es el descriptor de despliegue de Enterprise Application Archives y es un archivo estándar en aplicaciones java 2 EE. Se sitúa en el directorio "META-INF" del archivo ear y en él se declaran los módulos de la aplicación y las dependencias.</li>
<li><strong>ejb-jar.xml</strong>: Es el descriptor de despliegue est ́ndar de la especificació EJB. Se coloca en el directorio META-INF del archivo jar, y en Seam contiene la declaración del SeamInterceptor.</li>
<li><strong>jboss-app.xml</strong>: Es el descriptor de aplicación específico de JBoss y se sitúa en el directorio "META-INF" del archivo ear.</li>
<li><strong>faces-config.xml</strong>: Es el archivo de configuración central de JavaServer Faces. Se encuentra en el directorio "WEB-INF" del archivo war.</li>
<li><strong>pages.xml</strong>: Especifica las reglas de navegación. Se encuentra en el directorio "WEB-INF" del archivo war.</li>
<li><strong>web.xml</strong>: Es el descriptor Web estádar especificado en J2EE. Se encuentra en el directorio "WEB-INF" del archivo war.</li>
<li><strong>import-*.sql</strong>: Se coloca en la raíz del archivo jar. Puede contener código sql que será ejecutado cada vez que se despliegue la aplicación</li>
</ul>
<p>Una aplicación Seam típica tendrá la siguiente estructura de archivos</p>
<pre>
my-application.ear/
    jboss-seam.jar
    jboss-el.jar
    jboss-el-api.jar
    META-INF/
        MANIFEST.MF
        application.xml
    my-application.war/
        META-INF/
            MANIFEST.MF
        WEB-INF/
            web.xml
            components.xml
            faces-config.xml
            lib/
                jsf-facelets.jar
                jboss-seam-ui.jar
        login.jsp
        register.jsp
        ...
    my-application.jar/
        META-INF/
            MANIFEST.MF
            persistence.xml
        seam.properties
        mi/
            paquete/
                myapplication/
                    Clase1.class
                    Clase2.class
                    Clase3.class</pre>
]]></content:encoded>
			<wfw:commentRss>http://seamcity.madeinxpain.com/archives/archivos-de-configuracion-de-seam/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cuándo se crean y destruyen las conversaciones</title>
		<link>http://seamcity.madeinxpain.com/archives/cuando-se-crean-y-destruyen-las-conversaciones</link>
		<comments>http://seamcity.madeinxpain.com/archives/cuando-se-crean-y-destruyen-las-conversaciones#comments</comments>
		<pubDate>Wed, 06 Feb 2008 07:25:16 +0000</pubDate>
		<dc:creator>Tes</dc:creator>
				<category><![CDATA[seam]]></category>

		<guid isPermaLink="false">http://seamcity.madeinxpain.com/archives/29</guid>
		<description><![CDATA[En Seam podríamos definir una conversación como la unidad de trabajo desde el punto de vista del usuario.
La noción de Seam de conversació es el conjunto de tres ideas:

La idea de workspace. Cada usuario de la aplicación debe tener su propio espacio de trabajo, sin interferir en la actividad del resto de usuarios.
La idea de [...]]]></description>
			<content:encoded><![CDATA[<p>En Seam podríamos definir una conversación como la unidad de trabajo desde el punto de vista del usuario.<br />
La noción de Seam de conversació es el conjunto de tres ideas:</p>
<ul>
<li>La idea de <strong>workspace.</strong> Cada usuario de la aplicación debe tener su propio espacio de trabajo, sin interferir en la actividad del resto de usuarios.</li>
<li>La idea de <strong>transacción.</strong> La mayoría de los frameworks están construidos siguiendo una arquitectura sin estado, incapaz de manejar correctamente los contextos de persistencia extendidos, dando lugar a fallos como la famosa LazyLoadException.</li>
<li>La idea de<strong> tarea en un workflow</strong>.</li>
</ul>
<p>Uniendo y respetando estos tres conceptos, obtenemos el modelo conversacional de Seam, que nos<br />
permite construir aplicaciones eficientes de más ráidamente.<br />
Este modelo sigue las siguientes reglas para crear o destruir el contexto de conversación:</p>
<ul>
<li>Siempre hay una conversación activa durante la petición, el proceso de validación, la actualización de los modelos de datos, la invocación de la aplicación o la respuesta del ciclo de vida de JSF.</li>
<li>Con cada petición JSF, Seam intenta restaurar una ”conversación larga” (longrunning conversation) que existiese previamente. Si no la encuentra crea una conversación nueva.</li>
<li>Cuando se encuentra una anotacion @Begin en un méodo que se ejecute, la conversación activa se promociona a conversación larga.</li>
<li>Cuando se encuentra una anotacion @End en un método que se ejecute, cualquier conversación larga se degrada a conversación normal.</li>
<li> Tras cada respuesta JSF, Seam almacena los contenidos de la conversación larga si existe, y si no destruye el contenido de la conversación normal.</li>
<li>Cualquier petición JSF propaga el contexto de conversación, y por defecto las peticiones normales no lo propagan.</li>
<li> Si una petición JSF es redirigida, Seam almacena y restaura posteriormente la conversación para preservar su contenido.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://seamcity.madeinxpain.com/archives/cuando-se-crean-y-destruyen-las-conversaciones/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

