<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2spanishfull.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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/" version="2.0">

<channel>
	<title>Desarrollo en Web</title>
	
	<link>http://blogs.antartec.com/desarrolloweb</link>
	<description>Blog sobre desarrollo de aplicaciones web en Java, Python y JavaScript</description>
	<lastBuildDate>Thu, 06 Jan 2011 19:33:19 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/DesarrolloEnWeb" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="desarrolloenweb" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:emailServiceId xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">DesarrolloEnWeb</feedburner:emailServiceId><feedburner:feedburnerHostname xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">http://feedburner.google.com</feedburner:feedburnerHostname><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.newsgator.com/ngs/subscriber/subext.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2FDesarrolloEnWeb" src="http://www.newsgator.com/images/ngsub1.gif">Subscribe with NewsGator</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.bloglines.com/sub/http://feeds.feedburner.com/DesarrolloEnWeb" src="http://www.bloglines.com/images/sub_modern11.gif">Subscribe with Bloglines</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://fusion.google.com/add?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2FDesarrolloEnWeb" src="http://buttons.googlesyndication.com/fusion/add.gif">Subscribe with Google</feedburner:feedFlare><item>
		<title>Como funciona a4j:jsFunction</title>
		<link>http://blogs.antartec.com/desarrolloweb/2010/10/como-funciona-a4jjsfunction/</link>
		<comments>http://blogs.antartec.com/desarrolloweb/2010/10/como-funciona-a4jjsfunction/#comments</comments>
		<pubDate>Tue, 19 Oct 2010 22:19:00 +0000</pubDate>
		<dc:creator>Giancarlo Corzo</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[A4J]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[jsf]]></category>
		<category><![CDATA[RichFaces]]></category>
		<category><![CDATA[Seam]]></category>

		<guid isPermaLink="false">http://blogs.antartec.com/desarrolloweb/?p=369</guid>
		<description><![CDATA[
			
				
			
		
Volviendo a los temas de JSF y Java, hoy día quisiera escribir sobre a4j (Ajax4JSF), una librería que fue integrada al framework Seam y que permite darle una naturaleza AJAX a los componentes JSF tradicionales. En este artículo centraré mi atención en un componente bastante útil denominado jsFunction.
jsFunction es un componente de soporte dentro de [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblogs.antartec.com%2Fdesarrolloweb%2F2010%2F10%2Fcomo-funciona-a4jjsfunction%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblogs.antartec.com%2Fdesarrolloweb%2F2010%2F10%2Fcomo-funciona-a4jjsfunction%2F&amp;source=antartec&amp;style=normal&amp;service=bit.ly" height="61" width="50" /><br />
			</a>
		</div>
<p>Volviendo a los temas de JSF y Java, hoy día quisiera escribir sobre a4j (Ajax4JSF), una librería que fue integrada al framework Seam y que permite darle una naturaleza AJAX a los componentes JSF tradicionales. En este artículo centraré mi atención en un componente bastante útil denominado jsFunction.</p>
<p>jsFunction es un componente de soporte dentro de la librería y que es usado para poder hacer llamadas asíncronas al servidor desde cualquier código JavaScript que estemos escribiendo. Para tener un punto de referencia podemos decir que se comporta de una manera similar a la etiqueta a4j:commandButton, dado que permite realizar llamadas AJAX al servidor pero de una manera asíncrona.</p>
<p>Veamos un ejemplo:</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;script</span> <span style="color: #000066;">type</span>=<span style="color: #ff0000;">&quot;text/javascript&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
     function validateAndSave() {
       if (validate()) {
          save('all');
       }
     }
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/script<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;body<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;h:form<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;a4j:jsFunction</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;save&quot;</span> <span style="color: #000066;">action</span>=<span style="color: #ff0000;">&quot;#{myBean.save()}&quot;</span> <span style="color: #000066;">reRender</span>=<span style="color: #ff0000;">&quot;listPanel&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;a4j:actionParam</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;param1&quot;</span> <span style="color: #000066;">assignTo</span>=<span style="color: #ff0000;">&quot;#{myBean.aParameter}&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/a4j:jsFunction<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;a4j:outputPanel</span> <span style="color: #000066;">id</span>=<span style="color: #ff0000;">&quot;listPanel&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
       ....
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/a4j:outputPanel<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/h:form<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/body<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<p>Cuando se usa a4j:jsFunction es posible iniciar la petición AJAX desde cualquier JavaScript y hacer una actualización parcial de la página o utilizar la información procesada en el JavaScript que se ejecuta de retorno.</p>
<p>Los siguientes escenarios son ideales para usar el componente:</p>
<ul>
<li>Actualizar registros del lado de la capa Modelo después de cerrar una ventana emergente (popup).</li>
<li>Realizar una operación de guardado de información de manera asíncrona.</li>
<li>Actualizar una variable que será utilizada luego por otro método (ojo con la llamada asíncrona).</li>
</ul>
<p>Pueden ver un ejemplo completo en la página de demo de RichFaces. (<a href="http://livedemo.exadel.com/richfaces-demo/richfaces/jsFunction.jsf?tab=usage&amp;cid=617652">live demo</a>)</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/DesarrolloEnWeb?a=XdLpXN_lU58:GIxpIDIDfCM:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/DesarrolloEnWeb?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/DesarrolloEnWeb?a=XdLpXN_lU58:GIxpIDIDfCM:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/DesarrolloEnWeb?d=qj6IDK7rITs" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://blogs.antartec.com/desarrolloweb/2010/10/como-funciona-a4jjsfunction/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Facelets: el atributo rendered de ui:fragment no es reconocido</title>
		<link>http://blogs.antartec.com/desarrolloweb/2010/09/facelets-rendered-uifragment-no-reconocido/</link>
		<comments>http://blogs.antartec.com/desarrolloweb/2010/09/facelets-rendered-uifragment-no-reconocido/#comments</comments>
		<pubDate>Fri, 17 Sep 2010 22:17:28 +0000</pubDate>
		<dc:creator>Giancarlo Corzo</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[facelets]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[jsf]]></category>
		<category><![CDATA[tag jsf]]></category>

		<guid isPermaLink="false">http://blogs.antartec.com/desarrolloweb/?p=345</guid>
		<description><![CDATA[
			
				
			
		
Como programadores especializados en uno o varios lenguajes o frameworks, en ocasiones utilizamos características que no forman parte de la documentación oficial. En esta oportunidad haré alusión a un elemento en Facelets, el atributo rendered de la etiqueta o tag ui:fragment.
La etiqueta ui:fragment
El tag ui:fragment es utilizado para delimitar un conjunto de componentes en función [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblogs.antartec.com%2Fdesarrolloweb%2F2010%2F09%2Ffacelets-rendered-uifragment-no-reconocido%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblogs.antartec.com%2Fdesarrolloweb%2F2010%2F09%2Ffacelets-rendered-uifragment-no-reconocido%2F&amp;source=antartec&amp;style=normal&amp;service=bit.ly" height="61" width="50" /><br />
			</a>
		</div>
<p>Como programadores especializados en uno o varios lenguajes o frameworks, en ocasiones utilizamos características que no forman parte de la documentación oficial. En esta oportunidad haré alusión a un elemento en Facelets, el atributo rendered de la etiqueta o tag <em>ui:fragment</em>.</p>
<p><strong>La etiqueta ui:fragment</strong></p>
<p>El tag <em>ui:fragment</em> es utilizado para delimitar un conjunto de componentes en función es similar al elemento <em>ui:component</em>, con la salvedad que no elimina el código que existe alrededor de él.</p>
<p>La <a href="http://download-llnw.oracle.com/javaee/6/javaserverfaces/2.0/docs/pdldocs/facelets/ui/fragment.html">documentación oficial</a> indica que esta etiqueta  sólo posee dos atributos (<em>id</em> y <em>binding</em>); sin embargo en varios artículos se indica la existencia de un atributo adicional, <em>rendered</em>, que hace posible que se muestren o no los componentes dependiendo de un valor condicional. En el siguiente ejemplo se muestra un fragmento de código donde aparece este atributo:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #339933;">&lt;</span>ui<span style="color: #339933;">:</span>fragment rendered<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;#{condition}&quot;</span><span style="color: #339933;">&gt;</span>
   <span style="color: #339933;">&lt;</span>h<span style="color: #339933;">:</span>outputText value<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;text 1&quot;</span><span style="color: #339933;">/&gt;</span>
   <span style="color: #339933;">&lt;</span>h<span style="color: #339933;">:</span>outputText value<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;text 2&quot;</span><span style="color: #339933;">/&gt;</span>
   <span style="color: #339933;">&lt;</span>h<span style="color: #339933;">:</span>outputText value<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;text 3&quot;</span><span style="color: #339933;">/&gt;</span>
<span style="color: #339933;">&lt;/</span>ui<span style="color: #339933;">:</span>fragment<span style="color: #339933;">&gt;</span></pre></div></div>

<p>¿Cómo es posible que <em>rendered</em> si funcione a pesar de no estar documentado? La razón en realidad es muy simple: los componentes JSF se insertan dentro de un árbol  y como tales heredan las propiedades de su componente padre. Por lo tanto, esta excepción funciona porque los componentes hijos heredan el atributo rendered en <em>ui:fragment</em>.</p>
<p><strong>¿Pero si funciona porque busco alternativas?</strong></p>
<p>Los IDEs como NetBeans y Eclipse ya soportan en sus últimas versiones los tags de Facelets y JSF. Estos IDEs resaltan todo texto que no se encuentre conforme a la especificación oficial, y marcaba el código anterior como si se tratase de un error. Es por esta razón que decidí hacer una búsqueda de alternativas para conseguir el mismo resultado.</p>
<p>Entre las alternativas conocidas para esta situación se pueden señalar:</p>
<p>1. Usar otras estructuras agrupadoras:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #339933;">&lt;</span>s<span style="color: #339933;">:</span>div rendered<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;#{condition}&quot;</span><span style="color: #339933;">&gt;</span>
   <span style="color: #339933;">&lt;</span>h<span style="color: #339933;">:</span>outputText value<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;text 1&quot;</span><span style="color: #339933;">/&gt;</span>
   <span style="color: #339933;">&lt;</span>h<span style="color: #339933;">:</span>outputText value<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;text 2&quot;</span><span style="color: #339933;">/&gt;</span>
   <span style="color: #339933;">&lt;</span>h<span style="color: #339933;">:</span>outputText value<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;text 3&quot;</span><span style="color: #339933;">/&gt;</span>
<span style="color: #339933;">&lt;/</span>s<span style="color: #339933;">:</span>div<span style="color: #339933;">&gt;</span></pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #339933;">&lt;</span>s<span style="color: #339933;">:</span>fragment rendered<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;#{condition}&quot;</span><span style="color: #339933;">&gt;</span>
   <span style="color: #339933;">&lt;</span>h<span style="color: #339933;">:</span>outputText value<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;text 1&quot;</span><span style="color: #339933;">/&gt;</span>
   <span style="color: #339933;">&lt;</span>h<span style="color: #339933;">:</span>outputText value<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;text 2&quot;</span><span style="color: #339933;">/&gt;</span>
   <span style="color: #339933;">&lt;</span>h<span style="color: #339933;">:</span>outputText value<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;text 3&quot;</span><span style="color: #339933;">/&gt;</span>
<span style="color: #339933;">&lt;/</span>s<span style="color: #339933;">:</span>fragment<span style="color: #339933;">&gt;</span></pre></div></div>

<p>Los tags <em>s:div</em> y<em> s:fragment</em> pertenecen a la librería de tags que provee Seam (<a href="http://docs.jboss.org/seam/2.2.1.CR2/reference/en-US/html/controls.html">http://docs.jboss.org/seam/2.2.1.CR2/reference/en-US/html/controls.html</a>) y son estructuras que agrupan componentes, en el caso de <em>s:div</em> se muestra el contenido dentro de un <em>div</em> mientras que <em>s:fragment</em> es una estructura invisible.</p>
<p>Otra estructura que se puede usar es:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #339933;">&lt;</span>h<span style="color: #339933;">:</span>panelGroup rendered<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;#{condition}&quot;</span><span style="color: #339933;">&gt;</span>
   <span style="color: #339933;">&lt;</span>h<span style="color: #339933;">:</span>outputText value<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;text 1&quot;</span><span style="color: #339933;">/&gt;</span>
   <span style="color: #339933;">&lt;</span>h<span style="color: #339933;">:</span>outputText value<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;text 2&quot;</span><span style="color: #339933;">/&gt;</span>
   <span style="color: #339933;">&lt;</span>h<span style="color: #339933;">:</span>outputText value<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;text 3&quot;</span><span style="color: #339933;">/&gt;</span>
<span style="color: #339933;">&lt;/</span>h<span style="color: #339933;">:</span>panelGroup<span style="color: #339933;">&gt;</span></pre></div></div>

<p>Si al panel <em>group</em> no se le especifica el valor para <em>id</em>, <em>style</em> o <em>styleClass</em> funciona como entidad agrupada transparente (en caso se le asigne algún valor los componentes se muestran dentro de un span)</p>
<p>2. Usar <em>verbatim</em> si es que el contenido es sólo texto (aunque esto a la larga no es práctico para la mayoría de ocasiones)</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #339933;">&lt;</span>f<span style="color: #339933;">:</span>verbatim rendered<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;#{condition}&quot;</span><span style="color: #339933;">&gt;</span>
   text <span style="color: #cc66cc;">1</span>
   text <span style="color: #cc66cc;">2</span>
   text <span style="color: #cc66cc;">3</span>
<span style="color: #339933;">&lt;/</span>f<span style="color: #339933;">:</span>verbatim<span style="color: #339933;">&gt;</span></pre></div></div>

<p>3. Poner el atributo <em>rendered</em> a cada uno de los elementos hijos:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #339933;">&lt;</span>h<span style="color: #339933;">:</span>outputText value<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;text 1&quot;</span> rendered<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;#{condition}&quot;</span><span style="color: #339933;">/&gt;</span>
<span style="color: #339933;">&lt;</span>h<span style="color: #339933;">:</span>outputText value<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;text 2&quot;</span> rendered<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;#{condition}&quot;</span><span style="color: #339933;">/&gt;</span>
<span style="color: #339933;">&lt;</span>h<span style="color: #339933;">:</span>outputText value<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;text 3&quot;</span> rendered<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;#{condition}&quot;</span><span style="color: #339933;">/&gt;</span></pre></div></div>

<p>Con estas tres opciones es posible generar código válido para la versión de JSF 1.2 y no estar dependiendo de <em>ui:fragment</em> como elemento contenedor.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/DesarrolloEnWeb?a=bVUxtGT9RGU:D2huSIGpEH8:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/DesarrolloEnWeb?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/DesarrolloEnWeb?a=bVUxtGT9RGU:D2huSIGpEH8:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/DesarrolloEnWeb?d=qj6IDK7rITs" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://blogs.antartec.com/desarrolloweb/2010/09/facelets-rendered-uifragment-no-reconocido/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JQuery API browser</title>
		<link>http://blogs.antartec.com/desarrolloweb/2010/05/jquery-api-browser/</link>
		<comments>http://blogs.antartec.com/desarrolloweb/2010/05/jquery-api-browser/#comments</comments>
		<pubDate>Wed, 05 May 2010 20:41:58 +0000</pubDate>
		<dc:creator>Giancarlo Corzo</dc:creator>
				<category><![CDATA[Frameworks]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[documentación]]></category>
		<category><![CDATA[jquery]]></category>

		<guid isPermaLink="false">http://blogs.antartec.com/desarrolloweb/?p=333</guid>
		<description><![CDATA[
			
				
			
		
Uno de los aspectos más importantes para dominar y hacer uso de una tecnología es tener acceso a buena documentación. En el caso específico de la librería JQuery se cuenta con gran cantidad de información disponible en su sitio web, además de recursos de programadores con ejemplos prácticos de uso.
Sin embargo, la documentación oficial de [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblogs.antartec.com%2Fdesarrolloweb%2F2010%2F05%2Fjquery-api-browser%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblogs.antartec.com%2Fdesarrolloweb%2F2010%2F05%2Fjquery-api-browser%2F&amp;source=antartec&amp;style=normal&amp;service=bit.ly" height="61" width="50" /><br />
			</a>
		</div>
<p>Uno de los aspectos más importantes para dominar y hacer uso de una tecnología es tener acceso a buena documentación. En el caso específico de la librería JQuery se cuenta con gran cantidad de información disponible en su sitio web, además de recursos de programadores con ejemplos prácticos de uso.</p>
<p>Sin embargo, la <a href="http://api.jquery.com/">documentación oficial de la herramienta</a> es presentada en páginas independientes, por lo que navegar a través de ellas buscando información específica resulta complicado. Es por ello que quiero compartirles una utilidad que permite encontrar rápidamente mayores detalles de cualquier función de JQuery.</p>
<p><a href="http://blogs.antartec.com/desarrolloweb/files/2010/05/Pantallazo-jQuery-API-Browser-v1.3-Mozilla-Firefox.png"><img src="http://blogs.antartec.com/desarrolloweb/files/2010/05/Pantallazo-jQuery-API-Browser-v1.3-Mozilla-Firefox-300x169.png" alt="Pantallazo-jQuery API Browser v1.3" title="Pantallazo-jQuery API Browser v1.3" width="300" height="169" class="aligncenter size-medium wp-image-337" /></a></p>
<p>La herramienta, <a href="http://api.jquery.com/browser/">JQuery API browser</a> es accesible de dos maneras: la primera es mediante la aplicación web que utiliza una interfaz AJAX para saltar entre funciones de la librería y la segunda mediante una aplicación de escritorio basada en Adobe Air.</p>
<p>Espero la disfruten tanto como yo lo he hecho.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/DesarrolloEnWeb?a=IlhRQ902Fk8:YjtoU8SNOvg:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/DesarrolloEnWeb?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/DesarrolloEnWeb?a=IlhRQ902Fk8:YjtoU8SNOvg:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/DesarrolloEnWeb?d=qj6IDK7rITs" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://blogs.antartec.com/desarrolloweb/2010/05/jquery-api-browser/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Usando JQuery Dialog con IFrame</title>
		<link>http://blogs.antartec.com/desarrolloweb/2010/05/usando-jquery-dialog-con-iframe/</link>
		<comments>http://blogs.antartec.com/desarrolloweb/2010/05/usando-jquery-dialog-con-iframe/#comments</comments>
		<pubDate>Mon, 03 May 2010 22:58:32 +0000</pubDate>
		<dc:creator>Giancarlo Corzo</dc:creator>
				<category><![CDATA[Frameworks]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[jdialog]]></category>
		<category><![CDATA[jquery]]></category>

		<guid isPermaLink="false">http://blogs.antartec.com/desarrolloweb/?p=314</guid>
		<description><![CDATA[
			
				
			
		
JQuery es una excelente librería JavaScript que simplifica la manipulación del DOM (Document Object Model) de una página HTML, el manejo de eventos, animaciones y AJAX. Así también, desde hace un tiempo atrás provee una librería de componentes UI que extiende los componentes iniciales de esta librería. 
El widget de tipo diálogo es un ventana [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblogs.antartec.com%2Fdesarrolloweb%2F2010%2F05%2Fusando-jquery-dialog-con-iframe%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblogs.antartec.com%2Fdesarrolloweb%2F2010%2F05%2Fusando-jquery-dialog-con-iframe%2F&amp;source=antartec&amp;style=normal&amp;service=bit.ly" height="61" width="50" /><br />
			</a>
		</div>
<p><a href="http://www.jquery.com">JQuery</a> es una excelente librería JavaScript que simplifica la manipulación del DOM (Document Object Model) de una página HTML, el manejo de eventos, animaciones y AJAX. Así también, desde hace un tiempo atrás provee una librería de <a href="http://jqueryui.com/home">componentes UI</a> que extiende los componentes iniciales de esta librería. </p>
<p>El widget de tipo diálogo es un ventana flotante que tiene un título y contenido (similar a un popup). Este widget resulta ser muy útil para mostrar alertas o formularios que el usuario debe llenar antes de poder con﻿tinuar.  Veamos como lograr lanzar un dialog apenas carga la página</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;script</span> <span style="color: #000066;">type</span>=<span style="color: #ff0000;">&quot;text/javascript&quot;</span> <span style="color: #000066;">src</span>=<span style="color: #ff0000;">&quot;/assets/javascript/jquery-1.4.min.js&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span><span style="color: #000000; font-weight: bold;">&lt;/script<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;script</span> <span style="color: #000066;">type</span>=<span style="color: #ff0000;">&quot;text/javascript&quot;</span> <span style="color: #000066;">src</span>=<span style="color: #ff0000;">&quot;/assets/javascript/jquery-ui-1.8.custom.min.js&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span><span style="color: #000000; font-weight: bold;">&lt;/script<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
&nbsp;
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;script</span> <span style="color: #000066;">type</span>=<span style="color: #ff0000;">&quot;text/javascript&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
&nbsp;
$(function() {
 $(&quot;#dialog&quot;).dialog();
});
&nbsp;
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/script<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
&nbsp;
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;div</span> <span style="color: #000066;">id</span>=<span style="color: #ff0000;">&quot;dialog&quot;</span> <span style="color: #000066;">title</span>=<span style="color: #ff0000;">&quot;Basic dialog&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;p<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>This is the default dialog which is useful for displaying information. The dialog window can be moved, resized and closed with the 'x' icon.<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/p<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/div<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<p><em>Ejemplo tomado de la página web de Jquery</em><br />
<br />Como puede apreciarse en el código anterior, esta es una solución muy sencilla para hacer un widget dialog; sin embargo, cuando se desarrolla un sistema de mayor complejidad lo ideal es separar las ventanas en múltiples archivos y los diálogos no son la excepción.  Una implementación bastante difundida en la web es utilizar un elemento iframe en vez de una etiqueta div para construir el contenido del diálogo. Veamos un ejemplo para que quede más clara la idea.</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;script</span> <span style="color: #000066;">type</span>=<span style="color: #ff0000;">&quot;text/javascript&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
&nbsp;
$(function() {
        $('a.showPopup').click(function(e) {
            e.preventDefault();
            var $this = $(this);
            var horizontalPadding = 15;
            var verticalPadding = 15;
            $('<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;iframe</span> <span style="color: #000066;">id</span>=<span style="color: #ff0000;">&quot;site&quot;</span> <span style="color: #000066;">src</span>=<span style="color: #ff0000;">&quot;' + this.href + '&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>').dialog({
                title: ($this.attr('title')) ? $this.attr('title') : 'Site',
                autoOpen: true,
                width: 600,
                height: 300,
                modal: true,
                resizable: false,
                autoResize: true,
                overlay: {
                    opacity: 0.5,
                    background: &quot;black&quot;
                }
            }).width(600 - horizontalPadding).height(300 - verticalPadding);
        });
});
&nbsp;
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/script<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
&nbsp;
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;a</span> <span style="color: #000066;">class</span>=<span style="color: #ff0000;">&quot;showPopup&quot;</span> <span style="color: #000066;">href</span>=<span style="color: #ff0000;">&quot;http://www.google.com&quot;</span> <span style="color: #000066;">title</span>=<span style="color: #ff0000;">&quot;Google&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span></pre></div></div>

<p>Como puede apreciarse en el ejemplo anterior, se utiliza un pseudo iframe, al cual le asignamos la dirección con el contenido que queremos mostrar en el diálogo.  Algunas posibles mejoras a esta idea inicial sería crear una función que permita reutilizar el código en otros enlaces, pero eso se los dejo como tarea.</p>
<p>EDIT:<br />
Respondiendo aun pregunta realizada por un lector estoy agregando una manera de cerrar el diálogo desde el iframe mismo:</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;script</span> <span style="color: #000066;">type</span>=<span style="color: #ff0000;">&quot;text/javascript&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
var refDialog;
$(function() {
...
refDialog = $('<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;iframe</span> <span style="color: #000066;">id</span>=<span style="color: #ff0000;">&quot;site&quot;</span> <span style="color: #000066;">src</span>=<span style="color: #ff0000;">&quot;' + this.href + '&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>').dialog(...);
...
});
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/script<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<p>Dentro del iFrame colocar un link de la siguiente manera:</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;a</span> <span style="color: #000066;">href</span>=<span style="color: #ff0000;">&quot;javascript:void(0);&quot;</span> <span style="color: #000066;">onclick</span>=<span style="color: #ff0000;">&quot;window.parent.refDialog.dialog('close');&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>close<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/a<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/DesarrolloEnWeb?a=RCVR-eForgI:PP1xL6Ug0dI:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/DesarrolloEnWeb?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/DesarrolloEnWeb?a=RCVR-eForgI:PP1xL6Ug0dI:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/DesarrolloEnWeb?d=qj6IDK7rITs" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://blogs.antartec.com/desarrolloweb/2010/05/usando-jquery-dialog-con-iframe/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Primeras Impresiones de Django</title>
		<link>http://blogs.antartec.com/desarrolloweb/2010/03/primeras-impresiones-de-django/</link>
		<comments>http://blogs.antartec.com/desarrolloweb/2010/03/primeras-impresiones-de-django/#comments</comments>
		<pubDate>Mon, 29 Mar 2010 19:20:50 +0000</pubDate>
		<dc:creator>Pablo Torres Navarrete</dc:creator>
				<category><![CDATA[Frameworks]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[django]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://blogs.antartec.com/desarrolloweb/?p=295</guid>
		<description><![CDATA[
			
				
			
		
Hace poco empezamos a probar Django, uno de los frameworks web más populares para el lenguaje Python. Nos gustaría compartir las características que nos han parecido impresionantes y algunas que no nos han gustado.
Lo más impresionante: el sitio de administración
El “admin site”, como le llaman los Djangonautas, es más que un simple scaffolding para el [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblogs.antartec.com%2Fdesarrolloweb%2F2010%2F03%2Fprimeras-impresiones-de-django%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblogs.antartec.com%2Fdesarrolloweb%2F2010%2F03%2Fprimeras-impresiones-de-django%2F&amp;source=antartec&amp;style=normal&amp;service=bit.ly" height="61" width="50" /><br />
			</a>
		</div>
<p>Hace poco empezamos a probar <a href="http://www.djangoproject.com/">Django</a>, uno de los frameworks web más populares para el lenguaje <a href="http://python.org/">Python</a>. Nos gustaría compartir las características que nos han parecido impresionantes y algunas que no nos han gustado.</p>
<p><strong>Lo más impresionante: el sitio de administración</strong></p>
<p>El “admin site”, como le llaman los Djangonautas, es más que un simple scaffolding para el back-end, puesto que construye una interfaz más avanzada.</p>
<p>Django puede deducir información de los modelos para generar automáticamente las páginas de administración de los objetos de negocio, desde donde se realizan todas las operaciones sobre base de datos: lectura, actualización, creación, eliminación, validación, relación con otros objetos, etc. Así, los usuarios administradores puedan agregar contenido al sitio y tenerla lista para mostrar a los clientes finales.</p>
<p><span id="more-295"></span>En unos pocos pasos, explicados en la <a href="http://docs.djangoproject.com/en/1.1/intro/tutorial02/">parte 2 del tutorial</a>, Django ofrece:</p>
<ul>
<li>El widget correcto a utilizar (combobox, textbox, textarea, etc) para cada campo del objeto de negocio en el formulario de creación y edición.</li>
<li>Atajos inteligentes para los campos: calendarios para las fechas, vínculos de &#8220;hoy&#8221; y &#8220;ahora&#8221; para fechas y horas.</li>
</ul>
<p style="text-align: center"><a href="http://blogs.antartec.com/desarrolloweb/files/2010/03/primeras_impresiones_de_Django-admin_formulario1.png"><img class="alignnone size-medium wp-image-303" title="primeras_impresiones_de_Django-admin_formulario" src="http://blogs.antartec.com/desarrolloweb/files/2010/03/primeras_impresiones_de_Django-admin_formulario1-275x300.png" alt="" width="275" height="300" /></a></p>
<p style="text-align: center"><em>Ejemplo de formulario, con validaciones (*)</em></p>
<ul>
<li>Listas desplegables para escoger objetos relacionados (a través de llaves foráneas), con un atajo especial para crear un nuevo objeto relacionado en una ventana pop-up en caso éste no exista todavía.</li>
<li>Validación de cada uno de los campos por tipo de dato y longitud.</li>
</ul>
<p style="text-align: center"><a href="http://blogs.antartec.com/desarrolloweb/files/2010/03/primeras_impresiones_de_Django-admin_busqueda.png"><img class="alignnone size-medium wp-image-304" title="primeras_impresiones_de_Django-admin_busqueda" src="http://blogs.antartec.com/desarrolloweb/files/2010/03/primeras_impresiones_de_Django-admin_busqueda-300x101.png" alt="" width="300" height="101" /></a></p>
<p style="text-align: center"><em>Ejemplo de filtros y campos de búsqueda (*)</em></p>
<ul>
<li>Filtros y criterios de búsqueda para cada objeto, con vínculos de &#8220;último mes&#8221; y &#8220;última semana&#8221; para buscar por fecha</li>
<li>Acciones en masa: seleccionar varios objetos y borrarlos a la vez, cambiarles de estado o cualquier acción definida por el programador</li>
<li>Historial de acciones por cada usuario</li>
</ul>
<p style="text-align: center"><a href="http://blogs.antartec.com/desarrolloweb/files/2010/03/primeras_impresiones_de_Django-admin_roles.png"><img class="alignnone size-medium wp-image-299" title="primeras_impresiones_de_Django-admin_roles" src="http://blogs.antartec.com/desarrolloweb/files/2010/03/primeras_impresiones_de_Django-admin_roles-300x153.png" alt="" width="300" height="153" /></a></p>
<p style="text-align: center"><em>Ejemplo de usuarios, perfiles y roles</em></p>
<ul>
<li>Administración de usuarios, incluyendo perfiles y roles</li>
</ul>
<p>Una lista bastante larga para un sitio generado automáticamente, ¿no es verdad?</p>
<p>Así, Django nos salva de la tediosa pero infaltable tarea de programar el back-end. Con unas pocas líneas de código, se obtienen páginas listas para mostrar en producción.</p>
<p><em>(*) Imágenes tomadas del tutorial oficial de Django.</em></p>
<p><strong>Lo más decepcionante: necesitamos migraciones, ¡urgente!</strong></p>
<p>En Django, un cambio en los modelos no implica un cambio en la base de datos; es decir, el comando &#8217;syncdb&#8217; sólo puede crear tablas, pero no alterar las antiguas.</p>
<p>Los modelos suelen evolucionar con el tiempo, porque cambian los requerimientos o simplemente notamos un error: falta o sobra un campo, o se necesita una tabla extra y una llave foránea. Django no ofrece ningún soporte para estos casos, así que uno se ve obligado a modificar el esquema escribiendo las sentencias SQL a mano. Esto es inconcebible por las siguientes razones:</p>
<ol>
<li>Algunos de los casos mencionados podrían implicar pérdida o inconsistencia de datos. Es responsabilidad del framework estar alerta de estos errores y proteger al desarrollador de ellos, especialmente si se trata de un tema tan sensible.</li>
<li>Cada motor de base de datos maneja su propia versión de SQL, así que una modificación manual no serviría universalmente.</li>
<li>Una de las tareas de un framework es esconder el lenguaje SQL (es por esto que existen los ORMs).</li>
<li>Django debería ser capaz de manejar al menos los casos más sencillos, como agregar una columna.</li>
</ol>
<p>En <a href="http://rubyonrails.org/">Ruby on Rails</a>, el framework web más popular para el lenguaje <a href="http://www.ruby-lang.org/en/">Ruby</a>, existe el concepto de &#8220;<a href="http://guides.rubyonrails.org/migrations.html">migración</a>&#8220;: es posible manipular el esquema de datos a través de código en Ruby, ya sea para crear tablas, agregar columnas o insertar datos. Esta facilidad ofrece muchas ventajas:</p>
<ol>
<li>Abstracción del lenguaje SQL; es decir, una migración es útil inclusive si se usan distintos motores de bases de datos (por ejemplo, uno ligero para desarrollo y uno más potente para producción, o si la aplicación se desplegó en más de un entorno, cada uno con sus requerimientos sobre bases de datos).</li>
<li>Disponibilidad universal, puesto que las migraciones son archivos que se almacenan en el directorio del proyecto, así que cualquier desarrollador puede acceder a ellas (a través del repositorio) y mantener sincronizada su copia local.</li>
<li>Uso automatizado, puesto que las migraciones son código fuente ejecutable. Esto no es posible si se usara un gestor gráfico para interactuar con la base de datos.</li>
<li>Historial de versiones de la base de datos, puesto que se crea una migración por cada transacción. Así, es posible deshacer o aplicar un conjunto de cambios sobre la base de datos, lo que equivale a mantener el esquema de datos bajo control de versiones (repositorio). Esto no es posible si se usara un gestor gráfico.</li>
</ol>
<p style="text-align: center"><a href="http://blogs.antartec.com/desarrolloweb/files/2010/03/primeras_impresiones_de_DJango-migracion.png"><img class="size-medium wp-image-296 aligncenter" title="primeras_impresiones_de_DJango-migracion" src="http://blogs.antartec.com/desarrolloweb/files/2010/03/primeras_impresiones_de_DJango-migracion-300x187.png" alt="" width="300" height="187" /></a></p>
<p style="text-align: center"><em>Migración para crear una tabla</em></p>
<p>Django necesita algo similar con urgencia. Por el momento, lo más recomendable es comenzar a utilizar el sitio de administración inmediatamente después de definir los modelos, para poder notar errores lo antes posible y no tener que lidiar con la evolución del esquema. Naturalmente, los desarrolladores de Django ya han comenzado a discutir opciones para salvar este error.</p>
<p><strong>Conclusión</strong></p>
<p>Django es un framework que ofrece muchas abstracciones de alto nivel que simplifican enormemente la tarea del desarrollo web. El ejemplo más claro es la generación automática del back-end, que ahorra muchas horas de labor tediosa.</p>
<p>La documentación es excelente. La curva de aprendizaje de Django es muy baja gracias a la cantidad de información disponible acerca de él, muy bien redactada y muy completa.</p>
<p>El manejo del esquema de la base de datos es un señor problema. A menos que uno sea un experto en SQL (cosa que la &#8220;mala&#8221; costumbre de los ORMs hace improbable), seguro se tendrán problemas al hacer cambios a las tablas, inclusive cambios sencillos.</p>
<p><strong>Fuentes</strong></p>
<ul>
<li><a href="http://docs.djangoproject.com/en/dev/intro/tutorial01/">Tutorial oficial de Django </a></li>
<li><a href="http://docs.djangoproject.com/en/1.1/">Documentación oficial de Django </a></li>
<li><a href="http://code.djangoproject.com/wiki/SchemaEvolution">&#8220;Schema Evolution&#8221;, de la wiki de Django </a></li>
<li><a href="http://guides.rubyonrails.org/migrations.html">&#8220;Migrations&#8221;, de la documentación de Ruby on Rails</a></li>
</ul>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/DesarrolloEnWeb?a=OwCA-s3eFoA:2INnWCFq5k0:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/DesarrolloEnWeb?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/DesarrolloEnWeb?a=OwCA-s3eFoA:2INnWCFq5k0:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/DesarrolloEnWeb?d=qj6IDK7rITs" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://blogs.antartec.com/desarrolloweb/2010/03/primeras-impresiones-de-django/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Combobox JSF con s:convertEnum</title>
		<link>http://blogs.antartec.com/desarrolloweb/2009/10/combobox-jsf-con-sconvertenum/</link>
		<comments>http://blogs.antartec.com/desarrolloweb/2009/10/combobox-jsf-con-sconvertenum/#comments</comments>
		<pubDate>Wed, 07 Oct 2009 23:24:42 +0000</pubDate>
		<dc:creator>Giancarlo Corzo</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[jsf]]></category>
		<category><![CDATA[Seam]]></category>

		<guid isPermaLink="false">http://blogs.antartec.com/desarrolloweb/?p=249</guid>
		<description><![CDATA[
			
				
			
		
Escribo este post para todos los que alguna vez sufrieron buscando un ejemplo claro y simple de como crear un combobox en base a un Enum en JSF y Seam.
La documentación de Seam (tan clara como el agua) nos nuestra el siguiente ejemplo:

&#60;h:selectOneMenu value=&#34;#{person.honorific}&#34;&#62;
&#60;s:selectItems value=&#34;#{honorifics}&#34; 
             [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblogs.antartec.com%2Fdesarrolloweb%2F2009%2F10%2Fcombobox-jsf-con-sconvertenum%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblogs.antartec.com%2Fdesarrolloweb%2F2009%2F10%2Fcombobox-jsf-con-sconvertenum%2F&amp;source=antartec&amp;style=normal&amp;service=bit.ly" height="61" width="50" /><br />
			</a>
		</div>
<p>Escribo este post para todos los que alguna vez sufrieron buscando un ejemplo claro y simple de como crear un combobox en base a un Enum en JSF y Seam.</p>
<p>La <a href="http://docs.jboss.org/seam/2.2.0.GA/reference/en-US/html/controls.html">documentación de Seam</a> (tan clara como el agua) nos nuestra el siguiente ejemplo:</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;h:selectOneMenu</span> <span style="color: #000066;">value</span>=<span style="color: #ff0000;">&quot;#{person.honorific}&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;s:selectItems</span> <span style="color: #000066;">value</span>=<span style="color: #ff0000;">&quot;#{honorifics}&quot;</span> </span>
<span style="color: #009900;">                       <span style="color: #000066;">var</span>=<span style="color: #ff0000;">&quot;honorific&quot;</span> </span>
<span style="color: #009900;">                       <span style="color: #000066;">label</span>=<span style="color: #ff0000;">&quot;#{honorific.label}&quot;</span> </span>
<span style="color: #009900;">                       <span style="color: #000066;">noSelectionLabel</span>=<span style="color: #ff0000;">&quot;Please select&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
   <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;s:convertEnum</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/h:selectOneMenu<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<p>Donde solo muestran el ejemplo puntual sin dar mayor detalle.<br />
Googleando un poco encontré la siguiente <a href="http://shrubbery.mynetgear.net/wiki/Select_lists_with_Seam">página web</a> donde se dan el trabajo de explicar de una manera sencilla como crear el combobox.</p>
<p>En esa página se  muestra el siguiente ejemplo:</p>
<p>XHTML:</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;h:selectOneMenu</span> <span style="color: #000066;">id</span>=<span style="color: #ff0000;">&quot;marketStatus&quot;</span> </span>
<span style="color: #009900;">                 <span style="color: #000066;">value</span>=<span style="color: #ff0000;">&quot;#{person.status}&quot;</span></span>
<span style="color: #009900;">                 <span style="color: #000066;">required</span>=<span style="color: #ff0000;">&quot;true&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;s:selectItems</span> <span style="color: #000066;">value</span>=<span style="color: #ff0000;">&quot;#{enumLists.statusArray}&quot;</span> </span>
<span style="color: #009900;">                   <span style="color: #000066;">var</span>=<span style="color: #ff0000;">&quot;status&quot;</span></span>
<span style="color: #009900;">                   <span style="color: #000066;">label</span>=<span style="color: #ff0000;">&quot;#{status}&quot;</span></span>
<span style="color: #009900;">                   <span style="color: #000066;">noSelectionLabel</span>=<span style="color: #ff0000;">&quot;Select a status...&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;s:convertEnum</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/h:selectOneMenu<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<p>ENUM:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">@<span style="color: #003399;">Name</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;enumLists&quot;</span><span style="color: #009900;">&#41;</span>
@Scope<span style="color: #009900;">&#40;</span>ScopeType.<span style="color: #006633;">STATELESS</span><span style="color: #009900;">&#41;</span>
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> EnumLists <span style="color: #009900;">&#123;</span>
   <span style="color: #000000; font-weight: bold;">public</span> Status<span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> getStatusArray<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
     <span style="color: #000000; font-weight: bold;">return</span> Status.<span style="color: #006633;">values</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
   <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Como se puede ver en el ejemplo han expuesto el Enum como un Seam bean stateless y retornando la lista de valores con status.values().<br />
Para poner un label a cada opción utilizan el toString() del Enum dado que en label colocan label=&#8221;#{status}&#8221;</p>
<p>Como pueden ver hacer un combobox basado en un Enum es bastante sencillo y útil.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/DesarrolloEnWeb?a=wMBpkKpya14:oyGW9qsfzk4:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/DesarrolloEnWeb?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/DesarrolloEnWeb?a=wMBpkKpya14:oyGW9qsfzk4:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/DesarrolloEnWeb?d=qj6IDK7rITs" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://blogs.antartec.com/desarrolloweb/2009/10/combobox-jsf-con-sconvertenum/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>BlogDay 2009: Desarrollo Web recomienda</title>
		<link>http://blogs.antartec.com/desarrolloweb/2009/08/blogday-2009/</link>
		<comments>http://blogs.antartec.com/desarrolloweb/2009/08/blogday-2009/#comments</comments>
		<pubDate>Mon, 31 Aug 2009 22:20:50 +0000</pubDate>
		<dc:creator>Giancarlo Corzo</dc:creator>
				<category><![CDATA[Sin categoría]]></category>
		<category><![CDATA[Blog Day 2009]]></category>

		<guid isPermaLink="false">http://blogs.antartec.com/desarrolloweb/?p=236</guid>
		<description><![CDATA[
			
				
			
		
El día de hoy se celebra el día mundial del blog, esto a raíz del parecido entre la fecha 31 de agosto (3108) y la palabra Blog. El movimiento de los blogs ha ido creciendo año tras año y con el tiempo los bloggers se han sumado a publicar sus sitios preferidos.
Es por ello que [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblogs.antartec.com%2Fdesarrolloweb%2F2009%2F08%2Fblogday-2009%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblogs.antartec.com%2Fdesarrolloweb%2F2009%2F08%2Fblogday-2009%2F&amp;source=antartec&amp;style=normal&amp;service=bit.ly" height="61" width="50" /><br />
			</a>
		</div>
<p>El día de hoy se celebra el día mundial del blog, esto a raíz del parecido entre la fecha 31 de agosto (3108) y la palabra Blog. El movimiento de los blogs ha ido creciendo año tras año y con el tiempo los bloggers se han sumado a publicar sus sitios preferidos.</p>
<p>Es por ello que el día de hoy el equipo que escribe en Desarrollo Web ha dedicado unas cuantas horas a seleccionar y publicar nuestros blogs preferidos. Es así como -siguiendo la tendencia- nos gustaría contribuir con un listado.</p>
<p>Algunas de estas publicaciones son de Desarrollo Web, otras son de temas genéricos pero a la vez recomendables.</p>
<ul>
<li><a href="http://www.joelonsoftware.com">joelonsoftware</a> de Joel Spolsky.<br />
Tiene muy buenos posts sobre el desarrollo en general y últimamente sobre sus proyectos personales.</li>
<li><a href="http://www.cssblog.es/">CSSBlog</a> de Pedro Corchero Murga.<br />
Lo encontramos hace poco y nos ha ayudado muchísimo ahora que algunos de los miembros del equipo están revisando temas avanzados de CSS.</li>
<li><a href="http://www.codinghorror.com/">Coding horror</a> de Jeff Atwood.<br />
Sus posts más recientes hacen alusión frecuente a la psicología de los programadores.</li>
<li><a href="http://sinergiasincontrol.blogspot.com/">Sinergia sin control</a> de Ender Wiggins.<br />
Es un blog de un comic para frikis muy divertido.</li>
<li><a href="http://onstartups.com">On Startups</a> de Dharmesh Shah.<br />
Lo llevamos seguimos hace un tiempo y consideramos que se trata de un buen blog sobre negocios.</li>
</ul>
<p>Si desean compartir otros blogs que suelen visitar pueden hacer comentarios sobre sus blogs preferidos.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/DesarrolloEnWeb?a=NcSFJRN3hS0:2tHEWHEP0Ik:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/DesarrolloEnWeb?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/DesarrolloEnWeb?a=NcSFJRN3hS0:2tHEWHEP0Ik:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/DesarrolloEnWeb?d=qj6IDK7rITs" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://blogs.antartec.com/desarrolloweb/2009/08/blogday-2009/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Frameworks para iPhone</title>
		<link>http://blogs.antartec.com/desarrolloweb/2009/08/frameworks-para-iphone/</link>
		<comments>http://blogs.antartec.com/desarrolloweb/2009/08/frameworks-para-iphone/#comments</comments>
		<pubDate>Tue, 04 Aug 2009 14:41:04 +0000</pubDate>
		<dc:creator>Giancarlo Corzo</dc:creator>
				<category><![CDATA[Frameworks]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[jsf]]></category>
		<category><![CDATA[Seam]]></category>
		<category><![CDATA[ui]]></category>

		<guid isPermaLink="false">http://blogs.antartec.com/desarrolloweb/?p=223</guid>
		<description><![CDATA[
			
				
			
		
Hace algunas semanas en Antartec se nos encargó desarrollar una aplicación web piloto, ésto no tendría mucha novedad y/o relevancia como para escribir un post sobre ello, sin embargo el objetivo planteado lo hizo particularmente interesante.
El reto en esta aplicación fue desarrollar una web que se comporte como una aplicación nativa de iPhone y que le [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblogs.antartec.com%2Fdesarrolloweb%2F2009%2F08%2Fframeworks-para-iphone%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblogs.antartec.com%2Fdesarrolloweb%2F2009%2F08%2Fframeworks-para-iphone%2F&amp;source=antartec&amp;style=normal&amp;service=bit.ly" height="61" width="50" /><br />
			</a>
		</div>
<p>Hace algunas semanas en <a href="http://www.antartec.com">Antartec</a> se nos encargó desarrollar una aplicación web piloto, ésto no tendría mucha novedad y/o relevancia como para escribir un post sobre ello, sin embargo el objetivo planteado lo hizo particularmente interesante.</p>
<p>El reto en esta aplicación fue desarrollar una web que se comporte como una aplicación nativa de iPhone y que le permita a los usuarios ingresar información en tiempo real al sistema sin encontrarse frente a un computador.</p>
<p>Nuestros esfuerzos se concentraron en expandir nuestro actual framework basado en JSF y SEAM para que soporte el formato iPhone; nuestras investigaciones preliminares dieron frutos y encontramos varios frameworks para simular la apariencia de interfaces nativas en iPhone tales como <a href="http://code.google.com/p/iui">iUI</a> y <a href="http://code.google.com/p/iphone-universal/">UiUI (Universal)</a>.<br />
<span id="more-223"></span><br />
<a href="http://code.google.com/p/iui">iUI</a> desarrollado por Joe Hewitt es un framework bastante maduro que agiliza la construcción de aplicaciones al manejar las vistas, eventos, peticiones y estilos; sin embargo tiene algunas cosas que no son de mi agrado, como por ejemplo:</p>
<ul>
<li>Su funcionamiento está dado por el intercambio de vistas o pseudo páginas que se encuentran definidas en un solo documento HTML y mediante manipulación DOM se muestran o se ocultan, para el caso particular de cargar una vista dinámica ésta tiene que ser obtenida por AJAX y reemplazada en la vista apropiada (Ésto no tiene nada de malo pero no se ajusta 100% al ciclo de vida natural de JSF).</li>
<li>La simulación de las transiciones entre vistas que se utilizan en las aplicaciones nativas de iPhone se muestran con saltos bastante antinaturales, ésto se debe a que utiliza los efectos de CSS3 para realizar las transiciones. Es una lástima que en el Safari para  iPhone estas transiciones se vean bastante mal debido probablemente a la velocidad del procesador de video del equipo.</li>
<li>Para programar para iUI tienes que aprender la manera en que define vistas, cabeceras, botones etc. Para un proyecto corto, en donde no hay mucho tiempo para aprender, ésto se vuelve un impedimento mas que un beneficio (mi opinión es que mantener un esquema de programación conocido facilita la adopción de la tecnología).</li>
</ul>
<p><a href="http://code.google.com/p/iphone-universal/">iPhone Universal UI</a> fue otro framework que evaluamos. Desarrollado por Diego Lafuente, se basa en una serie de CSS que simulan la apariencia de las aplicaciones nativas.</p>
<p>Al respetar las convenciones web <a href="http://code.google.com/p/iphone-universal/">UiUI</a> se perfilaba como uno de los mejores prospectos para nuestro proyecto dado que podía ser adaptado fácilmente al desarrollo de aplicaciones JSF. Sin embargo, a mi modo de ver tiene una gran desventaja para que sea aceptado por las empresas, tiene una licencia GNU Affero General Public License (GNU AGPL 3) en vez de LGPL que no permite utilizarlo para proyectos con fines comerciales.</p>
<p>Dadas estas circunstancias, decidimos crear nuestro propio framework visual para iPhone que utilice todo el poder de los componentes JSF y el templating de Facelets. En una próxima entrega hablaremos más en profundidad sobre los pormenores del framework.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/DesarrolloEnWeb?a=YtyOQN2TerU:hfQKzOq9Bo0:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/DesarrolloEnWeb?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/DesarrolloEnWeb?a=YtyOQN2TerU:hfQKzOq9Bo0:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/DesarrolloEnWeb?d=qj6IDK7rITs" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://blogs.antartec.com/desarrolloweb/2009/08/frameworks-para-iphone/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Maven en detalle – Parte 3</title>
		<link>http://blogs.antartec.com/desarrolloweb/2009/05/maven-en-detalle-parte-3/</link>
		<comments>http://blogs.antartec.com/desarrolloweb/2009/05/maven-en-detalle-parte-3/#comments</comments>
		<pubDate>Mon, 18 May 2009 22:35:18 +0000</pubDate>
		<dc:creator>Giancarlo Corzo</dc:creator>
				<category><![CDATA[Arquitectura]]></category>
		<category><![CDATA[Maven]]></category>

		<guid isPermaLink="false">http://blogs.antartec.com/desarrolloweb/?p=197</guid>
		<description><![CDATA[
			
				
			
		
Continuando con nuestro artículo anterior hoy hablaremos sobre el manejo de las dependencias e IDEs con soporte de Maven.

Problemática
Hasta antes de la aparición de Maven el manejo de las librerías JAR que utilizaba cada proyecto se hacía de manera manual, las librerías normalmente eran almacenadas junto con el código fuente para que no se perdieran.
Muchos [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblogs.antartec.com%2Fdesarrolloweb%2F2009%2F05%2Fmaven-en-detalle-parte-3%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblogs.antartec.com%2Fdesarrolloweb%2F2009%2F05%2Fmaven-en-detalle-parte-3%2F&amp;source=antartec&amp;style=normal&amp;service=bit.ly" height="61" width="50" /><br />
			</a>
		</div>
<p>Continuando con nuestro <a href="http://blogs.antartec.com/desarrolloweb/2009/04/maven-en-detalle-parte-2/" target="_self">artículo anterior</a> hoy hablaremos sobre el manejo de las dependencias e IDEs con soporte de Maven.</p>
<p><span id="more-197"></span><br />
<strong>Problemática</strong></p>
<p>Hasta antes de la aparición de Maven el manejo de las librerías JAR que utilizaba cada proyecto se hacía de manera manual, las librerías normalmente eran almacenadas junto con el código fuente para que no se perdieran.</p>
<p>Muchos de los proyectos manejaban el mismo conjunto de librerías sin embargo éstas se duplicaban por seguridad y porque normalmente el arquitecto era la única persona que sabía exactamente qué versión de librerías debían ser incluidas en cada uno.</p>
<p>Maven resuelve la mayoría de los problemas de administración de las librerías (JAR) mediante un repositorio centralizado y un mecanismo para la inclusión de dependencias.</p>
<p><strong>¿Qué es una dependencia?</strong></p>
<p>Una dependencia es una referencia en el POM de la librería que se desea incluir en el proyecto. Por ejemplo si deseamos incluir la librería para el manejo de JUnit debemos declararlo de la siguiente manera:</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #ddbb00;">&amp;lt;</span>dependencies<span style="color: #ddbb00;">&amp;gt;</span>
  <span style="color: #ddbb00;">&amp;lt;</span>dependency<span style="color: #ddbb00;">&amp;gt;</span>
     <span style="color: #ddbb00;">&amp;lt;</span>groupId<span style="color: #ddbb00;">&amp;gt;</span>junit<span style="color: #ddbb00;">&amp;lt;</span>/groupId<span style="color: #ddbb00;">&amp;gt;</span>
     <span style="color: #ddbb00;">&amp;lt;</span>artifactId<span style="color: #ddbb00;">&amp;gt;</span>junit<span style="color: #ddbb00;">&amp;lt;</span>/artifactId<span style="color: #ddbb00;">&amp;gt;</span>
     <span style="color: #ddbb00;">&amp;lt;</span>version<span style="color: #ddbb00;">&amp;gt;</span>4.5<span style="color: #ddbb00;">&amp;lt;</span>/version<span style="color: #ddbb00;">&amp;gt;</span>
  <span style="color: #ddbb00;">&amp;lt;</span>/dependency<span style="color: #ddbb00;">&amp;gt;</span>
<span style="color: #ddbb00;">&amp;lt;</span>/dependencies<span style="color: #ddbb00;">&amp;gt;</span></pre></div></div>

<p>Como vimos en el artículo anterior los objetos en el repositorio se identifican mediante 3 tags <strong>groupId:artifactId:version</strong></p>
<p><strong>¿Cómo se estructura el repositorio de Maven?</strong></p>
<p>Maven maneja 3 niveles de repositorio: local, empresarial, global.</p>
<p>El repositorio local normalmente conocido como .m2 se guarda localmente en nuestra pc (En Windows se almacena en &#8220;documents and settings&#8221; y en linux en nuestro &#8220;home&#8221;). Dentro de ella encontramos los JAR, WAR, etc en una jerarquía de carpetas que siguen el mismo concepto <strong>groupId:artifactId:version</strong>.</p>
<p>Veamos un ejemplo de un repositorio local estándar:</p>
<p><img src="http://blogs.antartec.com/desarrolloweb/files/2009/05/maven3.gif" alt="Repositorio M2" /></p>
<p>El repositorio Empresarial tiene la misma estructura que el repositorio local con la diferencia que almacena librerías de uso compartido a nivel de red. Los repositorios empresariales normalmente se utilizan cuando se maneja un equipo de desarrolladores que trabaja sobre un conjunto variado de proyectos, los cuales normalmente tienen interdependencia entre ellos y sus librerías.</p>
<p>Los repositorios globales son repositorios públicos que almacenan librerías de uso compartido, como por ejemplo el repositorio mismo de Maven o el repositorio público de JBoss o maven central.</p>
<p>Cuando el proceso de compilación busca las dependencias del proyecto lo primero que hace es buscarlas en el repositorio local, si no las encuentra recurre a sus repositorios empresariales (definido en un archivo .settings.xml) o de red y en caso de no encontrar ahí los JAR necesarios los busca en los repositorios globales.</p>
<p>Es importante notar que una vez ubicado un JAR en alguno de los repositorios externos Maven inmediatamente lo descarga al repositorio local por lo que si uno desea que siempre se actualice el JAR de los repositorios externos debe incluir –U en el comando (ejemplo mvn clean install –U ).</p>
<p>El uso de repositorios Empresariales está íntimamente ligado al uso de la metodología de integración continua por lo que les recomiendo leer la entrada <a href="http://blogs.antartec.com/desarrolloweb/2008/12/integracion-continua-en-proyectos-de-desarrollo/" target="_self">Integración continua</a>.</p>
<p><strong>Ámbito de las dependencias</strong></p>
<p>Existen seis ámbitos en los que una dependencia puede ser declarada limitando así su transitividad:<br />
<strong>Compile</strong>,  es el ámbito por defecto. Las dependencias están disponibles en el proyecto y en sus proyectos dependientes.<br />
<strong>Provided</strong>, se espera que el JDK, la aplicación o el contenedor provea la dependencia.<br />
<strong>Runtime</strong>, la dependencia no es requerida en tiempo de compilación pero sí para la ejecución.<br />
<strong>Test</strong>, son dependencias que son requeridas solo cuando se compila y ejecuta los test.<br />
<strong>System</strong>, similar a provided pero se le debe indicar el jar que contiene la dependencia<br />
<strong>Import</strong>, (a partir a la version 2.0.9) solo es usado en una dependencia del tipo POM en la sección . Indica que el POM utilizado debe ser remplazado con las dependencias que éste tenga en su sección</p>
<p><strong>Cómo usar maven en Netbeans</strong></p>
<p>En Antartec usamos Netbeans como la plataforma por defecto para el desarrollo de aplicaciones web al proveer de manera integrada la mayoría de componentes necesarios para nuestro trabajo.</p>
<p>Pasos para trabajar en Netbeans con Maven</p>
<p>1.	Instalar Netbeans (Lo pueden desargar de <a href="http://www.netbeans.org" target="_blank">www.netbeans.org</a>)<br />
2.	En el menú seleccionar Herramientas – plugins<br />
3.	En la sección &#8220;Plugins disponibles&#8221; seleccionar el plugin Maven y hacer clic en Instalar.<br />
4.	Reiniciar el netbeans, con eso netbeans reconoce y permite crear proyectos maven desde cero.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/DesarrolloEnWeb?a=hkcn_RqjxeI:2IRJfMhoxuA:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/DesarrolloEnWeb?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/DesarrolloEnWeb?a=hkcn_RqjxeI:2IRJfMhoxuA:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/DesarrolloEnWeb?d=qj6IDK7rITs" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://blogs.antartec.com/desarrolloweb/2009/05/maven-en-detalle-parte-3/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Maven en detalle – Parte 2</title>
		<link>http://blogs.antartec.com/desarrolloweb/2009/04/maven-en-detalle-parte-2/</link>
		<comments>http://blogs.antartec.com/desarrolloweb/2009/04/maven-en-detalle-parte-2/#comments</comments>
		<pubDate>Fri, 24 Apr 2009 19:44:20 +0000</pubDate>
		<dc:creator>Giancarlo Corzo</dc:creator>
				<category><![CDATA[Arquitectura]]></category>
		<category><![CDATA[Maven]]></category>
		<category><![CDATA[pom]]></category>

		<guid isPermaLink="false">http://blogs.antartec.com/desarrolloweb/?p=166</guid>
		<description><![CDATA[
			
				
			
		
Continuando con nuestro artículo anterior analizaremos la estructura del proyecto y el POM, base de todo proyecto Maven.
La estructura del Proyecto
Dependiendo del tipo de proyecto se pueden tener diferentes estructuras, sin embargo las estructuras más conocidas son la JAR y la WAR.

Veamos la estructura de una aplicación JAR:

Veamos la estructura de una aplicación WAR:

Como puede [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblogs.antartec.com%2Fdesarrolloweb%2F2009%2F04%2Fmaven-en-detalle-parte-2%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblogs.antartec.com%2Fdesarrolloweb%2F2009%2F04%2Fmaven-en-detalle-parte-2%2F&amp;source=antartec&amp;style=normal&amp;service=bit.ly" height="61" width="50" /><br />
			</a>
		</div>
<p>Continuando con nuestro <a href="http://blogs.antartec.com/desarrolloweb/2009/03/maven-en-detalle-parte-1/">artículo anterior</a> analizaremos la estructura del proyecto y el POM, base de todo proyecto Maven.</p>
<p><strong>La estructura del Proyecto</strong></p>
<p>Dependiendo del tipo de proyecto se pueden tener diferentes estructuras, sin embargo las estructuras más conocidas son la JAR y la WAR.<br />
<span id="more-166"></span><br />
Veamos la estructura de una aplicación JAR:</p>
<p><img src="http://blogs.antartec.com/desarrolloweb/files/2009/03/app-test-1.jpg" alt="" /></p>
<p>Veamos la estructura de una aplicación WAR:</p>
<p><img src="http://blogs.antartec.com/desarrolloweb/files/2009/03/app-test-2.jpg" alt="" /></p>
<p>Como puede verse las estructuras son parecidas con la diferencia que la estructura WAR tiene la sección webapp donde irán todos los files jsp, xhtml, html, etc.</p>
<p>En el directorio resources van files de configuración así como el messages.properties.</p>
<p><strong>El POM (Project Object Model)</strong></p>
<p>El POM file es el archivo XML de configuración de cualquier proyecto Maven, en él podemos encontrar información sobre la versión y las dependencias del proyecto así como cualquier otra configuración personalizada para ese proyecto.</p>
<p>El contenido del POM generado después de ejecutar el comando lo podemos ver a continuación:</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #ddbb00;">&amp;lt;</span>project xmlns=&quot;http://maven.apache.org/POM/4.0.0&quot; xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
xsi:schemaLocation=&quot;http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd&quot;<span style="color: #ddbb00;">&amp;gt;</span>
   <span style="color: #ddbb00;">&amp;lt;</span>modelVersion<span style="color: #ddbb00;">&amp;gt;</span>4.0.0<span style="color: #ddbb00;">&amp;lt;</span>/modelVersion<span style="color: #ddbb00;">&amp;gt;</span>
   <span style="color: #ddbb00;">&amp;lt;</span>groupId<span style="color: #ddbb00;">&amp;gt;</span>com.antartec.app<span style="color: #ddbb00;">&amp;lt;</span>/groupId<span style="color: #ddbb00;">&amp;gt;</span>
   <span style="color: #ddbb00;">&amp;lt;</span>artifactId<span style="color: #ddbb00;">&amp;gt;</span>my-test<span style="color: #ddbb00;">&amp;lt;</span>/artifactId<span style="color: #ddbb00;">&amp;gt;</span>
   <span style="color: #ddbb00;">&amp;lt;</span>packaging<span style="color: #ddbb00;">&amp;gt;</span>jar<span style="color: #ddbb00;">&amp;lt;</span>/packaging<span style="color: #ddbb00;">&amp;gt;</span>
   <span style="color: #ddbb00;">&amp;lt;</span>version<span style="color: #ddbb00;">&amp;gt;</span>1.0-SNAPSHOT<span style="color: #ddbb00;">&amp;lt;</span>/version<span style="color: #ddbb00;">&amp;gt;</span>
   <span style="color: #ddbb00;">&amp;lt;</span>name<span style="color: #ddbb00;">&amp;gt;</span>Maven Quick Start Archetype<span style="color: #ddbb00;">&amp;lt;</span>/name<span style="color: #ddbb00;">&amp;gt;</span>
   <span style="color: #ddbb00;">&amp;lt;</span>url<span style="color: #ddbb00;">&amp;gt;</span>http://maven.apache.org<span style="color: #ddbb00;">&amp;lt;</span>/url<span style="color: #ddbb00;">&amp;gt;</span>
   <span style="color: #ddbb00;">&amp;lt;</span>dependencies<span style="color: #ddbb00;">&amp;gt;</span>
      <span style="color: #ddbb00;">&amp;lt;</span>dependency<span style="color: #ddbb00;">&amp;gt;</span>
           <span style="color: #ddbb00;">&amp;lt;</span>groupId<span style="color: #ddbb00;">&amp;gt;</span>junit<span style="color: #ddbb00;">&amp;lt;</span>/groupId<span style="color: #ddbb00;">&amp;gt;</span>
           <span style="color: #ddbb00;">&amp;lt;</span>artifactId<span style="color: #ddbb00;">&amp;gt;</span>junit<span style="color: #ddbb00;">&amp;lt;</span>/artifactId<span style="color: #ddbb00;">&amp;gt;</span>
           <span style="color: #ddbb00;">&amp;lt;</span>version<span style="color: #ddbb00;">&amp;gt;</span>3.8.1<span style="color: #ddbb00;">&amp;lt;</span>/version<span style="color: #ddbb00;">&amp;gt;</span>
           <span style="color: #ddbb00;">&amp;lt;</span>scope<span style="color: #ddbb00;">&amp;gt;</span>test<span style="color: #ddbb00;">&amp;lt;</span>/scope<span style="color: #ddbb00;">&amp;gt;</span>
      <span style="color: #ddbb00;">&amp;lt;</span>/dependency<span style="color: #ddbb00;">&amp;gt;</span>
   <span style="color: #ddbb00;">&amp;lt;</span>/dependencies<span style="color: #ddbb00;">&amp;gt;</span>
<span style="color: #ddbb00;">&amp;lt;</span>/project<span style="color: #ddbb00;">&amp;gt;</span></pre></div></div>

<p>Veamos los tags más importantes:</p>
<p><strong>&lt;groupId&gt;</strong> El id del grupo al que pertenece el proyecto.<br />
<strong>&lt;artifactId&gt;</strong> El id del artifact o proyecto (en la mayoría de los casos el nombre del proyecto).<br />
<strong>&lt;version&gt;</strong> La versión del artifact en el grupo especificado.<br />
<strong>&lt;dependency&gt;</strong> Aquí se colocarán todas las dependencias del proyecto.</p>
<p>El POM requiere que estos valores estén definidos ya que ésta es la manera en que Maven los identifica dentro de su repositorio.</p>
<p><strong>Ej. groupId:artifactId:version   com.antartec.app:my-test:1.0-SNAPSHOT</strong></p>
<p>Si no se especifica algunos de los tags (packaging,  name,  url) maven usan los valores por defecto heredados del super POM del cual heredan todos los proyectos (hablaremos sobre la herencia más adelante).</p>
<p><strong>Construyamos el proyecto</strong></p>
<p>Ejecutando el siguiente comando se construye el proyecto:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">mvn clean <span style="color: #c20cb9; font-weight: bold;">install</span></pre></div></div>

<p>A diferencia del comando archetype:create este comando es de una sola palabra que especifica la fase que debe ejecutarse. Una fase corresponde a un paso del ciclo de vida de maven. Por ejemplo</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">mvn compile</pre></div></div>

<p>Ejecutará las siguientes fases:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">validate
generate-sources
process-sources
generate-resources
process-resources
compile</pre></div></div>

<p>Existe muchas fases en Maven sin embargo listo las más utilizadas a continuación:</p>
<ul>
<li><strong>validate</strong> – valida que el proyecto es correcto y tiene toda la información necesaria.</li>
<li><strong>compile</strong> – compila el código fuente.</li>
<li><strong>test</strong> – compila el código y ejecuta los unit test correspondientes. Sin embargo no es requisito para que el proyecto sea desplegado.</li>
<li><strong>package</strong> – toma el código compilado y lo empaqueta en un formato distribuible como JAR o WAR.</li>
<li><strong>integration-test</strong> – Despliega el proyecto si es necesario en ambiente de pruebas donde se puedan correr pruebas de integración.</li>
<li><strong>verify</strong> – ejecuta cualquier verificación para cumplir los parámetros de calidad.</li>
<li><strong>install</strong> – instala el jar o war en el repositorio local para que otras aplicaciones locales la puedan usar.</li>
<li><strong>deploy</strong> – copia el jar o war a un repositorio remoto para que pueda ser usado por otro desarrollador o proyecto.</li>
</ul>
<p>Si desean ver la lista completa de fase las pueden encontrar en <a href="http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html#Lifecycle_Reference" target="_blank">lifecycle</a></p>
<p>Para un desarrollo local bastará con utilizar <strong>mvn clean install</strong>.</p>
<p>En nuestra siguiente entrega hablaremos sobre el manejo de las dependencias y como usar el proyecto junto con nuestro IDE favorito.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/DesarrolloEnWeb?a=A_gPZciTk4o:k6-2xntKj18:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/DesarrolloEnWeb?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/DesarrolloEnWeb?a=A_gPZciTk4o:k6-2xntKj18:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/DesarrolloEnWeb?d=qj6IDK7rITs" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://blogs.antartec.com/desarrolloweb/2009/04/maven-en-detalle-parte-2/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>

