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

<channel>
	<title>Rafael Ponte</title>
	<atom:link href="http://www.rponte.com.br/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.rponte.com.br</link>
	<description>"TEAM = Together Everyone Achieves More"</description>
	<pubDate>Tue, 29 Nov 2011 02:51:42 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.6.2</generator>
	<language>en</language>
			<item>
		<title>Limpando a árvore de componentes</title>
		<link>http://www.rponte.com.br/2011/06/07/limpando-a-arvore-de-componentes/</link>
		<comments>http://www.rponte.com.br/2011/06/07/limpando-a-arvore-de-componentes/#comments</comments>
		<pubDate>Tue, 07 Jun 2011 07:00:24 +0000</pubDate>
		<dc:creator>Rafael Ponte</dc:creator>
		
		<category><![CDATA[Boas Práticas]]></category>

		<category><![CDATA[Desenvolvimento de Software]]></category>

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

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

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

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

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

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

		<category><![CDATA[arvore.de.componentes]]></category>

		<category><![CDATA[cleaning.form]]></category>

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

		<category><![CDATA[clear.values]]></category>

		<category><![CDATA[clear.viewroot]]></category>

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

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

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

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

		<category><![CDATA[JavaServer Faces]]></category>

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

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

		<category><![CDATA[limpar.arvore.de.componentes]]></category>

		<category><![CDATA[limpeza.arvore]]></category>

		<category><![CDATA[local.value]]></category>

		<category><![CDATA[model.value]]></category>

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

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

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

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

		<category><![CDATA[submitted.value]]></category>

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

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

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

		<category><![CDATA[validation.error]]></category>

		<category><![CDATA[value.binding]]></category>

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

		<guid isPermaLink="false">http://www.rponte.com.br/?p=334</guid>
		<description><![CDATA[A natureza stateful do JSF nos ajuda em muitos cenários ao desenvolver nossas aplicações Web, cenários estes que não são tão simples assim de implementar com frameworks de natureza estritamente stateless, como a maioria dos frameworks action-like. Por outro lado, problemas que são facilmente solucionados ao se utilizar de frameworks action-like são, algumas vezes, extremamente [...]]]></description>
			<content:encoded><![CDATA[<p>A natureza stateful do JSF nos ajuda em muitos cenários ao desenvolver nossas aplicações Web, cenários estes que não são tão simples assim de implementar com frameworks de natureza estritamente stateless, como a maioria dos frameworks action-like. Por outro lado, problemas que são facilmente solucionados ao se utilizar de frameworks action-like são, algumas vezes, extremamente difíceis de se resolver com frameworks component-based, como JSF.</p>
<p>Durante os <a href="http://www.triadworks.com.br/servico.html">treinamentos em JSF</a> da <a href="http://www.triadworks.com.br/">TriadWorks</a>, nós nos preocupamos em, juntamente com os alunos, desenvolver uma aplicação Web que explore cenários o mais próximo da realidade, trazendo diversos problemas à tona para que desta forma possamos escrever a solução mais adequada utilizando o framework. Entre estes problemas, existe um absolutamente incomodo, que é <strong>a limpeza da árvore de componentes</strong>, mais precisamente dos formulários - ocasionado pela natureza stateful da tecnologia, claro.</p>
<p>Há mais ou menos um mês o <a href="https://twitter.com/#!/DaniloMagrini">@<span>DaniloMagrini</span></a> pediu uma <a href="https://twitter.com/#!/DaniloMagrini/status/62674414352867328">ajuda no Twitter</a> sobre um problema que a equipe dele estava enfrentando, e o problema era justamente a limpeza da árvore de componentes. Um dos membros da equipe do Danilo, o <a href="https://twitter.com/#!/NeiAlcantaraJr">@</a><span><a href="https://twitter.com/#!/NeiAlcantaraJr">NeiAlcantaraJr</a>, <a href="http://www.guj.com.br/java/239891-jsf-2-problema-com-requiredtrue-no-hinputtexto-">postou o problema </a></span><a href="http://www.guj.com.br/java/239891-jsf-2-problema-com-requiredtrue-no-hinputtexto-">no GUJ</a> e explicou o mesmo de maneira simples e objetiva, sendo, eu acabei <a href="https://twitter.com/#!/DaniloMagrini/status/62857262762426368">respondendo na própria thread</a>.</p>
<h3>Problema</h3>
<p>A primeira vez que bati de frente com este problema foi por volta de <a href="http://wiki.apache.org/myfaces/ClearInputComponents">2006-2007</a>, logo quando comecei a trabalhar com JSF e os componentes do Ajax4Jsf, e a partir daí já expliquei o mesmo inúmeras vezes na lista de discussão da <a href="http://groups.google.com.br/group/javasf/">#javasf</a> - você pode encontrar as threads no histórico do grupo - porém, até hoje, não entendi o porquê de eu nunca ter blogado sobre o assunto.</p>
<p>Para não prolongar muito esse post tentando exemplificar como e quando o problema ocorre, eu vou pegar o gancho na <a href="http://www.guj.com.br/java/239891-jsf-2-problema-com-requiredtrue-no-hinputtexto-">thread do GUJ</a> e somente apresentarei a solução aqui no blog - quase que um <em>copy&#8217;n paste</em> da minha resposta na thread, porém com mais alguns poucos detalhes.</p>
<p>Portanto, se você não conhece ainda o problema você pode ler o inicio da thread no <a href="http://www.guj.com.br/">GUJ</a>. Alias, melhor ainda se você ler a thread inteira.</p>
<p>Mas para os preguiçosos de plantão, o resumo da novela é: <strong>nem sempre limpar os dados no managed bean é suficiente para limpar o formulário da página</strong>.</p>
<h3>Componentes de input</h3>
<p>Antes de irmos direto à solução, vale a pena revisarmos como os componentes de input são processados durante do <a href="http://balusc.blogspot.com/2006/09/debug-jsf-lifecycle.html">ciclo de vida do faces</a>, pois eles são um pouquinho mais complicados do que você pensa.</p>
<p><span>Os componentes de input (todos que implementam <a href="http://download.oracle.com/javaee/5/api/javax/faces/component/EditableValueHolder.html">EditableValueHolder</a>) possuem 3 (três) tipos de valores que são alterados durante o ciclo de vida de uma requisição, eles são:</span></p>
<ol>
<li>Submitted Value</li>
<li>Local Value</li>
<li>Value Binding (aka model value)</li>
</ol>
<p><span>Esses 3 valores mudam nos componentes durante o ciclo de vida da seguinte maneira:</span></p>
<ul>
<li>Quando você submete um formulário todos os inputs da página são submetidos como string (parâmetros de request) no corpo HTTP, e na APPLY REQUEST VALUES (2a fase) estes valores são setados nos seus devidos componentes de inputs como &#8220;submitted value&#8221;;</li>
<li>Após isso, na fase de validação (PROCESS VALIDATIONS - 3a fase), cada componente de input tenta converter e validar seu &#8220;submitted value&#8221;, em caso de sucesso o componente define seu novo valor convertido como &#8220;local value&#8221; e seta para null seu &#8220;submitted value&#8221;, continuando assim o ciclo de vida. Em caso de erro de conversão ou validação o componente não define seu &#8220;local value&#8221; e marca o componente como inválido, que por fim pula para última fase (RENDER RESPONSE);</li>
<li>Se não houver erro na fase de validação o ciclo de vida continua na UPDATE MODEL VALUES para popular o modelo (managed bean, entidades etc), ou seja, o &#8220;model value&#8221;. Para cada componente de input setado no modelo o seu &#8220;local value&#8221; é setado para null, daí o ciclo passa pela fase INVOKE APPLICATION e termina na RENDER RESPONSE exibindo os valores do modelo (através das EL&#8217;s);</li>
</ul>
<div>Na última fase (RENDER RESPONSE), <span>o componente pode retornar qualquer um dos 3 valores, contudo seguindo essa ordem de prioridade:</span></div>
<div>
<ol>
<li>Se houver submitted value então retorne-o;</li>
<li>Caso contrário, se o local value é não nulo então retorne-o;</li>
<li>Caso contrário, avalie a EL, ou seja, chame o <em>getter</em> do modelo;</li>
</ol>
<h3>Solução</h3>
<p>Entender a prioridade acima é importante, pois assim você mata a charada do problema.</p>
<p>Esse problema independe do <a href="http://www.rponte.com.br/2008/02/18/qual-implementacao-jsf-voce-usa/">conjunto de componentes</a> que seu projeto utiliza e ocorre muito comumente quando trabalhamos com <strong>a mesma</strong> <strong>árvore de componentes</strong>, ou seja, quando utilizamos muito AJAX e/ou <a href="http://www.rponte.com.br/2008/04/10/utilizando-ajax-com-jsf-de-maneira-eficiente/">navegação orientada a estados</a>. Quando utilizamos a navegação padrão do JSF dificilmente isso ocorre!</p>
<p>Todas as soluções que conheço envolve limpar a <a href="http://www.rponte.com.br/tag/state-saving-method/">árvore de componentes</a> que está &#8220;suja&#8221;:</p>
<div>
<ol>
<li>Navegação padrão do Faces para recriar toda a viewroot (não vale retornar <em>null</em>);</li>
<li>Limpar de <a class="snap_shots" rel="nofollow" href="https://github.com/rponte/jsf-loja-project/blob/master/src/br/com/triadworks/loja/util/FacesUtils.java#L58" target="_new">maneira educada</a> todos os componentes de inputs;</li>
<li>Limpar os inputs de maneira &#8220;brute force&#8221; (<strong>parentComponent.getChildren().clear()</strong> - eles serão recriados na RENDER RESPONSE novamente, porém só funciona com JSF 1.x, pois o 2.x parece seguir corretamente a spec);</li>
</ol>
<p>Na maioria das vezes <a href="https://github.com/rponte/jsf-loja-project/blob/master/src/br/com/triadworks/loja/controller/ProdutoBean.java#L78">eu me utilizo da segunda opção</a>, a tal da &#8220;maneira educada&#8221; de limpar a árvore de componentes. Contudo, o <a href="https://twitter.com/#!/DaniloMagrini">@DaniloMagrini</a> relatou que esta abordagem <a href="https://twitter.com/#!/DaniloMagrini/status/63291278489690113">não funciona muito bem quando existem <em>composite components</em></a> na página. Eu sinceramente não lembro de ter tido esse problema, assim como também não pesquisei sobre o assunto. De qualquer forma, o Danilo melhorou a implementação do método <a href="https://gist.github.com/945737">cleanSubmittedValues</a> para funcionar com <em><em>composite components</em></em>.</p>
<p>Tendo um dos cuidados acima antes de exibir o formulário ou parte dele (via AJAX) vai garantir que os componentes estejam limpos para que o usuário possa entrar novos dados.</p>
<p>No mais, segue alguns links para complementar o que eu disse:</p>
<div>
<ul>
<li><a href="http://cagataycivici.wordpress.com/2005/12/28/jsf_component_s_value_local/">http://cagataycivici&#8230;/jsf_component_s_value_local/</a></li>
<li><a href="http://ovaraksin.blogspot.com/2010/06/submitted-va...e-local-value-model-value.html">http://ovaraksin&#8230;/submitted-va&#8230;e-local-value-model-value.html</a></li>
<li><a href="http://stackoverflow.com/questions/260094/jsf-getvalue-v-s-getsubmittedvalue">http://stackoverflow&#8230;/jsf-getvalue-v-s-getsubmittedvalue</a></li>
<li><a href="http://seamframework.org/Community/NoRerenderAfterValidationFailed">http://seamframework.org/Community/NoRerenderAfterValidationFailed</a></li>
<li><a href="http://livedemo.exadel.com/richfaces-local-value-demo/">http://livedemo.exadel.com/richfaces-local-value-demo/</a></li>
<li><a href="http://wiki.apache.org/myfaces/ClearInputComponents">http://wiki.apache.org/myfaces/ClearInputComponents</a></li>
</ul>
<h3>Concluindo</h3>
<p>Como podem ver, o problema está intimamente ligado a <a href="http://www.znetdevelopment.com/blogs/2009/05/01/jsf-suggestion-for-performance-improvement/">natureza stateful do JSF</a>, e querendo ou não, nós temos que lidar com ela.</p>
<p>Se você estava apressado e pulou <a href="http://www.guj.com.br/java/239891-jsf-2-problema-com-requiredtrue-no-hinputtexto-">a thread no GUJ</a> então eu aconselho novamente: leia a thread por completo, pois com certeza entender o problema, saber como soluciona-lo e principalmente como os componentes de input trabalham durante o ciclo de vida do faces vai te poupar muitas horas de dor de cabeça.</div>
</div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.rponte.com.br/2011/06/07/limpando-a-arvore-de-componentes/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Problema do rendered dinâmico com JSF</title>
		<link>http://www.rponte.com.br/2010/12/01/problema-do-rendered-dinamico-com-jsf/</link>
		<comments>http://www.rponte.com.br/2010/12/01/problema-do-rendered-dinamico-com-jsf/#comments</comments>
		<pubDate>Thu, 02 Dec 2010 04:58:20 +0000</pubDate>
		<dc:creator>Rafael Ponte</dc:creator>
		
		<category><![CDATA[Desenvolvimento de Software]]></category>

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

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

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

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

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

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

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

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

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

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

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

		<category><![CDATA[java.server.faces]]></category>

		<category><![CDATA[jboss.richfaces]]></category>

		<category><![CDATA[myfaces.trinidad]]></category>

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

		<category><![CDATA[problema.rendered.dinamico]]></category>

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

		<category><![CDATA[rendered.dinamico]]></category>

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

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

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

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

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

		<guid isPermaLink="false">http://www.rponte.com.br/?p=316</guid>
		<description><![CDATA[Desde o surgimento dos conjuntos de componentes Ajax passou-se a aproveitar melhor as features do JSF e destes componentes para trazer ao usuário uma UI mais rica e na medida do possível mais leve. Graças a estes componentes ficou mais fácil desenvolver estes tipos de UI quase que transparentemente da mesma forma convencional (sem Ajax) [...]]]></description>
			<content:encoded><![CDATA[<p>Desde o surgimento dos conjuntos de componentes Ajax passou-se a aproveitar melhor as features do JSF e destes componentes para trazer ao usuário uma UI mais rica e na medida do possível mais leve. Graças a estes componentes ficou mais fácil desenvolver estes tipos de UI quase que transparentemente da mesma forma convencional (sem Ajax) que estávamos acostumados a escrever nossas páginas.</p>
<p>Entre tantos benefícios dessa <a href="http://www.rponte.com.br/2008/04/10/utilizando-ajax-com-jsf-de-maneira-eficiente/">abordagem</a> apareceram alguns problemas que também não estávamos acostumados a lidar, como saber <a href="http://www.rponte.com.br/2008/11/01/algumas-boas-praticas-com-jsf-e-richfaces/">o que enviar e repintar antes de uma requisição Ajax</a>, ou saber limpar um formulário adequadamente quando necessário ou mesmo repintar determinados componentes de exibição dinâmica.</p>
<p>Pegando este último problema como tema deste post, o que eu tenho notado é que ainda hoje em dia ele é um dos problemas mais comuns de acontecer e ao mesmo tempo um dos mais discutidos em <a href="http://guj.com.br/posts/list/148603.java">fóruns</a> e <a href="http://groups.google.com/group/javasf">listas de discussão</a>. Sendo, nada mais justo do que explana-lo aqui no <a href="http://www.rponte.com.br/">blog</a> e facilitar a vida de muitos, assim como a minha.</p>
<h3>Problema</h3>
<p>Este problema, que muitos ainda desconhecem, é comumente conhecido como <strong>&#8220;problema do rendered dinâmico&#8221;</strong> (bem, ao menos é como eu o chamo!) e só acontece quando trabalhamos com JSF e Ajax - independente do <a href="http://www.rponte.com.br/2008/02/18/qual-implementacao-jsf-voce-usa/">conjunto de componentes</a> - mais especificamente após tentarmos repintar (ou rerenderizar, como você queira chamar) um componente com o atributo <strong>rendered</strong> dinâmico, como este:</p>
<pre class="xhtml" name="code">
<h:panelGroup id="blocoDeInformacoesExtras" rendered="${myBean.pessoaFisica}">
    <!-- corpo -->
</h:panelGroup>
</pre>
<p>Este componente poderia ser repintado após algum evento Ajax disparado pelo usuário na tela, como por exemplo ao selecionar o tipo de cadastro entre <em>pessoa física</em> ou <em>jurídica</em>, algo similar a isto:</p>
<pre class="xhtml" name="code">
<h:selectOneRadio id="tipoDePessoa" value="${myBean.tipoDePessoa}">
    <f:selectItem itemValue="PESSOA_FISICA" itemLabel="Pessoa Física"></f:selectItem>
    <f:selectItem itemValue="PESSOA_JURIDICA" itemLabel="Pessoa Jurídica"></f:selectItem>
    <a4j:support ajaxSingle="true" reRender="blocoDeInformacoesExtras"></a4j:support>
</h:selectOneRadio>
</pre>
<p>Aparentemente não há qualquer problema com os trechos de código acima, principalmente se o componente iniciar visível para o usuário (ou seja, a EL <strong>${myBean.pessoaFisica}</strong> do <strong>rendered</strong> estiver sendo avaliada para <strong>true</strong>).</p>
<p>Após mudar para o tipo <em>pessoa jurídica</em> é disparado um evento Ajax, o componente é repintado e desaparece da tela, como era de se esperar, claro. Contudo se você alterar a opção para o tipo <em>pessoa física</em> o componente não reaparecerá para o usuário. E é aí onde está o problema!</p>
<p>Se você for esperto, após alguns minutos analisando o problema, notará que a requisição Ajax foi disparada pelo componente <strong>tipoDePessoa</strong> (<a href="https://addons.mozilla.org/en-US/firefox/addon/1843/">Firebug</a>, plugin para Firefox, pode te ajudar aqui), o estado do managed bean foi alterado e o ciclo de vida do Faces foi processado sem qualquer erro.</p>
<p>E a partir daí, depois de refazer e analisar todos os passos básicos e sensatos, perde-se inúmeras horas tentando descobrir onde está de fato o problema neste simples cenário. A primeira vista parece ser um bug do JSF ou do conjunto de componentes, mas na verdade não é.</p>
<h3>Solução</h3>
<p>Sendo direto e sem rodeios: você <strong>não pode</strong> rerenderizar um componente na qual possua o atributo <strong>rendered</strong> dinâmico, ou seja, o componente não pode possuir <a href="http://www.java.net/article/2006/03/03/unified-expression-language-jsp-and-jsf">EL</a> para definir seu estado de visibilidade para o usuário.</p>
<p>Para resolver isso, repinte o componente <em>parent</em> do componente que possui o <strong>rendered</strong> dinâmico. Lembrando que este componente <em>parent</em> não pode ter o atributo <strong>rendered</strong> dinâmico, ou seja, ele sempre precisa ser renderizado.</p>
<p>Componentes como <strong>a4j:outputPanel</strong> ou mesmo <strong>h:panelGroup</strong> são excelentes componentes para servirem como componente <em>parent</em>. Sabendo disto, o código apropriado seria algo como:</p>
<pre class="xhtml" name="code">
<a4j:outputPanel id="parentBlock">
    <h:panelGroup id="blocoDeInformacoesExtras" rendered="${myBean.pessoaFisica}">
        <!-- corpo -->
    </h:panelGroup>
</a4j:outputPanel>
</pre>
<p>E o componente responsável pelo evento Ajax deve repintar, no caso acima, o <strong>a4j:outputPanel</strong> (componente <em>parent</em> sem <strong>rendered</strong> dinâmico) e não mais o <strong>h:panelGroup</strong>.</p>
<h3>Entendendo o problema</h3>
<p>Para quem ainda não sabe, o atributo <strong>rendered</strong> (que por padrão é <strong>true</strong>) dos componentes é responsável por tornar o componente visível ou não para o usuário, ou seja, sempre que este atributo for <strong>true</strong> o componente <strong>poderá</strong> gerar código XHTML para ser exibido na página. Caso ele seja <strong>false</strong>, normalmente, nenhum código XHTML é gerado. Vale lembrar que mesmo o <strong>rendered</strong> sendo <strong>false</strong> o componente ainda existe na <a href="http://www.rponte.com.br/2007/10/14/state_saving_method-server-ou-client/">árvore de componentes</a> no lado servidor.</p>
<p>Não é interessante tentar rerenderizar um componente com <strong>rendered</strong> dinâmico pois quando o atributo <strong>rendered</strong> é avaliado para <strong>false </strong>o componente (código XHTML na verdade) não aparece na árvore <a href="http://en.wikipedia.org/wiki/Document_Object_Model">DOM</a> da página. Sendo, após repintar este mesmo componente (agora com <strong>rendered</strong> avaliado para <strong>true</strong>) o código JavaScript do Richfaces responsável por atualizar o bloco de código onde se encontraria o componente na árvore DOM não consegue achar a posição exata para repintar na página (para injetar o novo código XHTML), já que o código XHTML do componente não existe mais. Então, no final, o Javascript do Richfaces acaba simplesmente <strong>não fazendo nada</strong>.</p>
<p>Por isso, quando você repinta um componente <em>parent</em> qualquer (que sempre tem o atributo <strong>rendered </strong>avaliado para <strong>true</strong>) o Richfaces consegue encontrar a posição exata deste componente na página e injetar o novo código XHTML, e como o componente com <strong>rendered </strong>dinâmico é um nó (filho) do componente <em>parent</em> ele também é repintado.</p>
<h3>Concluindo</h3>
<p>O problema é simples e a solução mais simples ainda! Nada como ler a documentação do seu <a href="http://www.jsfmatrix.net/">conjunto de componentes favorito</a> para entender e evitar este problema. Vale salientar que este problema ocorre com praticamente todos os conjuntos de componentes Ajax.</p>
<p>Acho que para um assunto simples como este eu falei mais do que devia. Espero que tenha ficado claro ou ao menos tenha dado uma luz para quem está enfrentando essa dor de cabeça. Caso queria saber mais sobre o assunto você poderá consultar a <a href="http://docs.jboss.org/richfaces/latest_3_3_X/en/devguide/html_single/">documentação do Richfaces</a>, mais especificamente os tópicos <a href="http://docs.jboss.org/richfaces/latest_3_3_X/en/devguide/html_single/#LimitationsAndRules">5.5</a> e <a href="http://docs.jboss.org/richfaces/latest_3_3_X/en/devguide/html_single/#Re-Rendering">5.6.1</a>.</p>
<p>Enfim, estou feliz por ter tirado mais um post antigo da minha lista de drafts! Atualmente minha <a href="http://www.triadworks.com.br/">rotina diária</a> não tem me permitido investir o tempo que eu gostaria para blogar, mas cá estamos nós novamente, certo? <img src='http://www.rponte.com.br/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.rponte.com.br/2010/12/01/problema-do-rendered-dinamico-com-jsf/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Maré de Agilidade Belo Horizonte: venha surfar nesta onda</title>
		<link>http://www.rponte.com.br/2010/04/27/mare-de-agilidade-belo-horizonte-venha-surfar-nesta-onda/</link>
		<comments>http://www.rponte.com.br/2010/04/27/mare-de-agilidade-belo-horizonte-venha-surfar-nesta-onda/#comments</comments>
		<pubDate>Tue, 27 Apr 2010 11:38:03 +0000</pubDate>
		<dc:creator>Rafael Ponte</dc:creator>
		
		<category><![CDATA[Desenvolvimento de Software]]></category>

		<category><![CDATA[Desenvolvimento Ágil]]></category>

		<category><![CDATA[Engenharia de Software]]></category>

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

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

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

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

		<category><![CDATA[agilidade extreme.programming]]></category>

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

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

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

		<category><![CDATA[maré]]></category>

		<category><![CDATA[mare.de.agilidade]]></category>

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

		<category><![CDATA[metodologias.ageis]]></category>

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

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

		<guid isPermaLink="false">http://www.rponte.com.br/?p=309</guid>
		<description><![CDATA[A edição mineira do  evento Maré de Agilidade, que acontece de 20 a 22 de maio em Belo  Horizonte, superou as melhores expectativas dos seus coordenadores e  preencheu, em pouco mais de uma semana, todas as 200 vagas oferecidas.  A solução encontrada para atender a toda esta demanda reprimida, foi  oferecer [...]]]></description>
			<content:encoded><![CDATA[<p align="justify"><span style="font-size: small; font-family: Arial;">A edição mineira do  evento Maré de Agilidade, que acontece de 20 a 22 de maio em Belo  Horizonte, superou as melhores expectativas dos seus coordenadores e  preencheu, em pouco mais de uma semana, todas as 200 vagas oferecidas.  A solução encontrada para atender a toda esta demanda reprimida, foi  oferecer a opção do streaming ao vivo, no dia 22, como opção para  todos aqueles que não conseguiram fazer sua inscrição para participar  presencialmente do evento nos dias 20 e 21. As <strong>inscrições para  o streaming</strong> ao vivo já estão abertas e podem ser feitas <strong>até  o próximo dia 15 de maio</strong>, diretamente pelo site </span><a href="http://bit.ly/ddHjPX" target="_blank"><span style="font-size: small; font-family: Arial; color: #0000ff;"><span style="text-decoration: underline;">www.maredeagilidade.com.br</span></span></a><span style="font-size: small; font-family: Arial;">. O pagamento é feito por meio de boleto bancário.   O valor para inscrições feitas em abril é de R$ 30,00 e para as feitas  em maio, de R$ 50,00. </span></p>
<p align="justify"><span style="font-size: small; font-family: Arial;">Esta será a 5ª  edição deste evento iitinerante, que já passou por Brasília, Salvador,  Fortaleza e Belém. O objetivo do Maré de Agillidades é disseminar  o conhecimento de metodologias ágeis de desenvolvimento, promover  networking,  criar parcerias, fortalecer a empregabilidade e gerar negócios. Os  mini-cursos, workshops e palestras serão ministrados nos dias 20 e  21 na unidade Pitágoras do Bairro Cidade Jardim (Rua Madalena Sofia,  30, no Shopping Jardim, e no dia 22, no pólo presencial da Unopar  virtual,  na Avenida Alfredo Camaratti, 121 – Pampulha. </span></p>
<p align="justify"><span style="font-size: small; font-family: Arial;"><strong>Responsabilidade  Social</strong></span></p>
<p align="justify"><span style="font-size: small; font-family: Arial;">Esta 5ª edição  do Maré de Agilidade vai doar toda da renda obtida com as inscrições  do evento (descontadas as despesas) para o Centro Espírita Bezerra  de Menezes, de Pedro Leopoldo (MG), em homenagem ao centenário de  nascimento  de Chico Xavier. </span></p>
<p align="justify"><span style="font-size: small; font-family: Arial;">Fundado em junho de 1962,   a entidade presta vários serviços de utilidade pública para populações  carentes da cidade mineira de Pedro Leopoldo (MG), como assistência  odontológica, alimentação, distribuição de agasalhos, cestas básicas,  entre vários outros benefícios. </span></p>
<p align="justify"><span style="font-size: small; font-family: Arial;"><strong>Streaming</strong></span></p>
<p align="justify"><span style="font-size: small; font-family: Arial;">Quem se inscrever no  streamming terá acesso privilegiado aos seguintes conteúdos:</span></p>
<ul type="DISC">
<li><span style="font-size: small; font-family: Arial;">Pedro Valente – <strong>Yahoo </strong> – Product Owner na prática</span></li>
<li><span style="font-size: small; font-family: Arial;">Rodrigo Yoshima – <strong>Aspercom</strong> – Implantando Scrum - experiências de um Agile Coach</span></li>
<li><span style="font-size: small; font-family: Arial;">Guilherme Silveira – <strong> Caelum</strong> – Deploy Contínuo: pois integração contínua não basta</span></li>
<li><span style="font-size: small; font-family: Arial;">Heitor Horiz – <strong>AdaptWorks</strong> – Planejamento e estimativas em projetos ágeis.</span></li>
<li><span style="font-size: small; font-family: Arial;">Carlos Barbieri – <strong>Fumsoft </strong> – <a href="http://mps.br/" target="_blank">MPS.BR</a> com metodologias  ágeis</span></li>
<li><span style="font-size: small; font-family: Arial;">Alexadre Gomes – <strong>Sea    Tecnologia</strong> – Escolhas 2.0</span></li>
<li><span style="font-size: small; font-family: Arial;">Manoel Pimentel – <strong>Stefanini</strong> – Coaching e Facilitação de equipes ágeis</span></li>
<li><span style="font-size: small; font-family: Arial;">Renato Willi – <strong>Sea Tecnologia</strong> – Agilidade e Licitações</span></li>
</ul>
<p align="justify"><span style="font-size: small; font-family: Arial;">Para quem não foi ágil  o bastante e ainda quer participar desta onda, não perca esta segunda  oportunidade e inscreva-se no streaming ou junte-se ao pólo de  transmissão  mais perto de você. Mais informações no site: </span><a href="http://bit.ly/ddHjPX" target="_blank"><span style="font-size: small; font-family: Arial; color: #0000ff;"><span style="text-decoration: underline;">www.maredeagilidade.com.br</span></span></a><span style="font-size: small; font-family: Arial;">.</span></p>
]]></content:encoded>
			<wfw:commentRss>http://www.rponte.com.br/2010/04/27/mare-de-agilidade-belo-horizonte-venha-surfar-nesta-onda/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Just Java 2009 - Eu vou.</title>
		<link>http://www.rponte.com.br/2009/09/10/just-java-2009-eu-vou/</link>
		<comments>http://www.rponte.com.br/2009/09/10/just-java-2009-eu-vou/#comments</comments>
		<pubDate>Fri, 11 Sep 2009 03:05:52 +0000</pubDate>
		<dc:creator>Rafael Ponte</dc:creator>
		
		<category><![CDATA[Desenvolvimento de Software]]></category>

		<category><![CDATA[Engenharia de Software]]></category>

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

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

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

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

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

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

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

		<category><![CDATA[maus.habitos]]></category>

		<category><![CDATA[os.10.maus.habitos.dos.desenvolvedores.jsf]]></category>

		<guid isPermaLink="false">http://www.rponte.com.br/?p=293</guid>
		<description><![CDATA[O maior evento da comunidade Java brasileira, Just Java, na sua 8ª edição, irá ocorrer na próxima semana, dia 15 a 17 de Setembro, em São Paulo.
Assim como no ano passado, eu irei participar do evento. No entanto, este ano eu, juntamente com um amigo, submetemos um trabalho, que por sua vez foi aprovado. Então [...]]]></description>
			<content:encoded><![CDATA[<p>O maior evento da comunidade Java brasileira, <a href="http://www.sucesusp.org.br/eventos2009/justjava/">Just Java</a>, na sua 8ª edição, irá ocorrer na próxima semana, dia 15 a 17 de Setembro, em São Paulo.</p>
<p>Assim como no <a href="http://www.rafaelcarneiro.net/blog/2008/10/03/apresentacao-codigos-e-comentarios-do-justjava-2008/">ano passado</a>, eu irei participar do evento. No entanto, este ano eu, juntamente com um amigo, submetemos um trabalho, que por sua vez foi aprovado. Então nós dois estaremos ministrando uma palestra nesta edição do evento.</p>
<p>A palestra será &#8220;<strong>Os 10 maus hábitos dos desenvolvedores JSF</strong>&#8220;, e será apresentada por <a href="http://www.rponte.com.br/">mim</a> e pelo <a href="http://tarsobessa.com/">Tarso Bessa</a> no último dia do evento, <strong>quinta-feira, dia 17, às 13:00h</strong>.</p>
<p>Um resumo da palestra pode ser visto logo abaixo:</p>
<blockquote><p><span dir="ltr">Serão apresentadas 10 discussões sobre os maus hábitos mais comuns entre os desenvolvedores JSF, hábitos encontrados não somente entre iniciantes, mas também entre alguns desenvolvedores mais experientes, e por sua vez serão apresentadas soluções para cada um deles.</span></p></blockquote>
<p>O conteúdo da apresentação será bem objetiva e simples. Muitos dos maus hábitos apresentados serão reconhecidos por alguns profissionais, e provavelmente as soluções propostas por nós para cada um deles. O mais interessante mesmo são as discussões e questionamentos durante a palestra sobre cada mau hábito, discussões estas que agregam grande valor a apresentação.</p>
<p>Enfim, eventos como o <a href="http://www.sucesusp.org.br/eventos2009/justjava/">Just Java</a> são muito bons pela excelente <a href="http://grade.justjava.com.br/">grade</a> de palestras técnicas e principalmente pelo networking que acabamos fazendo durante o evento. Tenho certeza que este evento irá superar os anteriores em vários aspectos.</p>
<p>Espero ver muitos amigos e profissionais que conheço apenas de <a href="http://groups.google.com.br/group/javasf">listas</a> e <a href="www.guj.com.br/">fóruns</a> de discussão, e se possível trocar algumas idéias com cada um deles.</p>
<p>Para ver a grade do evento:<br />
<a href="http://grade.justjava.com.br/">http://grade.justjava.com.br/</a></p>
<p>Para maiores informações sobre o evento:<br />
<a href="http://www.sucesusp.org.br/eventos2009/justjava/">http://www.sucesusp.org.br/eventos2009/justjava/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.rponte.com.br/2009/09/10/just-java-2009-eu-vou/feed/</wfw:commentRss>
		</item>
		<item>
		<title>CEJUG completa 7 anos</title>
		<link>http://www.rponte.com.br/2009/09/10/cejug-completa-7-anos/</link>
		<comments>http://www.rponte.com.br/2009/09/10/cejug-completa-7-anos/#comments</comments>
		<pubDate>Fri, 11 Sep 2009 00:32:05 +0000</pubDate>
		<dc:creator>Rafael Ponte</dc:creator>
		
		<category><![CDATA[Boas Práticas]]></category>

		<category><![CDATA[Desenvolvimento de Software]]></category>

		<category><![CDATA[Engenharia de Software]]></category>

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

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

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

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

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

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

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

		<category><![CDATA[cafe com tapioca]]></category>

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

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

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

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

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

		<guid isPermaLink="false">http://www.rponte.com.br/?p=284</guid>
		<description><![CDATA[Como o tempo passa rápido. Lembro-me de quando ainda era um mero estagiário, por volta do início de 2005, e havia acabado de entrar para o grupo de discussão do CEJUG.
No início era só mais um &#8220;observer&#8221; entre tantos, apenas lia as threads que ali rolavam e por poucas vezes postei algo ou até mesmo [...]]]></description>
			<content:encoded><![CDATA[<p>Como o tempo passa rápido. Lembro-me de quando ainda era um mero estagiário, por volta do início de 2005, e havia acabado de entrar para o grupo de discussão do <a href="http://cejug.org/">CEJUG</a>.</p>
<p>No início era só mais um &#8220;observer&#8221; entre tantos, apenas lia as threads que ali rolavam e por poucas vezes postei algo ou até mesmo respondi alguma dúvida. Na época meu conhecimento ainda era muito limitado, e minha timidez e baixa-estima não me permitiam colaborar com o grupo.</p>
<p>Aos poucos fui (re)conhencendo certos nomes, membros que postavam e ajudavam bastante com o grupo. Ficava claro quem realmente tinha alguma estima pelo grupo. Ficava claro quem realmente eram os verdadeiros formadores de opinião no grupo e mais ainda, porque eles realmente tinham o respeito merecido na lista.</p>
<p>Graças aos poucos eventos da época e a estas pessoas eu, sem perceber, me envolvi com o grupo. Passei a participar ativamente da lista, a fazer questão de ir aos eventos e principalmente divulga-los em outras listas de discussão, instituições e empresas.</p>
<p>Estava mais que óbvio que o grupo, <a href="http://cejug.org/">CEJUG</a>, se tornara algo importante no meu dia-a-dia, e principalmente era importante para o nosso mercado de trabalho, aqui em Fortaleza. Cada dia mais eu passei a me dedicar de alguma maneira para grupo, e foi daí que, depois de algum tempo, tive a oportunidade e o privilégio de ajudar o grupo de uma forma mais direta: minha <a href="http://www.rponte.com.br/2007/10/28/material-da-palestra-anatomia-do-jsf/">primeira palestra</a> no CEJUG.</p>
<p>Houveram muitos altos e baixos no grupo, tenho o orgulho de dizer que participei da maioria deles. Fiz muitos amigos, e até mesmo alguns poucos &#8220;inimigos&#8221;. Mas tudo que houve agregou valor a minha vida profissional e como pessoa.</p>
<p><div class="wp-caption alignleft" style="width: 202px"><a href="http://www.cafecomtapioca.com/"><img title="Café com Tapioca" src="http://wp.oktiva.com.br/cafe-com-tapioca/files/2009/09/button_animado.gif" alt="Café com Tapioca" width="192" height="192" /></a><p class="wp-caption-text">Café com Tapioca</p></div></p>
<p>Hoje, depois de quase 5 anos caminhando junto com o grupo, eu tenho o prazer de anunciar que no dia <strong>19 de Setembro</strong> irá ocorrer o <a href="http://www.cafecomtapioca.com/">Café com Tapioca</a> do <strong>7º Aniversário do CEJUG</strong>.</p>
<p>Assim como nos eventos de aniversário anteriores, este será um grande evento para o nosso mercado e trará grandes nomes nacionais e locais. Alias, o número de palestras, e o próprio evento em si, está <a href="http://www.cafecomtapioca.com/programacao/aniversario-de-7-anos-da-cejug">bem maior</a> que nos anos anteriores.</p>
<p>Teremos <strong>7 palestras</strong> sobre vários assuntos técnicos, desde <a href="http://en.wikipedia.org/wiki/Test-driven_development">TDD</a>, <a href="http://pt.wikipedia.org/wiki/Java_ME">JME</a>, frameworks web, até <a href="http://pt.wikipedia.org/wiki/Desenvolvimento_%C3%A1gil_de_software">metodologias ágeis</a>. Todos os assuntos estão diretamente relacionados ao atual cenário do nosso mercado. Vale ressaltar que as palestras serão ministradas por  <a href="http://www.paulo.com.br/" target="_blank">Paulo Silveira</a>, <a href="http://blog.aspercom.com.br/" target="_blank">Rodrigo Yoshima</a>, <a href="http://jeveaux.com/" target="_blank">Jeveaux</a>, <a href="http://brunopereira.org/" target="_blank">Bruno Pereira</a>, <a href="http://tarsobessa.com/" target="_blank">Tarso Bessa</a>, <a href="http://www.rponte.com.br/" target="_blank">eu</a>, Régis Melo e <a href="http://csvo.wordpress.com/" target="_blank">Victor Oliveira.<br />
</a></p>
<p>Com toda certeza este será um evento que marcará, com Java, o ano de 2009 no Ceará. <strong>Um dia inteiro de <a href="http://www.cafecomtapioca.com/palestras">palestras</a>, networking com grandes profissionais, brindes (quem não gosta!) e muita troca de informações sobre a plataforma Java</strong>. Vale muito a pena sair de casa neste sábado, dia 19 de Setembro, e investir seu tempo neste evento.</p>
<p>Espero encontrar todos lá, se não a maioria dos profissionais e estudantes membros dos CEJUG no evento. Até o dia 19.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rponte.com.br/2009/09/10/cejug-completa-7-anos/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Managed Beans. Não complique, simplifique.</title>
		<link>http://www.rponte.com.br/2009/08/27/managed-beans-nao-complique-simplifique/</link>
		<comments>http://www.rponte.com.br/2009/08/27/managed-beans-nao-complique-simplifique/#comments</comments>
		<pubDate>Thu, 27 Aug 2009 14:54:19 +0000</pubDate>
		<dc:creator>Rafael Ponte</dc:creator>
		
		<category><![CDATA[Boas Práticas]]></category>

		<category><![CDATA[Desenvolvimento de Software]]></category>

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

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

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

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

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

		<category><![CDATA[boas.praticas]]></category>

		<category><![CDATA[comunicacao.jsf]]></category>

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

		<category><![CDATA[java.server.faces]]></category>

		<category><![CDATA[JavaServer Faces]]></category>

		<category><![CDATA[jboss el]]></category>

		<category><![CDATA[jboss.el]]></category>

		<category><![CDATA[jboss.seam]]></category>

		<category><![CDATA[jsf.communication]]></category>

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

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

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

		<category><![CDATA[pull.mvc]]></category>

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

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

		<guid isPermaLink="false">http://www.rponte.com.br/?p=242</guid>
		<description><![CDATA[Já é sabido de todos que JSF é um framework web MVC com uma filosofia voltada a component-based. E não diferentemente dos bons frameworks action-based existentes hoje em dia, o JSF também se utiliza de POJOs como parte do controller.
Sim, eu estou falando dos, já muito conhecidos, managed beans. Eles são os responsáveis por intermediar [...]]]></description>
			<content:encoded><![CDATA[<p>Já é sabido de todos que JSF é um framework web MVC com uma filosofia voltada a component-based. E não diferentemente dos bons frameworks action-based existentes hoje em dia, o JSF também se utiliza de <a href="http://pt.wikipedia.org/wiki/Plain_Old_Java_Objects">POJOs</a> como parte do controller.</p>
<p>Sim, eu estou falando dos, já muito conhecidos, <strong>managed beans</strong>. Eles são os responsáveis por intermediar a comunicação entre nossas páginas e o nosso modelo. Até aí tudo bem, não existe qualquer mistério, basta entender um pouco sobre <a href="http://pt.wikipedia.org/wiki/MVC">MVC</a> que isso torna-se óbvio.</p>
<p>Se você observar, quando está trabalhando com JSF, notará que cerca de 50-70% do seu esforço é dedicado na implementaçao do managed bean. E que as futuras alterações e correções de bugs estão intimamente ligados a ele. Implementar corretamente um managed bean pode evitar muita dor de cabeça e facilitar na manutenção da aplicação.</p>
<p>Mas você já se perguntou como e qual seria a melhor forma de implementá-los? Não que exista apenas uma única maneira de escreve-los, longe disso, mas em contra partida existem inúmeras maneiras de torna-los realmente ruins.</p>
<p>Escrever um managed bean de forma <span style="text-decoration: line-through;">porca</span> incorreta  pode dificultar e muito sua vida e da sua equipe. Falta de legibilidade, dificuldade para escrever testes de unidade e principalmente medo de alterar o código são apenas alguns dos possíveis problemas.</p>
<p>Agora pare e imagine a vida do próximo desenvolvedor que deverá manter tal código. É, não parece algo divertido.</p>
<h3>Managed Beans mais responsáveis</h3>
<p>A principal responsabilidade de um managed bean é intermediar a comunicação entre as páginas (componentes do JSF) e nosso modelo. Escutar eventos, processa-los e delegar para a camada de negócios são apenas algumas de suas responsabilidades.</p>
<p>Talvez devido a experiência com frameworks action-based muitos desenvolvedores acabam subutilizando os managed beans e sobrecarregando as páginas com lógicas e dados desnecessários. Os managed beans e as páginas usam a abusam do <a href="http://rafaelliu.net/?p=22">modelo &#8220;pull&#8221;</a> durante a renderização e (re)construção da árvore de componentes, isto é, basicamente as páginas é quem decidem (através de <a href="http://today.java.net/pub/a/today/2006/03/07/unified-jsp-jsf-expression-language.html">EL</a>) quais os dados e lógica necessária para que possam ser processadas.</p>
<p>Graças a este modelo nós conseguimos retirar toda lógica de renderização da página e colocando-a onde jamais deveria ter saído, no managed bean. Esta lógica estará localizada nos métodos públicos do managed bean que serão acessados através de EL pela página.</p>
<p>Não importa se a lógica é simples ou complexa, é quase que mandatório que ela esteja localizada no seu managed bean. Então <span style="text-decoration: line-through;">bizarrices</span> lógicas de apresentação nas páginas, que não são difíceis de se encontrar por aí, como esta deveriam ser evitadas:</p>
<pre class="xhtml" name="code">&lt;h:panelGrid id="pnl" rendered="#{loginBean.usuario.admin == 1 or loginBean.permissao('exibir_painel_de_usuarios')}" /&gt;
	...
&lt;/h:panelGrid&gt;</pre>
<p>Reparem que a lógica de apresentação está, representada através de EL, na página. Se você teve a infelicidade de encontrar códigos assim então há grandes possibilidades de você também encontrar regras de negócio nas páginas, o que é muito pior que encontra-las no controller.</p>
<p>E olha que este foi apenas um exemplo simples e ligeiramente legível, já encontrei códigos mais complicados que este de dificil leitura e horrível de dar manutenção.</p>
<p>O problema disso é se houver a necessidade de mudar a regra (o que muitas vezes ocorre), mas e se ela estiver <strong>duplicada</strong> por dezenas de páginas, como você faria? Como testa-la? Pense um pouco sobre isso.</p>
<p>Imaginem um código um pouco pior que este (com 3 ou 4 condicionais), mas dentro de um componente de iteração (como <strong>h:dataTable</strong> ou <strong>ui:repeat</strong>). É, você nem vai querer imaginar.</p>
<p>A regra de visualização acima deveria está encapsulada no managed bean, a página não deveria conhecer a regra, mas apenas quem a conhece. Então pensando nisso nós poderíamos alterar nosso código para algo melhor, algo como isto:</p>
<pre class="xhtml"  name="code">&lt;h:panelGrid id="pnl" rendered="#{loginBean.permitidoExibirPainelDeUsuariosLogados}" /&gt;
	...
&lt;/h:panelGrid&gt;</pre>
<p>O componente não conhece a regra, mas sabe exatamente a quem perguntar. O código está bem mais legível pois revela sua intenção. Agora está bem mais fácil mudar a regra (pois temos apenas um único ponto de manutenção) e principalmente testa-la através de <a href="http://en.wikipedia.org/wiki/Test_automation">testes automatizados</a>.</p>
<p>Um managed bean deveria ao máximo tentar esconder a complexidade das páginas através de métodos que revelem a devida intenção, ou seja, a nomenclatura dos métodos é realmente importante e você deveria dar importância a legibilidade do seu código.</p>
<h3>Comunicação entre managed beans</h3>
<p>O que eu tenho para falar, de longe, se iguala ao que pode ser encontrado no excelente conteúdo sobre comunicação no JSF neste <a href="http://balusc.blogspot.com/2006/06/communication-in-jsf.html">post</a> no blog do <a href="http://balusc.blogspot.com/">BalusC</a>, além de que para mim ele aborda 99% sobre como managed beans podem se comunicar.</p>
<p>O que pretendo falar está mais relacionado em como manter uma conversa (troca de mensagens) saudável entre managed beans. Em como explicitar os parâmetros esperados e como passar parâmetros de um managed bean para outro de maneira coerente.</p>
<p>A comunicacão entre managed beans não difere da troca de mensagens entre componentes de software na orientação a objetos. Cada componente (managed bean) conhece a interface pública do outro componente para que eles possam  trocar mensagens.</p>
<p>Sendo, ter esta interface pública bem definida pode facilitar muito a &#8220;conversa&#8221; entre os managed beans, facilitar os testes, evitar problemas inesperados, diminuir o acoplamento, aumentar a coesão e assegurar contratos e invariantes do componente.</p>
<p>Nada mais claro que um exemplo para assimilar a idéia:</p>
<pre class="xhtml" name="code">&lt;h:dataTable var="item" value="#{compraBean.itensNoCarrinho}"&gt;
    &lt;h:column&gt;
        &lt;h:commandLink value="detalhe" action="#{itemBean.exibirDetalhesDoItem}"&gt;
            &lt;f:setPropertyActionListener value="#{item}" target="#{itemBean.itemSelecionado}" /&gt;
        &lt;/h:commandLink&gt;
    &lt;/h:column&gt;
&lt;/h:dataTable&gt;</pre>
<p>O código acima não tem nada de errado ou anormal, nada do que não estejamos acostumados a ver quase todos os dias. Se repararem há um pequeno &#8220;dialogo&#8221; entre dois managed beans - <strong>compraBean</strong> e <strong>itemBean</strong> - que estão trocando informações.</p>
<p>O problema não está na comunicação em si, pois isso teria que acontecer de um jeito ou de outro, mas sim em <strong>como</strong> eles se comunicam. O managed bean <strong>compraBean</strong> conhece detalhes de como o <strong>itemBean</strong> se comporta, ou seja, ele sabe mais do que o necessário.</p>
<p>Um maneira de melhorar isso seria ter uma interface pública bem definida no <strong>itemBean</strong>. Algo semelhante ao código abaixo:</p>
<pre class="xhtml" name="code">&lt;h:dataTable var="item" value="#{compraBean.itensNoCarrinho}"&gt;
    &lt;h:column&gt;
        &lt;h:commandLink value="detalhe" action="#{itemBean.exibirDetalhesDoItem(item)}" /&gt;
    &lt;/h:column&gt;
&lt;/h:dataTable&gt;</pre>
<p>Além de todos os benefícios (baixo acoplamento, alta coesão etc) citados acima, nós ganharíamos de cara maior legibilidade no código, o que é algo realmente importante quando a comunicação foge do trivial.</p>
<p>Vale ressaltar que independente da comunicação ocorrer na página (por meio da <a href="http://www.rponte.com.br/2008/10/23/estendendo-jsf-el-com-jboss-el/">JBoss-EL</a>) ou diretamente dentro do managed bean, essa abordagem poderia -e até deveria- ser utilizada. Para o segundo caso, frameworks como <a href="http://seamframework.org/">JBoss Seam</a> ou <a href="http://www.springsource.org/">Spring</a> ajudam a injetar as dependências de maneira simples através de anotações.</p>
<h3>Um ou vários managed beans?</h3>
<p>Não tenho uma opinião realmente formada quanto a isso, ainda não. Já pensei várias vezes sobre o assunto, e sempre me pego vislumbrando cenários nada comuns. Que no caso os considero como casos excepcionais.</p>
<p>Desde 2006 eu trabalho com JSF, ministro cursos e treinamentos e presto <a href="http://www.triadworks.com.br/">consultoria</a> para algumas empresas. E posso dizer que somente três vezes eu precisei ter mais de um managed bean para resolver uma tarefa. Dentre todas eu tenho a ligeira impressão que segui o caminho <span style="text-decoration: line-through;">errado</span> mais complicado, e que se tivesse pensado mais um pouco eu poderia ter evitado tais soluções.</p>
<p>Managed beans são componentes, em sua grande maioria, <strong>intimamente</strong> <strong>ligados</strong> a(s) página(s) e que deveriam ter apenas o <strong>estritamente necessário</strong> para representar a <a href="http://en.wikipedia.org/wiki/Graphical_user_interface">GUI</a>. Dificilmente você terá um managed bean genérico (<a href="http://pt.wikipedia.org/wiki/CRUD">CRUD</a> não conta) que poderia funcionar em todo lugar. Você precisa fazer um esforço hercúleo para conseguir isso, e as vezes parece que não vale a pena.</p>
<p>A idéia de um managed bean ter dados (entrada pelo usuário e estados) e comportamentos (eventos e regras ligadas a apresentação) juntos segue o princípio básico da <a href="http://en.wikipedia.org/wiki/Object-oriented_programming">OOP</a>, o que torna o trabalho mais simples e coeso. Tentar ir contra isso (ao estilo <strong>ActionForm</strong> e <strong>Action</strong> do <a href="http://struts.apache.org/">Struts</a>) pode te trazer muita dor de cabeça a médio-longo prazo.</p>
<p>Neste <a href="http://java.dzone.com/articles/making-distinctions-between">post</a> do Neil Griffin, um dos autores do <a href="http://www.amazon.com/JavaServer-Faces-2-0-Complete-Reference/dp/0071625097/ref=sr_1_4?ie=UTF8&amp;s=books&amp;qid=1250373036&amp;sr=1-4">primeiro livro de JSF2.0</a>, ele sugere alguns &#8220;rótulos&#8221; para os diversos tipos de managed beans que podem haver numa aplicação, e ainda por cima ele incita que seria uma boa prática trabalhar com vários managed beans por questões de <a href="http://en.wikipedia.org/wiki/Separation_of_concerns">SoC</a>, baixo acomplamento etc.</p>
<p>De fato, devido ao modelo &#8220;pull&#8221; podemos ter managed beans atuando como componentes menores, mais reutilizáveis e mais orientados a objetos. Ter componentes (managed beans ou não) de granularidade fina colaborando para construção da página é algo bastante comum, e eu mesmo <a href="http://www.rponte.com.br/2008/02/24/aproveitando-os-beans-do-spring-em-suas-paginas-jsf/">me utilizo muito disso</a>. Mas não são destes tipos de componentes que falo, muito menos o Neil.</p>
<p>Eu, particularmente, não concordo com quase nada no <a href="http://java.dzone.com/articles/making-distinctions-between">post</a> do Neil. Para mim ele se utilizou de argumentos isolados e vagos para defender sua idéia. Managed beans por sua natureza deveriam ser simples, contudo a abordagem do Neil, definifitivamente, vai contra tudo isso. Eu a considero um overkill, e ela torna qualquer aplicação web difícil de manter.</p>
<p>Bem, se dois ou mais managed beans relacionados <strong>-delimitados a um contexto-</strong> estão servindo para você e sua equipe, ótimo. Continue assim, não tem porque mudar. O framework (JSF) te permite isso, contudo eu tenho sérias dúvidas se essa abordagem vale a pena.</p>
<h3>Conclusão</h3>
<p>Este post estava em draft faz um bocado de tempo, mas a falta de tempo e a coragem não me permitiam finaliza-lo. Felizmente resolvi tira-lo do baú e posta-lo.</p>
<p>Tudo que comentei aqui está mais ligado a minha experiência e o que aprendi durante estes anos como desenvolvedor (e conversando com outros profissionais) do que eu pude encontrar em livros de JSF sobre o assunto. Existem muitos livros bons, assim como artigos em blogs e sites especializados sobre o assunto, mas nada melhor que a experiência do dia a dia para nos mostrar caminhos mais adequados de como solucionar determinados problemas.</p>
<p>Por mais longo que o post tenha ficado, eu ainda sinto que falta complementa-lo em alguns aspectos e pontos. Pois o que falei acima acaba te levando a aderir outras soluções não menos importantes, mas que já foram bastante citadas neste blog e discutidas em listas de discussão.</p>
<p>Entre os três tópicos abordados aqui eu ainda tenho algumas dúvidas quanto ao último, principalmente depois desta <a href="http://twitter.com/edburns/status/3560284776">resposta</a> do <a href="http://twitter.com/edburns">@edburns</a> a minha <a href="http://twitter.com/rponte/status/3557311795">pergunta</a> no <a href="http://twitter.com/">Twitter</a>. Hoje minha opinião está mais para o lado &#8220;<strong>um managed bean é suficiente</strong>&#8221; por não ter encontrado respostas que me convencessem do contrário.</p>
<p>Enfim, como disse antes, se vários managed beans intrinsecamente relacionados estão resolvendo teu problema por algum motivo, ótimo! Continue assim. Se você tiver um tempinho e puder comentar sobre tua decisão eu ficaria grato.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rponte.com.br/2009/08/27/managed-beans-nao-complique-simplifique/feed/</wfw:commentRss>
		</item>
		<item>
		<title>No more DAO&#8217;s</title>
		<link>http://www.rponte.com.br/2009/06/08/no-more-daos/</link>
		<comments>http://www.rponte.com.br/2009/06/08/no-more-daos/#comments</comments>
		<pubDate>Mon, 08 Jun 2009 13:10:44 +0000</pubDate>
		<dc:creator>Rafael Ponte</dc:creator>
		
		<category><![CDATA[Boas Práticas]]></category>

		<category><![CDATA[Desenvolvimento de Software]]></category>

		<category><![CDATA[Engenharia de Software]]></category>

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

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

		<category><![CDATA[anti-pattern]]></category>

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

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

		<category><![CDATA[data access object]]></category>

		<category><![CDATA[data.access.object]]></category>

		<category><![CDATA[design.pattern]]></category>

		<category><![CDATA[domain.model]]></category>

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

		<category><![CDATA[entity.manager]]></category>

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

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

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

		<category><![CDATA[no.more.dao]]></category>

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

		<category><![CDATA[padrao.de.projeto]]></category>

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

		<guid isPermaLink="false">http://www.rponte.com.br/?p=223</guid>
		<description><![CDATA[Um dos padrões de projetos mais conhecidos e mais utilizados ainda hoje é o DAO (Data Access Object). Padrão este que teve um papel fundamental há muitos anos, e que ainda hoje em determinados projetos de software desempenha muito bem seu trabalho. Contudo, isto não o torna, de maneira alguma, um padrão que todo arquiteto [...]]]></description>
			<content:encoded><![CDATA[<p>Um dos padrões de projetos mais conhecidos e mais utilizados ainda hoje é o DAO (<a href="http://en.wikipedia.org/wiki/Data_Access_Object">Data Access Object</a>). Padrão este que teve um papel fundamental há muitos anos, e que ainda hoje em determinados projetos de software desempenha muito bem seu trabalho. Contudo, isto não o torna, de maneira alguma, um padrão que todo arquiteto deveria implementar obrigatoriamente em qualquer aplicação.</p>
<p>Todo <a href="http://en.wikipedia.org/wiki/Design_pattern_(computer_science)">design pattern</a> existe para resolver um problema comum de software, e não apenas para ser utilizado como uma receita de bolo em qualquer projeto. E com DAO não seria diferente. A finalidade do DAO é prover uma interface com operações para acesso a dados que abstraiam os detalhes do mecanismo de persistência (seja um banco de dados, ou não), ponto final.</p>
<p>Sua utilização há alguns 5 ou 6 anos atrás fazia todo sentido pois naquela época ainda erámos obrigados a trabalhar com JDBC puro e frameworks de persitência bem precários. Isto é, não tinhamos bons frameworks que abstraíssem de maneira satisfatória o acesso aos dados da aplicação (99% das vezes um banco de dados).</p>
<p>Por isso todo projeto de software daquela época implementava seu próprio DAO para evitar a mistura de código de negócios com código SQL (e mais alguns objetos de persistência), e assim diminuir o acoplamento entre as camadas (layers).</p>
<p>O problema é que hoje em dia com todos os consagrados frameworks para persistência ainda temos arquitetos implementando seu próprio DAO em todo e qualquer projeto de software que eles ponham as mãos. Mesmo que na arquitetura tenha-se adotado algum framework ORM (como <a href="http://en.wikipedia.org/wiki/Java_Persistence_API">JPA</a> ou <a href="https://www.hibernate.org/">Hibernate</a>) ainda assim temos os benditos DAO&#8217;s espalhados pela aplicação.</p>
<p>Sempre que vejo um projeto que adotou algum ORM (muitas vezes JPA) para persistência e me deparo com o famigerado DAO eu pergunto para o arquiteto da solução qual motivo o levou a colocar uma layer a mais na aplicação sobre o JPA. E como sempre recebo a seguinte resposta:</p>
<blockquote><p>&#8220;Ah! para abstrair a camada de persistência. Assim se futuramente for necessário mudar de JPA para qualquer outra tecnologia, como JDBC puro, vai ser bem simples, pois bastaria criarmos outra implementação.&#8221;</p></blockquote>
<p>Este tipo de <a href="http://en.wikipedia.org/wiki/Argumentum_ad_nauseam">argumento</a> demonstra puro e simplesmente <strong>senso comum</strong>. Arquitetos que pensam assim pararam no tempo e não acompanharam a evolução das tecnologias ORM para plataforma Java. Outros mesmo atualizados seguem o senso comum. Pois é muito mais cômodo e simples para estas pessoas repetirem sempre a mesma &#8220;solução&#8221; em cada novo projeto do que se manterem atualizadas e avaliarem outras possíveis soluções.</p>
<p>O mais interessante disso tudo é que basicamente foi criada outra camada genérica para abstrair algo que por si só já é nossa abstração. O que estou querendo dizer, e que certamente foge ao senso comum, é que você não precisa de outra camada, o <strong>JPA já abstrai a persistência para você, ele além de muitas outras coisas já está atuando como nossa DAO layer</strong>.</p>
<p>A partir do momento que um arquiteto cria esta camada genérica ele está abrindo mão de features importantes de qualquer framework para persistência que ele venha a adotar. Todos os frameworks de persistência seguem filosofias e possuem features diferentes que agregam valor ao software de uma maneira ou de outra, mas que por termos esta camada de abstração não poderemos utiliza-las, caso contrário estaríamos detonando com a &#8220;portabilidade&#8221; da camada.</p>
<p>Quando adotamos um framework ORM como o JPA/Hibernate, não importa o motivo, já temos que ter em mente que nossa aplicação (principalmente o <a href="http://en.wikipedia.org/wiki/Domain_model">domain model</a>) estará &#8220;mergulhada&#8221; nas <a href="http://blog.caelum.com.br/2008/01/28/os-7-habitos-dos-desenvolvedores-hibernate-e-jpa-altamente-eficazes/">features</a> do framework, como <a href="http://blog.caelum.com.br/2007/06/25/jpa-anotacoes-nos-getters-ou-atributos/">anotações</a>, <a href="http://blog.caelum.com.br/2006/11/23/entidades-managed-transient-e-detached-no-hibernate-e-jpa/">contexto de persistência</a>, <a href="http://martinfowler.com/eaaCatalog/lazyLoad.html">lazy loading</a>, dirty checking etc. Simplesmente mudar a implementação do DAO -como muitos acreditam- não garantirá que nossa aplicação continuará funcionando.</p>
<p>Ter esta camada extra de abstração (seu próprio DAO) pode matar o que de melhor seu framework ORM pode te oferecer, já que sua aplicação deverá funcionar independente da implementação utilizada. Por isso reflita se é melhor ter<strong> um full-ORM com um half-DAO do que ter um switchable-DAO com um half-ORM</strong>. Eu, particularmente, prefiro um full-ORM.</p>
<p>Antes que algum fanático por DAO venha aqui me crucificar, <strong>eu não tenho nada contra DAO layers</strong>,<strong> </strong>assim como também não acho que <a href="http://www.infoq.com/news/2007/09/jpa-dao">JPA tenha vindo para mata-lo</a>. Mas acredito que este design pattern tem o seu lugar e deveria ser utilizado adequadamente, e não como uma camada obrigatória na aplicação.</p>
<p>Não existe uma receita de bolo para quando utilizar seu DAO genérico particular ou não. Cada projeto tem suas peculiaridades e estas devem ser analisadas com seus devidos cuidados. Mesmo eu achando que hoje em dia (a não ser que você esteja implementando o <a href="http://www.milfont.org/tech/2009/06/06/frameworks-caseiros-2-a-missao/">framework caseiro</a> da sua empresa) não precisamos de tanta preocupação quanto a isso.</p>
<p>Para o caso especifico do JPA, utilize diretamente o <a href="http://java.sun.com/javaee/5/docs/api/javax/persistence/EntityManager.html">EntityManager</a> no lugar da sua <a href="http://blog.caelum.com.br/2006/08/26/ei-como-e-o-seu-dao-ele-e-tao-abstraido-quanto-o-meu/">abstraçao de DAO genérica</a>, principalmente se você estiver implementando <a href="http://pt.wikipedia.org/wiki/CRUD">CRUDs</a>, e utilize DAO&#8217;s onde for realmente necessário e fizer sentido. Bem mais simples, e bem menos artefatos na tua aplicação para manter.</p>
<p>Enfim, esse tipo de discussão sobre abstrair um framework ORM com uma camada DAO não vem de hoje, datam de meados de 2005 ou até menos. Meu conselho é que você não crie uma camada a mais para tentar abstrair o que por si só já é sua abstração. Trabalhe com o que o framework ORM te fornece, de preferência da melhor forma possível.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rponte.com.br/2009/06/08/no-more-daos/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Não existe segredo: desenvolvedores e designers precisam colaborar entre si</title>
		<link>http://www.rponte.com.br/2009/02/18/desenvolvedores-e-designers-precisam-colaborar-entre-si/</link>
		<comments>http://www.rponte.com.br/2009/02/18/desenvolvedores-e-designers-precisam-colaborar-entre-si/#comments</comments>
		<pubDate>Wed, 18 Feb 2009 08:01:45 +0000</pubDate>
		<dc:creator>Rafael Ponte</dc:creator>
		
		<category><![CDATA[Boas Práticas]]></category>

		<category><![CDATA[Desenvolvimento de Software]]></category>

		<category><![CDATA[Desenvolvimento Ágil]]></category>

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

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

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

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

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

		<category><![CDATA[boas.praticas]]></category>

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

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

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

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

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

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

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

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

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

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

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

		<category><![CDATA[web.designer]]></category>

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

		<guid isPermaLink="false">http://www.rponte.com.br/?p=179</guid>
		<description><![CDATA[Durante o desenvolvimento &#8220;Enterprisey&#8221; de aplicações web temos dois papéis realmente importantes dentro da equipe: o desenvolvedor e o [web] designer. Cada um possui suas atividades bem definidas durante o desenvolvimento do software, mas em algum momento será necessário que eles sentem juntos e colaborem para definir os detalhes da GUI.
Eles não irão colaborar entre [...]]]></description>
			<content:encoded><![CDATA[<p>Durante o desenvolvimento &#8220;Enterprisey&#8221; de aplicações web temos dois papéis realmente importantes dentro da equipe: o <strong>desenvolvedor </strong>e o [web] <strong>designer</strong>. Cada um possui suas atividades bem definidas durante o desenvolvimento do software, mas em algum momento será necessário que <a href="http://gc.blog.br/2008/12/19/como-trabalhar-com-os-designers/">eles sentem juntos e colaborem</a> para definir os detalhes da <a href="http://en.wikipedia.org/wiki/Graphical_user_interface">GUI</a>.</p>
<p>Eles não irão colaborar entre si para definir a identidade visual da aplicação [não que não seja possível], mas sim para acertarem os detalhes &#8220;baixo nível&#8221; da interface ou mesmo como definir melhor a experiência do usuário. No final das contas, eles podem discutir sobre <a href="http://en.wikipedia.org/wiki/Cascading_Style_Sheets">css</a>, <a href="http://en.wikipedia.org/wiki/JavaScript">javascript</a>, tags de marcação <a href="http://pt.wikipedia.org/wiki/XHTML">XHTML</a> ou uma melhor disposição dos componentes visuais.</p>
<p>E isso é comum com qualquer tecnologia para web, seja ela PHP, RubyOnRails, .Net ou mesmo Java.</p>
<p>Mas o que eu realmente não entendo é porque muitos profissionais (desenvolvedores, gerentes, designers etc) encaram que desenvolvedor e designer não precisam -ou mesmo não deveriam- discutir sobre o design da interface da aplicação.</p>
<p>O que difere a comunicação entre um desenvolvedor e um analista de negócios que tentam definir ou acertar detalhes sobre o modelo de domínio da aplicação, e a comunicação entre um desenvolvedor (ou analista) e um designer que tentam acertar detalhes da interface com o usuário?</p>
<p>Nenhuma! Não há qualquer diferença, eles conversam e colaboram entre si com a mesma finalidade: <strong>terem software funcionando e que agregue valor ao cliente</strong>.</p>
<p>O que leva tantos profissionais a pensarem que desenvolvedor e designer são &#8220;peças&#8221; isoladas durante o desenvolvimento do software? Um <a href="http://en.wikipedia.org/wiki/Waterfall_model">modelo em cascata,</a> talvez. Por estarem trabalhando num processo <span style="text-decoration: line-through;">fabril</span> de <a href="http://blog.thiagoarrais.com.br/2007/07/25/fabricas-de-software-uma-analogia-levada-longe-demais/">fábrica de software</a>, talvez.</p>
<p>Não sei ao certo o motivo, mas sei que uma boa parte da culpa está na &#8220;balela&#8221; que algumas <a href="http://blog.fragmental.com.br/2007/06/07/3-letrinhas/">empresas-de-três-letrinhas</a> tentam empurrar sobre seus clientes e/ou desenvolvedores que utilizam suas tecnologias/ferramentas. Um bom exemplo disso é a tecnologia JSF, na qual temos a descrição abaixo dada pela Sun:</p>
<blockquote><p>Ease-of-use being the primary goal, the JavaServer Faces architecture clearly defines a separation between application logic and presentation while making it easy to connect the presentation layer to the application code. <strong>This design enables each member of a web application development team to focus on his or her piece of the development process, and it also provides a simple programming model to link the pieces together.</strong> For example, web page developers with no programming expertise can use JavaServer Faces UI component tags to link to application code from within a web page without writing any scripts.</p></blockquote>
<p>Por mais bonito que isto pareça ser, eu tenho o dever de alertar aos mais desavisados: <strong>isso dificilmente irá funcionar durante o desenvolvimento com JSF</strong> - para falar a verdade, eu acho muito dificil que qualquer tecnologia hoje em dia consiga prover tamanha separação de responsabilidade (entre designer e desenvolvedor) de forma transparente e produtiva.</p>
<p>Qualquer desenvolvedor web que se preze possui, ao menos, os conhecimentos mínimos sobre XHTML, css e javascript para entender e manter algum código escrito por outra pessoa ou mesmo por um web designer. Se você é um desenvolvedor web e não possui qualquer conhecimento sobre o que eu disse acima então já está mais do que na hora de você aprender.</p>
<p>Não subestimando os designers, pois eu conheço alguns muito bons, mas se levássemos essa separação de responsabilidades ao pé da letra você acha mesmo que eles conseguiriam desenhar excelentes interfaces utilizando apenas as taglibs dos componentes ou conjuntos de componentes JSF?</p>
<p>Alias, você acha mesmo que um designer teria produtividade ou conseguiria expressar sua criatividade limitado apenas a algumas dezenas de tags, por mais ricos que sejam os componentes, visualmente falando? Isso pode piorar ainda mais se este designer for obrigado a utilizar algum editor <strong>-com o qual ele nunca trabalhou-</strong> apenas por causa do suporte a <a href="http://en.wikipedia.org/wiki/Autocompletion">code-completion</a> para as tags dos componentes.</p>
<p>JSF é uma boa tecnologia, e por mais que ela nos forneça centenas de componentes, frameworks para <a href="http://www.rponte.com.br/2008/11/12/aplicacoes-serias-em-jsf-usam-facelets/">templating de páginas</a> e estes componentes possuam um <a href="http://www.jboss.org/file-access/default/members/jbossrichfaces/freezone/docs/devguide/en/html/ArchitectureOverview.html#StControlsSkinning">sistema de skinning</a> ainda assim no final das contas teremos XHTML (css e javascript também) gerado. Sendo, de duas, uma: ou o designer deve ter conhecimento sobre o código gerado pelos componentes ou ele deve ter conhecimento de como trabalhar com o suporte a skinnking dos componentes.</p>
<p>Qualquer que seja a opção acima, o designer estará com mais responsabilidades do que o necessário. Por isso é tão importante a interação entre um designer e um desenvolvedor para solucionar problemas decorrentes da tecnologia adotada.</p>
<p>Eu falo tudo isso por experiência própria, pois há alguns meses eu tive uma razoável dificuldade para aplicar o css, definido no prótotipo do sistema, nos componentes JSF da aplicação, atividade esta que deveria ser relativamente simples. Sim, o conjunto de componentes que eu utilizei <a href="http://myfaces.apache.org/trinidad/skin-selectors.html">suportava skinning</a>, mas quem disse que isso é suficiente quando o XHTML gerado por alguns componentes mais complexos é totalmente diferente do XHTML escrito pelo designer?</p>
<p>Foram vários dias adaptando o css da aplicação e, ao mesmo tempo, <strong>discutindo e redefinindo com os designers</strong> alguns pontos do css do prótotipo para que no final tivessemos o resultado ideal. E com certeza eu não teria sucesso nesta atividade se não fosse pelos dois grandes designers da equipe, <a href="http://twitter.com/carlossantos">Carlinhos</a> e <a href="http://twitter.com/andersonnunesc">Anderson</a>, que sentaram ao meu lado algumas <span style="text-decoration: line-through;">longas</span> horas durante a semana para me ajudar.</p>
<p>Certamente que há casos onde não podemos contar com um designer na equipe, como:</p>
<ul>
<li>projetos em que a presença do designer é inexistente na equipe e algum desenvolvedor precisa assumir mais este papel;</li>
<li>o designer faz parte da equipe, mas por algum motivo ele sempre encontra-se impossibilitado de interagir com ela nos momentos de maior necessidade;</li>
<li>ou nos piores casos, o protótipo da aplicação foi criado por outra empresa.</li>
</ul>
<p>Para cada situação é possível chegarmos a uma solução milhares de vezes melhor do que apenas ignorar o problema de que não há um designer na equipe - mas não é esta a questão do post.</p>
<p>Enfim, é muita ingenuidade (ou falta de conhecimento) destas pessoas que acreditam que desenvolvedores e designers [ou quaisquer membros da equipe] não precisam colaborar entre si para alcançar um resultado ideal que agrade o cliente.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rponte.com.br/2009/02/18/desenvolvedores-e-designers-precisam-colaborar-entre-si/feed/</wfw:commentRss>
		</item>
		<item>
		<title>O que todo bom desenvolvedor JSF deveria saber</title>
		<link>http://www.rponte.com.br/2009/01/19/o-que-todo-bom-desenvolvedor-jsf-deveria-saber/</link>
		<comments>http://www.rponte.com.br/2009/01/19/o-que-todo-bom-desenvolvedor-jsf-deveria-saber/#comments</comments>
		<pubDate>Tue, 20 Jan 2009 06:06:59 +0000</pubDate>
		<dc:creator>Rafael Ponte</dc:creator>
		
		<category><![CDATA[Boas Práticas]]></category>

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

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

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

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

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

		<category><![CDATA[action-like]]></category>

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

		<category><![CDATA[arvore.de.componentes]]></category>

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

		<category><![CDATA[boas.praticas]]></category>

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

		<category><![CDATA[brute-force]]></category>

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

		<category><![CDATA[ciclo.de.vida]]></category>

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

		<category><![CDATA[conversação]]></category>

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

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

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

		<category><![CDATA[escopos.conversacionais]]></category>

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

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

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

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

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

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

		<category><![CDATA[JavaServer Faces]]></category>

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

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

		<category><![CDATA[jboss.el]]></category>

		<category><![CDATA[jboss.seam]]></category>

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

		<category><![CDATA[jsf1.2]]></category>

		<category><![CDATA[jsf2.0]]></category>

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

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

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

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

		<category><![CDATA[naming.container]]></category>

		<category><![CDATA[navegacao.orientada.a.estados]]></category>

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

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

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

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

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

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

		<category><![CDATA[security.filter]]></category>

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

		<category><![CDATA[state-driven navigation]]></category>

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

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

		<guid isPermaLink="false">http://www.rponte.com.br/?p=128</guid>
		<description><![CDATA[Dificuldades todos temos, principalmente quando estamos aprendendo uma nova tecnologia, framework ou paradigma, e isso torna-se ainda pior quando não temos qualquer interesse em aprender sobre os mesmos.
Não é de hoje que percebo que a maioria das dúvidas postadas sobre JSF em listas de discussão e fóruns estão intimamente ligadas a falta de conhecimento base [...]]]></description>
			<content:encoded><![CDATA[<p>Dificuldades todos temos, principalmente quando estamos aprendendo uma nova tecnologia, framework ou paradigma, e isso torna-se ainda pior quando não temos qualquer interesse em aprender sobre os mesmos.</p>
<p>Não é de hoje que percebo que a maioria das dúvidas postadas sobre JSF em listas de discussão e fóruns estão intimamente ligadas a falta de <strong>conhecimento base </strong>sobre a tecnologia ou mesmo sobre os conceitos na qual o framework (JSF) foi construído - sim, estou falando de conceitos sobre desenvolvimento web e component-based.</p>
<p>É óbvio que JSF existe para tentar abstrair toda a complexidade existente no desenvolvimento web Java, complexidade esta que deveríamos evitar, mas <strong>é indispensável termos o mínimo de conhecimento</strong> sobre a mesma. Pois se você acha que apenas conhecendo os componentes você construirá uma aplicação decente então você está enganado.</p>
<p>Assusto-me com o número de dúvidas na <a href="http://groups.google.com/group/javasf">javasf</a> em que o mínimo de conhecimento sobre web seria suficiente para solucionar o problema, independente do framework utilizado. Evidente que muitas das dúvidas estão ligadas a tecnologia, JSF no caso, mas estes mesmos problemas também seriam facilmente resolvidos se os desenvolvedores se dessem ao trabalho de tentar entender os fundamentos do framework.</p>
<p>Quando falo dos fundamentos de JSF eu estou me referindo ao ciclo de vida, comunicação entre managed beans, escopos de conversação, árvore de componentes, a idéia por trás dos converters e validators, phase listeners, modelo dos componentes etc.</p>
<p>Desenvolver aplicações JSF guiado por &#8220;brute-force&#8221; é algo que todo desenvolvedor deveria evitar, de fato, ver um exemplinho (ou <a href="http://livedemo.exadel.com/richfaces-demo/richfaces/dataTable.jsf?c=dataTable&amp;tab=usage">demo</a>) básico de um componente, copiar o código, joga-lo na aplicação e ainda por cima achar que deveria funcionar é algo ingénuo demais até mesmo para um programador iniciante.</p>
<p>Pior que isso é continuar tentando fazer o componente ou bloco de código funcionar a todo custo sem nem ao menos ler a documentação do mesmo [por isso o termo "brute-force"].</p>
<p>Não adianta correr para tentar usar os componentes se você não possui os fundamentos básicos sobre JSF ou mesmo sobre desenvolvimento web.</p>
<h3>Saber o básico é importante</h3>
<p>Saber o básico de qualquer tecnologia é obrigatório, e com JSF não seria diferente. Acredito que em primeiro lugar é importante entender <a href="http://en.wikipedia.org/wiki/JavaServer_Faces">o que é JSF</a> e qual a <a href="http://www.rponte.com.br/2008/02/18/qual-implementacao-jsf-voce-usa/">diferença</a> entre uma implementação e um conjunto de componentes.</p>
<p>Criar e configurar um projeto web JSF faz parte do aprendizado, independente da IDE, claro. Como disse, o interessante é não depender exclusivamente da IDE, mas sim conhecer o mínimo necessário para <a href="http://balusc.blogspot.com/2008/01/jsf-tutorial-with-eclipse-and-tomcat.html">configurar e rodar um projeto com faces</a> (como as libs necessárias e configuração do web.xml).</p>
<p>Entenda que um managed bean é apenas um POJO e que <strong>deveria ser o mais simples possível</strong> (refletindo estritamente o necessário da GUI). E por favor, coloque uma vez por todas na sua cabeça que os componentes (através de EL) acessam os valores dos managed beans através dos <a href="http://en.wikipedia.org/wiki/JavaBean">métodos assessores</a> (getters e/ou setters) e não das propriedades.</p>
<p>Depois disso eu aconselharia o entendimento sobre <a href="http://www.ibm.com/developerworks/java/library/j-jsf3/">converters e validators</a>, pois eles tornam o desenvolvimento bem mais simples se comparado a outros frameworks MVC. Principalmente os converters, pois eles sim &#8220;quebram um galho&#8221; danado!</p>
<p>Entenda como o framework e os componentes <a href="http://johnderinger.wordpress.com/2007/10/10/action-handlers-and-event-listeners/">disparam/tratam os eventos e listeners</a>, e principalmente quando utiliza-los, pois utilizar um listener incorreto para um determinado cenário pode dificultar muito a sua vida, mesmo que no final a coisa funcione. Praticamente tudo o que você precisa saber estará na documentação do componente.</p>
<p>Procure entender o sistema de <a href="http://www.jsftutorials.net/jsf-navigation-by-examples.html">regras de navegação entre páginas</a> do JSF, principalmente quando e porquê você deveria usar <a href="http://www.rponte.com.br/2008/07/12/repitam-comigo-redirect-nao-e-forward/">redirect</a> ao invés de um simples forward. E claro, lembre-se que JSF trabalha (submete formulários) apenas com o método POST, não com GET.</p>
<p>Quando as páginas tornam-se grandes e até complexas vale a pena organizar os blocos de componentes através de componentes &#8220;maiores&#8221;, ou seja, componentes do tipo <a href="http://www.rponte.com.br/2008/07/01/jsf-e-naming-container/">naming containers</a>, com eles se torna possível manipular os componentes tanto no lado cliente quanto no lado servidor de forma mais simples.</p>
<p>Os fundamentos chaves do framework também fazem parte do conhecimento básico, ou você acha que apenas saber utilizar os componentes, navegar entre páginas e criar seu próprio validator são suficientes?</p>
<p>Sendo, é muito importante que você os compreenda da melhor forma possível. Provavelmente alguns deles você terá alguma dificuldade de entender no inicio, isto é normal, mas é interessante que você ao menos conheça superficialmente cada um deles.</p>
<p>Comece entendendo como e quando a árvore de componentes é gerada (está muito ligado ao ciclo de vida), busque entender como o JSF <a href="http://www.rponte.com.br/2007/10/14/state_saving_method-server-ou-client/">persiste o estado da árvore de componentes entre requests</a> e porque utilizar JSTL no <a href="http://andrewfacelets.blogspot.com/2008/03/build-time-vs-render-time.html">momento certo</a> é importante.</p>
<p>Os passos necessários para estender ou construir seu próprio componente é algo também importante, mesmo que você não seja um expert nisso, <a href="http://www.ibm.com/developerworks/library/j-jsf4/">conheça estes passos</a>. Eu particularmente nunca tive a necessidade de criar um componente, apenas estendi um [uma única vez], e com a <a href="http://www.jsfmatrix.net/">gama de componentes</a> hoje em dia eu acho muito difícil -mas não improvável- você precisar criar seu próprio componente.</p>
<p>Um fundamento extremamente importante é conhecer as maneiras como os objetos e <a href="http://balusc.blogspot.com/2006/06/communication-in-jsf.html">managed beans se comunicam entre si</a> numa aplicação JSF, pois sem este conhecimento provavelmente você cometeria erros e subutilizaria o framework na sua aplicação.</p>
<p>E por fim, o <strong>mais importante fundamento</strong>, sem sombra de dúvidas, é entender o <a href="http://balusc.blogspot.com/2006/09/debug-jsf-lifecycle.html"><strong>ciclo de vida</strong> (lifecycle) das requisições no JSF</a>. Procure entende-lo muito bem, pois assim você evitará horas quebrando a cabeça com problemas relativamente simples (quem nunca teve dificuldades de entender como funciona o atributo <em>immediate</em>?).</p>
<p>Vale salientar que independente do(s) conjunto(s) de componentes que você pretenda utilizar os conceitos acima te permitirão trabalhar de forma prática, correta e produtiva.</p>
<h3>Mas vá além do básico</h3>
<p>Os conhecimentos básicos são obrigatórios quando se pretende desenvolver qualquer aplicação com JSF, por menor que ela seja, mas a partir do momento que se desenvolve aplicações maiores e até complexas se faz necessário adotar certos frameworks, abordagens e até conhecer ou saber que existem algumas soluções mais interessantes.</p>
<p>Assim como a maioria dos frameworks web, JSF trabalha com páginas, muitas páginas para falar a verdade, e isto nos leva a necessidade de um framework para templating. E sempre que falamos em um framework com esta finalidade para JSF nós não devemos esquecer: <a href="http://www.rponte.com.br/2008/11/12/aplicacoes-serias-em-jsf-usam-facelets/">Aplicações sérias em JSF usam Facelets</a>.</p>
<p>Para quem ainda acha que deve criar seu converter apenas para formatar e remover máscaras de strings deve se interessar por <a href="http://www.rponte.com.br/2008/07/26/entity-converters-pra-da-e-vender/">abordagens mais práticas e produtivas</a> de se trabalhar com componentes e conversão de entidades de domínio da aplicação.</p>
<p>Um dos grandes problemas para quem está começando com JSF e componentes AJAX é a maneira como estes <strong>desenvolvedores subutilizam os recursos AJAX</strong> do framework e dos componentes. Sendo, vale a pena estudar e adotar uma abordagem mais eficiente para isso, uma abordagem com foco em <a href="http://www.rponte.com.br/2008/04/10/utilizando-ajax-com-jsf-de-maneira-eficiente/">navegação orientada a estados</a>.</p>
<p>Uma abordagem orientada a estados é realmente eficaz e produtiva, mas em certos momentos precisamos &#8220;tunar&#8221; as requisições AJAX dos componentes ou mesmo diminuir os gargalos em determinadas páginas, buscar melhores práticas para os conjuntos de componentes e/ou frameworks AJAX adotados para um projeto é dever do desenvolvedor, sejam estas práticas para <a href="http://www.rponte.com.br/2008/11/01/algumas-boas-praticas-com-jsf-e-richfaces/">JBoss Richfaces</a>, <a href="http://myfaces.apache.org/trinidad/devguide/ppr.html">Myfaces Trinidad</a> ou qualquer outro.</p>
<p>A <a href="http://today.java.net/pub/a/today/2006/03/07/unified-jsp-jsf-expression-language.html">Expression Language</a> (EL) do JSF por padrão ainda é bem limitada, porém muito extensível, e muitas vezes precisamos de features bem mais arrojadas, logo, não podemos abrir mão de extensões como a <a href="http://www.rponte.com.br/2008/10/23/estendendo-jsf-el-com-jboss-el/">JBoss EL</a> para que assim evitemos implementar soluções bizarras.</p>
<p>Como havia dito antes, JSF trabalha apenas com POST, porém algumas vezes precisamos submeter formulários via GET ou disponibilizar links (bookmarking) que acessam recursos ou executam algum método no managed bean antes de renderizar uma página. E antes que você implemente seu próprio phase listener ou alguma solução nada elegante eu indico a você o framework <a href="https://restfaces.dev.java.net/">Restfaces</a>.</p>
<p>Nem todas as aplicações web necessitam de um mecanismo arrojado de segurança, muitas vezes uma simples <a href="http://www.urubatan.com.br/implementando-login-com-jsf-exemplo-simples/">página de login</a> para autenticação e um <a href="http://javaboutique.internet.com/tutorials/Servlet_Filters/">Servlet Filter</a> (ou <a href="http://www.comesolvego.com/2008/04/30/jsf-phaselisteners-in-action-image-rendering-back-button-simple-security/">phase listener</a>) para autorização de recursos resolve o problema. Mas <strong>qualquer coisa além disso</strong> você deveria, <strong>obrigatoriamente</strong>, partir para um framework especializado no assunto: como o <a href="http://www.mularien.com/blog/2008/07/07/5-minute-guide-to-spring-security/">Spring Security</a> ou <a href="http://www.jeveaux.com/blog/2009/autenticacao-e-autorizacao-jaas-com-jdbc-realm/">JAAS</a>.</p>
<p>Já cansei muito de bater na tecla que <strong>não existe arquitetura de referência</strong> (aka bala-de-prata) para solucionar todos os problemas de softwares, já discuti muito isso na lista do javasf, <a href="http://www.cejug.org/">cejug</a> e já comentei sobre isso em vários <a href="http://www.rponte.com.br/2008/06/05/nao-era-mais-uma-receita-de-bolo-jsf/">posts</a> meus e de colegas.</p>
<p>Mas também sei que muitos desenvolvedores/arquitetos tem dificuldades em dar inicio numa arquitetura base que se integre bem com JSF, desta forma, eu aconselho a leitura de dois excelentes posts do <a href="http://cagataycivici.wordpress.com/">Cagatay</a> <strong>como referência básica</strong>. <strong>1)</strong> sobre a integração de <a href="http://cagataycivici.wordpress.com/2008/03/04/annotation-driven-jsf-spring-jpa/">JSF+JPA+Spring</a> com o uso massivo de anotações e <strong>2)</strong> com a integração anterior mais o <a href="http://cagataycivici.wordpress.com/2008/06/17/annotation-driven-jsf-spring-jpa-spring-security-orchestra/">Spring Security e Myfaces Orchestra</a>.</p>
<p>Se por algum motivo você não gosta ou não se dá bem com Spring então vale a pena dar uma olhada em um projeto recente de integração entre JSF e Guice, o <a href="http://code.google.com/p/guicesf/">Guicesf</a>. O Guicesf foi uma iniciativa do Volnei, um dos membros do <a href="http://weblogs.java.net/blog/edburns/archive/2008/12/bom_dia_brazili.html">JavaServer Faces International Group</a> (javasf), e que está caminhando muito bem diga-se de passagem.</p>
<p>Ainda assim, acredito que se você tem tempo para estudar e levantar uma arquitetura para seu projeto então corra e dê uma olhada no <a href="http://www.seamframework.org/">JBoss Seam</a>, pois todos os problemas (<a href="http://blog.spock.com.br/2008/07/sobre-os-contextos-do-jboss-seam.html">escopos conversacionais</a>, <a href="http://blog.caelum.com.br/2006/11/01/transientobjectexception-lazyinitializationexception-e-outras-famosas-do-hibernate/">LazyInitializationException</a>, <a href="http://www.devmedia.com.br/articles/viewcomp.asp?comp=11509">bookmarking</a> etc) que você encontrará com JSF e solucionará com a integração de alguns frameworks e componentes você com toda certeza poderá ter a mesma solução muito mais simples e muito melhor implementada no JBoss Seam, ou seja, <a href="http://www.seamframework.org/Documentation">soluções prontas</a>!</p>
<h3>Concluindo</h3>
<p>A maior parte do conhecimento que você precisa para se tornar um bom desenvolvedor JSF está ligada aos <strong>fundamentos do framework</strong>, e aos <strong>fundamentos sobre desenvolvimento web</strong>. Com estes conhecimentos alinhados você não terá muitas dificuldades.</p>
<p>Além do mais, não se assuste se você tiver alguma dificuldade no inicio, principalmente se você já trabalhou com algum framework action-like, como Struts ou Webwork, pois a maioria dos desenvolvedores vindos do &#8220;mundo&#8221; action-like são os que mais possuem <a href="http://www.rponte.com.br/2008/11/24/os-10-maus-habitos-dos-desenvolvedores-jsf/">dificuldades</a> em desenvolver aplicações com JSF.</p>
<p>Não pare por aqui, continue pesquisando e estudando sobre a tecnologia, principalmente sobre as <a href="http://blog.gilliard.eti.br/2008/09/jsf-2-early-draft-review-2/">novidades do JSF2.0</a> que estão por vir. Se você já possui experiência com JSF integrado a outros frameworks então aproveite seu tempo e <strong>dê uma chance ao JBoss Seam</strong>, pois sem dúvida alguma ele está trazendo grande produtivade no desenvolvimento “Enterprisey”.</p>
<p>Enfim, o intuito do post é abrir os olhos de novos desenvolvedores -e até de alguns veteranos- sobre como desenvolver melhor com JSF, e claro, disponibilizar fontes de estudos (quase todos os links levam a outros posts).</p>
<p>No final de tudo, este post nada mais é do que a minha opinião.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rponte.com.br/2009/01/19/o-que-todo-bom-desenvolvedor-jsf-deveria-saber/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Os 10 maus hábitos dos desenvolvedores JSF</title>
		<link>http://www.rponte.com.br/2008/11/24/os-10-maus-habitos-dos-desenvolvedores-jsf/</link>
		<comments>http://www.rponte.com.br/2008/11/24/os-10-maus-habitos-dos-desenvolvedores-jsf/#comments</comments>
		<pubDate>Tue, 25 Nov 2008 04:01:49 +0000</pubDate>
		<dc:creator>Rafael Ponte</dc:creator>
		
		<category><![CDATA[Boas Práticas]]></category>

		<category><![CDATA[Desenvolvimento de Software]]></category>

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

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

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

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

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

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

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

		<category><![CDATA[java.server.faces]]></category>

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

		<category><![CDATA[JavaServer Faces]]></category>

		<category><![CDATA[maus.habitos]]></category>

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

		<category><![CDATA[natal.java.day]]></category>

		<category><![CDATA[os.10.maus.habitos.dos.desenvolvedores.jsf]]></category>

		<guid isPermaLink="false">http://www.rponte.com.br/?p=121</guid>
		<description><![CDATA[Neste último sábado, dia 22 de Novembro, ocorreu o IV Natal Java Day, e diferentemente do ano passado, a qual participei como espectador, este ano eu tive a oportunidade de palestrar sobre o tema &#8220;Os 10 maus hábitos dos desenvolvedores JSF&#8220;.
Tenho que admitir que o evento desde ano superou o evento de 2007, foram muito [...]]]></description>
			<content:encoded><![CDATA[<p>Neste último sábado, dia 22 de Novembro, ocorreu o <a href="http://www.jeebrasil.com.br/nataljavaday/index.jsp">IV Natal Java Day</a>, e diferentemente do ano passado, a qual <a href="http://www.rponte.com.br/2007/10/19/presenca-confirmada-no-iii-natal-java-day/">participei</a> como espectador, este ano eu tive a oportunidade de <a href="http://www.jeebrasil.com.br/nataljavaday/resumos/palestraRafael.jsp">palestrar</a> sobre o tema &#8220;<strong>Os 10 maus hábitos dos desenvolvedores JSF</strong>&#8220;.</p>
<p>Tenho que admitir que o evento desde ano superou o evento de 2007, foram muito mais palestras, todas de alto nível e o melhor, com temas bem diversificados. A equipe do <a href="http://javarn.dev.java.net/">JUG de Natal</a> está realmente de parabéns pela organização, apoio as caravanas e pelo evento como um todo, não tenho nada do que reclamar. Simplesmente posso resumir o evento como &#8220;fantástico&#8221;.</p>
<p>Neste evento tive a oportunidade de conhecer diversos profissionais de vários cantos do país, profissionais como <a href="http://bazedral.blogspot.com/">Serge Rehem</a>, <a href="http://rodrigor.com/">Rodrigo Rebouças</a>, <a href="http://jbossbrasil.ning.com/profile/JoaoPauloViragine">João Paulo Viragine</a>, <a href="http://www.igormedeiros.com.br/">Igor Medeiros</a>, sem falar que praticamente conheci toda a <a href="http://www.jeebrasil.com.br/nataljavaday/organizacao.jsp">coordenação do evento</a> do <a href="http://javarn.dev.java.net/">JavaRN JUG</a> e mais alguns profissionais que não me recordo o nome nesse momento.</p>
<p>Bem, este ano a caravana que partiu daqui de Fortaleza-CE estava composta por <a href="http://www.handersonfrota.com.br/">Handerson Frota</a>, <a href="http://www.milfont.org/tech/">Christiano Milfont</a>, <a href="http://renearaujo.blogspot.com/">René Araújo</a>, <a href="http://yross.wordpress.com/">Ythalo Rossy</a>, eu e mais alguns outros membros do <a href="http://www.cejug.org/display/cejug/Home">CEJUG</a>. Dentre estes, <a href="http://www.milfont.org/tech/2008/11/24/material-iv-natal-java-day-2008/">Milfont</a>, <a href="http://www.handersonfrota.com.br/natal-java-day-2008/">Handerson</a> e eu palestramos no evento, cada um com temas bem distintos e de alto nível ténico.</p>
<p>Sendo, segue a minha apresentação, que por sua vez poderá ser baixada no formato PDF:</p>
<div style="width:425px;text-align:left" id="__ss_781787"><a style="font:14px Helvetica,Arial,Sans-serif;display:block;margin:12px 0 3px 0;text-decoration:underline;" href="http://www.slideshare.net/rponte/os-10-maus-hbitos-dos-desenvolvedores-jsf-presentation?type=powerpoint" title="Os 10 maus hábitos dos desenvolvedores JSF">Os 10 maus hábitos dos desenvolvedores JSF</a><object style="margin:0px" width="425" height="355"><param name="movie" value="http://static.slideshare.net/swf/ssplayer2.swf?doc=os10maushabitosdosdesenvolvedoresjsf-1227498904307343-9&#038;stripped_title=os-10-maus-hbitos-dos-desenvolvedores-jsf-presentation" /><param name="allowFullScreen" value="true"/><param name="allowScriptAccess" value="always"/><embed src="http://static.slideshare.net/swf/ssplayer2.swf?doc=os10maushabitosdosdesenvolvedoresjsf-1227498904307343-9&#038;stripped_title=os-10-maus-hbitos-dos-desenvolvedores-jsf-presentation" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"></embed></object>
<div style="font-size:11px;font-family:tahoma,arial;height:26px;padding-top:2px;">View SlideShare <a style="text-decoration:underline;" href="http://www.slideshare.net/rponte/os-10-maus-hbitos-dos-desenvolvedores-jsf-presentation?type=powerpoint" title="View Os 10 maus hábitos dos desenvolvedores JSF on SlideShare">presentation</a> or <a style="text-decoration:underline;" href="http://www.slideshare.net/upload?type=powerpoint">Upload</a> your own. (tags: <a style="text-decoration:underline;" href="http://slideshare.net/tag/maus-habitos">maus.habitos</a> <a style="text-decoration:underline;" href="http://slideshare.net/tag/java">java</a>)</div>
</div>
<p>Esta apresentação seria ministrada por mim e pelo Tarso Bessa [membro do <a href="http://www.cejug.org/display/cejug/Home">CEJUG</a> e com certeza um dos profissionais mais safos em JSF do nosso mercado], mas infelizmente ele não pôde ir ao evento, logo fiquei incubido de sozinho alertar os desenvolvedores sobre os erros mais comuns durante o desenvolvimento com a tecnologia JSF.</p>
<p>Enfim, gostaria de agradecer ao <a href="http://javarn.dev.java.net/">JavaRN JUG</a> pela oportunidade e principalmente pelo grande evento que sem dúvida foi, e é, impagável. Parabéns a todos, espero nos vermos próximo ano em Natal com muito mais Java e aquele excelente cappuccino depois do almoço <img src='http://www.rponte.com.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.rponte.com.br/2008/11/24/os-10-maus-habitos-dos-desenvolvedores-jsf/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>

