<?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>Fri, 11 Sep 2009 03:05:52 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.6.2</generator>
	<language>en</language>
			<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>
<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>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>
		<item>
		<title>Aplicações sérias em JSF usam Facelets</title>
		<link>http://www.rponte.com.br/2008/11/12/aplicacoes-serias-em-jsf-usam-facelets/</link>
		<comments>http://www.rponte.com.br/2008/11/12/aplicacoes-serias-em-jsf-usam-facelets/#comments</comments>
		<pubDate>Thu, 13 Nov 2008 04:11:28 +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[web]]></category>

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

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

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

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

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

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

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

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

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

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

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

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

		<category><![CDATA[struts.tiles]]></category>

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

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

		<category><![CDATA[templating.framework]]></category>

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

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

		<guid isPermaLink="false">http://www.rponte.com.br/?p=86</guid>
		<description><![CDATA[Não há exagero no título do post, de fato, aplicações sérias desenvolvidas em JSF deveriam utilizar Facelets. Desenvolvedores que abrem mão de todas as vantagens oferecidas por este framework estão &#8220;pisando na bola&#8221;.
Já é de conhecimento da maioria que JSF sozinho [apenas a implementação] não nos fornece os recursos necessários para desenvolver médias ou grandes [...]]]></description>
			<content:encoded><![CDATA[<p>Não há exagero no título do post, de fato, <strong>aplicações sérias desenvolvidas em JSF deveriam utilizar <a href="https://facelets.dev.java.net/">Facelets</a></strong>. Desenvolvedores que abrem mão de todas as vantagens oferecidas por este framework estão &#8220;pisando na bola&#8221;.</p>
<p>Já é de conhecimento da maioria que JSF sozinho [<a href="http://www.rponte.com.br/2008/02/18/qual-implementacao-jsf-voce-usa/">apenas a implementação</a>] não nos fornece os recursos necessários para desenvolver médias ou grandes aplicações webs de maneira produtiva, o framework possui vários problemas (mas qual não possui?), muitos deles são facilmente resolvidos com a adoção de algum framework ou <a href="http://www.jsfmatrix.net/">conjunto de componentes</a>, outros podemos resolver apenas com algum conhecimento/conceito base sobre o framework ou seguindo algumas boas práticas.</p>
<p>E por falar em <a href="http://www.rponte.com.br/2008/11/01/algumas-boas-praticas-com-jsf-e-richfaces/">boas práticas</a>, certamente uma das melhores práticas <strong>-e praticamente obrigatória-</strong> é a utilização de algum framework de templating para construção das páginas, não somente em JSF, claro.</p>
<p>Pois se estamos trabalhando com páginas, por que então não utilizarmos algum framework para definição de templates?</p>
<h4>Templating frameworks</h4>
<p>Hoje existem várias opções de frameworks com essa finalidade, porém a grande maioria deles não foi desenvolvido para trabalhar com JSF, a maioria deles não foi desenvolvido para trabalhar de acordo com o ciclo de vida das requisições processadas pelo JSF. Alguns deles funcionam até bem, porém com toda certeza em determinados momentos eles te deixarão na mão.</p>
<p>Acredito que hoje os frameworks para definição de templates mais comuns são o <a href="http://struts.apache.org/1.x/struts-tiles/">Struts Tiles</a> e o <a href="http://opensymphony.com/sitemesh/">Sitemesh</a>, ambos funcionam bem com JSF até que em algumas situações os problemas começam a surgir, problemas como perda do FacesContext, código duplicado, conflito de componentes, funcionalidades AJAX param de funcionar etc. Sendo, com certeza nem <a href="http://struts.apache.org/1.x/struts-tiles/">Struts Tiles</a> nem <a href="http://opensymphony.com/sitemesh/">Sitemesh</a> são boas opções de frameworks para se trabalhar com JSF.</p>
<p>Pior do que usar um dos dois frameworks citados acima é criar seu <strong>próprio</strong> <strong><em>mini-fashion-templating-framework</em></strong>, seja utilizando-se de <a href="http://www.ibm.com/developerworks/java/library/j-jsptags.html">JSP taglibs</a> ou mesmo de um <a href="http://java.sun.com/products/servlet/Filters.html">Servlet Filter</a>, não importa, fuja disso, evite reinventar a roda, aliás, evite reinventar uma roda ainda pior do que as já existentes [não quero entrar na discussão dos <a href="http://www.milfont.org/tech/2008/01/20/frameworkstools-caseiros-ou-fechados/">malefícios</a> de criar seu <a href="http://www.rafaelcarneiro.org/blog/2008/05/23/frameworks-agindo-com-bom-senso/">framework caseiro</a>].</p>
<h4>A melhor opção</h4>
<p>Já faz um bom tempo que temos excelentes opções de templating frameworks <strong>desenvolvidos especialmente</strong> <strong>para JavaServer Faces</strong> como o <a href="https://facelets.dev.java.net/">Facelets</a> ou <a href="https://jsftemplating.dev.java.net/">JSFTemplating</a>. Ambos trabalham perfeitamente bem com JSF e trazem diversos benefícios tanto em termos de perfomance como em produtividade.</p>
<p>Mas com toda certeza o mais utilizado, mais popular, com maior suporte da comunidade, maior documentação e provavelmente mais estável entre eles é o <a href="https://facelets.dev.java.net/">Facelets</a>.</p>
<p>Iniciar um projeto web com JSF e não adotar Facelets é começar um projeto &#8220;pisando na bola&#8221;, é abrir mão de diversos benefícios para a equipe de desenvolvedores e para a aplicação em si.</p>
<p><a href="https://facelets.dev.java.net/">Facelets</a> possui várias vantagens que vão desde a facilidade na criação e reutilização de páginas e componentes, melhor depuração de erros, AJAX nativo, uma melhor compatibilidade entre <a href="http://en.wikipedia.org/wiki/XHTML">XHTML</a>, <a href="http://en.wikipedia.org/wiki/JavaServer_Pages_Standard_Tag_Library">JSTL</a> e os componentes, ele é independente de web container, e claro, <strong>Facelets é de 30% a 50% mais rápido que JSP</strong>.</p>
<p>Ah, claro, como poderia esquecer, <a href="http://www.rponte.com.br/2008/06/30/o-que-esperar-do-jsf-20/">JSF2.0</a> adotou Facelets como view handler padrão, então, provavelmente migrar uma aplicação de JSF1.2 (ou mesmo JSF1.1) para JSF2.0 será menos trabalhoso ainda caso você não o estive usando.</p>
<p>Estas são somente algumas vantagens ao se adotar Facelets em um projeto, <a href="https://facelets.dev.java.net/nonav/docs/dev/docbook.html#intro">existem várias outras</a>, mas eu considero estas como as principais.</p>
<h4>Concluindo</h4>
<p>Infelizmente JSF1.2 utiliza-se de JSP como view handler padrão por questões políticas e principalmente comercias, mas acreditem em mim, eles são como água e óleo, <strong>não combinam juntos</strong>. Para falar a verdade, por que você acha que todos os exemplos dos produtos da <a href="http://www.jboss.org/">JBoss</a> (<a href="http://www.jboss.org/jbossrichfaces/">Richfaces</a>, <a href="http://www.seamframework.org/">Seam</a> etc) estão utilizando-se massivamente de Facelets e não de JSP?</p>
<p>Enfim, não há motivos para não adotar Facelets em um novo projeto ou mesmo em um projeto já em andamento [<a href="http://wiki.java.net/bin/view/Projects/FaceletsFAQ#How_do_I_use_Facelets_and_JSP_in">é possível ir migrando de JSP para Facelets aos poucos</a>], todos os conjuntos de componentes que conheço funcionam perfeitamente bem com ele e algumas vezes até melhor, o que não falta são <a href="http://wiki.java.net/bin/view/Projects/FaceletsArticles">artigos</a>, blogs, <a href="http://www.devmedia.com.br/articles/viewcomp.asp?comp=5332">tutoriais</a>, <a href="http://www.guj.com.br/">fóruns</a>, revistas e <a href="http://groups.google.com/group/javasf">listas de discussão</a> com informações suficientes para configurar  e tirar melhor proveito do Facelets na sua aplicação.</p>
<p>Volto a dizer, iniciar um projeto sério em JSF sem adotar Facelets como framework para templating <strong>é começar errado</strong>. Eu falo sério.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rponte.com.br/2008/11/12/aplicacoes-serias-em-jsf-usam-facelets/feed/</wfw:commentRss>
		</item>
		<item>
		<title>CearáOnRails, o evento e a comunidade que estavam faltando!</title>
		<link>http://www.rponte.com.br/2008/11/05/cearaonrails-o-evento-e-a-comunidade-que-estavam-faltando/</link>
		<comments>http://www.rponte.com.br/2008/11/05/cearaonrails-o-evento-e-a-comunidade-que-estavam-faltando/#comments</comments>
		<pubDate>Thu, 06 Nov 2008 01:57:50 +0000</pubDate>
		<dc:creator>Rafael Ponte</dc:creator>
		
		<category><![CDATA[Desenvolvimento de Software]]></category>

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

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

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

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

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

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

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

		<category><![CDATA[fabio.akita]]></category>

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

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

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

		<guid isPermaLink="false">http://www.rponte.com.br/?p=90</guid>
		<description><![CDATA[
Próxima semana, dia 14 de Novembro, estará ocorrendo o primeiro evento oficial sobre Rails aqui em Fortaleza (no Ceará?). Graças a iniciativa de alguns desenvolvedores daqui do Ceará o evento ganhou vida e está trazendo um dos maiores nomes de RubyOnRails do Brasil, Fábio Akita. O que é incrível para o primeiro evento, e olha [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><a rel="http://www.cearaonrails.org/" href="http://www.cearaonrails.org/"><img class="aligncenter" src="http://www.handersonfrota.com.br/blog/wp-content/uploads/2008/11/banner_468x60.png" alt="" width="468" height="60" /></a></p>
<p>Próxima semana, dia <strong>14 de Novembro</strong>, estará ocorrendo o <a href="http://www.cearaonrails.org/">primeiro evento oficial sobre Rails</a> aqui em Fortaleza (no Ceará?). Graças a iniciativa de alguns desenvolvedores daqui do Ceará o evento ganhou vida e está trazendo um dos maiores nomes de <a href="http://www.rubyonrails.pro.br/">RubyOnRails</a> do Brasil, <a href="http://www.akitaonrails.com/"><strong>Fábio Akita</strong></a>. O que é incrível para o primeiro evento, e olha que tudo começou em uma lista de discussão!</p>
<p>O mercado de Fortaleza é conhecido pelos seus diversos <a href="http://cejug.org/pages/viewpage.action?pageId=2818055">eventos mensais</a> sobre a tecnologia Java e desenvolvimento de software, para falar a verdade, o mercado local é muito mais Java que outras tecnologias como .Net ou mesmo PHP. Mas agora com este evento o nosso mercado estará ganhando um sabor a mais, um sabor que já estava fazendo falta, muita falta.</p>
<p>Além da grande comunidade de desenvolvedores Java do <a href="http://cejug.org/">CEJUG</a>, e da recente chegada do <a href="http://cepug.org/">CEPUG</a>, agora temos uma comunidade pequena e ainda modesta, porém dedicada, em volta de <a href="http://www.rubyonrails.pro.br/">RubyOnRails</a>, a <a href="http://www.cearaonrails.org/">CearaOnRails</a>. Com um início não tão tímido, esta comunidade pretende trazer a cultura Rails para o nosso mercado, e certamente eu e mais <a href="http://www.handersonfrota.com.br/ceara-on-rails/">alguns</a> <a href="http://www.milfont.org/tech/">desenvolvedores</a> estaremos divulgando-a entre as empresas e profissionais, <strong>pois não só de Java se vive do homem</strong> <img src='http://www.rponte.com.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Enfim, o evento ocorrerá logo, logo. Eu marcarei presença com toda certeza, e aconselho aos profissionais, estudantes e empresários a participarem do evento e darem uma chance a essa cultura [pois Rails é mais que uma tecnologia] que tanto tem a agregar valor ao nosso mercado e aos softwares aqui desenvolvidos.</p>
<p>Mais informações sobre local, horário e palestras você obtém no site do Ceará On Rails, <a href="http://www.cearaonrails.org/">http://www.cearaonrails.org/</a>.</p>
<p>Espero vocês lá!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rponte.com.br/2008/11/05/cearaonrails-o-evento-e-a-comunidade-que-estavam-faltando/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Algumas boas práticas com JSF e Richfaces</title>
		<link>http://www.rponte.com.br/2008/11/01/algumas-boas-praticas-com-jsf-e-richfaces/</link>
		<comments>http://www.rponte.com.br/2008/11/01/algumas-boas-praticas-com-jsf-e-richfaces/#comments</comments>
		<pubDate>Sat, 01 Nov 2008 22:56:05 +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[ajax4jsf]]></category>

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

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

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

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

		<guid isPermaLink="false">http://www.rponte.com.br/?p=80</guid>
		<description><![CDATA[Esses dias eu estava fuçando meus arquivos e encontrei uma apresentação que eu havia utilizado para uma consultoria numa empresa muito conhecida no mercado local. A empresa estava adotando Jsf, mais especificamente Jboss Richfaces, como solução para a camada de visão de uma nova aplicação web que eles pretendiam desenvolver.
Na época, por volta de um [...]]]></description>
			<content:encoded><![CDATA[<p>Esses dias eu estava fuçando meus arquivos e encontrei uma apresentação que eu havia utilizado para uma consultoria numa empresa muito conhecida no mercado local. A empresa estava adotando Jsf, mais especificamente <a href="http://labs.jboss.com/jbossrichfaces/">Jboss Richfaces</a>, como solução para a camada de visão de uma nova aplicação web que eles pretendiam desenvolver.</p>
<p>Na época, por volta de um ano atrás, fui contratado para ministrar um treinamento sobre como aplicar boas práticas no desenvolvimento com a tecnologia Jsf, pois a equipe de desenvolvedores desta empresa tinha o receio de não conseguir obter proveito dos recursos dos frameworks adotados, como também era de interesses deles &#8220;tunar&#8221; a utilização de AJAX na aplicação e por fim, como integrar Jsf com o framework javascript <a href="http://extjs.com/">ExtJs</a>.</p>
<p>A apresentação está bem simples, serve somente como resumo sobre o que foi passado à eles, porém apenas observando-a é possível saber como conseguir um melhor proveito dos frameworks e conjuntos de componentes ao redor de Jsf, principalmente no aspecto da utilização dos recursos AJAX oferecidos por vários dos componentes do Richfaces.</p>
<p>Algumas das práticas contidas nos slides <a href="http://www.rponte.com.br/2008/06/05/nao-era-mais-uma-receita-de-bolo-jsf/">já foram muito discutidas por aqui</a>, outras eu sempre comento um pouco em alguns posts e na maioria das vezes elas foram muito discutidas na lista do <a href="http://groups.google.com/group/javasf">JavaServer Faces International Group</a>.</p>
<div id="__ss_713230" style="width: 425px; text-align: left;"><a style="font:14px Helvetica,Arial,Sans-serif;display:block;margin:12px 0 3px 0;text-decoration:underline;" title="Boas Práticas com JavaServer Faces (Jsf)" href="http://www.slideshare.net/rponte/boas-prticas-com-javaserver-faces-jsf-presentation?type=powerpoint">Boas Práticas com JavaServer Faces (Jsf)</a><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="425" height="355" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowScriptAccess" value="always" /><param name="src" value="http://static.slideshare.net/swf/ssplayer2.swf?doc=boaspraticasjsf-1225577855861476-9&amp;stripped_title=boas-prticas-com-javaserver-faces-jsf-presentation" /><embed type="application/x-shockwave-flash" width="425" height="355" src="http://static.slideshare.net/swf/ssplayer2.swf?doc=boaspraticasjsf-1225577855861476-9&amp;stripped_title=boas-prticas-com-javaserver-faces-jsf-presentation" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<div style="font-size: 11px; font-family: tahoma,arial; height: 26px; padding-top: 2px;">View SlideShare <a style="text-decoration:underline;" title="View Boas Práticas com JavaServer Faces (Jsf) on SlideShare" href="http://www.slideshare.net/rponte/boas-prticas-com-javaserver-faces-jsf-presentation?type=powerpoint">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/java-server-faces">java.server.faces</a> <a style="text-decoration:underline;" href="http://slideshare.net/tag/jsf">jsf</a>)</div>
</div>
<p>Algumas das dicas sobre a utilização do <a href="http://labs.jboss.com/jbossrichfaces/">Richfaces/Ajax4jsf</a> podem ter mudado de alguma forma no decorrer das versões do framework, outras features certamente surgiram para ajudar na melhor utilização dos componentes e recursos AJAX, contudo, a chave para &#8220;tunar&#8221; o Richfaces ou qualquer conjunto de componentes AJAX basicamente é:</p>
<ul>
<li>Antes de enviar uma requisição AJAX <strong>decida o que enviar</strong>;</li>
<li>Antes de enviar uma requisição AJAX também <strong>decida o que atualizar</strong>;</li>
</ul>
<p>Enfim, muito do que se foi discutido na apresentação está bem mais clara e fácil de encontrar hoje na documentação dos frameworks e conjunto de componentes, blogs, listas de dicussão, fóruns e artigos em revistas especializadas.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rponte.com.br/2008/11/01/algumas-boas-praticas-com-jsf-e-richfaces/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
