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

<channel>
	<title>Gilliard Cordeiro</title>
	<atom:link href="http://blog.gilliard.eti.br/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.gilliard.eti.br</link>
	<description>tá nervoso? vai programar!</description>
	<lastBuildDate>Wed, 21 Sep 2011 05:22:19 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Tipos de Scaffold com Grails</title>
		<link>http://blog.gilliard.eti.br/2011/09/tipos-de-scaffold-com-grails/</link>
		<comments>http://blog.gilliard.eti.br/2011/09/tipos-de-scaffold-com-grails/#comments</comments>
		<pubDate>Wed, 21 Sep 2011 04:11:05 +0000</pubDate>
		<dc:creator>Gilliard Cordeiro</dc:creator>
				<category><![CDATA[Grails]]></category>
		<category><![CDATA[Groovy]]></category>
		<category><![CDATA[grails]]></category>
		<category><![CDATA[scaffold]]></category>

		<guid isPermaLink="false">http://blog.gilliard.eti.br/?p=392</guid>
		<description><![CDATA[No último sábado, dia 17/09/2011 fizemos um HandsOn do JUGMS com Groovy 1.8 e Grails 2.0.0.M2. Vimos desde o básico, começando com um overview de Groovy e depois vendo o basicão de Grails. Como muitas dessas coisas não é muito dificil de conseguir ver na net, vou focar em coisas que nesse momento agregam um [...]]]></description>
			<content:encoded><![CDATA[<p>No último sábado, dia 17/09/2011 fizemos um <a href="http://www.jugms.com.br/blog/2011/09/20/handson-groovy-1-8-e-grails-2-0/" target="_blank">HandsOn do JUGMS</a> com <a href="http://docs.codehaus.org/display/GROOVY/Groovy+1.8+release+notes" target="_blank">Groovy 1.8</a> e <a href="http://grails.org/doc/2.0.x/" target="_blank">Grails 2.0.0.M2</a>. Vimos desde o básico, começando com um overview de Groovy e depois vendo o basicão de Grails. Como muitas dessas coisas não é muito dificil de conseguir ver na net, vou focar em coisas que nesse momento agregam um pouco mais de valor. Aí sim, depois que postar as coisas menos fáceis de achar na net, posso postar um projeto desde o início. Mas até lá (se esse lá chegar) tem um monte de vídeo bacana na net com esse início.</p>
<p>Uma coisa bacana dessas ferramentas modernas como RoR, Grails, Roo, e mais um monte, é o scaffold. Mas apesar de ser meio carne de vaca, vou tentar falar disso mostrando umas coisinhas a mais.</p>
<p><br/><br/></p>
<h2>Scaffold</h2>
<p>Esse conceito foi copiado da engenharia civil, e quer dizer andaime. Eles servem para sustentar os trabalhadores enquanto a estrutura final não está pronta, ou seja, é algo temporário, um quebra galho.<br />
Na programação é a mesma coisa&#8230; uma estrutura temporaria que serve para que possamos nos focar no mais importante em vez de ficar metade do tempo do projeto enfeitando CRUD. Ao mesmo tempo que os scaffolds são massa pra caramba numa primeira olhada, logo depois começamos a passar uma certa raiva com o código gerado, pois mais cedo ou mais tarde temos que mexer nesse código. Bom, para lidar melhor com isso vamos dar uma olhada em três formas de scaffold que podemos usar com o Grails.</p>
<p>Para mostrar um código mais próximo do real vou usar como exemplo o projeto <a href="https://github.com/gscordeiro/jugmotors" target="_blank">jugmotors</a> (criado no HandsOn) e suas respectivas classes de domínio.</p>
<p><br/><br/></p>
<h3>1. Scaffold estático</h3>
<p>Esseé o mais basicão de todos. É o que conseguimos ao executar</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">grails genereate-all jugmotors.Pedido</pre></div></div>

<p>Isso gera o controlador <code>PedidoController</code> e as views correspondentes às operações de CRUD.<br />
<strong>Ponto positivo:</strong> o código está ali, pronto para você customizar<br />
<strong>Ponto negativo:</strong> se você mudar a domain class o CRUD vai ficar desatulizado, faltando campos, e aí vem erro ao salvar por campos requeridos não estarem na tela, etc.</p>
<p><br/><br/></p>
<h3>2. Scaffold dinâmico</h3>
<p>Em vez de gerar tudo, só crie um controlador assim:</p>
<pre class="brush: groovy; title: ; notranslate">
class ModeloController {
    static scaffold = true
}
</pre>
<p>Nesse caso, como o controlador tem o mesmo nome (fora o sufixo) que a domain class Modelo, automaticamente será gerado todo o scaffold em tempo de execução. Se o controlador não tivesse o mesmo nome, você teria o mesmo efeito com:</p>
<pre class="brush: groovy; title: ; notranslate">
class AlgumNomeController {
    static scaffold = Modelo
}
</pre>
<p>O legal é que a gente pode ir sobrescrevendo cada elemento do scaffold, como uma action do controlador ou então uma view do CRUD, ou só a show.gsp, ou só a list.gsp e assim sucessivamente.</p>
<p><strong>Ponto positivo:</strong> você pode alterar livremente a classe de domínio que o scaffold se adapta automaticamente, pois não existe um código &#8220;físico&#8221; executando.<br />
<strong>Ponto negativo:</strong> se não tivermos outro scaffold estatico gerado para ter noção do código que vai ser executado, acabamos ficando vendidos, pois não vemos o código. Pelo mesmo motivo, quando formos sobrescrever algum elemento do scaffold, podemos esquecer algum passo importante.</p>
<p><br/><br/></p>
<h3>3. Install-templates</h3>
<p>Tá certo que esse não chega a ser um tipo de scaffold, mas executando</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">grails install-templates</pre></div></div>

<p>A gente ganha os pontos positivos do scaffold estatico e do dinâmico. Tanto o código gerado no scaffold estático, quanto o que executa no dinâmico (apesar de não vermos) veem dos templates. Esses templates ficam dentro da instalação do grails, mas quando executamos esse script copiamos ele para dentro do projeto. A partir de então, toda vez que mandarmos o grails fazer alguma coisa, como gerar um controlador, view ou mesmo um scaffold inteiro, ele vai usar o template do projeto, e não do grails. Obviamente ele primeiro olha no projeto e se não encontrar vai para o grails.</p>
<p>No projeto jugmotors, eu fiz um scaffold estático sem customização: <code>pedido</code>; e um customizado: <code>modelo</code>.</p>
<p>O CRUD de <code>pedido</code> eu deixei como foi gerado, mas o de modelo eu fiz umas mudanças simples só para exemplificar a customização dos templates. Na view <a href="https://github.com/gscordeiro/jugmotors/blob/master/grails-app/views/modelo/list.gsp" target="_blank">list.gsp</a> eu coloquei as mesmas opções presentes na view show (editar e deletar). Então em vez da listagem padrão que só tem um link para a visualização, agora temos um botão que manda direto para e edição e um que apaga.</p>
<p>Depois de ter customizado essa tela, eu voltei para o código do template <a href="https://github.com/gscordeiro/jugmotors/blob/master/src/templates/scaffolding/list.gsp" target="_blank">list.gsp</a> e coloqui o mesmo estilo nele (não que esteja bom ou bonito, a ideia é exemplificar).</p>
<p>Agora se executarmos o CRUD de opcional, que é dinâmico, vemos que fica bem parecido com o de modelo. Agora se eu executar</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">grails generate-all &lt;domain class&gt;</pre></div></div>

<p>O código gerado já vai sair de acordo com o meu novo template. Isso é muito legal, pois não temos que ficar &#8220;reféns&#8221; do código gerado pelo framework, pois agora o código é meu.</p>
<p><strong>Ponto positivo:</strong> Tanto o scaffold estático quanto o dinâmico respeitam o nosso template <img src='http://blog.gilliard.eti.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br />
<strong>Ponto negativo:</strong> A gente vai ter um pouco mais de trabalho para fazer um template do que para fazer um arquivo comum, seja um gsp ou um groovy. Isso porque temos que prestar atenção nas expressões que escrevem outas expressões&#8230; então temos que usar muito escape. Exemplo simples do template list.gsp:</p>
<pre class="brush: xml; title: ; notranslate">
&lt;g:link class=&quot;edit&quot; action=&quot;edit&quot; id=&quot;\${${propertyName}.id}&quot;&gt;Editar&lt;/g:link&gt;
</pre>
<p>Aqui no caso a <em>propertyName</em> se refere ao nome da propriedade do g:each que itera todos os objetos. Supondo que em tempo de execução propertyName seja igual a &#8220;pedidoInstance&#8221;, o resultado seria:</p>
<pre class="brush: xml; title: ; notranslate">
&lt;g:link class=&quot;edit&quot; action=&quot;edit&quot; id=&quot;${pedidoInstance.id}&quot;&gt;Editar&lt;/g:link&gt;
</pre>
<p>Espero que a partir de agora a gente use mais essa funcionalidade de instalar os templates e assim customizá-los. E apesar de eu ter colocado somente o exemplo de customização de template de uma view, navegando dentro da pasta <strong>src/templates</strong> do projeto podemos ver os templates usados para criar classes de domínio, controladores, filtros, testes, etc. Logo, templates não são apenas para scaffold.</p>
<p>Mas pessoal, lembre do conceito do scaffold. A idéia é te entregar algo resoável para trabalharmos no mais importante. Então a menos que seja um CRUD muito sem vergonha é bom que você substitua o código gerado (mesmo customizado via template) pelo teu, que provavelmente vai ser melhor que o gerado.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.gilliard.eti.br/2011/09/tipos-de-scaffold-com-grails/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Palestra Grails Javaneiros 2008</title>
		<link>http://blog.gilliard.eti.br/2010/12/palestra-grails-javaneiros-2008/</link>
		<comments>http://blog.gilliard.eti.br/2010/12/palestra-grails-javaneiros-2008/#comments</comments>
		<pubDate>Thu, 09 Dec 2010 01:26:47 +0000</pubDate>
		<dc:creator>Gilliard Cordeiro</dc:creator>
				<category><![CDATA[Grails]]></category>
		<category><![CDATA[Groovy]]></category>

		<guid isPermaLink="false">http://blog.gilliard.eti.br/?p=360</guid>
		<description><![CDATA[Então, sei que já faz mais de 2 anos (mais precisamente em 08/11/2008), mas como acabei não publicando o conteúdo dessa palestra na época, estou agora, impulsionado pelos desenvolvimento do JMeetings fazendo isso. Além disso tem um outro motivo. Esses tempos meu HD deu pau e quase perdi um monte de palestras antigas que por [...]]]></description>
			<content:encoded><![CDATA[<p>Então, sei que já faz mais de 2 anos (mais precisamente em 08/11/2008), mas como acabei não publicando o conteúdo dessa palestra na época, estou agora, impulsionado pelos desenvolvimento do <a href="https://github.com/jugms/jmeetings">JMeetings</a> fazendo isso. Além disso tem um outro motivo. Esses tempos meu HD deu pau e quase perdi um monte de palestras antigas que por algum motivo não publiquei. Então estou aproveitando o fim de ano para limpar meus rascunhos e ir postando essas palestras antigas <img src='http://blog.gilliard.eti.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<div style="width:425px" id="__ss_6069058"><strong style="display:block;margin:12px 0 4px"><a href="http://www.slideshare.net/gscordeiro/grails-o-que-isso-quer-dizer" title="Grails, o que isso quer dizer?">Grails, o que isso quer dizer?</a></strong><object id="__sse6069058" width="425" height="355"><param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=grails-101207210947-phpapp02&#038;stripped_title=grails-o-que-isso-quer-dizer&#038;userName=gscordeiro" /><param name="allowFullScreen" value="true"/><param name="allowScriptAccess" value="always"/><embed name="__sse6069058" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=grails-101207210947-phpapp02&#038;stripped_title=grails-o-que-isso-quer-dizer&#038;userName=gscordeiro" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"></embed></object>
<div style="padding:5px 0 12px">Veja minhas <a href="http://www.slideshare.net/gscordeiro">outras apresentações</a>.</div>
</div>
<p>De lá para cá obviamente muitas coisas mudaram, como por exemplo a utilização do servidor tomcat em vez do jetty como padão. Além disso logo depois da apresentação (três dias depois) a <a href="http://www.springsource.com/newsevents/g2one">SpringSource comprou o G2One</a>, que mantinha a linguagem Groovy e o Grails. E menos de um ano depois disso a <a href="www.vmware.com/go/springsource/">SpringSource foi adiquirida pela VMWare</a>.</p>
<p>Estarei postando assim que possível um vídeo mostrando como é simples desenvolver usando <a href="http://grails.org/">Grails</a>. Ou pelo menos tão simples como poderia ser desenvolver em outras plataformas como <a href="http://www.rubyonrails.org/">RoR</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.gilliard.eti.br/2010/12/palestra-grails-javaneiros-2008/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Será que o Java 7/8 faz falta mesmo?</title>
		<link>http://blog.gilliard.eti.br/2010/12/sera-que-o-java-7-8-faz-falta-mesmo/</link>
		<comments>http://blog.gilliard.eti.br/2010/12/sera-que-o-java-7-8-faz-falta-mesmo/#comments</comments>
		<pubDate>Thu, 02 Dec 2010 04:01:37 +0000</pubDate>
		<dc:creator>Gilliard Cordeiro</dc:creator>
				<category><![CDATA[Groovy]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Scala]]></category>
		<category><![CDATA[ARM]]></category>
		<category><![CDATA[Automatic Resource Management]]></category>
		<category><![CDATA[closures]]></category>
		<category><![CDATA[Java 7]]></category>
		<category><![CDATA[Java 8]]></category>
		<category><![CDATA[Project Coin]]></category>
		<category><![CDATA[properties]]></category>

		<guid isPermaLink="false">http://blog.gilliard.eti.br/?p=309</guid>
		<description><![CDATA[Antes de mais nada sei que um ou outro pode querer me xingar sem nem ler o post. Esse post não serve para dizer que eu não quero que o Java evolua, que saiam novas versões, etc. Óbvio que isso é importante e por isso não vou nem discutir isso. Mas o ponto é: tem [...]]]></description>
			<content:encoded><![CDATA[<p>Antes de mais nada sei que um ou outro pode querer me xingar sem nem ler o post. Esse post não serve para dizer que eu não quero que o Java evolua, que saiam novas versões, etc. Óbvio que isso é importante e por isso não vou nem discutir isso. Mas o ponto é: tem motivos para eu ficar <del datetime="2010-11-26T00:19:53+00:00">choramingando</del> lamentando a falta de recursos da <strong>linguagem</strong>, sem olhar para o que é mais importante, que é a <strong>plataforma</strong>? Ficar pensando porque essas mudanças nunca saem em vez de usar o que já temos hoje? A minha resposta pessoal é não, e o intuito deste post é explicar o porquê.</p>
<p>E porque eu coloquei Java 7 e 8 numa tacada só? Bom, talvez você não tenha acompanhado a <a href="http://slashdot.org/story/10/11/22/2329217/The-Details-of-Oracles-JDK-7-and-8-Plan-B">novela da estratégia da Oracle para o Java 7</a>. Resumindo, em vez de fazer um Java 7 pela metade &#8220;agora&#8221; ou um Java 7 completo para sabe-se lá quando, optou-se por fazer um &#8220;Java 7&#8243; em duas fazes. Uma primeira que será o 7 e não vai ter muitas das coisas complicadas de implementar, e a segunda será o 8 e aí sim vai ter tudo que era esperado para o 7. Bem melhor do que demorar tudo que já demorou até hoje e ainda fazer &#8220;de qualquer jeito&#8221;.</p>
<p>Mas o artigo não é sobre Java 7/8 (vou tratar como uma única versão mesmo), e sim sobre a gente precisar ou não desesperadamente da nova versão da <strong>linguagem</strong>, e não das evoluções na <strong>plataforma</strong>. O que vou mostrar é que praticamente tudo que esperamos da próxima versão do Java (linguagem) já temos pronto em outras duas das principais linguagens para a JVM: Groovy e Scala.</p>
<p>Para esse artigo não ficar muito longo vou assumir que você está familiarizado com o fato da plataforma Java ser mais do que a linguagem Java. Mas já deixo na gaveta um post sobre a plataforma para deixar isso mais claro depois. </p>
<p>Além disso meu objetivo aqui não é escrever um post que explique em detalhes cada uma das funcionalidades citadas em cada uma das linguagens, e sim mostrar rapidamente cada coisa. Sendo assim reservo-me o direito de citar referências externas em vez de criar código de exemplo próprio <img src='http://blog.gilliard.eti.br/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p><br/><br/></p>
<h2>Geral</h2>
<p>Para as próximas versões do Java existe o projeto <a href="http://openjdk.java.net/projects/coin/">Coin</a> que reúne diversas melhorias para as próximas versões da linguagem. Algumas dessas mudanças estão contempladas nos tópicos abaixo. </p>
<p>Mas o fato é que o objetivo do Java não é ser uma linguagem como Groovy ou Ruby que tem diversas facilidades como <a href="http://groovy.codehaus.org/Operators#Operators-ElvisOperator%28%3F%3A%29">elvis operator</a>, <a href="http://groovy.codehaus.org/Operators#Operators-SafeNavigationOperator%28%3F.%29">safe navigation</a>, reflection super facilitado, invocação do método <code><em>equals</em></code> usando <code><em>==</em></code> entre dezenas de outras coisas.</p>
<p>Talvez o mais parecido com Java seja Scala. Não em sintaxe, pois nesse quisito Groovy é quase igual Java. Agora o que Scala tem de mais parecido é o fato de ser estaticamente tipada, mas com um sintaxe simplificada, com alto poder inferência de tipos, sem ponto e vírgula obrigatório e que você na maioria das vezes nem percebe que não está usando uma linguagem dita mais &#8220;flexível&#8221; ou &#8220;dinâmica&#8221;. </p>
<p>Na minha opinião a maioria não quer especificar tipos, mas isso não quer dizer que necessariamente quer uma linguagem sem tipos. Nos artigos que escrevi de <a href="http://blog.gilliard.eti.br/category/scala/">Scala</a> dá pra ver bem dessas facilidades.</p>
<p><br/><br/></p>
<h2>Closures</h2>
<p>Um dos principais pontos, ou pelo menos o &#8220;mais famoso&#8221; ponto do Java 7 é o suporte à closures. Suporte que esse que durante a novela Java 7 já foi cortado, reintroduzido &#8220;nas coxas&#8221; e por fim vai estar completo no Java 8. Mas e se olharmos para Groovy e Scala? O suporte à closures está lá.</p>
<h5>Java 8</h5>
<p><a href="http://cr.openjdk.java.net/~mr/lambda/straw-man">Referência</a></p>
<pre class="brush: java; title: ; notranslate">
#int() fortyTwo = #()(42);
#int(int) doubler = #(int x)(x + x);
#int(int,int) multiplier = #(int x, int y)(x * y);

assert fortyTwo() == 42;
assert doubler(fortyTwo()) == 84;
assert multiplier(3, fortyTwo()) == 126;
</pre>
<p><strong>Update:</strong> o Paulo Silveira, há um bom tempo já, postou um material bem bacana em português sobre isso no <a href="http://blog.caelum.com.br/trabalhando-com-closures-no-java-8/">blog da Caelum</a>.</p>
<h5>Groovy</h5>
<p><a href="http://groovy.codehaus.org/Closures">Referência</a></p>
<pre class="brush: groovy; title: ; notranslate">
def printSum = { a, b -&gt; print a+b }
printSum( 5, 7 )                       //prints &quot;12&quot;
</pre>
<p><a href="http://groovy.codehaus.org/Closures+-+Formal+Definition">Referência</a></p>
<pre class="brush: groovy; title: ; notranslate">
def c = { arg1, arg2-&gt; println &quot;${arg1} ${arg2}&quot; }
def d = c.curry(&quot;foo&quot;)
d(&quot;bar&quot;)
</pre>
<p><a href="http://groovy.codehaus.org/Closures+-+Informal+Guide">Referência</a></p>
<pre class="brush: groovy; title: ; notranslate">
def x = 2

// define closure and assign it to variable 'c'
def c = { numberToSquare -&gt; numberToSquare * numberToSquare }

// using 'c' as the identifer for the closure, make a call on that closure
def y = c(x)       // shorthand form for applying closure, y will equal 4
def z = c.call(x)  // longhand form, z will equal 4
</pre>
<p><strong>Scala</strong></p>
<p>Esse código de exemplo eu postei <a href="http://blog.gilliard.eti.br/2008/09/scalando-parte-2/">aqui</a> (to meio sem criatividade hoje <img src='http://blog.gilliard.eti.br/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> ). Nele temos um método chamado <code>percorreLista</code> e uma closure chamada <code>imprimeElemento</code>, que é passada como parâmetro para o primeiro.</p>
<pre class="brush: scala; title: ; notranslate">
object Main extends Application {
    def percorreLista[T](lista:List[T], funcao:(T) =&gt; Unit)= {
    for (elemento &lt;- lista) {
      funcao(elemento)
    }
  }

  val imprimeElemento = (elemento: Any) =&gt; {
    println(elemento)
  }

  percorreLista(List(2,3,4,5), imprimeElemento)
}
</pre>
<p><br/><br/></p>
<h2>Automatic Resource Management (ARM)</h2>
<p>Uma coisa chata de fazer em Java é trabalhar com IO. Vamos pegar como exemplo&#8230;</p>
<h5>Java 6</h5>
<p>Referências <a href="http://www.java7developer.com/blog/?p=24">um</a> e <a href="http://www.infoq.com/news/2010/08/arm-blocks">dois</a></p>
<p>Aqui temos que tratar as possíveis exceções todas na mão.</p>
<p>Lendo um arquivo</p>
<pre class="brush: java; title: ; notranslate">
try
{
    String teamMember;
    FileReader fr = new FileReader(&quot;arquivo.txt&quot;);
    BufferedReader br = new BufferedReader(fr);
    while ((teamMember = br.readLine()) != null)
    {
        System.out.println(teamMember);
    }
}
catch (FileNotFoundException e)
{
    e.printStackTrace();
}
catch (IOException e)
{
    e.printStackTrace();
}
finally
{
    if (br!= null)
    {
        br.close();
        if (fr != null)
        {
            fr.close();
        }
    }
}
</pre>
<p>Agora um código JDBC</p>
<pre class="brush: java; title: ; notranslate">
String connectionURL = &quot;jdbc:mysql://localhost:3306/myDB&quot;;
Connection connection = null;
Statement st = null;
ResultSet rs = null;
try
{
    connection = DriverManager.getConnection(connectionURL, &quot;root&quot;, &quot;admin&quot;);
    st = connection.createStatement();
    rs = st.executeQuery(&quot;Select * from EMPLOYEE_SALARIES&quot;);
    while (rs.next())
    {
        System.out.println(&quot;EMPLOYEE_NAME/EMPLOYEE_SALARY&quot;);
        System.out.println(rs.getString(1) + &quot;/&quot; + rs.getString(2));
    }
}
catch (ClassNotFoundException ex)
{
    ex.printStackTrace();
}
catch (SQLException ex)
{
    ex.printStackTrace();
}
catch (InstantiationException ex)
{
    ex.printStackTrace();
}
catch (IllegalAccessException ex)
{
    ex.printStackTrace();
}
finally
{
    try
    {
        if (!rs.isClosed())
        {
            rs.close();
        }
        if (!st.isClosed())
        {
            st.close();
        }
        if (!connection.isClosed())
        {
            connection.close();
        }
    }
    catch (SQLException ex)
    {
        ex.printStackTrace();
    }
}
</pre>
<h5>Java 8</h5>
<p>Com o ARM ficaria bem mais simples.</p>
<p>Lendo um arquivo</p>
<pre class="brush: java; title: ; notranslate">
String teamMember = null;
try (BufferedReader br = new BufferedReader(new FileReader(&quot;arquivo.txt&quot;)))
{
    while ((teamMember = br.readLine()) != null)
    {
        System.out.println(teamMember);
    }
}
</pre>
<p>Código JDBC com ARM</p>
<pre class="brush: java; title: ; notranslate">
String connectionURL = &quot;jdbc:mysql://localhost:3306/myDB&quot;;
try
(
    Connection connection = DriverManager.getConnection(connectionURL, &quot;root&quot;, &quot;admin&quot;);
    Statement st = connection.createStatement();
    ResultSet rs = st.executeQuery(&quot;Select * from EMPLOYEE_SALARIES&quot;);
)
{
    while (rs.next())
    {
        System.out.println(&quot;EMPLOYEE_NAME/EMPLOYEE_SALARY&quot;);
        System.out.println(rs.getString(1) + &quot;/&quot; + rs.getString(2));
    }
}
</pre>
<h5>Groovy</h5>
<p>Em Groovy fazer isso é extremamente simples</p>
<p>Lendo um arquivo</p>
<p><a href="http://docs.codehaus.org/display/GROOVY/JN2015-Files">Referência</a></p>
<pre class="brush: groovy; title: ; notranslate">
println new File('arquivo.txt').text
</pre>
<p>Lendo uma tabela com Groovy</p>
<p><a href="http://docs.codehaus.org/display/GROOVY/Tutorial+6+-+Groovy+SQL">Referência</a></p>
<pre class="brush: groovy; title: ; notranslate">
import groovy.sql.Sql
sql = Sql.newInstance(&quot;jdbc:jtds:sqlserver://serverName/dbName-CLASS;domain=domainName&quot;, &quot;username&quot;,
                     &quot;password&quot;, &quot;net.sourceforge.jtds.jdbc.Driver&quot;)
sql.eachRow(&quot;select * from tableName&quot;, { println it.id + &quot; -- ${it.firstName} --&quot;} );
</pre>
<h5>Scala</h5>
<p>Referências <a href="http://stackoverflow.com/questions/2207425/what-automatic-resource-management-alternatives-exists-for-scala">um</a> e <a href="http://polyglot-window.blogspot.com/2009/03/arm-blocks-in-scala-revisited.html">dois</a></p>
<p>Em Scala também é simples.</p>
<pre class="brush: scala; title: ; notranslate">
def using[T &lt;: { def close() }]
    (resource: T)
    (block: T =&gt; Unit)
{
  try {
    block(resource)
  } finally {
    if (resource != null) resource.close()
  }
}

using(new BufferedReader(new FileReader(&quot;file.txt&quot;))) { r =&gt;
  var count = 0
  while (r.readLine != null) count += 1
  println(count)
}
</pre>
<p><a href="http://github.com/jsuereth/scala-arm">Referência</a></p>
<pre class="brush: scala; title: ; notranslate">
val lines = for { file &lt;- managed(new java.io.File(&quot;some.txt&quot;))
       stream &lt;- new java.io.FileInputStream(file)
       line &lt;- makeLineIterator(stream) } yield line
</pre>
<p><br/><br/></p>
<h2>Switch com String?</h2>
<p>Sinceramente eu acho essa parte até meio brincadeira, pois é muito barulho para uma funcionalidade muito simples. Essa mudança faz parte do projeto <a href="http://openjdk.java.net/projects/coin/">Coin</a>.</p>
<h5>Java 7</h5>
<p>A funcionalidade é simples, a única diferença é que agora suporta String.</p>
<h5>Groovy</h5>
<p>O suporte do Groovy é bem mais rico que o suporte à Strings. Claro que pode ser mais complicado num primeiro momento, cheio de possibilidades, mas para mim é só um comportamento mais completo, com tudo que se espera.</p>
<p><a href="http://docs.codehaus.org/display/GROOVY/Logical+Branching">Referência</a></p>
<pre class="brush: groovy; title: ; notranslate">
def x = 1.23
def result = &quot;&quot;

switch ( x ) {
    case &quot;foo&quot;:
        result = &quot;found foo&quot;
        // lets fall through

    case &quot;bar&quot;:
        result += &quot;bar&quot;

    case [4, 5, 6, 'inList']:
        result = &quot;list&quot;
        break

    case 12..30:
        result = &quot;range&quot;
        break

    case Integer:
        result = &quot;integer&quot;
        break

    case Number:
        result = &quot;number&quot;
        break

    default:
        result = &quot;default&quot;
}

assert result == &quot;number&quot;
</pre>
<p>E podemos ainda sobrescrever o método isCase(valor), que por default chama equals(valor)</p>
<pre class="brush: groovy; title: ; notranslate">
class Estado{
    String uf
    def isCase(valor){
        uf == valor
    }
}

def estado = new Estado(uf: &quot;MS&quot;)

switch ( estado ) {
    case &quot;MS&quot;:
        println &quot;Mato Grosso do Sul&quot;
        break

    case &quot;SP&quot;:
        println &quot;São Paulo&quot;
        break

    default:
        println &quot;Sei lá...&quot;
}
</pre>
<h5>Scala</h5>
<p>Scala assim como Groovy tem um mecanismo bem interessante que pode ser usado num switch, o Pattern Matching. Como isso vale um artigo a parte, recomendo a leitura <a href="http://www.codecommit.com/blog/scala/scala-for-java-refugees-part-4">desse post</a>. Mas para exemplificar vou colocar um exemplo:</p>
<pre class="brush: scala; title: ; notranslate">
def checkPrime(number:Int) = number match {
  case 1 =&gt; true
  case 2 =&gt; true
  case 3 =&gt; true
  case 5 =&gt; true
  case 7 =&gt; true

  case _ =&gt; false
}
</pre>
<p>Comparando pelo tipo</p>
<pre class="brush: scala; title: ; notranslate">
var obj = performOperation()
var cast:Color = obj match {
  case x:Color =&gt; x
  case _ =&gt; null
}
</pre>
<p>Em <strong>Java</strong> o equivalente seria</p>
<pre class="brush: java; title: ; notranslate">
Object obj = performOperation();
Color cast = null;
if (obj instanceof Color) {
    cast = (Color) obj;
}
</pre>
<p>E em Scala temos ainda as case classes, que são tipos especiais de classes, que dentro outras coisas não precisamos de new para instanciá-las e podem ser usadas direto com pattern matching.</p>
<p><a href="http://www.scala-lang.org/node/107">Referência</a></p>
<pre class="brush: scala; title: ; notranslate">
case class Number(value:Int)

def checkPrime(n:Number) = n match {
  case Number(1) =&gt; true
  case Number(2) =&gt; true
  case Number(3) =&gt; true
  case Number(5) =&gt; true
  case Number(7) =&gt; true
  case Number(_) =&gt; false
}

checkPrime(Number(12))
</pre>
<p>Outro exemplo</p>
<pre class="brush: scala; title: ; notranslate">
class Color(val red:Int, val green:Int, val blue:Int)

case class Red(r:Int) extends Color(r, 0, 0)
case class Green(g:Int) extends Color(0, g, 0)
case class Blue(b:Int) extends Color(0, 0, b)

def printColor(c:Color) = c match {
  case Red(v) =&gt; println(&quot;Red: &quot; + v)
  case Green(v) =&gt; println(&quot;Green: &quot; + v)
  case Blue(v) =&gt; println(&quot;Blue: &quot; + v)

  case col:Color =&gt; {
    print(&quot;R: &quot; + col.red + &quot;, &quot;)
    print(&quot;G: &quot; + col.green + &quot;, &quot;)
    println(&quot;B: &quot; + col.blue)
  }

  case null =&gt; println(&quot;Invalid color&quot;)
}

printColor(Red(100))
printColor(Blue(220))

printColor(new Color(100, 200, 50))
printColor(null)
</pre>
<p>Saída</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">Red: 100
Blue: 220
R: 100, G: 200, B: 50
Invalid color</pre></div></div>

<p><br/><br/></p>
<h2>Properties</h2>
<p>Suporte à properties é bem esperado mas já foi praticamente &#8220;limado&#8221; da lista de features que vão entrar nas próximas versões de Java. Na verdade o suporte à properties é mais do que vamos ver aqui. Um suporte completo permitiria a gente ter type safe criteria na JPA2 sem necessidade de geração de código. Mas com certeza esse suportezinho simples, à la Groovy, já ajuda bastante.</p>
<h5>Java</h5>
<p>Sem suporte. Getters and Setters</p>
<pre class="brush: java; title: ; notranslate">
public class Pessoa{
  private String nome;
  private String endereco;
  private String nome;

  //getters e setterss gerados pela IDE.
  //Vocês já devem estar enjoados de ver, então vou economizar espaço e nem colocar esse código aqui
</pre>
<h5>Groovy</h5>
<p>Em Groovy fazer isso é extremamente simples. O compilador gera altomaticamente os getters e setters para atributos não privados. Depois de compilado fica igualzinho um &#8220;bean&#8221; java, atributos privados e métodos de acesso públicos.</p>
<pre class="brush: groovy; title: ; notranslate">
class Pessoa{
  String nome
  String endereco

  //para essa propriedade não teremos getters e setters gerados
  private Integer idade

  //aqui fica igual os getters e setters gerados para nome e endereco.
  //Só lembrando que a tipagem em groovy é opcional
  def Integer getIdade(){ idade }
  def void setIdade(Integer idade){ this.idade = idade }
}
</pre>
<h5>Scala</h5>
<p>Em Scala também é simples.</p>
<pre class="brush: scala; title: ; notranslate">
class Pessoa(var nome:String,
             var localidade:String,
             private var _idade:Int) {
  //assim como no exemplo em Groovy, quando marcamos um atributo como privado os métodos de acesso não são gerados
  def idade = _idade
  def idade_=(idade:Int) = _idade = idade
}

val pessoa = new Pessoa(&quot;Gilliard&quot;, &quot;Campo Grande/MS&quot;, 26)
pessoa.nome = &quot;Gilliard Cordeiro&quot;
pessoa.idade = 27
println( pessoa.localidade )
</pre>
<p><br/><br/></p>
<h2>Performance</h2>
<p>Tem mais um monte de coisas que eu poderia comentar mas essas são as primeiras que me ocorreram. Mas para finalizar, pelo menos por enquanto, vamos falar de performance.</p>
<p>Não encontrei nenhum benchmark atualizado para linkar aqui, mas no geral Java e Scala estão bem próximos em performance, com mais vantagem para o Java e em alguns casos Scala na frente. Já o Groovy é meio patinho feio nessa comparação entre as três linguagens, mas ainda assim &#8211; com base em benchmarks um pouco antigos &#8211; ele ainda é mais performático que PHP por exemplo. E eu nunca ouvi ninguém dizer que deixaria de usar PHP por causa de performance, mas quando se fala de Groovy esse assunto sempre surge.</p>
<p>Sobre Java e Scala nem vale muito a pena falar, mas os benchmarks envolvendo Groovy tem que ser encarados com cautela. Primeiro porque se o benchmark for meio antigo é bem possível que de lá pra cá a performance já melhorou bastante. Até porque quanto mais lento, mais espaço para melhorar um ambiente de execução tem. O segundo ponto é que em todos os comparativos sempre vejo código 100% linguagem A contra código 100% linguagem B. Já na prática dificilmente a gente vai ter uma aplicação com código 100% Groovy. Vamos pegar como exemplo uma aplicação feita em Grails. Minha bola de cristal diz que no total de código da aplicação (bibliotecas incluídas) nem 30% é Groovy.</p>
<p>Para complicar ainda mais a conta, você já viu o tamanho da StackTrace quando executamos nosso código num servidor de aplicações? O tanto de AOP, interceptors e outros serviços rodando ao mesmo tempo com certeza vai levar mais tempo do que a diferença entre a execução de duas linguagens diferentes. Por fim a maioria dos problemas de performance não é culpa do que se usa, e sim de como se usa uma ferramenta.</p>
<p><strong>Update:</strong> Só mais uma &#8220;coisinha&#8221; sobre performance do Groovy. Existe também o <a href="http://code.google.com/p/groovypptest/wiki/Welcome">Groovy++</a>, que compila estaticamente partes do código Groovy (<a href="http://code.google.com/p/groovypptest/wiki/HowDoesItWork">depende do que você anotar com @Typed</a>) aumentando assim a performance consideravelmente pelo que li, mas não conheço na prática. Quando eu já tiver mexido com isso eu posto, mas até lá vocês podem ver alguma coisa <a href="http://groovy.dzone.com/articles/how-come-groovy-overperform">aqui</a>, <a href="http://groovy.dzone.com/articles/sneak-peak-groovy-what-it-why">aqui</a> e <a href="http://stronglytypedblog.blogspot.com/2010/02/java-vs-scala-vs-groovy-vs-groovy.html">aqui</a>.</p>
<p><br/><br/></p>
<h2>(Minha) Conclusão</h2>
<p>Terminado então esse post, acho que ficou claro que, pelo menos para mim, sentimos falta de um ou outro recurso da linguagem mas, ou praticamente não vamos usar a função quando ela sair (pois não faz falta de verdade hoje), ou não conhecemos as outras opções que a <strong>plataforma</strong>, e não a linguagem Java nos dá. Pois se conhecermos as opções e realmente quisermos usar essas funcionalidades, não faz muito sentido não usar o que se tem.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.gilliard.eti.br/2010/12/sera-que-o-java-7-8-faz-falta-mesmo/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Como trabalhar com ViewScope e Page</title>
		<link>http://blog.gilliard.eti.br/2010/11/como-trabalhar-com-viewscope-e-page/</link>
		<comments>http://blog.gilliard.eti.br/2010/11/como-trabalhar-com-viewscope-e-page/#comments</comments>
		<pubDate>Tue, 23 Nov 2010 20:06:06 +0000</pubDate>
		<dc:creator>Gilliard Cordeiro</dc:creator>
				<category><![CDATA[JavaEE]]></category>
		<category><![CDATA[JSF]]></category>
		<category><![CDATA[bookmarking]]></category>
		<category><![CDATA[JavaServer Faces]]></category>
		<category><![CDATA[page-scope]]></category>
		<category><![CDATA[Seam]]></category>
		<category><![CDATA[view-scope]]></category>

		<guid isPermaLink="false">http://blog.gilliard.eti.br/?p=275</guid>
		<description><![CDATA[Uma coisa que não é muito intuitiva é a forma como o ViewScope do JSF e o scope Page do Seam funcionam. Como estamos acostumados com o escopo request, que termina quando a próxima view é renderizada, tendemos a pensar que esses escopos funcionam da mesma forma. Mas na verdade o escopo morre no momento [...]]]></description>
			<content:encoded><![CDATA[<p>Uma coisa que não é muito intuitiva é a forma como o <code><strong>ViewScope</strong></code> do JSF e o scope <code><strong>Page</strong></code> do Seam funcionam. Como estamos acostumados com o escopo request, que termina quando a próxima view é renderizada, tendemos a pensar que esses escopos funcionam da mesma forma. Mas na verdade o escopo morre no momento que uma nova view é setada. O problema é que depois que isso acontece ainda temos toda a fase 6 do jsf.</p>
<p>Para entendermos melhor o funcionamento, vamos considerar como exemplo uma tela de listagem de produtos (<code>produtoLista.xhtml</code>) onde selecionamos um produto e este é exibido em outra view, que mostra os detalhes desse produto (<code>produtoForm.xhtml</code>). Nessa aplicação vou usar o mesmo managed bean com <code><strong>@ViewScope</strong></code> para a listagem e para a tela do produto.</p>
<p>Usando o escopo <code><strong>view</strong></code>, quando clicamos num <code>h:command(Button | Link)</code> que tem dentro um <code>f:setPropertyActionListener</code> temos a impressão que o jsf não colocou o produto selecionado no <code>target</code>, no caso o <code><strong>produtoController.produto</strong></code>. Na verdade ele fez isso sim, mas assim que mudou da view de listagem para a de produto o <code>produtoController</code>, que continha o produto selecionado foi descartado. Então um novo <code>produtoController</code> é instanciado, e esse obviamente não conhece o produto selecionado. O funcionamento é simples, só não é intuitivo (vou fazer essa afirmação várias vezes que é pra ficar no subconsciente hehehe).</p>
<p>Na minha opinião, um bom comportamento padrão seria como o <a href="http://wiki.apache.org/myfaces/Extensions/CDI/DevDoc/Drafts/ViewConversationScoped" target="_blank">@ViewConversationScoped</a>. Mas como ninguém liga para a minha opinião, o jeito é usarmos os parâmetros de url para segurar esses valores. Pra variar já escrevi muito, então vamos ver na prática como fazer isso.</p>
<p>Na classe <code>Produto</code> vou simplesmente ignorar os getters e setters, <a href="http://groovy.codehaus.org/Groovy+Beans">Groovy like</a> =)</p>
<p>Entidade Produto</p>

<div class="wp_syntax"><div class="code"><pre class="java5" style="font-family:monospace;">@<span style="color: #003399; font-weight: bold;">Entity</span>
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> Produto <span style="color: #009900;">&#123;</span>
&nbsp;
	@Id @GeneratedValue
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #003399; font-weight: bold;">Integer</span> id<span style="color: #339933;">;</span>
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #003399; font-weight: bold;">String</span> nome<span style="color: #339933;">;</span>
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #003399; font-weight: bold;">String</span> descricao<span style="color: #339933;">;</span>
&nbsp;
        @<span style="color: #003399; font-weight: bold;">Override</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399; font-weight: bold;">String</span> toString<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #0000ff;">&quot;Produto [descricao=&quot;</span> + descricao + <span style="color: #0000ff;">&quot;, id=&quot;</span> + id + <span style="color: #0000ff;">&quot;, nome=&quot;</span> + nome + <span style="color: #0000ff;">&quot;]&quot;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>O Controlador</p>

<div class="wp_syntax"><div class="code"><pre class="java5" style="font-family:monospace;">@ManagedBean
@ViewScope
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> ProdutoController <span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">private</span> Produto produto<span style="color: #339933;">;</span>
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #003399; font-weight: bold;">List</span><span style="color: #339933;">&lt;</span>Produto<span style="color: #339933;">&gt;</span> produtos<span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">//método init serve só para vermos em que momento o bean é destruído</span>
	@PostConstruct
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #006600; font-weight: bold;">void</span> init<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		<span style="color: #003399; font-weight: bold;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;ProdutoController.init()&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		atribuirEstadoInicial<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #008000; font-style: italic; font-weight: bold;">/**
	 * Deixa o bean em um estado inicial válido tanto para edição quanto para listagens
	 */</span>
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #006600; font-weight: bold;">void</span> atribuirEstadoInicial<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #003399; font-weight: bold;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;ProdutoController.atribuirEstadoInicial()&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #666666; font-style: italic;">//serve para deixar o bean em um estado onde pode acontecer uma nova edição</span>
		produto = <span style="color: #000000; font-weight: bold;">new</span> Produto<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #666666; font-style: italic;">//limpa a listagem previamente carregada pois ela não contém um elemento novo ou contém um recém excluído</span>
		produtos = <span style="color: #006600; font-weight: bold;">null</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #006600; font-weight: bold;">void</span> salvar<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #003399; font-weight: bold;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;ProdutoController.salvar()&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		JpaUtil.<span style="color: #006633;">getEntityManager</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">getTransaction</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">begin</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		JpaUtil.<span style="color: #006633;">getEntityManager</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">merge</span><span style="color: #009900;">&#40;</span>produto<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		JpaUtil.<span style="color: #006633;">getEntityManager</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">getTransaction</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">commit</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		atribuirEstadoInicial<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> Produto getProduto<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> produto<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #006600; font-weight: bold;">void</span> setProduto<span style="color: #009900;">&#40;</span>Produto produto<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #003399; font-weight: bold;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;ProdutoController.setProduto(): &quot;</span> + produto<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">produto</span> = produto<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	@<span style="color: #003399; font-weight: bold;">SuppressWarnings</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;unchecked&quot;</span><span style="color: #009900;">&#41;</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399; font-weight: bold;">List</span><span style="color: #339933;">&lt;</span>Produto<span style="color: #339933;">&gt;</span> getProdutos<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000;  font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>produtos == <span style="color: #006600; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			produtos = JpaUtil.<span style="color: #006633;">getEntityManager</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">createQuery</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;select p from Produto p&quot;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">getResultList</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
		<span style="color: #000000; font-weight: bold;">return</span> produtos<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #006600; font-weight: bold;">void</span> setProdutos<span style="color: #009900;">&#40;</span><span style="color: #003399; font-weight: bold;">List</span><span style="color: #339933;">&lt;</span>Produto<span style="color: #339933;">&gt;</span> produtos<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">produtos</span> = produtos<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>E o converter</p>

<div class="wp_syntax"><div class="code"><pre class="java5" style="font-family:monospace;">@FacesConverter<span style="color: #009900;">&#40;</span>forClass=Produto.<span style="color: #000000; font-weight: bold;">class</span><span style="color: #009900;">&#41;</span>
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> ProdutoConverter <span style="color: #000000; font-weight: bold;">implements</span> Converter <span style="color: #009900;">&#123;</span>
&nbsp;
	@<span style="color: #003399; font-weight: bold;">Override</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399; font-weight: bold;">Object</span> getAsObject<span style="color: #009900;">&#40;</span>FacesContext context, UIComponent component, <span style="color: #003399; font-weight: bold;">String</span> string<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #003399; font-weight: bold;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;ProdutoConverter.getAsObject(): &quot;</span> + string<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000000;  font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>string == <span style="color: #006600; font-weight: bold;">null</span> || string.<span style="color: #006633;">isEmpty</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
			<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #006600; font-weight: bold;">null</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
		<span style="color: #000000; font-weight: bold;">return</span> JpaUtil.<span style="color: #006633;">getEntityManager</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">find</span><span style="color: #009900;">&#40;</span>Produto.<span style="color: #000000; font-weight: bold;">class</span>, <span style="color: #003399; font-weight: bold;">Integer</span>.<span style="color: #006633;">valueOf</span><span style="color: #009900;">&#40;</span>string<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	@<span style="color: #003399; font-weight: bold;">Override</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399; font-weight: bold;">String</span> getAsString<span style="color: #009900;">&#40;</span>FacesContext context, UIComponent component, <span style="color: #003399; font-weight: bold;">Object</span> object<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		Produto produto = <span style="color: #009900;">&#40;</span>Produto<span style="color: #009900;">&#41;</span> object<span style="color: #339933;">;</span>
		<span style="color: #003399; font-weight: bold;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;ProdutoConverter.getAsString(): &quot;</span> + produto<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000000;  font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>produto == <span style="color: #006600; font-weight: bold;">null</span> || produto.<span style="color: #006633;">getId</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> == <span style="color: #006600; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
			<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #006600; font-weight: bold;">null</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
		<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #003399; font-weight: bold;">String</span>.<span style="color: #006633;">valueOf</span><span style="color: #009900;">&#40;</span>produto.<span style="color: #006633;">getId</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Na verdade, até aqui não tem muita novidade. No resto também não vai ter novidade <img src='http://blog.gilliard.eti.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  mas vamos lá.</p>
<p>A listagem de produtos:</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;">...
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;h:dataTable</span> <span style="color: #000066;">value</span>=<span style="color: #ff0000;">&quot;#{produtoController.produtos}&quot;</span> <span style="color: #000066;">var</span>=<span style="color: #ff0000;">&quot;produto&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;h:column<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;f:facet</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;header&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>ID<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/f:facet<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		#{produto.id}
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/h:column<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;h:column<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;f:facet</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;header&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>Nome<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/f:facet<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		#{produto.nome}
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/h:column<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;h:column<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;f:facet</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;header&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>Descrição<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/f:facet<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		#{produto.descricao}
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/h:column<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;h:column<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;f:facet</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;header&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>Ações<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/f:facet<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;h:link</span> <span style="color: #000066;">value</span>=<span style="color: #ff0000;">&quot;editar 1&quot;</span> <span style="color: #000066;">outcome</span>=<span style="color: #ff0000;">&quot;produtoForm&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
			<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;f:param</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;id&quot;</span> <span style="color: #000066;">value</span>=<span style="color: #ff0000;">&quot;#{produto.id}&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/h:link<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;h:commandLink</span> <span style="color: #000066;">value</span>=<span style="color: #ff0000;">&quot;editar 2&quot;</span> <span style="color: #000066;">action</span>=<span style="color: #ff0000;">&quot;produtoForm?faces-redirect=true&amp;amp;includeViewParams=true&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
			<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;f:setPropertyActionListener</span> <span style="color: #000066;">value</span>=<span style="color: #ff0000;">&quot;#{produto}&quot;</span> <span style="color: #000066;">target</span>=<span style="color: #ff0000;">&quot;#{produtoController.produto}&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/h:commandLink<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/h:column<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/h:dataTable<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
...</pre></div></div>

<p>E o form de produto:</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;">...
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;f:view<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;f:metadata<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;f:viewParam</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;id&quot;</span> <span style="color: #000066;">value</span>=<span style="color: #ff0000;">&quot;#{produtoController.produto}&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/f:metadata<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;h:head<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;title<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>Detalhes do Produto<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/title<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/h:head<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;h:body<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;h:form<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
			<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;h:panelGrid</span> <span style="color: #000066;">columns</span>=<span style="color: #ff0000;">&quot;2&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
				Nome: <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;h:inputText</span> <span style="color: #000066;">value</span>=<span style="color: #ff0000;">&quot;#{produtoController.produto.nome}&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
				Descrição: <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;h:inputText</span> <span style="color: #000066;">value</span>=<span style="color: #ff0000;">&quot;#{produtoController.produto.descricao}&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
				<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;h:commandButton</span> <span style="color: #000066;">action</span>=<span style="color: #ff0000;">&quot;#{produtoController.salvar}&quot;</span> <span style="color: #000066;">value</span>=<span style="color: #ff0000;">&quot;Salvar&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
			<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/h:panelGrid<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/h:form<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/h:body<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/f:view<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
...</pre></div></div>

<p>Por fim, vamos analisar o log do click nos links &#8220;editar 1&#8243; e &#8220;editar 2&#8243;</p>
<p>link &#8220;editar 1&#8243;</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">ProdutoController.init()
ProdutoController.atribuirEstadoInicial()
ProdutoConverter.getAsObject(): 1
ProdutoController.setProduto(): Produto [descricao=Fermento em Pó, id=1, nome=Fermento]
ProdutoConverter.getAsString(): Produto [descricao=Fermento em Pó, id=1, nome=Fermento]</pre></div></div>

<p>link &#8220;editar 2&#8243;</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">ProdutoController.setProduto(): Produto [descricao=Fermento em Pó, id=1, nome=Fermento]
ProdutoConverter.getAsString(): Produto [descricao=Fermento em Pó, id=1, nome=Fermento]
ProdutoController.init()
ProdutoController.atribuirEstadoInicial()
ProdutoConverter.getAsObject(): 1
ProdutoController.setProduto(): Produto [descricao=Fermento em Pó, id=1, nome=Fermento]
ProdutoConverter.getAsString(): Produto [descricao=Fermento em Pó, id=1, nome=Fermento]</pre></div></div>

<p><br/><br/><br />
Beleza, agora sim tem código pra caramba&#8230; boa parte dele aliás bem parecido com o <a href="http://blog.gilliard.eti.br/2009/05/urls-amigaveis-no-jsf-2/">desse post</a>. No meio disso tudo o que temos que prestar atenção é nos dois botões editar da produtoLista.xhtml. O link <strong>&#8220;editar 1&#8243;</strong> é exatamente igual ao apresentado no post que acabei de citar. O valor é passado por GET e o converter do viewParam faz o trabalho de nos deixar trabalhar sempre OO.</p>
<p>Agora vamos ver o link <strong>&#8220;editar 2&#8243;</strong>. Nesse exemplo a gente tem um post para uma view que usa um ManagedBean com escopo <code><strong>@ViewScope</strong></code> para uma outra view cujo MB é o mesmo, mas isso é um detalhe. </p>
<p>Na primeira linha temos o <code><strong>f:setPropertyActionListener</strong></code> trabalhando e chamando o set da propriedade, e na segunda linha vimos o converter gerando o texto (nesse caso id) que irá representar esse objeto na url da próxima view, pois deixamos o <code><strong>includeViewParams=true</strong></code>. Note que em momento algum passamos a propriedade que vai representar o produto na url como fizemos no <strong>&#8220;editar 1&#8243;</strong>. Quem vai fazer isso é o conversor. </p>
<p>Depois, entre as linhas 2 e 3 a view é trocada e o MB é perdido, mas como a url agora já tem o valor a ser mantido, fica igual o exemplo anterior. A única coisa que pode parecer é que teremos buscas desnecessárias ao banco. Mas como você vai estar usando algo mais esperto do que buscar no braço, a JPA já vai estar com esse objeto no cache de primeiro nível &#8211; pois estou usando o padrão <code><a href="http://community.jboss.org/wiki/OpenSessioninView">OpenEntityManagerInView</a></code> &#8211; e não haverá nenhum overhead por causa dessa outra forma de fazer. E isso é muito importante, apesar de termos um converter no meio, e do POST em vez de GET rodar o restore view do jsf, o objeto selecionado não será em momento algum trazido mais de uma vez no banco pois o <code><strong>EntityManager</strong></code> está com ele no cache (para isso não precisa de configuração nenhuma). Como estamos com o bean em escopo view, também não será buscado novamente a lista do banco. Então a única perda real nesse caso é não termos a url montada já na tela de listagem &#8211; o que pode nem ser uma perda. De fato todo o &#8220;overhead&#8221; dessa abordagem resume-se a chamadas de métodos locais como getters. Então provavelmente se sua aplicação ficar lenta aqui, o problema é outro.</p>
<p>Novamente o que incomoda é a falta de intuitividade dessa abordagem. Mas o funcionamento é simples. Só temos que lembrar que nessa abordagem do <strong>&#8220;editar 2&#8243;</strong> só vai funcionar se tivermos o <code><strong>includeViewParams</strong></code> ativo, seja no link ou na regra de navegação do <code><strong>faces-config.xml</strong></code>. Sem isso o JSF não se preocupa em incluir na próxima view os parâmetros de url.</p>
<p><br/><br/></p>
<h3>
Importante! (update)<br />
</h3>
<p><br/><br/></p>
<p>Apesar da abordagem do link <strong>&#8220;editar 1&#8243;</strong>, que usa GET ser a forma mais bacana de se trabalhar, e inclusive é a &#8220;novidade&#8221; do JSF 2, a abordagem do <strong>&#8220;editar 2&#8243;</strong> tem se mostrado mais segura. Isso porque até a versão atual do JSF (2.1) a remoção do bean no escopo view não ocorre da forma esperada quando usamos GET para sair da página, porém quando usamos POST (jeitão que o JSF já está bem acostumado) a coisa rola corretamente.</p>
<p>Agora caso você queria usar um escopo que dure mais que uma página como <a href="http://blog.gilliard.eti.br/2010/11/como-trabalhar-com-viewscope-e-page/#comment-17878">comentado pelo Rodrigo</a> a melhor solução na minha opinião é usar conversação. Solução que inclusive permite trocar de páginas usando GET sem o problema do escopo <code>view</code>, que desse modo não remove o bean, pois na conversação, se você não matar, o timeout mata.<br />
Uma forma simples de usar é iniciar a conversação quando abrimos a view. Para isso podemos fazer de <a href="http://stackoverflow.com/questions/6161618/postconstruct-called-multiple-time-for-conversationscoped-bean">várias formas</a>, mas a mais simples é usando o <a href="http://seamframework.org/Seam3/FacesModule">seam-faces</a>:</p>
<p><strong>Código da view</strong></p>

<div class="wp_syntax"><div class="code"><pre class="java5" style="font-family:monospace;">&nbsp;
<span style="color: #339933;">&lt;</span>f:metadata<span style="color: #339933;">&gt;</span>
   <span style="color: #339933;">&lt;</span>s:viewAction action=<span style="color: #0000ff;">&quot;#{meuBean.init}&quot;</span> <span style="color: #000000;  font-weight: bold;">if</span>=<span style="color: #0000ff;">&quot;#{conversation.transient}&quot;</span> /<span style="color: #339933;">&gt;</span>
<span style="color: #339933;">&lt;</span>/f:metadata<span style="color: #339933;">&gt;</span></pre></div></div>

<p><strong>Código do Bean</strong></p>

<div class="wp_syntax"><div class="code"><pre class="java5" style="font-family:monospace;">@Named
@ConversationScoped
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> MeuBean<span style="color: #009900;">&#123;</span>
    @Begin 
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #006600; font-weight: bold;">void</span> init<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Ou</p>
<p><strong>Código do Bean (alternativo)</strong></p>

<div class="wp_syntax"><div class="code"><pre class="java5" style="font-family:monospace;">@Named
@ConversationScoped
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> MeuBean<span style="color: #009900;">&#123;</span>
&nbsp;
    @In
    Conversation conversation
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #006600; font-weight: bold;">void</span> init<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        conversation.<span style="color: #006633;">begin</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Mas não estou dizendo para criar conversação e largar, tem que matar ela. Só estou falando que se for pra largar pra trás (coisa feia <img src='http://blog.gilliard.eti.br/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' /> ) é melhor fazer com conversação do que com view ou session.</p>
<p>E ainda outra forma de usar um escopo view em mais de uma página é usar o <a href="https://cwiki.apache.org/confluence/display/EXTCDI/JSF+Usage#JSFUsage-ViewAccessScope">@ViewAccessScope</a> do apache CODI (<a href="http://blog.gilliard.eti.br/2010/11/como-trabalhar-com-viewscope-e-page/#comment-13202">citado</a> também pelo João). Ele funciona como o &#8220;bom e velho&#8221; <a href="http://docs.jboss.org/richfaces/latest_3_3_X/en/devguide/html/a4j_keepAlive.html">Keep Alive</a> (anotação ao tag), e em vez de matar o bean na troca de página, ele espera o fim do response, e se o bem não for usado, aí sim é removido. O única problema é que a configuração do apache CODI, principalmente quando já estamos rodando o seam-faces, é um pouquinho mais charope. Mas funciona.</p>
<p><br/><br/></p>
<h3>
Concluindo&#8230;<br />
</h3>
<p><br/><br/></p>
<p>Nada do que mostrei aqui é novo ou difícil. Mas resolvi escrever pois em uma semana tive três dúvidas iguais aqui no blog sobre esse assunto. E nos cursos de Seam (escopo Page) e JSF 2 que ministro vejo que esse assunto demora para ser digerido também. Então espero que esse post tenha sido útil para minimizar essas dúvidas. Usar esse recurso do JSF 2 (ou Seam) é simples, mas se te incomodar muito, ou se você quiser usar uma conversação em uma única view (<code><strong>@ViewScope</strong></code> não segura o <code><strong>EntityManager</strong></code> aberto e com isso não evita <code><strong>LazyinitializationException</strong></code>), lembre-se que JEE6 define extensões portáveis. Então uma boa coisa é procurar coisas como o escopo que eu citei no início do post.</p>
<p>Sei que o pessoal do Java é meio purista, as vezes torce o nariz para o que não é especificado, mas se ganha muito procurando a solução para o seu problema em um projeto opensource bacana em vez de passar raiva e esperar até sair a próxima versão de alguma especificação, o que obviamente vai demorar mais do que uma novidade nascida direto da comunidade (apache, jboss.org, etc). Mas isso é assunto para um próximo post.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.gilliard.eti.br/2010/11/como-trabalhar-com-viewscope-e-page/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Desenvolvendo uma aplicação Desktop com Weld – Final</title>
		<link>http://blog.gilliard.eti.br/2010/05/aplicacao-desktop-com-weld-final/</link>
		<comments>http://blog.gilliard.eti.br/2010/05/aplicacao-desktop-com-weld-final/#comments</comments>
		<pubDate>Tue, 25 May 2010 18:30:56 +0000</pubDate>
		<dc:creator>Gilliard Cordeiro</dc:creator>
				<category><![CDATA[CDI]]></category>
		<category><![CDATA[JavaEE]]></category>
		<category><![CDATA[CDI SE]]></category>
		<category><![CDATA[JavaEE 6]]></category>
		<category><![CDATA[JSR-299]]></category>
		<category><![CDATA[JSR-330]]></category>
		<category><![CDATA[WebBeans]]></category>
		<category><![CDATA[Weld]]></category>
		<category><![CDATA[Weld-SE]]></category>

		<guid isPermaLink="false">http://blog.gilliard.eti.br/?p=254</guid>
		<description><![CDATA[Depois da parte 1 e parte 2, chegamos à parte final do nosso exemplo. Disponibilizei o código e vou mostrar mais algumas coisas. Só uma observação sobre o código: é o mesmo utilizado na apresentação de 14 de Novembro de 2009, quando ainda não tínhamos as mesmas versões de hoje. Mas o exemplo é totalmente [...]]]></description>
			<content:encoded><![CDATA[<p>Depois da <a href="http://blog.gilliard.eti.br/2010/03/aplicacao-desktop-com-weld-parte-1/">parte 1</a> e <a href="http://blog.gilliard.eti.br/2010/05/aplicacao-desktop-com-weld-parte-2/">parte 2</a>, chegamos à parte final do nosso exemplo. Disponibilizei o <a href="http://blog.gilliard.eti.br/arquivos/javaneiros-weld.zip">código</a> e vou mostrar mais algumas coisas.<br />
Só uma observação sobre o código: é o mesmo utilizado na apresentação de 14 de Novembro de 2009, quando ainda não tínhamos as mesmas versões de hoje. Mas o exemplo é totalmente funcional. Acabei deixando fixa a versão no pom.xml, então para testar a última versão você vai ter que alterá-lo.</p>
<p>Agora voltando ao post&#8230;</p>
<p><br/></p>
<h3>Alternatives</h3>
<p><br/></p>
<p>Alternatives são a forma de trocarmos um objeto por outro. É parecido com um decorator, mas em vez de incrementar funcionalidades, um alternative serve para substituir um bean.</p>
<p>No nosso exemplo, temos o seguinte objeto como alternativa ao nosso CaixaEletronico:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
</pre></td><td class="code"><pre class="java" style="font-family:monospace;">@Alternative
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> CaixaEletronicoSubstituto <span style="color: #000000; font-weight: bold;">extends</span> CaixaEletronico<span style="color: #009900;">&#123;</span>
&nbsp;
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> depositar<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">float</span> valor<span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;@@@@@@ CaixaEletronicoMock.depositar():&quot;</span> <span style="color: #339933;">+</span> valor<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> sacar<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">float</span> valor<span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;@@@@@@ CaixaEletronicoMock.sacar():&quot;</span> <span style="color: #339933;">+</span> valor<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p><br/></p>
<p>E para habilitar temos que mudar novamente nosso META-INF/beans.xml:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
</pre></td><td class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;beans</span> <span style="color: #000066;">xmlns</span>=<span style="color: #ff0000;">&quot;http://java.sun.com/xml/ns/javaee&quot;</span> <span style="color: #000066;">xmlns:xsi</span>=<span style="color: #ff0000;">&quot;http://www.w3.org/2001/XMLSchema-instance&quot;</span></span>
<span style="color: #009900;">	<span style="color: #000066;">xsi:schemaLocation</span>=<span style="color: #ff0000;">&quot;http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/beans_1_0.xsd&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
&nbsp;
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;interceptors<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;class<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>br.com.jugms.weldse.intercept.ContaInterceptor<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/class<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/interceptors<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
&nbsp;
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;decorators<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;class<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>br.com.jugms.weldse.intercept.CaixaDecorator<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/class<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/decorators<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
&nbsp;
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;alternatives<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;class<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>br.com.jugms.weldse.model.CaixaEletronicoSubstituto<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/class<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/alternatives<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
&nbsp;
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/beans<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></td></tr></table></div>

<p><br/></p>
<p>Agora se executarmos nosso código a saída sera:</p>
<pre>
hello
CaixaDecorator.sacar()
@@@@@@ CaixaEletronicoMock.sacar():200.0
ContaInterceptor.protege(antes) >> getSaldo
ContaInterceptor.protege(depois) >> getSaldo
2000.0
CaixaDecorator.depositar()
@@@@@@ CaixaEletronicoMock.depositar():300.0
ContaInterceptor.protege(antes) >> getSaldo
ContaInterceptor.protege(depois) >> getSaldo
2000.0
</pre>
<p><br/></p>
<p>Como podemos ver, nosso decorator decora o alternative e o interceptor continua funcionando normalmente.<br />
Podemos também declarar uma anotação própria e anotá-la como alternative. Mas em vez de tentar explicar, vou mostrar um outro exemplo que servirá como base para este.</p>
<p><br/></p>
<h3>Estereótipos próprios</h3>
<p><br/></p>
<p>Podemos criar nossos próprios estereótipos, e dessa forma não só reduzir a quantidade de anotações em cima dos nossos beans, mas também deixar a leitura das anotações mais condizentes com nosso linguajar do dia a dia.</p>
<p>Vamos pegar como exemplo o nosso objeto ContaBancaria:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
</pre></td><td class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">br.com.jugms.weldse.model</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">javax.enterprise.context.ApplicationScoped</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">javax.enterprise.event.Observes</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">javax.inject.Inject</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">javax.inject.Named</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">br.com.jugms.weldse.intercept.Seguro</span><span style="color: #339933;">;</span>
&nbsp;
@ApplicationScoped
@Seguro
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> ContaBancaria <span style="color: #009900;">&#123;</span>
	<span style="color: #666666; font-style: italic;">//o código já foi visto antes</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p><br/></p>
<p>Já vimos este código e o corpo da classe não tem relação com o que vamos ver agora. Agora o mais importante é observarmos as anotações. Temos duas, mas poderíamos ter mais. Para deixar isso mais limpo e com mais significado no meu negócio, poderia criar um estereótipo próprio como o seguinte:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
</pre></td><td class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">br.com.jugms.weldse.model</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">static</span> java.<span style="color: #006633;">lang</span>.<span style="color: #006633;">annotation</span>.<span style="color: #006633;">ElementType</span>.<span style="color: #006633;">TYPE</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">static</span> java.<span style="color: #006633;">lang</span>.<span style="color: #006633;">annotation</span>.<span style="color: #006633;">RetentionPolicy</span>.<span style="color: #006633;">RUNTIME</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.lang.annotation.Retention</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.lang.annotation.Target</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">javax.enterprise.context.ApplicationScoped</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">javax.enterprise.inject.Stereotype</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">br.com.jugms.weldse.intercept.Seguro</span><span style="color: #339933;">;</span>
&nbsp;
@ApplicationScoped
@Seguro
@Stereotype
@Target<span style="color: #009900;">&#40;</span>TYPE<span style="color: #009900;">&#41;</span>
@Retention<span style="color: #009900;">&#40;</span>RUNTIME<span style="color: #009900;">&#41;</span>
<span style="color: #000000; font-weight: bold;">public</span> @<span style="color: #000000; font-weight: bold;">interface</span> JavaneirosBean <span style="color: #009900;">&#123;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p><br/></p>
<p>E depois mudar nosso ContaBancaria deixando ele assim:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
</pre></td><td class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">br.com.jugms.weldse.model</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">javax.enterprise.event.Observes</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">javax.inject.Inject</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">javax.inject.Named</span><span style="color: #339933;">;</span>
&nbsp;
@JavaneirosBean
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> ContaBancaria <span style="color: #009900;">&#123;</span>
	<span style="color: #666666; font-style: italic;">//o código já foi visto antes</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p><br/></p>
<p>Com isso o resultado será o mesmo de antes. Nosso objeto ContaBancaria é @Seguro e @ApplicationScoped. Além disso se depois quisermos dizer que nosso @JavaneirosBean é também um @Alternative ou qualquer outro estereótipo pré-existente ou mesmo um outro estereótipo customizado, basta anotar nossa anotação @JavaneirosBean com a anotação desejada.</p>
<p>Pode parecer estranho usarmos anotações de anotações, mas para exemplificar, se a JPA suportasse isso eu poderia ter uma anotação @Entidade que seria uma @Entity (JPA) e ao mesmo tempo @Named (CDI) e assim poder utilizá-la diretamente nas minhas view JSF com uma única anotação.</p>
<p><br/></p>
<h3>Conceitos gerais</h3>
<p><br/></p>
<p>Eu disse que ao final do exemplo iria entrar mais na parte teórica de como a CDI trata mais extamente a injeção de dependência, seleção de candidatos etc. Porém por questão de organização, vou deixar isso em um post separado.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.gilliard.eti.br/2010/05/aplicacao-desktop-com-weld-final/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Desenvolvendo uma aplicação Desktop com Weld – Parte 2</title>
		<link>http://blog.gilliard.eti.br/2010/05/aplicacao-desktop-com-weld-parte-2/</link>
		<comments>http://blog.gilliard.eti.br/2010/05/aplicacao-desktop-com-weld-parte-2/#comments</comments>
		<pubDate>Tue, 25 May 2010 15:09:52 +0000</pubDate>
		<dc:creator>Gilliard Cordeiro</dc:creator>
				<category><![CDATA[CDI]]></category>
		<category><![CDATA[JavaEE]]></category>
		<category><![CDATA[CDI SE]]></category>
		<category><![CDATA[JavaEE 6]]></category>
		<category><![CDATA[JSR-299]]></category>
		<category><![CDATA[JSR-330]]></category>
		<category><![CDATA[WebBeans]]></category>
		<category><![CDATA[Weld]]></category>
		<category><![CDATA[Weld-SE]]></category>

		<guid isPermaLink="false">http://blog.gilliard.eti.br/?p=241</guid>
		<description><![CDATA[Continuando então no nosso exemplo, vamos comentar mais sobre a &#8220;parte prática&#8221; do exemplo e depois eu comento mais sobre os tipos de injeção que a CDI faz. E só pra contextualizar, quando eu disse &#8220;ejeção&#8221; no último post, não quer dizer que a CDI tem um @Out como o Seam, e sim que ele [...]]]></description>
			<content:encoded><![CDATA[<p>Continuando então no nosso exemplo, vamos comentar mais sobre a &#8220;parte prática&#8221; do exemplo e depois eu comento mais sobre os tipos de injeção que a CDI faz. E só pra contextualizar, quando eu disse &#8220;ejeção&#8221; no <a href="http://blog.gilliard.eti.br/2010/03/aplicacao-desktop-com-weld-parte-1/">último post</a>, não quer dizer que a CDI tem um @Out como o Seam, e sim que ele tem uma forma de produzir objetos para um determinado escopo assim como um @Factory do Seam ou Spring. </p>
<p><br/></p>
<h3>Interceptors</h3>
<p><br/></p>
<p>No final do <a href="http://blog.gilliard.eti.br/2010/03/aplicacao-desktop-com-weld-parte-1/">ultimo post</a> vimos que nossa <code>ContaBancaria</code> estava anotada com @Seguro. Essa é uma anotação da nossa aplicação:</p>
<p><br/></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
</pre></td><td class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">br.com.jugms.weldse.intercept</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">static</span> java.<span style="color: #006633;">lang</span>.<span style="color: #006633;">annotation</span>.<span style="color: #006633;">ElementType</span>.<span style="color: #006633;">METHOD</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">static</span> java.<span style="color: #006633;">lang</span>.<span style="color: #006633;">annotation</span>.<span style="color: #006633;">ElementType</span>.<span style="color: #006633;">TYPE</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">static</span> java.<span style="color: #006633;">lang</span>.<span style="color: #006633;">annotation</span>.<span style="color: #006633;">RetentionPolicy</span>.<span style="color: #006633;">RUNTIME</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.lang.annotation.Retention</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.lang.annotation.Target</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">javax.interceptor.InterceptorBinding</span><span style="color: #339933;">;</span>
&nbsp;
@InterceptorBinding
@Target<span style="color: #009900;">&#40;</span> <span style="color: #009900;">&#123;</span> METHOD, TYPE <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span>
@Retention<span style="color: #009900;">&#40;</span>RUNTIME<span style="color: #009900;">&#41;</span>
<span style="color: #000000; font-weight: bold;">public</span> @<span style="color: #000000; font-weight: bold;">interface</span> Seguro <span style="color: #009900;">&#123;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p><br/></p>
<p>No meio de um monte de anotações percebemos a que define nossa anotação como uma @InterceptorBinding. Agora basta anotar quem queremos interceptar com a mesma anotação usada na definição do interceptor (@Seguro) para &#8220;bindar&#8221; interceptador e interceptado.</p>
<p><br/></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
</pre></td><td class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">br.com.jugms.weldse.intercept</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">javax.interceptor.AroundInvoke</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">javax.interceptor.Interceptor</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">javax.interceptor.InvocationContext</span><span style="color: #339933;">;</span>
&nbsp;
&nbsp;
@Interceptor @Seguro
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> ContaInterceptor <span style="color: #009900;">&#123;</span>
&nbsp;
	@AroundInvoke
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399;">Object</span> protege<span style="color: #009900;">&#40;</span>InvocationContext context<span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">throws</span> <span style="color: #003399;">Exception</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;ContaInterceptor.protege(antes) &gt;&gt; &quot;</span> <span style="color: #339933;">+</span> context.<span style="color: #006633;">getMethod</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">getName</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #003399;">Object</span> object <span style="color: #339933;">=</span> context.<span style="color: #006633;">proceed</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;ContaInterceptor.protege(depois) &gt;&gt; &quot;</span> <span style="color: #339933;">+</span> context.<span style="color: #006633;">getMethod</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">getName</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #000000; font-weight: bold;">return</span> object<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p><br/></p>
<p>Esse é o nosso interceptador. Olhando o código quase não preciso explicar nada. Aqui coloquei Conta no meio do nome porque é uma aplicação de exemplo, mas na prática poderia ter um uso mais genérico. Esse código tem o jeitão de um interceptador comum. O método &#8220;protege&#8221; está anotado com @AroundInvoke, e isso me dá o poder de envolver, e com isso até mesmo trocar a implementação original do objeto interceptado. É bem parecido com <a href="http://pt.wikipedia.org/wiki/Programa%C3%A7%C3%A3o_orientada_a_aspecto">AOP</a>. Mas a regra do <a href="http://pt.wikipedia.org/wiki/Ben_Parker">tio Ben</a> se aplica aqui também: <em>&#8220;Grandes poderes trazem grandes responsabilidades&#8221;</em>! Então isso não serve para ficar adicionando regra de negócio na aplicação, senão depois você não vai achar mais nada no sistema e vai falar que viu isso aqui. A idéia de um interceptor é prover funcionalidades ortogonais para o sistema, assim como AOP. Então se você não gosta de AOP ou interceptor é provavelmente porque está colocando código no local errado.</p>
<p>Nesse exemplo usei para prover segurança, protegendo meus objetos marcados com @Seguro. Mas minha implementação simplesmente mostra no console que o nosso método foi chamado.</p>
<p>Além de interceptors, temos <a href="http://en.wikipedia.org/wiki/Decorator_pattern">decorators</a>, que veremos daqui a pouco. Mas para já ter uma idéia da diferença, o interceptor geralmente é para requisitos não funcionais, enquanto os decorators adicionam funcionalidades em objetos do nosso sistema. Mas o foco aqui não é padrões de projeto, então para saber mais basta dar uma pesquisada. O que importa para o contexto desse post é que tanto interceptors quanto decorators não estão habilitados por padrão. Para colocá-los para rodar precisamos &#8220;ligá-los&#8221; no arquivo /META-INF/beans.xml. Abaixo vemos como fica nosso arquivo com esse interceptor ligado.</p>
<p><br/></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
</pre></td><td class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;beans</span> <span style="color: #000066;">xmlns</span>=<span style="color: #ff0000;">&quot;http://java.sun.com/xml/ns/javaee&quot;</span> <span style="color: #000066;">xmlns:xsi</span>=<span style="color: #ff0000;">&quot;http://www.w3.org/2001/XMLSchema-instance&quot;</span></span>
<span style="color: #009900;">	<span style="color: #000066;">xsi:schemaLocation</span>=<span style="color: #ff0000;">&quot;http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/beans_1_0.xsd&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
&nbsp;
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;interceptors<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;class<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>br.com.jugms.weldse.intercept.ContaInterceptor<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/class<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/interceptors<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
&nbsp;
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/beans<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></td></tr></table></div>

<p><br/></p>
<p>Eu sei que sou repetitivo, mas mais uma vez eu digo: não precisamos habilitar beans injetáveis ou gerenciáveis quando usamos CDI. Basta que os objetos estejam em um bean package para tudo acontecer, e um bean package é um módulo (jar, projeto, etc) que tenha um arquivo /META-INF/beans.xml vazio (só com cabeçalho). Pronto, só precisa disso. As exceções são para interceptors, decorators e alternatives (esse ultimo falo depois). Esses sim precisam ser habilitados.</p>
<p>Agora que já temos tudos os arquivos, executando a aplicação temos a seguinte saída:</p>
<pre>
hello
ContaInterceptor.protege(antes) >> recebeMovimento
ContaInterceptor.protege(depois) >> recebeMovimento
ContaInterceptor.protege(antes) >> getSaldo
ContaInterceptor.protege(depois) >> getSaldo
1800.0
ContaInterceptor.protege(antes) >> recebeMovimento
ContaInterceptor.protege(depois) >> recebeMovimento
ContaInterceptor.protege(antes) >> getSaldo
ContaInterceptor.protege(depois) >> getSaldo
2100.0
</pre>
<p>Como estamos usando @AroundInvoke, colocamos uma mensagem antes e uma depois de cada método.</p>
<p><br/></p>
<h3>Decorators</h3>
<p><br/></p>
<p>Agora que vimos o interceptor, fica mais fácil entendermos o decorator. Vamos ao código</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
</pre></td><td class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">br.com.jugms.weldse.intercept</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">javax.decorator.Decorator</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">javax.decorator.Delegate</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">javax.inject.Inject</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">br.com.jugms.weldse.model.CaixaEletronico</span><span style="color: #339933;">;</span>
&nbsp;
@Decorator
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> CaixaDecorator <span style="color: #000000; font-weight: bold;">extends</span> CaixaEletronico <span style="color: #009900;">&#123;</span>
&nbsp;
	@Inject
	@<span style="color: #003399;">Delegate</span>
	<span style="color: #000000; font-weight: bold;">private</span> CaixaEletronico delegate<span style="color: #339933;">;</span>
&nbsp;
	@Override
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> sacar<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">float</span> valor<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
		<span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;CaixaDecorator.sacar()&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		delegate.<span style="color: #006633;">sacar</span><span style="color: #009900;">&#40;</span>valor<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	@Override
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> depositar<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">float</span> valor<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
		<span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;CaixaDecorator.depositar()&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		delegate.<span style="color: #006633;">depositar</span><span style="color: #009900;">&#40;</span>valor<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p><br/></p>
<p>Um decorator precisa ter condições de <a href="http://pt.wikipedia.org/wiki/Princ%C3%ADpio_da_substitui%C3%A7%C3%A3o_de_Liskov">substituir</a> o objeto original (extender, implementar mesma interface). Além disso temos o objeto original que é injetado através da anotação @Delegate juntamente com a @Inject. Aqui também podemos utilizar diversos estereótipos para &#8220;selecionar&#8221; o objeto a ser decorado. Como os demais exemplos dessa nossa aplicação, esse decorator é extremamente complexo ao printar no console que ele foi executado <img src='http://blog.gilliard.eti.br/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' />  .</p>
<p>Agora basta adicionarmos ele no beans.xml:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
</pre></td><td class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;beans</span> <span style="color: #000066;">xmlns</span>=<span style="color: #ff0000;">&quot;http://java.sun.com/xml/ns/javaee&quot;</span> <span style="color: #000066;">xmlns:xsi</span>=<span style="color: #ff0000;">&quot;http://www.w3.org/2001/XMLSchema-instance&quot;</span></span>
<span style="color: #009900;">	<span style="color: #000066;">xsi:schemaLocation</span>=<span style="color: #ff0000;">&quot;http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/beans_1_0.xsd&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
&nbsp;
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;interceptors<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;class<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>br.com.jugms.weldse.intercept.ContaInterceptor<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/class<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/interceptors<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
&nbsp;
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;decorators<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;class<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>br.com.jugms.weldse.intercept.CaixaDecorator<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/class<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/decorators<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
&nbsp;
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/beans<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></td></tr></table></div>

<p><br/></p>
<p>E agora a saída no console é a seguinte:</p>
<pre>
hello
CaixaDecorator.sacar()
ContaInterceptor.protege(antes) >> recebeMovimento
ContaInterceptor.protege(depois) >> recebeMovimento
ContaInterceptor.protege(antes) >> getSaldo
ContaInterceptor.protege(depois) >> getSaldo
1800.0
CaixaDecorator.depositar()
ContaInterceptor.protege(antes) >> recebeMovimento
ContaInterceptor.protege(depois) >> recebeMovimento
ContaInterceptor.protege(antes) >> getSaldo
ContaInterceptor.protege(depois) >> getSaldo
2100.0
</pre>
<p><br/></p>
<p>Apesar da saída no console mostrar nosso decorator antes do nosso interceptor, isso é porque estamos decorando e interceptando coisas diferentes, pois decorators são chamados <strong>depois</strong> dos interceptors.</p>
<p>Em seguida posto como funcionam os alternatives e o que faltou colocar nesses dois primeiros posts.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.gilliard.eti.br/2010/05/aplicacao-desktop-com-weld-parte-2/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Desenvolvendo uma aplicação Desktop com Weld – Parte 1</title>
		<link>http://blog.gilliard.eti.br/2010/03/aplicacao-desktop-com-weld-parte-1/</link>
		<comments>http://blog.gilliard.eti.br/2010/03/aplicacao-desktop-com-weld-parte-1/#comments</comments>
		<pubDate>Wed, 17 Mar 2010 15:06:56 +0000</pubDate>
		<dc:creator>Gilliard Cordeiro</dc:creator>
				<category><![CDATA[CDI]]></category>
		<category><![CDATA[JavaEE]]></category>
		<category><![CDATA[CDI SE]]></category>
		<category><![CDATA[JavaEE 6]]></category>
		<category><![CDATA[JSR-299]]></category>
		<category><![CDATA[JSR-330]]></category>
		<category><![CDATA[WebBeans]]></category>
		<category><![CDATA[Weld]]></category>
		<category><![CDATA[Weld-SE]]></category>

		<guid isPermaLink="false">http://blog.gilliard.eti.br/?p=196</guid>
		<description><![CDATA[Como havia comentado, em Novembro do ano passado eu apresentei uma palestra no Javaneiros, evento anual sobre Java organizado pelo JUGMS. Os slides eu já disponibilizei no post anterior, e agora vou de fato colocar aqui no blog o que mostrei na palestra, pois slides sem explicação não serve para muita coisa né? Como acho [...]]]></description>
			<content:encoded><![CDATA[<p>Como havia comentado, em Novembro do ano passado eu apresentei uma palestra no Javaneiros, evento anual sobre Java organizado pelo JUGMS. Os slides eu já disponibilizei no post anterior, e agora vou de fato colocar aqui no blog o que mostrei na palestra, pois slides sem explicação não serve para muita coisa né? </p>
<p>Como acho que um post só vai ficar muito grande, vou publicar o conteúdo em partes.</p>
<p><br/></p>
<h3>Intradução</h3>
<p><br/></p>
<p><img src="http://blog.gilliard.eti.br/wp-content/uploads/2010/03/cdi1.png" alt="" title="Vários nomes envolvidos na JSR-299" class="alignnone size-full wp-image-231" /></p>
<p>Primeiramente eu gostaria de explicar, para quem não está familiarizado, o que é a CDI. Hoje em dia está mais difundido que na época da palestra, mas até para manter a coerência com os slides vou comentar rapidamente alguma coisa. Se seu objetivo é ver código, pode pular esse tópico.</p>
<p>A CDI, ou &#8220;<strong>Context and Dependency Injection for the Java EE platform</strong>&#8221; é uma especificação que define uma forma padrão de trabalharmos com DI em aplicações Java. Pelo nome já vemos que ela é voltada para Java EE, mas está seguindo os mesmos passos da JPA, que foi introduzida no Java EE 5 mas é usada sem problemas em aplicações SE.</p>
<p>Talvez a coisa que valha mais a pena comentar antes de entrar na prática é o monte de nomes envolvidos nessa JSR. O primeiro &#8220;nome&#8221; é a própria identificação da JSR: &#8220;JSR-299&#8243;. Acho que até quem nunca foi ligado em número de JSR já ouviu falar dessa tal de 299. Para resumir a história, ela já se chamou WebBeans antes de se chamar CDI, e até hoje muita coisa na internet, principalmente as discussões iniciais você vai encontrar esse nome. Além disso tem a implementação de referência dela, que também já chamou WebBeans e agora é Weld. Ou seja, de WebBeans não sobrou nada.</p>
<p><img src="http://blog.gilliard.eti.br/wp-content/uploads/2010/03/cdi2.png" alt="" title="Evolução dos nomes na linha do tempo" class="aligncenter size-full wp-image-232" /></p>
<p>Outra coisa que veio dar uma cofundida nesses nomes foi a JSR-330, &#8220;<strong>Dependency Injection for Java</strong>&#8220;, que nada mais é do que a extração das anotações da CDI para uma especificação menor, tornando assim mais fácil que frameworks como Spring e Guice utilizem anotações padrão mesmo não sendo uma implementação da CDI. Isso gerou muita polêmica também, pois em tese a CDI já deveria ser mínima e não faz sentido alguém usar as anotações dela sem ter o mesmo comportamento. Mas isso já é outra história.</p>
<p><br/></p>
<h3>Ainda antes de começar&#8230;</h3>
<p><br/></p>
<p>A CDI sofreu muita influência do Seam e Guice, além é claro de não ser difícil de compreender para quem trabalha com Spring, pois no fim das contas os conceitos são os mesmos.</p>
<p>Uma premissa muito forte da CDI é a injeção de dependência &#8220;<em>type safe</em>&#8220;, o que já a diferencia bastante do Seam que trabalha muito com Strings. Nesse ponto já fica mais perto para quem trabalha com Spring do que quem tá acostumado com Seam.</p>
<p>Outra coisa que temos que ter em mente é que diferentemente do Spring ou Seam onde uma classe simples não é considerada uma candidata à injeção de dependência a menos que seja marcada (via xml ou anotação), na CDI se a classe está dentro de um <em>bean package</em> então ela automaticamente é elegível. Mas isso nós vamos ver na aplicação de exemplo.</p>
<p>Outra coisa que temos que ter em mente é que o objetivo da CDI não é substituir o Seam. O Seam tem um mundo de coisas como facilitadores para e-mail, pdf, bpm, segurança, jsf, etc. A CDI define apenas o core o que será o core do Seam 3, ou seja, a parte da DI, interceptors e mais algumas coisas. Então não vamos comparar coisas tão diferentes com comentários tipo &#8220;O Seam é muito melhor que o Weld. O Weld não faz nada, o Seam faz um monte de coisas&#8221;.</p>
<p><img src="http://blog.gilliard.eti.br/wp-content/uploads/2010/03/cdi3.png" alt="" title="Relação do Seam com Weld e CDI" class="aligncenter size-full wp-image-233" /></p>
<p>A primeira coisa que precisamos saber para trabalhar com a CDI é o que é um <em>bean package</em>. Na prática um <em>bean package</em> vai ser um jar (ou pode estar explodido mesmo) onde temos um arquivo <code>META-INF/beans.xml</code>. Se a CDI encontrar esse cara, ela escaneia tudo e considera todas classes dentro desse &#8220;<em>módulo</em>&#8221; como beans injetáveis. É análogo ao seam.properties, mas no caso do Seam ainda precisa ter a anotação ou estar no <em>components.xml</em> para a classe ser considerada.</p>
<p>Outra coisa que vamos ver no exemplo é que o mesmo se trata de uma aplicação SE de console. Aí nos perguntamos: mas no nome da especificação não fala que é para Java EE? Pois é, mas a especificação define também a criação de extensões portáveis. Isso quer dizer que você pode fazer uma extensão da CDI e rodar em qualquer implementação dela. Pois bem, o Weld tem uma extensão que permite que rodemos tudo isso num ambiente SE, porém com limitações, claro.</p>
<p><br/></p>
<h3>Agora vamos à pratica</h3>
<p><br/></p>
<p>O nosso exemplo é bem simples, e consiste em realizarmos um saque e um depósito em uma conta bancária via um caixa eletrônico. Para simplificar o exemplo, temos apenas uma conta e um caixa eletrônico.</p>
<p>Nossa aplicação inicia com a classe MovimentacaoControl.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
</pre></td><td class="code"><pre class="java5" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">br.com.jugms.weldse.control</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">javax.enterprise.context.ApplicationScoped</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">javax.enterprise.event.Observes</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">javax.inject.Inject</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">org.jboss.weld.environment.se.events.ContainerInitialized</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">br.com.jugms.weldse.model.CaixaEletronico</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">br.com.jugms.weldse.model.ContaBancaria</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #008000; font-style: italic; font-weight: bold;">/**
* @author http://gilliard.eti.br
*/</span>
@ApplicationScoped
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> MovimentacaoControl<span style="color: #009900;">&#123;</span>
&nbsp;
    @Inject <span style="color: #000000; font-weight: bold;">private</span> ContaBancaria contaBancaria<span style="color: #339933;">;</span>
    @Inject <span style="color: #000000; font-weight: bold;">private</span> CaixaEletronico caixaEletronico<span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #006600; font-weight: bold;">void</span> executar<span style="color: #009900;">&#40;</span>@Observes ContainerInitialized init<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
        <span style="color: #003399; font-weight: bold;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;hello&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        caixaEletronico.<span style="color: #006633;">sacar</span><span style="color: #009900;">&#40;</span>200.0f<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #003399; font-weight: bold;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span>contaBancaria.<span style="color: #006633;">getSaldo</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        caixaEletronico.<span style="color: #006633;">depositar</span><span style="color: #009900;">&#40;</span>300.0f<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #003399; font-weight: bold;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span>contaBancaria.<span style="color: #006633;">getSaldo</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Como podemos ver essa classe possui a anotação @ApplicationScoped, mas essa anotação não serve para habilitar o gerenciamento dos objetos dessa classe, pois como eu disse anteriormente, isso é automático já que estamos em um bean package.</p>
<p>Essa classe também não possui um método main. Para executar o exemplo executamos a classe <code>org.jboss.weld.environment.se.StartMain</code>, e essa sim possui um método main, que inicializa todo o framework e quando termina de inicializar o container ele avisa lançando um evento do tipo <code>org.jboss.weld.environment.se.events.ContainerInitialized</code>. Para iniciarmos nossa aplicação, basta escutarmos esse evento como é feito no método &#8220;<code>executar</code>&#8220;. Deu para perceber que escutar um evento é algo muito complicado <img src='http://blog.gilliard.eti.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> . Nesse caso não faremos nada com o objeto init que é o que representa o evento, mas no decorrer do exemplo veremos como isso funciona.</p>
<p>No nosso exemplo, nós realizamos um saque de 200, depois olhamos o saldo, depositamos 300 e olhamos o saldo de novo. Parece bobo (e não vou negar isso), mas é útil para testarmos os diferentes escopos. Pois quando mudamos os scopos para stateless (default, sem a anotação @ApplicationScoped) percebemos que a conta sempre volta a ter o valor inicial.</p>
<p>Nesse exemplo estou trabalhando com classes, mas para trabalhar com interfaces o procedimento é o mesmo, ao ver que você pediu para injetar um objeto tipado por uma determinada interface a CDI vai procurar por uma implementação da mesma, e encontrando injeta. Agora se ela encontrar nenhuma ou mais de uma, aí será lançada uma excessão. &#8220;Poxa, mas e se eu tiver mais de uma implementação no bean package&#8221;? <a href="http://pt.wikipedia.org/wiki/El_Chapul%C3%ADn_Colorado" target="_blank">Palma, palma, palma, não priemos cânico</a>, vamos chegar a ver isso.</p>
<p><br/></p>
<h3>Manipulação de eventos</h3>
<p><br/></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
</pre></td><td class="code"><pre class="java5" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">br.com.jugms.weldse.model</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">javax.enterprise.event.Event</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">javax.inject.Inject</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #008000; font-style: italic; font-weight: bold;">/**
* @author http://gilliard.eti.br
*/</span>
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> CaixaEletronico <span style="color: #009900;">&#123;</span>
&nbsp;
    @Inject <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #003399; font-weight: bold;">Event</span><span style="color: #339933;">&lt;</span>Movimentacao<span style="color: #339933;">&gt;</span> eventMovimentacao<span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #006600; font-weight: bold;">void</span> depositar<span style="color: #009900;">&#40;</span><span style="color: #006600; font-weight: bold;">float</span> valor<span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        eventMovimentacao.<span style="color: #006633;">fire</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> Movimentacao<span style="color: #009900;">&#40;</span>valor<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #006600; font-weight: bold;">void</span> sacar<span style="color: #009900;">&#40;</span><span style="color: #006600; font-weight: bold;">float</span> valor<span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        eventMovimentacao.<span style="color: #006633;">fire</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> Movimentacao<span style="color: #009900;">&#40;</span>-<span style="color: #cc66cc;">1</span> <span style="color: #339933;">*</span> valor<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>


<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
</pre></td><td class="code"><pre class="java5" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">br.com.jugms.weldse.model</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #008000; font-style: italic; font-weight: bold;">/**
* @author http://gilliard.eti.br
*/</span>
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> Movimentacao <span style="color: #009900;">&#123;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #006600; font-weight: bold;">float</span> valor<span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> Movimentacao<span style="color: #009900;">&#40;</span><span style="color: #006600; font-weight: bold;">float</span> valor<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">valor</span> = valor<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #006600; font-weight: bold;">float</span> getValor<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">return</span> valor<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Como podemos ver, a classe <code>CaixaEletronico</code> não tem nenhuma anotação para &#8220;ativá-la&#8221; como injetável, e ainda assim ela é injetada no nosso objeto da classe <code>MovimentacaoControl</code>. Podemos ver também que nossa classe <code>CaixaEletronico</code> não debita diretamente da nossa conta (que nesse exemplo simplista só existe uma). O <code>CaixaEletronico</code> envia uma mensagem que é representada pela classe <code>Movimentacao</code>. Para disparar esse evento nosso <code>CaixaEletronico</code> pede para que seja injetado nele um &#8216;cara&#8217; que sabe disparar eventos do tipo <code>Movimentacao</code>. E então no depósito ele dispara uma movimentação com valor positivo e no saque uma com valor negativo. Bem simples.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
</pre></td><td class="code"><pre class="java5" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">br.com.jugms.weldse.model</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">javax.enterprise.context.ApplicationScoped</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">javax.enterprise.event.Observes</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">javax.inject.Inject</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">javax.inject.Named</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">br.com.jugms.weldse.intercept.Seguro</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #008000; font-style: italic; font-weight: bold;">/**
* @author http://gilliard.eti.br
*/</span>
@ApplicationScoped
@Seguro
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> ContaBancaria <span style="color: #009900;">&#123;</span>
&nbsp;
    @Inject @Named
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #006600; font-weight: bold;">float</span> saldoInicial = 1000.0f<span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #006600; font-weight: bold;">void</span> recebeMovimento<span style="color: #009900;">&#40;</span>@Observes Movimentacao movimentacao<span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        saldoInicial += movimentacao.<span style="color: #006633;">getValor</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #006600; font-weight: bold;">float</span> getSaldo<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">return</span> saldoInicial<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Agora na classe <code>ContaBancaria</code> vemos como consumir um evento. Na verdade já tinhamos visto na classe <code>MovimentacaoControl</code>, mas agora vamos de fato utilizar o objeto do evento. Como na <code>MovimentacaoControl</code>, para escutarmos um evento basta termos um método com um parâmetro do tipo do objeto do evento anotado com @Observes. Além disso podemos ver o escopo desse objeto, que é de aplicação. Comente esse escopo e você vai perceber que serão criadas várias contas bancárias, e dessa forma vamos debitar em uma e creditar na outra.</p>
<p>Podemos ver também a injeção de um &#8216;cara&#8217; do tipo float, mas além de @Inject usamos um @Named para isso. O @Named é um qualificador. Nós também podemos, em vários casos vamos &#8220;precisar&#8221;, criar nosso próprios qualificadores. Um qualificador serve para especificar melhor qual candidato à injeção queremos que seja escolhido. Seria como uma cláusula &#8220;where&#8221; na pesquisa por injetáveis. No caso desse float, obviamente algém vai ter que colocá-lo no contexto para que possamos recuperá-lo, e podemos ver isso na classe Produtores.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
</pre></td><td class="code"><pre class="java5" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">br.com.jugms.weldse.model</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">javax.enterprise.inject.Produces</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">javax.inject.Named</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #008000; font-style: italic; font-weight: bold;">/**
* @author http://gilliard.eti.br
*/</span>
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> Produtores <span style="color: #009900;">&#123;</span>
&nbsp;
    @Produces @Named
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #006600; font-weight: bold;">float</span> getSaldoInicial<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">return</span> 2000.0f<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Essa classe agrega todos os métodos produtores da nossa aplicação (que por ser extremamente complexa tem exatamente um <img src='http://blog.gilliard.eti.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> ). Um método produtor (anotado com @Produces) é o oposto do consumidor (@Inject), logo em vez de pegar, ele joga um obejto no contexto, usando como qualificador o @Named que permite darmos um nome ao componente. Só temos que tomar cuidado para não usarmos demais isso e acabarmos tendo tudo ligado via Strings. Nesse exemplo, o nome usado para registrar esse componente é &#8220;saldoInicial&#8221;, pois segue o padrão java bean.</p>
<p>Podemos ver também que que na classe <code>ContaBancaria</code> deixei um saldo inicial de 1000, e depois mandei injetar nessa propriedade o valor de um componente do tipo float chamado &#8220;saldoInicial&#8221; que está com valor 2000. Na prática ficará valendo o 2000, pois o 1000 só vai valer antes que as injeções sejam executadas.</p>
<p>Nos próximos posts eu faço uma sessão específica para comentar as possibilidade de injeção e &#8220;ejeção&#8221; que a CDI provê. E também vou explicar o funcionamento dos interceptadores como podemos ver através da anotação @Seguro da classe <code>ContaBancaria</code>, e também como especificarmos qual implementação de uma interface vamos querer que seja selecionada. Como dá para perceber esse assunto vai longe. Então até o próximo post.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.gilliard.eti.br/2010/03/aplicacao-desktop-com-weld-parte-1/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
		<item>
		<title>Apresentacao sobre CDI (JSR-299) no Javaneiros2009</title>
		<link>http://blog.gilliard.eti.br/2010/02/apresentacao-sobre-cdi-jsr-299-no-javaneiros2009/</link>
		<comments>http://blog.gilliard.eti.br/2010/02/apresentacao-sobre-cdi-jsr-299-no-javaneiros2009/#comments</comments>
		<pubDate>Thu, 25 Feb 2010 16:33:13 +0000</pubDate>
		<dc:creator>Gilliard Cordeiro</dc:creator>
				<category><![CDATA[CDI]]></category>
		<category><![CDATA[JavaEE]]></category>
		<category><![CDATA[CDI SE]]></category>
		<category><![CDATA[JavaEE 6]]></category>
		<category><![CDATA[JSR-299]]></category>
		<category><![CDATA[JSR-330]]></category>
		<category><![CDATA[Seam]]></category>
		<category><![CDATA[Seam 3]]></category>
		<category><![CDATA[WebBeans]]></category>
		<category><![CDATA[Weld]]></category>
		<category><![CDATA[Weld-SE]]></category>

		<guid isPermaLink="false">http://blog.gilliard.eti.br/?p=179</guid>
		<description><![CDATA[Estou a um bom tempo sem postar, mas nesse tempo fiz bastante coisa que acabei não postando aqui. Uma delas foi uma palestra no Javaneiros2009, falando sobre a JSR-299. Ainda vou postar aqui o exemplo, mas como pretendo explicar cada parte, e isso vai levar mais tempo, já vou postando os slides até para tirar [...]]]></description>
			<content:encoded><![CDATA[<p>Estou a um bom tempo sem postar, mas nesse tempo fiz bastante coisa que acabei não postando aqui. Uma delas foi uma palestra no Javaneiros2009, falando sobre a JSR-299.</p>
<p>Ainda vou postar aqui o exemplo, mas como pretendo explicar cada parte, e isso vai levar mais tempo, já vou postando os slides até para tirar a poeira do blog.</p>
<p><strong>Update:</strong><br />
<a href="http://blog.gilliard.eti.br/2010/03/aplicacao-desktop-com-weld-parte-1/">Desenvolvendo uma aplicação Desktop com Weld – Parte 1</a><br />
<a href="http://blog.gilliard.eti.br/2010/05/aplicacao-desktop-com-weld-parte-2/">Desenvolvendo uma aplicação Desktop com Weld – Parte 2</a><br />
<a href="http://blog.gilliard.eti.br/2010/05/aplicacao-desktop-com-weld-final/">Desenvolvendo uma aplicação Desktop com Weld – Final</a></p>
<div style="width:425px" id="__ss_3122974"><strong style="display:block;margin:12px 0 4px"><a href="http://www.slideshare.net/gscordeiro/do-seam-ao-cdi-jsr299" title="Do Seam à CDI (JSR-299)">Do Seam à CDI (JSR-299)</a></strong><object width="425" height="355"><param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=doseamaocdi-100210075749-phpapp02&#038;stripped_title=do-seam-ao-cdi-jsr299" /><param name="allowFullScreen" value="true"/><param name="allowScriptAccess" value="always"/><embed src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=doseamaocdi-100210075749-phpapp02&#038;stripped_title=do-seam-ao-cdi-jsr299" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"></embed></object>
<div style="padding:5px 0 12px">View more <a href="http://www.slideshare.net/">presentations</a> from <a href="http://www.slideshare.net/gscordeiro">gscordeiro</a>.</div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.gilliard.eti.br/2010/02/apresentacao-sobre-cdi-jsr-299-no-javaneiros2009/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Mojarra (JSF RI) 2.0 disponível</title>
		<link>http://blog.gilliard.eti.br/2009/10/mojarra-jsf-ri-2-0-disponivel/</link>
		<comments>http://blog.gilliard.eti.br/2009/10/mojarra-jsf-ri-2-0-disponivel/#comments</comments>
		<pubDate>Mon, 19 Oct 2009 18:47:31 +0000</pubDate>
		<dc:creator>Gilliard Cordeiro</dc:creator>
				<category><![CDATA[JavaEE]]></category>
		<category><![CDATA[JSF]]></category>
		<category><![CDATA[JavaServer Faces]]></category>

		<guid isPermaLink="false">http://blog.gilliard.eti.br/2009/10/mojarra-jsf-ri-2-0-disponivel/</guid>
		<description><![CDATA[Depois de uma boa espera, está disponível a versão final do JSF 2.0. Nos demais post deste blog você pode ver alguns exemplos de novas funcionalidades e baixar projetos com JSF 2 (não a versão final) rodando. Como faz algum tempo que eu venho postando sobre isso, alguns exemplos podem ter pequenas diferenças do que [...]]]></description>
			<content:encoded><![CDATA[<p>Depois de uma boa espera, está disponível a versão final do <a href="https://javaserverfaces.dev.java.net/servlets/ProjectDocumentList?folderID=11852">JSF 2.0</a>.</p>
<p>Nos <a href="http://blog.gilliard.eti.br/category/jsf/">demais post</a> deste blog você pode ver alguns exemplos de novas funcionalidades e baixar projetos com JSF 2 (não a versão final) rodando.</p>
<p>Como faz algum tempo que eu venho postando sobre isso, alguns exemplos podem ter pequenas diferenças do que está agora na versão final, mas nada que prejudique o entendimento, pois apesar da implementação estar saindo agora, a especificação já está pronta há algum tempo.</p>
<p>Tem vários assuntos que não tive tempo de escrever um post, mas hoje em dia já não está difícil encontrar exemplos de JSF 2 na internet.</p>
<p>Outros links:</p>
<p><a href="https://javaserverfaces.dev.java.net/">https://javaserverfaces.dev.java.net/</a><br />
<a href="https://javaserverfaces.dev.java.net/nonav/rlnotes/2.0.0/index.html">https://javaserverfaces.dev.java.net/nonav/rlnotes/2.0.0/index.html</a><br />
<a href="https://javaserverfaces.dev.java.net/maven2">https://javaserverfaces.dev.java.net/maven2</a></p>
<p>Boa diversão <img src='http://blog.gilliard.eti.br/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.gilliard.eti.br/2009/10/mojarra-jsf-ri-2-0-disponivel/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>URLs amigáveis no JSF 2.0</title>
		<link>http://blog.gilliard.eti.br/2009/05/urls-amigaveis-no-jsf-2/</link>
		<comments>http://blog.gilliard.eti.br/2009/05/urls-amigaveis-no-jsf-2/#comments</comments>
		<pubDate>Thu, 28 May 2009 03:36:19 +0000</pubDate>
		<dc:creator>Gilliard Cordeiro</dc:creator>
				<category><![CDATA[JavaEE]]></category>
		<category><![CDATA[JSF]]></category>
		<category><![CDATA[bookmarking]]></category>
		<category><![CDATA[JavaServer Faces]]></category>

		<guid isPermaLink="false">http://blog.gilliard.eti.br/?p=163</guid>
		<description><![CDATA[Hoje vou falar de mais uma novidade do JSF 2, cuja falta era motivo de muita reclamação: URLs amigávies, bookmarking, método GET e outros nomes que podemos dar. O suporte a essa nova funcionalidade é dado por dois pares de componentes, de um lado h:button e h:link e do outro f:metadata e f:viewParam. Os componentes [...]]]></description>
			<content:encoded><![CDATA[<p>Hoje vou falar de mais uma novidade do JSF 2, cuja falta era motivo de muita reclamação: URLs amigávies, bookmarking, método GET e outros nomes que podemos dar. O suporte a essa nova funcionalidade é dado por dois pares de componentes, de um lado h:button e h:link e do outro f:metadata e f:viewParam.</p>
<p>Os componentes h:button e h:link servem para originar as ações jsf assim como os componentes h:command{Button|Link}, porém usando GET em vez de POST. Esses componentes possuem um atributo chamado <strong>outcome</strong>, que representa a regra de navegação do JSF, assim como seria colocar uma String diretamente na action do h:command{Button|Link}. Para passar parâmetros colocamos a tag f:param dentro do h:link ou h:button.</p>
<p>Como exemplo vamos ver uma aplicaçãozinha que tem uma tela de listagem e outra de visualização de Pessoas. A seguir um trecho da página de listagem de pessoas, <strong>listarPessoas.xhtml</strong>:</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;h:form<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;h:dataTable</span> <span style="color: #000066;">value</span>=<span style="color: #ff0000;">&quot;#{pessoaController.pessoas}&quot;</span> <span style="color: #000066;">var</span>=<span style="color: #ff0000;">&quot;pessoa&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;h:column<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
			#{pessoa.nome}
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/h:column<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;h:column<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
			<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;h:link</span> <span style="color: #000066;">outcome</span>=<span style="color: #ff0000;">&quot;/verPessoa&quot;</span> <span style="color: #000066;">value</span>=<span style="color: #ff0000;">&quot;Editar&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
				<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;f:param</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;pessoa&quot;</span> <span style="color: #000066;">value</span>=<span style="color: #ff0000;">&quot;#{pessoa.nome}&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
			<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/h:link<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/h:column<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/h:dataTable<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/h:form<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<p>Nesse exemplo, no outcome eu já estou usando o esquema novo de navegação comentado no <a href="http://blog.gilliard.eti.br/2009/05/implicit-navigation-jsf-2/">post passado</a>. O link acima vai gerar uma url parecida com <strong><em>http://localhost:8080/exemplojsf2/verPessoa.jsf?pessoa=fulano_0</em></strong>.</p>
<p>Agora do lado da página que recebe a requisição temos os componentes f:metadata e f:viewParam. A primeira é apenas uma tag que engloba as f:viewParam. Já as tags f:viewParam se comportam de forma muito parecida com um h:inputText, podemos dizer que praticamente a única diferença é no input a gente digita em um formulário, enquanto na f:viewParam escrevemos na URL.</p>
<p>A tag f:viewParam possue os seguintes atributos: converter, converterMessage, required, requiredMessage, validator, validatorMessage, value, valueChangeListener, maxlength e for (este último voltado para o novo esquema de component composition do Facelets). Como podemos ver, é praticamente um h:inputText.</p>
<p>Vamos ver então um trecho do código da página que recebe a requisição, <strong>verPessoa.xhtml</strong>:</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;f:view<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;f:metadata<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	    	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;f:viewParam</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;pessoa&quot;</span> <span style="color: #000066;">value</span>=<span style="color: #ff0000;">&quot;#{pessoaController.pessoaSelecionada}&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
   	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/f:metadata<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;h:head<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;title<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>Ver Pessoa<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/title<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/h:head<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;h:body<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;h:form<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		Nome: #{pessoaController.pessoaSelecionada.nome}
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/h:form<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/h:body<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/f:view<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<p>Não precisei colocar um converter no f:viewParam pois configurei um converter &#8220;<strong>forClass</strong>&#8221; como veremos mais a frente.</p>
<p>Agora a nossa classe</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> Pessoa <span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #003399;">String</span> nome<span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> Pessoa<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #000000; font-weight: bold;">public</span> Pessoa<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> nome<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">nome</span> <span style="color: #339933;">=</span> nome<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">//getter e setter suprimido</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Isso mesmo, a classe é complexa desse jeito  <img src='http://blog.gilliard.eti.br/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p>Como o intuito é só um exemplo, eu nem me preocupei com banco de dados ou algum mecanismo mais interessante, apenas criei um conversor para mostrar que o novo esquema não permite apenas o uso de Strings. Segue o código do conversor:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">@FacesConverter<span style="color: #009900;">&#40;</span>forClass<span style="color: #339933;">=</span>Pessoa.<span style="color: #000000; font-weight: bold;">class</span><span style="color: #009900;">&#41;</span>
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> PessoaConverter <span style="color: #000000; font-weight: bold;">implements</span> Converter <span style="color: #009900;">&#123;</span>
&nbsp;
	@Override
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399;">Object</span> getAsObject<span style="color: #009900;">&#40;</span>FacesContext context, UIComponent component, <span style="color: #003399;">String</span> string<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
		<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000000; font-weight: bold;">new</span> Pessoa<span style="color: #009900;">&#40;</span>string<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	@Override
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399;">String</span> getAsString<span style="color: #009900;">&#40;</span>FacesContext context, UIComponent component, <span style="color: #003399;">Object</span> object<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
		<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>Pessoa<span style="color: #009900;">&#41;</span>object<span style="color: #009900;">&#41;</span>.<span style="color: #006633;">getNome</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>E agora nosso managed bean que recebe não uma String, e sim objetos do nosso domínio. Eu falo isso o tempo todo pois preciso deixar isso bem claro, senão eu fico doido de ver uma aplicação usando JSF passando String e Integer de um lado pro outro <img src='http://blog.gilliard.eti.br/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' /> </p>
<p>Mas tudo bem, deixando o desabafo pra lá vamos ao código:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">@ManagedBean<span style="color: #009900;">&#40;</span>name<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;pessoaController&quot;</span><span style="color: #009900;">&#41;</span>
@RequestScoped
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> PessoaController <span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">private</span> Pessoa pessoaSelecionada<span style="color: #339933;">;</span>
	<span style="color: #000000; font-weight: bold;">private</span> List<span style="color: #339933;">&lt;</span>pessoa<span style="color: #339933;">&gt;</span> pessoas<span style="color: #339933;">;</span>
&nbsp;
	@PostConstruct
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> init<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		pessoas <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> ArrayList<span style="color: #339933;">&lt;</span>pessoa<span style="color: #339933;">&gt;</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000000; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">int</span> i <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> <span style="color: #cc66cc;">10</span><span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			pessoas.<span style="color: #006633;">add</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> Pessoa<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;fulano_&quot;</span> <span style="color: #339933;">+</span> i<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">//getters e setters suprimidos</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Acredito que por hoje seja suficiente. Vou ver se em breve escrevo algo mais específico sobre facelets.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.gilliard.eti.br/2009/05/urls-amigaveis-no-jsf-2/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
	</channel>
</rss>

