<?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 &#187; Seam</title>
	<atom:link href="http://blog.gilliard.eti.br/tag/seam/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>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>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>
	</channel>
</rss>

