<?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>Edson Gonçalves &#187; JSF 2.0</title>
	<atom:link href="http://www.edsongoncalves.com.br/category/javaserver-faces-2-0/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.edsongoncalves.com.br</link>
	<description>Tecnologia e Conhecimento ao Alcance de Todos</description>
	<lastBuildDate>Fri, 23 Sep 2011 00:49:08 +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>Ajax com JSF 2.0</title>
		<link>http://www.edsongoncalves.com.br/2010/06/04/ajax-com-jsf-2-0/</link>
		<comments>http://www.edsongoncalves.com.br/2010/06/04/ajax-com-jsf-2-0/#comments</comments>
		<pubDate>Fri, 04 Jun 2010 11:28:29 +0000</pubDate>
		<dc:creator>Edson Gonçalves</dc:creator>
				<category><![CDATA[JSF 2.0]]></category>
		<category><![CDATA[Eclipse IDE]]></category>
		<category><![CDATA[Java EE 6]]></category>
		<category><![CDATA[JavaServer Faces]]></category>
		<category><![CDATA[Tomcat]]></category>

		<guid isPermaLink="false">http://www.edsongoncalves.com.br/?p=376</guid>
		<description><![CDATA[Olá Pessoal, tudo bom? Como vão vocês? Depois que fiz a publicação do artigo Ajax com JSF 1.2 utilizando JBoss RichFaces, alguns leitores me enviaram e-mail pedindo um exemplo com o JSF 2.0. Então, atendendo aos pedidos, este artigo ensina como fazer o exemplo com JSF 1.2 utilizando o AJAX da biblioteca RichFaces, mas em [...]]]></description>
			<content:encoded><![CDATA[<p>Olá Pessoal, tudo bom? Como vão vocês?</p>
<p>Depois que fiz a publicação do artigo <a href="../2010/05/22/ajax-com-jsf-1-2-utilizando-jboss-richfaces/">Ajax com JSF 1.2 utilizando JBoss RichFaces</a>, alguns leitores me enviaram e-mail pedindo um exemplo com o JSF 2.0.</p>
<p>Então, atendendo aos pedidos, este artigo ensina como fazer o exemplo com JSF 1.2 utilizando o AJAX da biblioteca RichFaces, mas em JSF 2.0, sem adição de biblioteca AJAX.</p>
<h3>Obtendo e instalando o Eclipse IDE</h3>
<p>Para desenvolver este exemplo, utilizei a versão do Eclipse IDE 3.6, ainda em desenvolvimento, em um ambiente voltado para o trabalho com Java EE. Para obter o Eclipse IDE, já configurado com o ambiente Web, vá ao endereço <a href="http://www.eclipse.org/downloads/"><strong>http://www.eclipse.org/downloads/</strong></a> e selecione a aba <strong>Developer Builds</strong> e clique em <strong>Eclipse IDE for Java EE Developers</strong>. Lembre-se de selecionar o seu sistema operacional.</p>
<p>Ao baixar, descompacte em um local desejado de sua máquina.</p>
<h3>O Servidor Java</h3>
<p>Para este artigo, vamos utilizar o Tomcat 7.0, ainda em desenvolvimento. Para baixar o binário do Tomcat 7, vá até o endereço  <strong><a href="http://people.apache.org/%7Emarkt/dev/tomcat-7/v7.0.0-RC3/bin/">http://people.apache.org/~markt/dev/tomcat-7/v7.0.0-RC3/bin/</a></strong>. Antes de continuarmos, vale lembrá-los que este endereço pode mudar até a versão final e que, por ser uma versão de desenvolvimento, não deve ser utilizada em produção.</p>
<p>A versão que vamos baixar é a compactada. Por exemplo, se o seu Windows for de uma versão 64bits, baixe o arquivo <strong><a href="http://people.apache.org/%7Emarkt/dev/tomcat-7/v7.0.0-RC3/bin/apache-tomcat-7.0.0-RC3-windows-x64.zip">apache-tomcat-7.0.0-RC3-windows-x64.zip</a></strong>.</p>
<p><strong>Atenção:</strong> O Tomcat 7.0 roda somente na JDK 6 ou superior.</p>
<h3>As bibliotecas</h3>
<p>Para trabalhar com o JavaServer Faces 2.0, primeiramente será preciso configurar os arquivos e a estrutura necessária.</p>
<p>O contêiner Servlet Tomcat 7, por padrão, não possue suporte direto ao JavaServer Faces, ou seja, não contém as bibliotecas necessárias para o desenvolvimento com o mesmo.</p>
<p>Para baixar o JSF, faça download no endereço<strong> </strong><a href="https://javaserverfaces.dev.java.net/"><strong>https://javaserverfaces.dev.java.net/</strong></a>. Ao baixar o arquivo, simplesmente descompacte em um diretório de sua escolha.</p>
<h4>JavaServer Faces rodando em seu aplicativo Web</h4>
<p>Para ter o JavaServer Faces 2.0 em sua aplicação, você possui dois arquivos do tipo JAR:</p>
<ol>
<li><strong>jsf-api.jar</strong></li>
<li><strong>jsf-impl.jar</strong></li>
</ol>
<p><strong> </strong></p>
<h4>As bibliotecas JSTL</h4>
<p>Os arquivos JSTL estão no endereço  <a href="http://www.apache.org/dist/jakarta/taglibs/standard/binaries/"><strong>http://www.apache.org/dist/jakarta/taglibs/standard/binaries/</strong></a>, onde utilizaremos dois arquivos JARs:</p>
<ol>
<li><strong>jstl.jar</strong></li>
<li><strong>standard.jar</strong></li>
</ol>
<p><strong> </strong></p>
<h3>Criando o projeto</h3>
<p>Clique no menu <strong>File&gt;New&gt;Dynamic Web Project</strong>. Na caixa de diálogo <strong>New Dynamic Web Project</strong>, digite <strong>ProjAjaxComJSF2 </strong>(ou o nome que desejar dar) em <strong>Project name</strong>. Clique no botão <strong>New Runtime</strong> e, na caixa de diálogo <strong>New Server Runtime Environment</strong>, expanda <strong>Apache</strong> e selecione <strong>Apache Tomcat v7.0</strong>. Clique no botão <strong>Next</strong>.</p>
<div id="attachment_377" class="wp-caption alignnone" style="width: 310px"><a href="http://www.edsongoncalves.com.br/wp-content/uploads/2010/06/Figura-1.jpg" rel="lightbox[376]"><img class="size-medium wp-image-377" title="Figura-1" src="http://www.edsongoncalves.com.br/wp-content/uploads/2010/06/Figura-1-300x292.jpg" alt="Figura 1 – Selecionando o Apache Tomcat 7" width="300" height="292" /></a><p class="wp-caption-text">Figura 1 – Selecionando o Apache Tomcat 7</p></div>
<p>Na próxima etapa, selecione o diretório onde está localizado o seu Tomcat 7, clicando em <strong>Browse</strong>. Lembre-se da versão do JDK 6 para trabalhar com o Tomcat. Confirme no botão <strong>Finish</strong>.</p>
<div id="attachment_378" class="wp-caption alignnone" style="width: 310px"><a href="http://www.edsongoncalves.com.br/wp-content/uploads/2010/06/Figura-2.jpg" rel="lightbox[376]"><img class="size-medium wp-image-378" title="Figura-2" src="http://www.edsongoncalves.com.br/wp-content/uploads/2010/06/Figura-2-300x292.jpg" alt="Figura 2 – Definindo o local onde foi instalado o Tomcat 7" width="300" height="292" /></a><p class="wp-caption-text">Figura 2 – Definindo o local onde foi instalado o Tomcat 7</p></div>
<p>Retornando a primeira etapa da criação do projeto, em <strong>Configuration</strong>, selecione <strong>JavaServer Faces v2.0 Project</strong>. Com suas definições completas, podemos prosseguir em <strong>Next</strong>.</p>
<div id="attachment_379" class="wp-caption alignnone" style="width: 294px"><a href="http://www.edsongoncalves.com.br/wp-content/uploads/2010/06/Figura-3.jpg" rel="lightbox[376]"><img class="size-medium wp-image-379" title="Figura-3" src="http://www.edsongoncalves.com.br/wp-content/uploads/2010/06/Figura-3-284x300.jpg" alt="Figura 3 – Definição inicial do projeto completa" width="284" height="300" /></a><p class="wp-caption-text">Figura 3 – Definição inicial do projeto completa</p></div>
<p>Iremos executar o botão <strong>Next</strong> até a última etapa, ao qual definiremos as bibliotecas do projeto.</p>
<p>Na última etapa do assistente, deixe <strong>Type</strong> como <strong>User Library</strong>, caso não esteja.</p>
<div id="attachment_380" class="wp-caption alignnone" style="width: 310px"><a href="http://www.edsongoncalves.com.br/wp-content/uploads/2010/06/Figura-4.jpg" rel="lightbox[376]"><img class="size-medium wp-image-380" title="Figura-4" src="http://www.edsongoncalves.com.br/wp-content/uploads/2010/06/Figura-4-300x57.jpg" alt="Figura 4 – Definindo em biblioteca de usuário" width="300" height="57" /></a><p class="wp-caption-text">Figura 4 – Definindo em biblioteca de usuário</p></div>
<p>Logo abaixo, na lateral direita, você encontra o ícone <strong>Manage libraries</strong>. Dê um clique nele.</p>
<div id="attachment_381" class="wp-caption alignnone" style="width: 241px"><a href="http://www.edsongoncalves.com.br/wp-content/uploads/2010/06/Figura-5.jpg" rel="lightbox[376]"><img class="size-full wp-image-381" title="Figura-5" src="http://www.edsongoncalves.com.br/wp-content/uploads/2010/06/Figura-5.jpg" alt="Figura 5 – Seleção de Manage libraries" width="231" height="86" /></a><p class="wp-caption-text">Figura 5 – Seleção de Manage libraries</p></div>
<p>Ao abrir a caixa de diálogo <strong>Preferences</strong>, verá que está filtrado direto no item <strong>User Libraries</strong>. Clique no botão <strong>New</strong> e, na caixa de diálogo <strong>New User Library</strong> digite <strong>JSF2</strong> e confirme.</p>
<div id="attachment_382" class="wp-caption alignnone" style="width: 304px"><a href="http://www.edsongoncalves.com.br/wp-content/uploads/2010/06/Figura-6.jpg" rel="lightbox[376]"><img class="size-full wp-image-382" title="Figura-6" src="http://www.edsongoncalves.com.br/wp-content/uploads/2010/06/Figura-6.jpg" alt="Figura 6 – Criando a biblioteca de usuário JSF2" width="294" height="209" /></a><p class="wp-caption-text">Figura 6 – Criando a biblioteca de usuário JSF2</p></div>
<p>Retornando para <strong>Preferences</strong>, selecione <strong>JSF2</strong> e clique no botão <strong>Add JARs</strong>. Selecione os JARs do JSF 2.0 que necessitamos para o projeto e confirme.</p>
<p>Faça o mesmo processo para criar uma nova biblioteca de usuário, mas a chame desta vez de <strong>JSTL</strong>. Adicione as bibliotecas JSTL a esta biblioteca de usuário. Confirme por fim a caixa de diálogo <strong>Preferences</strong> no botão <strong>OK</strong>.</p>
<div id="attachment_383" class="wp-caption alignnone" style="width: 310px"><a href="http://www.edsongoncalves.com.br/wp-content/uploads/2010/06/Figura-7.jpg" rel="lightbox[376]"><img class="size-medium wp-image-383" title="Figura-7" src="http://www.edsongoncalves.com.br/wp-content/uploads/2010/06/Figura-7-300x216.jpg" alt="Figura 7 – Bibliotecas de usuário JSF2 e JSTL criadas" width="300" height="216" /></a><p class="wp-caption-text">Figura 7 – Bibliotecas de usuário JSF2 e JSTL criadas</p></div>
<p>Por fim, selecione as bibliotecas de usuário criadas, pois elas serão adicionadas ao projeto automaticamente. Confirme a criação do projeto no botão <strong>Finish</strong>.</p>
<div id="attachment_384" class="wp-caption alignnone" style="width: 268px"><a href="http://www.edsongoncalves.com.br/wp-content/uploads/2010/06/Figura-8.jpg" rel="lightbox[376]"><img class="size-medium wp-image-384" title="Figura-8" src="http://www.edsongoncalves.com.br/wp-content/uploads/2010/06/Figura-8-258x300.jpg" alt="Figura 8 – Finalizando a criação do projeto com a seleção das bibliotecas de usuário criadas" width="258" height="300" /></a><p class="wp-caption-text">Figura 8 – Finalizando a criação do projeto com a seleção das bibliotecas de usuário criadas</p></div>
<p>Na finalização do projeto, o Eclipse lançará uma mensagem perguntando se desejamos mudar de perspectiva. Diga que sim, clicando em <strong>Yes</strong>. O Eclipse alterará de perspectiva, colocando na <strong>Java EE</strong>.</p>
<h3>O  deployment descriptor</h3>
<p>O assistente do projeto criou automaticamente o <strong>web.xml</strong> com suas respectivas configurações. <strong> </strong></p>
<h3>Criando o JavaBean Texto</h3>
<p>Com o direito do mouse sobre o projeto, selecione <strong>New&gt;Class</strong> no menu de contexto.</p>
<p>Na caixa de diálogo <strong>New Java Class</strong>, preencha o pacote (<strong>br.com.integrator</strong>) e o nome da classe, no caso <strong>Texto</strong>, em <strong>Name</strong>. Confirme no botão <strong>Finish</strong>.</p>
<div id="attachment_385" class="wp-caption alignnone" style="width: 269px"><a href="http://www.edsongoncalves.com.br/wp-content/uploads/2010/06/Figura-9.jpg" rel="lightbox[376]"><img class="size-medium wp-image-385" title="Figura-9" src="http://www.edsongoncalves.com.br/wp-content/uploads/2010/06/Figura-9-259x300.jpg" alt="Figura 9 – A classe Texto" width="259" height="300" /></a><p class="wp-caption-text">Figura 9 – A classe Texto</p></div>
<p>Altere a classe <strong>Texto</strong> conforme mostrado na <strong>Listagem 1</strong>.</p>
<p><strong>Listagem 1 – O JavaBean Texto</strong></p>
<pre class="brush:java">package br.com.integrator;

@ManagedBean(name="textoBean")

@RequestScoped

public class Texto {

private String texto;

public String getTexto() {

return texto;

}

public void setTexto(String texto) {

this.texto = texto;

}

}</pre>
<h3>Sem utilizar o arquivo faces-config.xml</h3>
<p>Caso o leitor ainda não teve a oportunidade, recomendo ler o meu artigo <strong><a href="../2010/02/09/javaserver-faces-2-0-na-pratica-parte-2/">JavaServer Faces 2.0 na Prática – Parte 2</a></strong>, que explica como funciona atualmente o JSF na versão 2.0.<strong> </strong></p>
<h3>Criando a página JSF com suporte ao AJAX</h3>
<p>Com o direito do mouse sobre <strong>WebContent</strong>, vá no menu de contexto em <strong>New&gt;HTML File</strong>.  No diálogo <strong>New HTML File</strong>, dê o nome no arquivo de <strong>ajaxjsf.xhtml</strong> e prossiga no assistente clicando em <strong>Next</strong></p>
<p>.</p>
<div id="attachment_386" class="wp-caption alignnone" style="width: 310px"><a href="http://www.edsongoncalves.com.br/wp-content/uploads/2010/06/Figura-10.jpg" rel="lightbox[376]"><img class="size-medium wp-image-386" title="Figura-10" src="http://www.edsongoncalves.com.br/wp-content/uploads/2010/06/Figura-10-300x266.jpg" alt="Figura 10 – Criando uma página JSF 2" width="300" height="266" /></a><p class="wp-caption-text">Figura 10 – Criando uma página JSF 2</p></div>
<p>Na última etapa de criação da página, como não temos definido um Template que se encaixe na nossa necessidade de desenvolvimento da página, selecione o primeiro item da lista, no caso <strong>New Facelet Composition Page</strong>. Finalize no botão <strong>Finish</strong>.</p>
<div id="attachment_387" class="wp-caption alignnone" style="width: 310px"><a href="http://www.edsongoncalves.com.br/wp-content/uploads/2010/06/Figura-11.jpg" rel="lightbox[376]"><img class="size-medium wp-image-387" title="Figura-11" src="http://www.edsongoncalves.com.br/wp-content/uploads/2010/06/Figura-11-300x274.jpg" alt="Figura 11 – Seleção do template New Facelet Composition Page" width="300" height="274" /></a><p class="wp-caption-text">Figura 11 – Seleção do template New Facelet Composition Page</p></div>
<p>Com a página <strong>ajaxjsf.xhtml</strong> criada e aberta no editor, altere-a deixando exatamente como mostrado na <strong>Listagem 2 </strong> a seguir:  <strong>Listagem 2 – A página ajaxjsf.xhtml completa</strong></p>
<pre class="brush:xml">&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"

"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;

&lt;html xmlns="http://www.w3.org/1999/xhtml"

xmlns:h="http://java.sun.com/jsf/html"

xmlns:f="http://java.sun.com/jsf/core"&gt;

&lt;h:head&gt;&lt;title&gt;Ajax com JSF 2.0&lt;/title&gt;&lt;/h:head&gt;

&lt;h:body&gt;

&lt;h:form id="form1"&gt;

&lt;h:outputScript name="jsf.js" library="javax.faces" target="head"/&gt;

&lt;h:inputText id="texto" value="#{textoBean.texto}"&gt;

&lt;f:ajax event="keyup" execute="form1:texto" render="form1:resultado"/&gt;

&lt;/h:inputText&gt;

&lt;br /&gt;

Resultado:

&lt;strong&gt;

&lt;h:outputLabel id="resultado" value="#{textoBean.texto}" /&gt;

&lt;/strong&gt;

&lt;/h:form&gt;

&lt;/h:body&gt;

&lt;/html&gt;</pre>
<div id="attachment_388" class="wp-caption alignnone" style="width: 310px"><a href="http://www.edsongoncalves.com.br/wp-content/uploads/2010/06/Figura-12.jpg" rel="lightbox[376]"><img class="size-medium wp-image-388" title="Figura-12" src="http://www.edsongoncalves.com.br/wp-content/uploads/2010/06/Figura-12-300x239.jpg" alt="Figura 12 – Página ajaxjsf.xhtml no editor visual Web Page Editor" width="300" height="239" /></a><p class="wp-caption-text">Figura 12 – Página ajaxjsf.xhtml no editor visual Web Page Editor</p></div>
<p>Por fim, execute a página, já que o cursor e o foco estão nela, indo ao meu <strong>Run&gt; Run As&gt;Run on Server</strong>. Na caixa de diálogo, deixe o Tomcat como escolha para executar o projeto e clique no botão <strong>Next</strong>.</p>
<div id="attachment_389" class="wp-caption alignnone" style="width: 310px"><a href="http://www.edsongoncalves.com.br/wp-content/uploads/2010/06/Figura-13.jpg" rel="lightbox[376]"><img class="size-medium wp-image-389" title="Figura-13" src="http://www.edsongoncalves.com.br/wp-content/uploads/2010/06/Figura-13-300x299.jpg" alt="Figura 13 – Selecionando o servidor Java para executar o projeto" width="300" height="299" /></a><p class="wp-caption-text">Figura 13 – Selecionando o servidor Java para executar o projeto</p></div>
<p>Adicione em <strong>Configured </strong>o projeto e clique no botão <strong>Finish</strong>. Neste momento o Apache Tomcat iniciará, executando a página JSF contendo o AJAX.</p>
<p>O aplicativo é de simples compreensão, como o criado no exemplo com <a href="../2010/05/22/ajax-com-jsf-1-2-utilizando-jboss-richfaces/">JSF 1.2 e RichFaces</a>. O texto digitado no campo de texto, é enviado ao servidor sem que seja submetido por um botão. Transportado ao Managed Bean <strong>textoBean</strong>, representado pela classe <strong>Texto</strong>, o valor enviado é retornado ao label abaixo, em <strong>Resultado</strong>. Como estamos usando AJAX, o texto vai sendo digitado e enviado a cada nova letra para o servidor e retornada à página sem um reload no browser.</p>
<div id="attachment_391" class="wp-caption alignnone" style="width: 310px"><a href="http://www.edsongoncalves.com.br/wp-content/uploads/2010/06/Figura-14.jpg" rel="lightbox[376]"><img class="size-medium wp-image-391" title="Figura-14" src="http://www.edsongoncalves.com.br/wp-content/uploads/2010/06/Figura-14-300x122.jpg" alt="Figura 14 – A página executada" width="300" height="122" /></a><p class="wp-caption-text">Figura 14 – A página executada</p></div>
<p>Este envio ao servidor, sem reload na página, e o retorno é feito graças ao suporte ao AJAX do JSF 2.0, pela tag <strong>&lt;f:ajax /&gt;</strong>:</p>
<p>&lt;h:inputText id=<em>&#8220;texto&#8221;</em> value=<em>&#8220;#{textoBean.texto}&#8221;</em>&gt;</p>
<p><strong> </strong><strong>&lt;f:ajax event=<em>&#8220;keyup&#8221;</em> execute=<em>&#8220;form1:texto&#8221;</em> render=<em>&#8220;form1:resultado&#8221;</em>/&gt;</strong></p>
<p>&lt;/h:inputText&gt;</p>
<p>Esta tag trabalha com o evento JavaScript onkeyup (que no caso deve ser <strong>keyup</strong>), que chama o servidor e renderiza o resultado onde o atributo <strong>render</strong> estiver apontando. Observe que esta tag está dentro da tag JSF <strong>&lt;h:inputText/&gt;</strong>, que é exatamente onde ela trabalhará para receber o evento e se comunicar com o servidor, transmitindo as informações nela contidas.</p>
<p><strong>No próximo artigo </strong></p>
<p>No próximo artigo veremos uma biblioteca AJAX compatível com JSF 2.0 e alguns recursos interessantes que ela pode nos oferecer.</p>
<p>Até o próximo artigo pessoALL.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.edsongoncalves.com.br/2010/06/04/ajax-com-jsf-2-0/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>JavaServer Faces 2.0 na Prática &#8211; Parte 3</title>
		<link>http://www.edsongoncalves.com.br/2010/02/21/javaserver-faces-2-0-na-pratica-parte-3/</link>
		<comments>http://www.edsongoncalves.com.br/2010/02/21/javaserver-faces-2-0-na-pratica-parte-3/#comments</comments>
		<pubDate>Sun, 21 Feb 2010 06:55:32 +0000</pubDate>
		<dc:creator>Edson Gonçalves</dc:creator>
				<category><![CDATA[JSF 2.0]]></category>
		<category><![CDATA[Eclipse IDE]]></category>
		<category><![CDATA[Java EE 6]]></category>
		<category><![CDATA[JavaServer Faces]]></category>
		<category><![CDATA[NetBeans]]></category>

		<guid isPermaLink="false">http://www.edsongoncalves.com.br/?p=168</guid>
		<description><![CDATA[Olá, tudo bom? Como vão vocês? Este artigo é o terceiro de uma série ao qual vou ensiná-los a trabalhar com o JavaServer Faces 2.0. Nesta terceira parte iremos conhecer melhor o framework JavaServer Faces 2.0 e seu comportamento. Dúvidas e críticas são bem vindas. Conhecendo melhor o JavaServer Faces Como pudemos  ver, o framework [...]]]></description>
			<content:encoded><![CDATA[<p>Olá, tudo bom? Como vão vocês?</p>
<p>Este artigo é o terceiro de uma série ao qual vou ensiná-los a trabalhar com o JavaServer Faces 2.0.</p>
<p>Nesta terceira parte iremos conhecer melhor o framework JavaServer Faces 2.0 e seu comportamento.</p>
<p>Dúvidas e críticas são bem vindas.</p>
<h2>Conhecendo melhor o JavaServer Faces</h2>
<p>Como pudemos  ver, o framework JSF é responsável por interagir com o usuário (cliente). Porém, o escopo de JSF é restringido à camada de apresentação. A persistência de dados e outras conexões back-end estão fora do escopo de JSF.</p>
<p>Se você está começando agora, recomendo voltar até a <a href="../2010/01/18/javaserver-faces-2-0-na-pratica-parte-1/">Parte 1</a> para melhor compreender este artigo.</p>
<h3>Renderizando componentes</h3>
<p>Ao chamar uma página JSF no navegador, o servidor inicia uma chamada a árvore de componentes do JSF para renderizar a página de acordo com o encontrado.</p>
<p>O servlet JavaServer Faces inicializa o código do framework e lê a página <strong>index.xhtml</strong>. Como esta página contém tags JSF, como <strong>&lt;h:form /&gt;</strong>, <strong>&lt;h:inputText /&gt;</strong>, <strong>&lt;h:commandButton /&gt;</strong> e <strong>&lt;h:outputText /&gt;</strong>, cada uma possui uma classe <strong>tag handler</strong> associada. Quando a página é lida, as <strong>tags handles</strong> são executadas, de modo que cada uma colabora com a outra para construir o que chamamos de árvore de componentes. A <strong>Figura 1</strong> mostra as <strong>tag handlers</strong> dos componentes utilizados no exemplo criado na <a href="../2010/02/09/javaserver-faces-2-0-na-pratica-parte-2/">Parte 2</a> do conjunto de artigos.</p>
<div id="attachment_170" class="wp-caption alignnone" style="width: 310px"><a rel="attachment wp-att-170" href="http://www.edsongoncalves.com.br/wp-content/uploads/2010/02/Figura-11.jpg" rel="lightbox[168]"><img class="size-medium wp-image-170" title="Figura 1" src="http://www.edsongoncalves.com.br/wp-content/uploads/2010/02/Figura-11-300x135.jpg" alt="Figura 1 – Os componentes da aplicação de exemplo" width="300" height="135" /></a><p class="wp-caption-text">Figura 1 – Os componentes da aplicação de exemplo</p></div>
<p>Após ler cada componente, a página HTML é devolvida ao navegador, que a renderiza. Todo e qualquer texto que não for uma tag JSF será passado adiante, onde as demais que não forem serão convertidas em HTML.</p>
<p>O processo de devolver a página no formato HTML ao navegador é chamado de <strong>encoding</strong>. Se olhar o código HTML gerado, verá que o objeto <strong>UIInput</strong>, por exemplo, procura o ID (unique ID) e o seu valor atual da expressão <strong>#{meuManagedBean.texto}</strong>. Por padrão, as strings de atributos ID, do HTML, são adicionadas pelo framework, podendo ser aleatórias. Caso não houver um ID na tag <strong>&lt;h:form/&gt;</strong>, como no exemplo desenvolvido, poderemos ter um ID como <strong>j_idt17:texto</strong>:</p>
<p><strong> </strong><strong>&lt;input id=&#8221;j_idt17:texto&#8221; name=&#8221;j_idt17:texto&#8221; /&gt;</strong></p>
<p>Se houver um atributo ID na tag <strong>&lt;h:form/&gt; </strong>(ex: &lt;h:form <strong>id=&#8221;form1&#8243; /</strong>&gt;), você terá como resultado o ID <strong>form1:texto</strong> na renderização da página:</p>
<p><strong>&lt;input type=&#8221;text&#8221; /&gt;</strong></p>
<p>Se desejarmos retirar essa pré-definição de nome no atributo ID, basta adicionar seguinte atributo e seu valor na tag <strong>&lt;h:form/&gt;</strong>: <strong>prependId=&#8221;false&#8221;</strong>. O resultado tag <strong>&lt;h:form/&gt;</strong> completa ficaria assim:</p>
<p><strong>&lt;h:form prependId=&#8221;false&#8221;&gt;</strong></p>
<p>No <strong>encoding</strong>, o atributo ID gerado seria apenas o nome atribuído na tag pela propriedade <strong>id</strong>, como, por exemplo, na tag de entrada <strong>&lt;h:inputText id=&#8221;texto&#8221; /&gt;</strong>, onde a renderização HTML seria:</p>
<p><strong> </strong></p>
<p><strong>&lt;input type=&#8221;text&#8221; /&gt;</strong></p>
<p>Depois de ocorrer o <strong>encoding</strong>, elas são enviadas ao navegador que agora as reconhece como uma página HTML. A <strong>Figura 2</strong> ilustra esta transformação.</p>
<div id="attachment_171" class="wp-caption alignnone" style="width: 310px"><a rel="attachment wp-att-171" href="http://www.edsongoncalves.com.br/wp-content/uploads/2010/02/Figura-28.jpg" rel="lightbox[168]"><img class="size-medium wp-image-171" title="Figura 2" src="http://www.edsongoncalves.com.br/wp-content/uploads/2010/02/Figura-28-300x113.jpg" alt="Figura 2 – Codificação e decodificação das páginas JavaServer Faces" width="300" height="113" /></a><p class="wp-caption-text">Figura 2 – Codificação e decodificação das páginas JavaServer Faces</p></div>
<h3>Do navegador para o servidor</h3>
<p>Depois que o usuário receber a página, este a preenche como deve e submete o formulário ao servidor novamente. No caso do exemplo, o formulário é submetido pelo método HTTP POST, contendo o endereço da página e os dados do formulário.</p>
<p>Os dados no servidor são colocados em uma tabela hash, como ocorre normalmente em processamentos Servlet, que pode ser acessada por todos os componentes. O framework JSF permite que cada componente inspecione esta tabela em um processo chamado de <strong>decoding</strong>. Neste momento, cada componente decide como serão interpretados os dados do formulário.</p>
<p>O processo como um todo é chamado de <strong><a href="#LifeCicle">Ciclo de Vida</a></strong> e será visto mais adiante, ainda neste artigo.</p>
<h3>A arquitetura do JavaServer Faces</h3>
<p>Para melhor compreensão, a seguir teremos um resumo de como funcionam as páginas JavaServer Faces:</p>
<h4>A arquitetura Model-View-Controller</h4>
<p>JSF conecta a apresentação e o modelo. Como vimos, um componente de apresentação pode ser unido a uma propriedade do Managed Bean de um objeto modelo:</p>
<p><strong>&lt;h:outputText value=&#8221;#{meuManagedBean.texto}&#8221;/&gt;</strong></p>
<p>O JSF opera como o controlador que reage ao usuário processando a ação e os eventos de alteração de valores, enquanto dirige o código para atualizar o modelo ou a apresentação. A invocação ao controlador ocorre através do componente <strong>&lt;h:commandButton /&gt;</strong>.</p>
<p>Quando o botão é clicado e o formulário é enviado (submetido) ao servidor, a implementação JSF invoca o método para checar o bean do usuário. O componente <strong>&lt;h:commandButton /&gt;</strong> pode possuir um método que entra em ação para atualizar o modelo e devolver para a navegação o ID da próxima página a ser exibida.</p>
<h4>Validações e Conversão de dados</h4>
<p>Usuários entram com os dados em um formulário Web com um formato de texto. Podemos validar de forma padrão ou personalizada como serão aceitos estes textos (dados). Estas validações, assim como suas conversões, são feitas pelo conjunto de tags JSF Core, que incluímos da seguinte forma:</p>
<pre class="brush:xml">&lt;html xmlns="http://www.w3.org/1999/xhtml"

xmlns:h="http://java.sun.com/jsf/html"

xmlns:f="http://java.sun.com/jsf/core"&gt;</pre>
<p>A biblioteca de tags Core pode ser incluída também em uma página JSP da seguinte forma:</p>
<p><strong>&lt;%@ taglib uri=&#8221;http://java.sun.com/jsf/core&#8221; prefix=&#8221;f&#8221;%&gt;</strong></p>
<p>Para validar, por exemplo, o tamanho mínimo de caracteres aceitos, podemos fazer da seguinte forma:</p>
<pre class="brush:html">&lt;h:inputText id="texto" value="#{meuManagedBean.texto}"&gt;

&lt;f:validateLength minimum="3" /&gt;

&lt;/h:inputText&gt;</pre>
<p>Também podemos validar se um campo é obrigatório ou não, utilizando <strong>required=&#8221;true&#8221;</strong>:</p>
<p><strong>&lt;h:inputText value=&#8221;#{meuManagedBean.texto}&#8221; required=&#8221;true&#8221; &gt;</strong></p>
<p>Objetos de negócios também requerem informações como números, datas ou outros tipos de dados. Com JavaServer Faces podemos definir com as tags Core como serão os dados aceitos em um determinado campo, convertendo-os ou até mesmo personalizar a regra de conversão.</p>
<p>Um exemplo simples seria utilizar o <strong>&lt;f:convertDateTime /&gt;</strong>, que faz com que o campo de entrada seja apenas um tipo de data e hora com o formato definido, que pode ser acrescido ao seu código da seguinte forma:</p>
<pre class="brush:html">&lt;h:inputText id="texto" value="#{meuManagedBean.texto}"&gt;

&lt;f:convertDateTime pattern="dd/MM/yyyy" /&gt;

&lt;/h:inputText&gt;</pre>
<h4>Manipulação de erros</h4>
<p>O JSF utiliza regras de validação para campos como <em>&#8220;este campo é obrigatório&#8221;</em>. Claro que, quando os usuários entrarem com dados inválidos, preciamos exibir mensagens de erros mais apropriadas.</p>
<p>Os erros, tanto de validação, como de conversão, são tratados da mesma forma: uma mensagem é adicionada ao componente que não passou na verificação (seja validação ou conversão), onde a página atual é novamente exibida contendo uma frase do problema ocorrido.</p>
<p>As tags utilizadas para tais representações são: <strong>&lt;h:message /&gt; </strong>e <strong>&lt;h:messages /&gt;</strong>. Os erros também podem ser lançados de forma personalizada utilizando o atributo <strong>validatorMessage</strong> ou <strong>requiredMessage</strong>. Para o exemplo, poderíamos ter algo assim:</p>
<pre class="brush:html">&lt;h:inputText

value="#{meuManagedBean.texto}"

required="true"

validatorMessage="Mínimo de 3 caracteres"

requiredMessage="Campo obrigatório"&gt;

&lt;f:validateLength minimum="3" /&gt;

&lt;/h:inputText&gt;

&lt;h:messages /&gt;</pre>
<h4>Internacionalização</h4>
<p>JSF fornece suporte à internacionalização como codificações de caractere e a seleção de pacotes de recursos.</p>
<p>A internacionalização no JSF 2.0 é possível de duas formas: <strong>faces-config.xml</strong> e a tag Core <strong>&lt;f:loadBundle /&gt;</strong>.</p>
<p>Para uma internacionalização com o arquivo <strong>faces-config.xml</strong>, devemos adicionar este arquivo dentro do diretório <strong>WEB-INF</strong>. O conteúdo é mostrado na <strong>Listagem 1</strong>.</p>
<p><strong>Listagem 1 – O arquivo faces-config.xml</strong></p>
<pre class="brush:xml">&lt;?xml version="1.0" encoding="UTF-8"?&gt;

&lt;faces-config xmlns="http://java.sun.com/xml/ns/javaee"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://java.sun.com/xml/ns/javaee

http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd"

version="2.0"&gt;

&lt;application&gt;

&lt;resource-bundle&gt;

&lt;base-name&gt;br.com.integrator.rotulos&lt;/base-name&gt;

&lt;var&gt;rotulo&lt;/var&gt;

&lt;/resource-bundle&gt;

&lt;locale-config&gt;

&lt;default-locale&gt;pt&lt;/default-locale&gt;

&lt;supported-locale&gt;en&lt;/supported-locale&gt;

&lt;/locale-config&gt;

&lt;/application&gt;

&lt;/faces-config&gt;</pre>
<p>O arquivo <strong>faces-config.xml</strong> é usado no JSF 2.0 principalmente para numerosas configurações globais de sua aplicação.</p>
<p>Os rótulos neste caso são colocados em arquivos <strong>.properties</strong>, onde o nome de cada arquivo possui _ABREVIAÇÃO DO IDIOMA como, por exemplo: <strong>rotulos_pt.properties</strong>. Crie os arquivos mostrados nas <strong>Listagens 2</strong> e <strong>3</strong> dentro do pacote <strong>br.com.integrator</strong>.</p>
<p><strong>Listagem 2 – O arquivo rotulos_en.properties</strong></p>
<pre class="brush:text">texto = Text:

enviar = Submit Text

obrigatorio = Required Field

validacao = Minimum 3 characters

titulo = One simple JSF Page</pre>
<p><strong>Listagem 3 – O arquivo rotulos_pt.properties</strong></p>
<pre class="brush:text">texto = Texto:

enviar = Enviar Texto

obrigatorio = Campo Obrigatório

validacao = Mínimo de 3 caracteres

titulo = Uma simples página JSF</pre>
<p>Para compreender como ficará seu projeto, a <strong>Figura 3</strong> mostra onde estará cada um dos arquivos que o compõem.</p>
<div id="attachment_173" class="wp-caption alignnone" style="width: 213px"><a rel="attachment wp-att-173" href="http://www.edsongoncalves.com.br/wp-content/uploads/2010/02/Figura-35.jpg" rel="lightbox[168]"><img class="size-medium wp-image-173" title="Figura 3" src="http://www.edsongoncalves.com.br/wp-content/uploads/2010/02/Figura-35-203x300.jpg" alt="Figura 3 – Estrutura de diretórios do projeto" width="203" height="300" /></a><p class="wp-caption-text">Figura 3 – Estrutura de diretórios do projeto</p></div>
<p>As alterações na página <strong>index.xhtml</strong> são mostradas na <strong>Listagem 4</strong> a seguir.</p>
<p><strong>Listagem 4 – Alterações na página index.xhtml</strong></p>
<pre class="brush:xhtml">...

&lt;h:head&gt;

&lt;title&gt;&lt;h:outputText value="#{rotulo.titulo}" /&gt;&lt;/title&gt;

&lt;/h:head&gt;

&lt;h:body&gt;

&lt;h:form&gt;

&lt;h:outputText value="#{rotulo.texto}" /&gt;

&lt;h:inputText id="texto"

value="#{meuManagedBean.texto}"

required="true"

validatorMessage="#{rotulo.validacao}"

requiredMessage="#{rotulo.obrigatorio}"&gt;

&lt;f:validateLength minimum="3" /&gt;

&lt;/h:inputText&gt;

&lt;h:messages /&gt;

&lt;br /&gt;

&lt;h:commandButton value="#{rotulo.enviar}" action="enviar" /&gt;

&lt;br /&gt;

&lt;h3&gt;&lt;h:outputText value="#{meuManagedBean.texto}" /&gt;&lt;/h3&gt;

&lt;/h:form&gt;

&lt;/h:body&gt;

...</pre>
<p>Para visualizar as alterações, será necessário trocar o idioma padrão do seu navegador. No Mozilla Firefox, por exemplo, basta ir em <strong>Ferramentas&gt;Opções&gt;Conteúdo&gt;Idiomas</strong> e clicar no botão <strong>Selecionar</strong>. Coloque o idioma diferente do que está usando como primeiro na ordem da lista de idiomas de preferência e confirme tudo. Dê um reload na página que verá as alterações.</p>
<p>Caso não queira usar uma declaração global dos recursos de localidades, podemos adicionar a tag <strong>&lt;f:loadBundle  /&gt;</strong> em cada página JSF. A seguir o trecho que poderá substituir a configuração global no arquivo <strong>faces-config.xml</strong>.</p>
<pre class="brush:xml">&lt;f:loadBundle

basename="br.com.integrator.rotulos"

var="rotulo /&gt;</pre>
<p><strong>Nota:</strong> Das duas formas apresentadas para internacionalização de uma aplicação Web com o framework JSF, a versão com o elemento <strong>&lt;resource-bundle /&gt;</strong>, encontrado no arquivo <strong>faces-config.xml</strong>, é a mais eficiente, pois é utilizado em todo o aplicativo e não somente na página configurada.</p>
<h4>Componentes customizados</h4>
<p>O desenvolvedor de componentes pode criar componentes sofisticados que são chamados pelos designers simplesmente colocando suas tags em suas páginas, ou arrastando-as caso sejam visuais. Um exemplo é pegar bibliotecas criadas, como de calendários, gráficos ou de upload de arquivos com barra de progresso e simplesmente adicionar na página desenvolvida.</p>
<p>Desde o JavaServer Faces 2.0, criar componentes customizados ficou mais fácil, com um recurso chamado de <strong>Composite Components</strong> (Componentes Compostos). Para exemplificar como funcionam os recursos de Composite Components, altere como nos passos a seguir seu projeto:</p>
<ol>
<li>Crie      um diretório chamado de <strong>resources</strong>,      no mesmo diretório onde se encontra a página <strong>index.xhtml</strong>.</li>
<li>Dentro      do diretório <strong>resources</strong>,      adicione outro diretório chamado de <strong>componente</strong>.</li>
<li>No      diretório <strong>componente</strong>, crie uma      página <strong>XHTML</strong>, chamada de <strong>component.xhtml</strong>,  com o conteúdo mostrado na <strong>Listagem 5</strong>.</li>
</ol>
<p><strong>Listagem 5 – Conteúdo do arquivo component.xhtml</strong></p>
<pre class="brush:xhtml">&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"

"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;

&lt;html xmlns="http://www.w3.org/1999/xhtml"

xmlns:h="http://java.sun.com/jsf/html"

xmlns:f="http://java.sun.com/jsf/core"

xmlns:composite="http://java.sun.com/jsf/composite"&gt;

&lt;h:head&gt;

&lt;title&gt;Meu Primeiro Componente JSF 2.0&lt;/title&gt;

&lt;/h:head&gt;

&lt;h:body&gt;

&lt;composite:interface&gt;

&lt;composite:attribute name="identificacao" required="true"/&gt;

&lt;composite:attribute name="managedbean" required="true"/&gt;

&lt;composite:attribute name="qtdcaracteres" required="true"/&gt;

&lt;/composite:interface&gt;

&lt;composite:implementation&gt;

&lt;h:outputText value="#{rotulo.texto}" /&gt;

&lt;h:inputText id="#{cc.attrs.identificacao}"

value="#{cc.attrs.managedbean}"

required="true"

validatorMessage="#{rotulo.validacao}"

requiredMessage="#{rotulo.obrigatorio}"&gt;

&lt;f:validateLength minimum="#{cc.attrs.qtdcaracteres}" /&gt;

&lt;/h:inputText&gt;

&lt;h:messages /&gt;

&lt;br /&gt;

&lt;h:commandButton value="#{rotulo.enviar}" /&gt;

&lt;br /&gt;

&lt;h3&gt;&lt;h:outputText value="#{cc.attrs.managedbean}" /&gt;&lt;/h3&gt;

&lt;/composite:implementation&gt;

&lt;/h:body&gt;

&lt;/html&gt;</pre>
<p>Uma página de componente(s) no JSF 2.0 pode conter suporte aos componentes do JSF, a validação, converters e listeners. Além disso, qualquer outra tag HTML pode ser adicionada ao componente, incluindo também recursos de templates.</p>
<p>As tags utilizadas para criar <em>componentes compostos</em> no exemplo são: <strong>&lt;composite:interface/&gt;</strong> e <strong>&lt;composite:implementation/&gt;</strong>. Para utilizá-las, é necessário adicionar o seguinte namespace:</p>
<p>&lt;html <strong>xmlns:composite=&#8221;http://java.sun.com/jsf/composite&#8221;</strong>&gt;</p>
<p>A tag<strong> &lt;composite:interface/&gt;</strong> declara o contrato para um componente, ou seja, definimos quais são os atributos que o componente receberá. Os atributos são definidos dentro desta tag, com a tag <strong>&lt;composite:attribute /&gt;</strong>, onde temos os atributos <strong>name</strong> e <strong>required</strong>. Em <strong>name</strong> colocamos o nome do atributo do nosso componente composto e definindo <strong>true</strong>, em <strong>required</strong>, definimos o atributo como de preenchimento obrigatório.</p>
<p>O exemplo mostrado possui um componente que terá os seguintes atributos obrigatórios, em ordem definidos na interface: <strong>identificacao</strong>, <strong>managedbean</strong> e<strong> qtdcaracteres</strong>.</p>
<p>A tag <strong>&lt;composite:implementation/&gt;</strong> é onde definimos o conteúdo do componente composto. Onde definir <strong>#{cc.attrs.x}</strong>, sendo que “<strong>x</strong>” é o nome do atributo do seu componente, será o local de substituição quando preencher o componente na página que o utilizar.</p>
<p>Para utilizar este componente, vá à página <strong>index.xhtml</strong> e altere seu conteúdo conforme a <strong>Listagem 6</strong> a seguir:</p>
<p><strong>Listagem 6– A página index.xhtml</strong></p>
<pre class="brush:xhtml">&lt;?xml version="1.0" encoding="ISO-8859-1" ?&gt;

&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"

"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;

&lt;html xmlns="http://www.w3.org/1999/xhtml"

xmlns:h="http://java.sun.com/jsf/html"

xmlns:f="http://java.sun.com/jsf/core"

xmlns: comp="http://java.sun.com/jsf/composite/componente"&gt;

&lt;h:head&gt;

&lt;title&gt;&lt;h:outputText value="#{rotulo.titulo}" /&gt;&lt;/title&gt;

&lt;/h:head&gt;

&lt;h:body&gt;

&lt;h:form&gt;

&lt;comp:component

identificacao="texto"

managedbean="#{meuManagedBean.texto}"

qtdcaracteres="3" /&gt;

&lt;/h:form&gt;

&lt;/h:body&gt;

&lt;/html&gt;</pre>
<p>Para utilizar o componente criado, você adiciona o seguinte namespace em sua página:</p>
<p><strong>xmlns: comp=&#8221;http://java.sun.com/jsf/composite/componente</strong>&#8221;</p>
<p>Observe que <strong>componente</strong>, no <strong>namespace</strong>, é o nome do diretório onde se encontra seu componente composto (o diretório fica dentro de <strong>resources</strong> caso não se lembre). O nome <strong>comp</strong> é dado por nós para chamar o componente. Podemos ter inúmeros componentes dentro de um diretório, assim como vários diretórios dentro de <strong>resources</strong>. Os agrupamos como acharmos melhor, de acordo com o conveniente no desenvolvimento de nossos aplicativos.</p>
<p>Para utilizar o componente, o chamamos assim: <strong>&lt;comp:component/&gt;</strong>. Onde <strong>component</strong> é o nome do arquivo <strong>.xhtml</strong> criado. Os atributos deste componente podem ser vários e os definidos como obrigatórios precisam ser preenchidos para que não ocorram erros.</p>
<div id="attachment_174" class="wp-caption alignnone" style="width: 310px"><a rel="attachment wp-att-174" href="http://www.edsongoncalves.com.br/wp-content/uploads/2010/02/Figura-41.jpg" rel="lightbox[168]"><img class="size-medium wp-image-174" title="Figura 4" src="http://www.edsongoncalves.com.br/wp-content/uploads/2010/02/Figura-41-300x162.jpg" alt="Figura 4 – Da criação do componente até sua utilização e renderização na página" width="300" height="162" /></a><p class="wp-caption-text">Figura 4 – Da criação do componente até sua utilização e renderização na página</p></div>
<h3>Renderizadores Alternativos</h3>
<p>Por padrão, JSF produz HTML em sua saída, mas é extensível o suficiente para produzir outros tipos de saídas como, por exemplo, WML ou XUL.</p>
<h4>Ajax</h4>
<p>JavaServer Faces possui atualmente uma comunicação Ajax padrão que torna-se totalmente transparente as chamadas cliente-servidor sem a necessidade de reload na página.</p>
<p>Para conhecer rapidamente o Ajax no JavaServer Faces 2.0, altere a página <strong>index.xhtml</strong> como mostrado na <strong>Listagem 7</strong>.</p>
<p><strong>Listagem 7 – Alterações na página index.xhtml</strong></p>
<pre class="brush:xhtml">...

&lt;h:form&gt;

&lt;h:outputScript name="jsf.js" library="javax.faces" target="head"/&gt;

&lt;h:outputText value="#{rotulo.texto}" /&gt;

&lt;h:inputText id="texto" value="#{meuManagedBean.texto}"/&gt;

&lt;br /&gt;

&lt;h:commandButton id="enviar" value="#{rotulo.enviar}"&gt;

&lt;f:ajax execute="form1:texto" render="form1:saida"/&gt;

&lt;/h:commandButton&gt;

&lt;br /&gt;

&lt;h3&gt;

&lt;h:outputText id="saida" value="#{meuManagedBean.texto}" /&gt;

&lt;/h3&gt;

&lt;/h:form&gt;

...</pre>
<p>Com algumas pequenas mudanças, sua aplicação passou a utilizar o recurso de Ajax.</p>
<p>O JSF 2.0 possui uma nova API JavaScript, ao qual pode chamar o servidor, enviando e recebendo dados. Nesta API JavaScript, temos o seguinte método:</p>
<p><strong>jsf.ajax.request(source, event, options)</strong></p>
<p>Este método envia e recebe os dados do servidor de forma assíncrona diretamente para os componentes da view. Você pode vê-lo no HTML renderizado.</p>
<p>A tag <strong>&lt;f:ajax /&gt;</strong> que utilizamos no exemplo pode ser substituída pela chamada direta à  <strong>jsf.ajax.request() </strong>da seguinte forma:</p>
<p><strong>&lt;h:commandButton value=&#8221;#{rotulo.enviar}&#8221;</strong></p>
<p><strong> onclick=&#8221;jsf.ajax.request(this, event, </strong></p>
<p><strong> {execute: &#8216;form1:texto&#8217;, render: &#8216;form1:saida&#8217;}); return false;&#8221; /&gt;</strong></p>
<p>Em ambos os casos, seja com a tag <strong>&lt;f:Ajax/&gt;</strong> ou pelo script adicionado na tag, na renderização, o método recebe o elemento que está disparando a ação , que no geral é o próprio que o chama (<strong>this</strong>), o evento e um conjunto de parâmetros.</p>
<p>Neste conjunto de parâmetros existem duas propriedades: <strong>execute</strong> e <strong>render</strong>. Tanto o <strong>execute</strong>, como o <strong>render</strong>, recebem os IDs dos elementos HTML renderizados no cliente, ou seja, o ID dos componentes que passaram pelo <strong>encoding</strong>. O <strong>execute</strong> define o componente que será submetido ao servidor via Ajax e <strong>render</strong> qual componente receberá a resposta.</p>
<p>O Ajax padrão de JSF 2.0 é obtido pela tag <strong>&lt;h:outputScript /&gt;</strong>. Esta tag, configurada como no exemplo, renderiza a tag HTML <strong>&lt;script/&gt;</strong>, que trás um JavaScript existente na biblioteca JSF 2.0. Os três atributos usados no exemplo são:</p>
<ul>
<li><strong>name</strong> – O nome do arquivo externo de JavaScript que, no caso,      pertence a própria biblioteca de JSF 2.0;</li>
<li><strong>library</strong> – A biblioteca usada;</li>
<li><strong>target</strong> -  Onde será      renderizada a tag &lt;script/&gt;, que no caso será por entre as tags      &lt;head/&gt;, sempre no HTML.</li>
</ul>
<p><strong>Nota:</strong> O JavaScript contido no JSF 2.0 em questão está dentro do JAR <strong>jsf-impl.jar</strong>, em <strong>META-INF/resources/javax.faces/jsf.js</strong>. Veja mais a respeito sobre o JavaScript padrão de JSF 2.0 no seguinte link: <strong>https://javaserverfaces.dev.java.net/nonav/docs/2.0/jsdocs/index.html</strong>.</p>
<h3>O MVC de JSF</h3>
<p>Para que JSF funcione, registramos a classe FacesServlet no deployment descriptor (web.xml). Ao fazer este registro, os pedidos são controlados pela classe <strong>javax.faces.webapp.FacesServlet</strong> (o Controller do MVC), uma implementação de <strong>javax.servlet.Servlet</strong>, roteando o tráfego e administrando o ciclo de vida dos beans e componentes de interface do usuário (UI).</p>
<div id="attachment_175" class="wp-caption alignnone" style="width: 310px"><a rel="attachment wp-att-175" href="http://www.edsongoncalves.com.br/wp-content/uploads/2010/02/Figura-51.jpg" rel="lightbox[168]"><img class="size-medium wp-image-175" title="Figura 5" src="http://www.edsongoncalves.com.br/wp-content/uploads/2010/02/Figura-51-300x119.jpg" alt="Figura 5 – O MVC do framework JSF" width="300" height="119" /></a><p class="wp-caption-text">Figura 5 – O MVC do framework JSF</p></div>
<p>Os componentes UI são organizados em uma estrutura de árvore onde, cada componente, pode ser associado com os métodos e atributos de um bean. Cada componente também pode ser associado com uma função de validação ou classe.</p>
<p>Por trás, FacesServlet aceita pedidos de entrada e controla o objeto <strong>javax.faces.lifecycle.Lifecycle</strong>. Usando uma <em>factory</em>, ela cria um objeto do tipo <strong>javax.faces.context.FacesContext</strong>, que contém todos os processos.</p>
<h3><a name="LifeCicle"></a>O ciclo de vida do JSF</h3>
<p>O objeto <strong>Lifecycle </strong> usa o objeto <strong>FacesContext</strong> em seis fases que compõem o ciclo de vida de uma aplicação JSF. Cada fase tem uma ação importante em sua aplicação e deve ser bem compreendida para que você possa manipular ao extremo sua interface e melhorar a legibilidade de seu desenvolvimento.</p>
<div id="attachment_176" class="wp-caption alignnone" style="width: 310px"><a rel="attachment wp-att-176" href="http://www.edsongoncalves.com.br/wp-content/uploads/2010/02/Figura-6.jpg" rel="lightbox[168]"><img class="size-medium wp-image-176" title="Figura 6" src="http://www.edsongoncalves.com.br/wp-content/uploads/2010/02/Figura-6-300x124.jpg" alt="Figura 6 – Ciclo de vida do JavaServer Faces" width="300" height="124" /></a><p class="wp-caption-text">Figura 6 – Ciclo de vida do JavaServer Faces</p></div>
<p>As seis fases são executadas na seguinte ordem:</p>
<ol>
<li><strong>Restaurar Apresentação</strong><sup> <a name="_ednref1"></a><a href="#_edn1">[1]</a></sup>–      Esta fase inicia o processamento da requisição do ciclo de vida por meio      da construção da árvore de componentes do JSF. Cada árvore de componentes      possui um identificador único durante todo o aplicativo. O JSF constrói a      apresentação da página e salva  na instância      FacesContext para processamento das fases seguintes.</li>
<li><strong>Aplicar Valores Requisitados</strong> –      Nesta fase, quaisquer novos valores inseridos são extraídos e armazenados      por seus apropriados componentes. Se o valor do componente não for uma      String, então ele é convertido para o seu determinado tipo. Se a conversão      falhar, ocorrem diversas situações:</li>
</ol>
<ol>
<li><strong>1. </strong>Uma mensagem de erro é gerada e associada com o componente;</li>
<li><strong>2. </strong>Uma mensagem de erro é armazenada no <strong>FacesContext</strong> e depois mostrada posteriormente na fase de <strong>Renderizar a Resposta</strong>;</li>
<li><strong>3. </strong> O ciclo de vida pula a fase de <strong>Renderizar a Resposta</strong> quando esta se completou.</li>
</ol>
<ol>
<li><strong>Processar Validações</strong> – Depois do      valor de cada componente ser atualizado, na fase de processo de validações,      os componentes serão validados naqueles valores, se necessário. Um      componente que necessita de validação deve fornecer a implementação da      lógica de validação. Por exemplo, em um carrinho de compras, podemos      determinar a quantidade mínima a ser digitada e máxima. O valor      requisitado é um inteiro (verificado na fase anterior) e, como passou pela      fase 2, nessa fase pode ser barrado por estar além do determinado (com uma      quantidade mínima ou máxima diferente da estipulada).</li>
<li><strong>Atualizar Valores do Modelo</strong> –      Alcança-se essa fase após todos os componentes serem validados. Nesta fase      são atualizados os dados do modelo do aplicativo. Na página em que foi      criada para enviar um texto, a informação digitada foi armazenada no      Managed Bean durante esta fase. Por ter passado pelo processo de      validação, temos garantias que o valor armazenado  será garantido nessa fase. Entretanto,      os dados podem violar a lógica de negócios, ao qual a validação ocorre na      fase seguinte.</li>
<li><strong>Invocar Aplicação</strong> – Durante esta      fase, a implementação JSF manipula quaisquer eventos do aplicativo, tal      como enviar um formulário ou ir a outra página através de um link. Estes      eventos são ações que retornam geralmente uma  string que está associada a uma navegação      no qual se encarrega de chamar a página determinada.</li>
<li><strong>Renderizar Resposta</strong> – Esta é a      fase final, ao qual é renderizada a página. Se este é um pedido inicial      para esta página,  os componentes      são acrescentados à apresentação neste momento. Se este é um postback,  os componentes já foram acrescidos à      apresentação.  Se há mensagens de      conversão ou erros de validação e a página contém um ou mais componentes <strong>&lt;mensage /&gt; </strong>ou um componente      <strong>&lt;messages /&gt;</strong>, estes serão      exibidos.  Reciprocamente, se a página      não contém um componente de mensagem,       nenhuma informação aparecerá.</li>
</ol>
<p>Numa requisição a uma página JSF, podemos passar por todas essas fases ou por nenhuma, dependendo do tipo de pedido, de erros que ocorrem durante as validações, conversões e do tipo de resposta.</p>
<p>Uma requisição e uma resposta são consideradas <strong>faces request/response </strong>se contiverem tags JSF, assim como as que não as contém são chamadas de <strong>non-faces request/response</strong>. Uma <strong>non-faces request </strong>pode vir de um clique em um link, por exemplo.</p>
<p>Como já dito, toda requisição é recebida pelo <strong>FacesServlet </strong>e prossegue a passagem pelas fases (<strong>Lifecycle</strong>) até uma resposta ser retornada ao cliente.</p>
<p>O <strong>FacesServlet </strong>recupera uma instância de <strong>FacesContext</strong>,<strong> </strong>do <strong>FacesContextFactory</strong>, fornecendo uma implementação de <strong>LifeCycle</strong>. O processamento do ciclo de vida é então delegado a interface <strong>LifeCycle</strong>, a partir da chamada ao método <strong>execute</strong>. A implementação de <strong>LifeCycle</strong> inicia as fases do ciclo de vida. Se existir algum validador associado a algum campo do formulário este é inicializado nessa primeira fase. A árvore é armazenada pelo contexto e será utilizada nas fases seguintes. Também o estado do formulário é salvo automaticamente.</p>
<h3>Testando o ciclo de vida</h3>
<p>Para confirmar como todas as fases do ciclo de vida são usadas e quais são, basta criar um simples <strong>PhaseListener</strong> e mandá-lo gerar a saída antes e depois de cada fase.</p>
<h4>Criando uma classe Phase Listener</h4>
<p>Criar uma classe que implemente a PhaseListener exigem dois passos:</p>
<p>• Criar uma classe que implemente PhaseListener;</p>
<p>• Registrar esta classe no arquivo de configurações do JSF.</p>
<p>A classe <strong>PhaseListener</strong> deve implementa a classe <strong>javax.faces.event.PhaseListener</strong>.  A <strong>Listagem 8</strong> demonstra como criar esta classe:</p>
<p><strong>Listagem 8 – A classe PhaseListener</strong></p>
<pre class="brush:java">package br.com.integrator.listener;

public class PhaseListener implements javax.faces.event.PhaseListener {

public void afterPhase(PhaseEvent event) {

event.getFacesContext().getExternalContext().

log("AFTER: "+event.getPhaseId());

}

public void beforePhase(PhaseEvent event) {

event.getFacesContext().getExternalContext().

log("BEFORE: "+event.getPhaseId());

}

public PhaseId getPhaseId() {

return PhaseId.ANY_PHASE;

}

}</pre>
<p>Para a classe da <strong>Listagem 8</strong>, três métodos são implementados: <strong>afterPhase()</strong>, <strong>beforePhase()</strong> e <strong>getPhaseId()</strong>.</p>
<p>Os dois primeiros,  <strong>afterPhase()</strong> e  <strong>beforePhase()</strong>, definem o que ocorre <strong>ANTES</strong> e <strong>DEPOIS</strong> de cada fase.  Nestes métodos foram incluídos a capacidade de imprimir na saída console o que ocorreu.</p>
<p>O terceiro método, <strong>getPhaseId()</strong>, especifica  em  qual das fases é invocado este ouvinte (<strong>Listener</strong>) e <strong>PhaseId.ANY_PHASE </strong> menciona que será para todas as fases.</p>
<p>Com a classe criada, o próximo passo é registrar esta classe PhaseListener no arquivo de configurações do JSF (<strong>faces-config.xml</strong>).</p>
<p>Para fazer isso, no arquivo <strong>faces-config.xml</strong>,  adicionaremos os seguintes elementos do trecho a seguir:</p>
<pre class="brush:xml">&lt;faces-config ...&gt;

...

&lt;lifecycle&gt;

&lt;phase-listener&gt;

br.com.integrator.listener.PhaseListener

&lt;/phase-listener&gt;

&lt;/lifecycle&gt;

&lt;/faces-config&gt;</pre>
<p>Ao rodar a aplicação, haverá saídas no console de acordo com o uso da aplicação. A <strong>Figura 7</strong> mostra tanto o uso da aplicação como sua saída no console, passando pelas seis fases do ciclo de vida.</p>
<div id="attachment_177" class="wp-caption alignnone" style="width: 310px"><a rel="attachment wp-att-177" href="http://www.edsongoncalves.com.br/wp-content/uploads/2010/02/Figura-7.jpg" rel="lightbox[168]"><img class="size-medium wp-image-177" title="Figura 7" src="http://www.edsongoncalves.com.br/wp-content/uploads/2010/02/Figura-7-300x153.jpg" alt="Figura 7- Execução do exemplo e saída no Console resultante da classe PhaseListener" width="300" height="153" /></a><p class="wp-caption-text">Figura 7- Execução do exemplo e saída no Console resultante da classe PhaseListener</p></div>
<p>Podemos testar o comportamento das fases enviando o formulário sem dados preenchidos ou preenchendo erroneamente. É uma forma de analisar de perto o ciclo de vida do framework JavaServer Faces.</p>
<hr size="1" /><a name="_edn1"></a><a href="#_ednref1">[1]</a> Defino aqui como Apresentação a tradução para View, que se refere ao Model-View-Controller, no qual traduzo como Modelo-Apesentação-Controle. Entretanto, a especificação JSF define como View o nome para uma página JSF. No decorrer dos artigos, sempre que me referir a View, estarei tratando da página JSF e não da palavra existente em MVC.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.edsongoncalves.com.br/2010/02/21/javaserver-faces-2-0-na-pratica-parte-3/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>JavaServer Faces 2.0 na Prática &#8211; Parte 2</title>
		<link>http://www.edsongoncalves.com.br/2010/02/09/javaserver-faces-2-0-na-pratica-parte-2/</link>
		<comments>http://www.edsongoncalves.com.br/2010/02/09/javaserver-faces-2-0-na-pratica-parte-2/#comments</comments>
		<pubDate>Tue, 09 Feb 2010 22:05:33 +0000</pubDate>
		<dc:creator>Edson Gonçalves</dc:creator>
				<category><![CDATA[JSF 2.0]]></category>
		<category><![CDATA[GlassFish]]></category>
		<category><![CDATA[Java EE 6]]></category>
		<category><![CDATA[JavaServer Faces]]></category>
		<category><![CDATA[NetBeans]]></category>

		<guid isPermaLink="false">http://www.edsongoncalves.com.br/?p=128</guid>
		<description><![CDATA[Olá, tudo bom? Como vão vocês? Este artigo é o segundo de uma série ao qual vou ensiná-los a trabalhar com o JavaServer Faces 2.0. Nesta segunda parte iremos conhecer e utilizar um Managed Beans. Dúvidas e críticas são bem vindas. Conhecendo o comportamento do  JavaServer Faces Agora que já fizemos nossa primeira aplicação em [...]]]></description>
			<content:encoded><![CDATA[<p>Olá, tudo bom? Como vão vocês?<br />
Este artigo é o segundo de uma série ao qual vou ensiná-los a trabalhar com o JavaServer Faces 2.0.<br />
Nesta segunda parte iremos conhecer e utilizar um Managed Beans.<br />
Dúvidas e críticas são bem vindas.</p>
<h2><strong>Conhecendo o comportamento do  JavaServer Faces</strong></h2>
<p>Agora que já fizemos nossa <a href="http://www.edsongoncalves.com.br/2010/01/18/javaserver-faces-2-0-na-pratica-parte-1/">primeira aplicação em JSF</a>, é mais fácil de entender os serviços que o framework JSF oferece ao desenvolvedor.  Como pudemos ver, o framework JSF é responsável por interagir com o usuário (cliente) e fornece componentes para criar uma apresentação visual de uma aplicação Web, ou seja, o escopo de JSF é restringido à camada de apresentação. A persistência de banco de dados e outras conexões de back-end estão fora do escopo de JSF.</p>
<p>A arquitetura do JavaServer Faces, em um alto nível, se assemelha ao mostrado na <strong>Figura 1</strong>. Aplicações JSF utilizam como padrão a interceptação HTTP via Servlet Faces e produz HTML. Esta mesma arquitetura permite “plugar” novos elementos, gerando outras características, possibilitando criar páginas usando eventos, listeners e componentes como o seu irmão Java Swing.</p>
<div id="attachment_129" class="wp-caption alignnone" style="width: 310px"><a rel="attachment wp-att-129" href="http://www.edsongoncalves.com.br/wp-content/uploads/2010/02/Figura-1.jpg" rel="lightbox[128]"><img class="size-medium wp-image-129" title="Figura 1" src="http://www.edsongoncalves.com.br/wp-content/uploads/2010/02/Figura-1-300x245.jpg" alt="A arquitetura JavaServer Faces" width="300" height="245" /></a><p class="wp-caption-text">Figura 1. A arquitetura JavaServer Faces</p></div>
<p>A <strong>Figura 1</strong> mostra a arquitetura rica e flexível existente no JSF, onde:</p>
<ul>
<li><strong>FacesServlet</strong> &#8211; é o servlet principal para a aplicação e,      opcionalmente, você pode ter o arquivo de configuração <strong>faces-config.xml<a href="#_ftn1"><sup><strong><sup>[1]</sup></strong></sup></a></strong>.</li>
<li><strong>Renderers</strong> -  são os      responsáveis por exibir um componente e traduzir uma entrada de valor      realizada por um usuário em componente.</li>
<li><strong>Páginas XHTML, JSP</strong> – o JavaServer Faces permite mais de um      tipo de arquivo para renderizar seus componentes (PDL – Page Declaration      Language<a href="#_ftn2"><sup><sup>[2]</sup></sup></a>),      como páginas JSP ou Facelets.</li>
<li><strong>Converters</strong> – convertem o valor de um componente (como datas,      moedas, porcentagem e outros) dando-lhes novos formatos.</li>
<li><strong>Validators</strong> – responsáveis por validar a entrada ocorrida no      componente pelo usuário.</li>
<li><strong>Managed Bean</strong> – a lógica do negócio é gerenciada pelos managed      beans, que controlam inclusive a navegação por entre páginas.</li>
<li><strong>Ajax</strong> – Tanto o envio como o recebimento de dados podem ser      feitos via Ajax, sem a necessidade de reload na página do usuário.</li>
</ul>
<hr size="1" /><a href="#_ftnref1">[1]</a> Este arquivo só se tornou opcional na versão 2.0 ou superior.</p>
<p><a href="#_ftnref2">[2]</a> PDL herda a funcionalidade do núcleo de dois conhecidos projetos JSF: Facelets e JSFTemplates. Entre todos os outros recursos, permite criar novos componentes JSF de forma declarativa, sem a criação de um grupo de classes Java como era nas versões anteriores do JSF.</p>
<h3><strong>Compreendendo o comportamento da primeira página JSF criada</strong></h3>
<p>Assim como ocorre com outras bibliotecas de tags, o JavaServer Faces é configurado através da diretiva <strong>taglib</strong>, onde existem as bibliotecas que manipulam o HTML e a Core.</p>
<p>Para usar as tags HTML personalizadas que representam componentes JavaServer Faces, você precisa da diretiva <strong>taglib</strong> mostrada a seguir, geralmente posicionadas no topo de cada página JSP, como de costume no uso dessa diretiva.</p>
<p><strong>&lt;%@ taglib uri=&#8221;http://java.sun.com/jsf/html&#8221; prefix=&#8221;h&#8221;%&gt; </strong></p>
<p>No caso da utilização do Facelets, onde as páginas são XHTML’s, você terá a inclusão da tag personalizada HTML de JSF dessa forma:</p>
<p>&lt;html <strong>… xmlns:h=&#8221;http://java.sun.com/jsf/html&#8221;</strong>&gt;</p>
<p><strong>Nota:</strong> Com a evolução, o desenvolvimento em JSF atualmente pode utilizar a versão com XHTML descartando a anterior, uma vez que se adéqua melhor ao modelo Web 2.0.</p>
<p>Dentre as tags JSF adicionadas na página, a tag <strong>&lt;h:form /&gt;</strong>, representa um componente UIForm e cria um formulário para envio de dados pelo JSF. No HTML gerado, temos a tag <strong>&lt;form/&gt;</strong> para que o browser a compreenda.</p>
<p>A tag <strong>&lt;h:outputText /&gt;</strong> , representando um componente UIOutput que exibe valores, é a responsável pela geração do texto renderizado na página do usuário que, na grande maioria das vezes, é dinâmico. No atributo <strong>value</strong> você adicionou o texto diretamente, mas poderia adicionar a JSF EL (JavaServer Faces Expression Language), visto mais adiante, referente ao Bean criado, dando assim o retorno ao browser de um valor dinâmico produzido por uma entrada ou vindo do banco de dados.</p>
<h3><strong>A página no Browser</strong></h3>
<p>A página criada no aplicativo poderá ser aberta através do seguinte endereço também:</p>
<p><strong>http://localhost:8080/TrabComJSF/faces/index.xhtml</strong></p>
<p>Isso ocorre porque adicionamos a seguinte configuração no deployment descriptor (web.xml):</p>
<pre class="brush:xml">&lt;servlet&gt;
&lt;servlet-name&gt;Faces Servlet&lt;/servlet-name&gt;
&lt;servlet-class&gt;javax.faces.webapp.FacesServlet&lt;/servlet-class&gt;
&lt;load-on-startup&gt;1&lt;/load-on-startup&gt;
&lt;/servlet&gt;
&lt;servlet-mapping&gt;
&lt;servlet-name&gt;Faces Servlet&lt;/servlet-name&gt;
&lt;url-pattern&gt;/faces/*&lt;/url-pattern&gt;
&lt;/servlet-mapping&gt;</pre>
<p>Os itens em destaque mostram que o Servlet FacesServlet, usado para renderizar os componentes JSF, é acionado quando temos “/faces/” antes do nome da página.</p>
<p><strong>Adicionando um bean ao projeto</strong></p>
<p>Na primeira página JSF que criou, você simplesmente adicionou o texto diretamente na tag HTML JSF  <strong>&lt;h:outputText /&gt;</strong>.</p>
<p>Desta vez, você irá adicionar o conteúdo através de um Managed Bean, que nada mais é que uma classe JavaBean comum. A <strong>Listagem 1</strong> mostra o conteúdo do Managed Bean que deverá ser feito:</p>
<p><strong>Listagem 1 – A classe MeuManagedBean.java</strong></p>
<pre class="brush:java">package br.com.integrator;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;

@ManagedBean(name="meuManagedBean")
@RequestScoped
public class MeuManagedBean {

private String texto;

public String getTexto() {
return "Exemplo Simples";
}
}
</pre>
<p><strong>A estrutura de diretórios com o Managed Bean</strong></p>
<p>Sua estrutura de diretórios deverá ser similar ao mostrado na <strong>Figura 2</strong>, onde apresentamos a classe <strong>MeuManagedBean.java</strong> compilada:</p>
<div id="attachment_130" class="wp-caption alignnone" style="width: 291px"><a rel="attachment wp-att-130" href="http://www.edsongoncalves.com.br/wp-content/uploads/2010/02/Figura-2.jpg" rel="lightbox[128]"><img class="size-medium wp-image-130" title="Figura 2" src="http://www.edsongoncalves.com.br/wp-content/uploads/2010/02/Figura-2-281x300.jpg" alt="Estrutura de diretórios do projeto TrabComJSF" width="281" height="300" /></a><p class="wp-caption-text">Figura 2. Estrutura de diretórios do projeto TrabComJSF</p></div>
<h3><strong>Alterando a página do projeto</strong></h3>
<p>Vá até a página index.xhtml e altere a tag JSF  <strong>&lt;h:outputText /&gt;</strong> da seguinte forma:</p>
<p><strong>&lt;h:outputText value=&#8221;#{meuManagedBean.texto}&#8221; /&gt;</strong></p>
<p>Ao alterar a tag <strong>&lt;h:outputText/&gt;</strong>, o atributo <strong>value</strong> recebeu agora os delimitadores <strong>#{&#8230;}</strong>. Estes delimitadores são indicações de expressão ao qual ligam o componente JSF ao Managed Bean e seu atributo <strong>get</strong> correspondente, neste caso.</p>
<p>No JavaServer Faces 2.0, usamos a anotação <strong>@ManagedBean</strong>, de <strong>javax.faces.bean.ManagedBean</strong>, para registrar a classe como sendo uma Managed Bean onde, através do atributo <strong>name</strong>, damos o nome que será acessível pelos componentes das páginas JSF. No caso, chamamos de <strong>meuManagedBean</strong>.</p>
<p>O conteúdo é exibido pelo método público <strong>getTexto()</strong>, responsável por enviar as informações do Managed Bean para a página JSF e exibi-las através da tag <strong>&lt;h:outputText /&gt;</strong>. A <strong>Figura 3</strong> mostra como funciona essa integração.</p>
<p>Um <strong>managed bean</strong> possui um escopo onde, no caso, está definido como por requisição<a href="#_ftn3"><sup><sup>[3]</sup></sup></a>. Este escopo é definido na anotação <strong>@RequestScoped</strong>, de <strong>javax.faces.bean.RequestScoped</strong>.</p>
<hr size="1" /><a href="#_ftnref3">[3]</a> Isso indica que as informações transmitidas serão recebidas e permanecerão apenas na página ao qual foi requisitada. Se você navegar para outra página, estas informações se perdem.</p>
<div id="attachment_133" class="wp-caption alignnone" style="width: 306px"><a rel="attachment wp-att-133" href="http://www.edsongoncalves.com.br/wp-content/uploads/2010/02/Figura-3.jpg" rel="lightbox[128]"><img class="size-medium wp-image-133" title="Figura 3" src="http://www.edsongoncalves.com.br/wp-content/uploads/2010/02/Figura-3-296x300.jpg" alt="Componente da página JSF lendo o Managed Bean" width="296" height="300" /></a><p class="wp-caption-text">Figura 3. Componente da página JSF lendo o Managed Bean</p></div>
<h3><strong>Os Beans em JSF</strong></h3>
<p>Um <strong>bean</strong> em Java é uma classe que expõe atributos/propriedades e eventos em um ambiente como o JSF. Um atributo é nada mais que uma variável nomeada com um determinado tipo que pode ser lido ou escrito. No bean, existe a convenção de declarar tais atributos como sendo do tipo privado e expô-los através de métodos públicos que encapsulam seus valores com as iniciais: <strong>set</strong> e <strong>get</strong> que servem para atribuir um valor e para pegar este valor respectivamente.</p>
<h3><strong>Utilizando Getters e Setters em um Managed Bean</strong></h3>
<p>Para compreender melhor estas características, vamos modificar novamente o exemplo de modo que possamos enviar dados de um campo e recebê-los.</p>
<div id="attachment_134" class="wp-caption alignnone" style="width: 310px"><a rel="attachment wp-att-134" href="http://www.edsongoncalves.com.br/wp-content/uploads/2010/02/Figura-4.jpg" rel="lightbox[128]"><img class="size-medium wp-image-134" title="Figura 4" src="http://www.edsongoncalves.com.br/wp-content/uploads/2010/02/Figura-4-300x173.jpg" alt="Rascunho da representação final do exemplo" width="300" height="173" /></a><p class="wp-caption-text">Figura 4. Rascunho da representação final do exemplo</p></div>
<p>Altere a página <strong>index.xhtml</strong> como mostra o trecho a seguir:</p>
<pre class="brush:html">&lt;h:form&gt;
&lt;h:inputText id="texto" value="#{meuManagedBean.texto}" /&gt;
&lt;br /&gt;
&lt;h:commandButton value="Enviar Texto" action="enviar" /&gt;
&lt;br /&gt;
&lt;h3&gt;&lt;h:outputText value="#{meuManagedBean.texto}" /&gt;&lt;/h3&gt;
&lt;/h:form&gt;
</pre>
<p>E altere o Managed Bean <strong>MeuManagedBean</strong> adicionando o método <strong>setText()</strong> e modificando o método <strong>getText()</strong> como mostra o trecho a seguir:</p>
<pre class="brush:java">public String getTexto() {
return texto;
}
public void setTexto(String texto) {
this.texto = texto;
}</pre>
<p>Pronto, basta rodar o exemplo que verá o resultado.</p>
<div id="attachment_135" class="wp-caption alignnone" style="width: 310px"><a rel="attachment wp-att-135" href="http://www.edsongoncalves.com.br/wp-content/uploads/2010/02/Figura-5.jpg" rel="lightbox[128]"><img class="size-medium wp-image-135" title="Figura 5" src="http://www.edsongoncalves.com.br/wp-content/uploads/2010/02/Figura-5-300x131.jpg" alt="Submissão do texto da página para o Managed Bean e retornando" width="300" height="131" /></a><p class="wp-caption-text">Figura 5. Submissão do texto da página para o Managed Bean e retornando</p></div>
<h2>Na próxima Parte</h2>
<p>Desta vez você utilizou mais dois componentes: <strong>&lt;h:inputText /&gt;</strong> e <strong>&lt;h:commandButton /&gt;</strong>. O primeiro permite a inserção de dados. O atributo <strong>id</strong> é o nome atribuído ao componente e o <strong>value</strong> possui a expressão JSF que contém a ligação entre o componente e o atributo no Managed Bean. O segundo componente, o <strong>&lt;h:commandButton /&gt;</strong>, teve o atributo <strong>value</strong> que representa o texto a ser exibido no componente e <strong>action</strong>, que chama um método no servidor e, se não houver método, recebe como valor uma string qualquer, que pode indicar navegação para outra página ou não.</p>
<p>Na <strong>Parte 3 de JavaServer Faces 2.0 na Prática</strong> teremos uma visão geral da arquitetura do framework, com pequenos exemplos funcionais em alguns dos seus aspectos.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.edsongoncalves.com.br/2010/02/09/javaserver-faces-2-0-na-pratica-parte-2/feed/</wfw:commentRss>
		<slash:comments>18</slash:comments>
		</item>
		<item>
		<title>JavaServer Faces 2.0 na Prática &#8211; Parte 1</title>
		<link>http://www.edsongoncalves.com.br/2010/01/18/javaserver-faces-2-0-na-pratica-parte-1/</link>
		<comments>http://www.edsongoncalves.com.br/2010/01/18/javaserver-faces-2-0-na-pratica-parte-1/#comments</comments>
		<pubDate>Mon, 18 Jan 2010 03:06:52 +0000</pubDate>
		<dc:creator>Edson Gonçalves</dc:creator>
				<category><![CDATA[JSF 2.0]]></category>
		<category><![CDATA[GlassFish]]></category>
		<category><![CDATA[JavaServer Faces]]></category>
		<category><![CDATA[NetBeans]]></category>

		<guid isPermaLink="false">http://www.edsongoncalves.com.br/?p=8</guid>
		<description><![CDATA[Nesta primeira parte da série veremos como configurar e rodar um aplicativo básico em JavaServer Faces 2.0. Não serão economizadas imagens para exemplificar as informações.]]></description>
			<content:encoded><![CDATA[<p>Olá, tudo bom? Como vão vocês?<br />
Este artigo é o primeiro de uma série ao qual vou ensiná-los a trabalhar com o JavaServer Faces 2.0. Dúvidas e críticas são bem vindas.</p>
<h3>Como Rodar o JSF 2.0 na sua máquina</h3>
<p>A forma mais rápida de executar um aplicativo em JSF 2.0 é através do <a title="Download NetBeans IDE" href="http://netbeans.org/downloads/index.html" target="_blank">NetBeans IDE 6.8</a>.  A versão que você deve baixar é a que possui o <a title="Site oficial do GlassFish" href="https://glassfish.dev.java.net/" target="_blank">Sun GlassFish Enterprise Server v3</a> que, não por acaso, possui suporte ao Java Web e EE.</p>
<h3>JavaServer Faces no NetBeans IDE &#8211; Criando um Projeto JSF 2.0</h3>
<p>O NetBeans IDE, graças ao GlassFish v3, possui as bibliotecas necessárias para desenvolver uma aplicação JavaServer Faces.</p>
<p>Para criar um projeto com JavaServer Faces, siga os seguintes passos:</p>
<p><strong>1. </strong>Vá ao menu <strong>File</strong> e clique no item <strong>New Project</strong>.</p>
<div id="attachment_11" class="wp-caption alignnone" style="width: 310px"><a href="http://www.edsongoncalves.com.br/wp-content/uploads/2010/01/Figura-11.jpg" rel="lightbox[8]"><img class="size-medium wp-image-11" title="Figura 1" src="http://www.edsongoncalves.com.br/wp-content/uploads/2010/01/Figura-11-300x118.jpg" alt="File &gt; New Project" width="300" height="118" /></a><p class="wp-caption-text">Figura 1. Criando um novo projeto no NetBeans IDE</p></div>
<p><strong>2. </strong>Na caixa de diálogo <strong>New Project </strong>selecione o item  <strong>Web</strong> em <strong>Categories</strong> e <strong>Web</strong> <strong>Application</strong> em <strong>Projects</strong>. Clique no botão <strong>Next</strong>.</p>
<div id="attachment_12" class="wp-caption alignnone" style="width: 310px"><a href="http://www.edsongoncalves.com.br/wp-content/uploads/2010/01/Figura-2.jpg" rel="lightbox[8]"><img class="size-medium wp-image-12" title="Figura 2" src="http://www.edsongoncalves.com.br/wp-content/uploads/2010/01/Figura-2-300x206.jpg" alt="Caixa de Diálogo New Project" width="300" height="206" /></a><p class="wp-caption-text">Figura 2. Criando um projeto Web no NetBeans IDE</p></div>
<p><strong>3. </strong>Na segunda etapa você define o nome do projeto, em <strong>Project Name</strong>, e a localização, em <strong>Project Location</strong>. Digite <strong>PrimProjJSF </strong>(uma abreviação de Primeiro Projeto JavaServer Faces, como sugestão no nome do projeto). Fique atento a localização dos arquivos em sua máquina. Se desejar mudar a localização de onde se encontra o projeto, clique no botão <strong>Browse</strong> e selecione um novo local. Clique no botão <strong>Next</strong>.</p>
<div id="attachment_14" class="wp-caption alignnone" style="width: 310px"><a href="http://www.edsongoncalves.com.br/wp-content/uploads/2010/01/Figura-3.jpg" rel="lightbox[8]"><img class="size-medium wp-image-14" title="Figura 3" src="http://www.edsongoncalves.com.br/wp-content/uploads/2010/01/Figura-3-300x169.jpg" alt="Nome do Projeto e Localização na Criação do Projeto no NetBeans IDE" width="300" height="169" /></a><p class="wp-caption-text">Figura 3. Nome do Projeto e Localização</p></div>
<p><strong>3. </strong>Na terceira etapa você vai manter o <strong>GlassFish v3</strong> em <strong>Server</strong>, assim como manter o mesmo nome do projeto em <strong>Context Path</strong>. Clique no botão <strong>Next</strong>.</p>
<div id="attachment_15" class="wp-caption alignnone" style="width: 310px"><a href="http://www.edsongoncalves.com.br/wp-content/uploads/2010/01/Figura-4.jpg" rel="lightbox[8]"><img class="size-medium wp-image-15" title="Figura 4" src="http://www.edsongoncalves.com.br/wp-content/uploads/2010/01/Figura-4-300x148.jpg" alt="Seleção do Servidor de Aplicativos" width="300" height="148" /></a><p class="wp-caption-text">Figura 4. Seleção do Servidor de Aplicativos</p></div>
<p><strong>4. </strong>A última etapa é onde você escolhe o framework  <strong>JavaServer Faces</strong>. Na parte inferior, após selecionar o framework, surgirá duas abas: <strong>Libraries</strong> e <strong>Configuration</strong>. Em <strong>Libraries</strong> mantenha <strong>Use default library which comes with Server (JSF 2.0) </strong><strong> </strong>.</p>
<div id="attachment_16" class="wp-caption alignnone" style="width: 310px"><a href="http://www.edsongoncalves.com.br/wp-content/uploads/2010/01/Figura-5.jpg" rel="lightbox[8]"><img class="size-medium wp-image-16" title="Figura 5" src="http://www.edsongoncalves.com.br/wp-content/uploads/2010/01/Figura-5-300x233.jpg" alt="Selecionando o Framework JSF 2.0" width="300" height="233" /></a><p class="wp-caption-text">Figura 5. Selecionando o Framework JSF 2.0</p></div>
<p><strong>5. </strong>Na aba <strong>Configuration</strong>, em  <strong>Servlet URL Pattern</strong>, mantenha como <strong>/faces/*</strong>, assim como deixe <strong>Facelets </strong>em <strong>Preferred Page Language</strong> (veremos sobre isso em outra parte). Clique no botão <strong>Finish</strong> para concluir.</p>
<div id="attachment_17" class="wp-caption alignnone" style="width: 310px"><a href="http://www.edsongoncalves.com.br/wp-content/uploads/2010/01/Figura-6.jpg" rel="lightbox[8]"><img class="size-medium wp-image-17" title="Figura 6" src="http://www.edsongoncalves.com.br/wp-content/uploads/2010/01/Figura-6-300x117.jpg" alt="Mapeando o Faces Servlet no Projeto" width="300" height="117" /></a><p class="wp-caption-text">Figura 6. Mapeando o Faces Servlet no arquivo web.xml</p></div>
<p>O NetBeans IDE abrirá automaticamente uma página em JSF criada pelo assistente através do template existente.</p>
<h3>Um primeiro contato com JavaServer Faces</h3>
<p>Se você não tem base de conhecimento no JavaServer Faces, aqui será o seu princípio.  A idéia é modificar os arquivos configurados pelo NetBeans IDE.</p>
<h4>Uma página simples</h4>
<p>A primeira página de um projeto Web costuma ser chamada de <strong>index</strong>. No JSF 2.0, quando utilizamos o padrão de Facelets, esta página possui a extensão .xhtml, ficando  <strong>index.xhtml</strong>. No NetBeans basta substituir o conteúdo da página <strong>index.xhtml</strong> pelo mostrado na  <strong>Listagem 1</strong>.</p>
<p><strong>Listagem 1 – A página index.xhtml</strong></p>
<pre class="brush:xml">&lt;?xml version='1.0' encoding='UTF-8' ?&gt;
&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;
&lt;html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"&gt;
&lt;h:head&gt;
&lt;title&gt;Uma simples página JSF&lt;/title&gt;
&lt;/h:head&gt;
&lt;h:body&gt;
&lt;h:form&gt;
&lt;h:outputText value="Exemplo Simples" /&gt;
&lt;/h:form&gt;
&lt;/h:body&gt;
&lt;/html&gt;</pre>
<h4>O diretório WEB-INF</h4>
<p>No diretório <strong>WEB-INF</strong> encontramos o arquivo <strong>web.xml</strong> (deployment descriptor) padrão, contendo as adições mostradas na <strong>Listagem 2</strong>.</p>
<p><strong>Listagem 2 – O arquivo web.xml</strong></p>
<pre class="brush:xml">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"&gt;
&lt;servlet&gt;
&lt;servlet-name&gt;Faces Servlet&lt;/servlet-name&gt;
&lt;servlet-class&gt;javax.faces.webapp.FacesServlet&lt;/servlet-class&gt;
&lt;load-on-startup&gt;1&lt;/load-on-startup&gt;
&lt;/servlet&gt;
&lt;servlet-mapping&gt;
&lt;servlet-name&gt;Faces Servlet&lt;/servlet-name&gt;
&lt;url-pattern&gt;/faces/*&lt;/url-pattern&gt;
&lt;/servlet-mapping&gt;
&lt;session-config&gt;
&lt;session-timeout&gt;
30
&lt;/session-timeout&gt;
&lt;/session-config&gt;
&lt;welcome-file-list&gt;
&lt;welcome-file&gt;faces/index.xhtml&lt;/welcome-file&gt;
&lt;/welcome-file-list&gt;
&lt;/web-app&gt;</pre>
<p>O elemento <strong>&lt;servlet-class /&gt;</strong> declara <strong>javax.faces.webapp.FacesServlet</strong> fazendo com que este seja carregado inicialmente. O Servlet é mapeado no contexto pelo elemento <strong>&lt;url-pattern /&gt; </strong>para que as páginas da aplicação tenham o prefixo /faces/.</p>
<p><strong>Nota:</strong> Embora na versão com Eclipse apareça o arquivo <strong>faces-config.xml</strong>, utilizado até a versão 1.2, na versão do JSF 2.0 não é obrigatório.</p>
<p>Você também pode configurar, para um aplicativo JSF, alguns parâmetros específicos no elemento <strong>&lt;context-param /&gt;</strong>, como no trecho a seguir:</p>
<pre class="brush:xml">&lt;context-param&gt;
&lt;param-name&gt;javax.faces.STATE_SAVING_METHOD&lt;/param-name&gt;
&lt;param-value&gt;client&lt;/param-value&gt;
&lt;/context-param&gt;
&lt;context-param&gt;
&lt;param-name&gt;javax.faces.PROJECT_STAGE&lt;/param-name&gt;
&lt;param-value&gt;Production&lt;/param-value&gt;
&lt;/context-param&gt;</pre>
<p>A seguir você tem a <strong>Tabela 1</strong> com alguns parâmetros e sua explicação:</p>
<p><em>Tabela 1 – Parâmetros de configurações de um projeto JSF no web.xml</em></p>
<table border="1" cellspacing="0" cellpadding="5">
<tbody>
<tr>
<td width="331" valign="top"><strong>Parâmetro</strong></td>
<td width="251" valign="top"><strong>Descrição</strong></td>
</tr>
<tr>
<td width="331" valign="top">javax.faces.CONFIG_FILES</td>
<td width="251" valign="top">Define uma lista delimitada por vírgulas com   caminhos relativos de  contextos de   configurações JSF em que a aplicação  irá   procurar.</td>
</tr>
<tr>
<td width="331" valign="top">javax.faces.DEFAULT_SUFFIX</td>
<td width="251" valign="top">Permite definir uma lista de sufixos (ex.:   .xhtml, .jsf) que serão utilizadas pelo framework para ler páginas com   conteúdo JSF.</td>
</tr>
<tr>
<td width="331" valign="top">javax.faces.LIFECYCLE_ID</td>
<td width="251" valign="top">Identifica a instância do ciclo de vida a ser   utilizado durante o processamento de  requisições JSF.</td>
</tr>
<tr>
<td width="331" valign="top">javax.faces.STATE_SAVING_METHOD</td>
<td width="251" valign="top">Define a localização em que o estado é   salvo.  Neste caso temos dois: <strong>server</strong> (padrão) que tipicamente salva   em HttpSession e <strong>client</strong> que salva   como campos ocultos na subsequente submissão do formulário.</td>
</tr>
<tr>
<td width="331" valign="top">javax.faces.PROJECT_STAGE</td>
<td width="251" valign="top">Descreve como a aplicação JSF está em seu ciclo   de vida no desenvolvimento de software, podendo conter os seguintes   valores:  Development, UnitTest,   SystemTest ou Production. Esta informação poderá ser usada por uma   implementação JSF cachear recursos de modo que haja uma melhora no desempenho   em produção, por exemplo.</td>
</tr>
<tr>
<td width="331" valign="top">javax.faces.DISABLE_FACELET_JSF_VIEWHANDLER</td>
<td width="251" valign="top">Desabilita o Facelets (padrão) como Linguagem de   Declaração de Página (Page Declaration Language – PDL) se colocado como <strong>true</strong> em seu valor.</td>
</tr>
<tr>
<td width="331" valign="top">javax.faces.LIBRARIES</td>
<td width="251" valign="top">Interpreta cada arquivo encontrado na lista,   separada por vírgula, de caminhos como uma biblioteca de tags Facelets.</td>
</tr>
</tbody>
</table>
<h4>Executando o projeto de exemplo</h4>
<p>No NetBeans é mais simples, pois o projeto considerado principal (main) já está ativo, sendo necessário apenas ir ao menu <strong>Run&gt;Run Main Project</strong>.</p>
<div id="attachment_27" class="wp-caption alignnone" style="width: 294px"><a href="http://www.edsongoncalves.com.br/wp-content/uploads/2010/01/Figura-7.jpg" rel="lightbox[8]"><img class="size-full wp-image-27" title="Figura 7" src="http://www.edsongoncalves.com.br/wp-content/uploads/2010/01/Figura-7.jpg" alt="Executando o Projeto" width="284" height="107" /></a><p class="wp-caption-text">Figura 7. Executando o Projeto no NetBeans IDE</p></div>
<p>Resultado é uma página JSF renderizada no Browser como mostrado na Figura abaixo.</p>
<div id="attachment_28" class="wp-caption alignnone" style="width: 310px"><a href="http://www.edsongoncalves.com.br/wp-content/uploads/2010/01/Figura-8.jpg" rel="lightbox[8]"><img class="size-medium wp-image-28" title="Figura 8" src="http://www.edsongoncalves.com.br/wp-content/uploads/2010/01/Figura-8-300x110.jpg" alt="Resultado da página JSF renderizada" width="300" height="110" /></a><p class="wp-caption-text">Figura 8. Resultado da página JSF renderizada no Browser</p></div>
]]></content:encoded>
			<wfw:commentRss>http://www.edsongoncalves.com.br/2010/01/18/javaserver-faces-2-0-na-pratica-parte-1/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
	</channel>
</rss>

