<?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>SubMundo Java &#187; Java Server Faces</title>
	<atom:link href="http://submundojava.com.br/wordpress/category/java-server-faces/feed/" rel="self" type="application/rss+xml" />
	<link>http://submundojava.com.br/wordpress</link>
	<description>Um pouco de tudo, mas tecnologia acima de tudo!</description>
	<lastBuildDate>Wed, 26 May 2010 15:00:26 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>JBoss RichFaces 3.1.3 está nas ruas!</title>
		<link>http://submundojava.com.br/wordpress/2007/12/18/jboss-richfaces-313-esta-nas-ruas/</link>
		<comments>http://submundojava.com.br/wordpress/2007/12/18/jboss-richfaces-313-esta-nas-ruas/#comments</comments>
		<pubDate>Tue, 18 Dec 2007 17:45:04 +0000</pubDate>
		<dc:creator>Henrique Lima</dc:creator>
				<category><![CDATA[Java Server Faces]]></category>

		<guid isPermaLink="false">http://submundojava.com.br/wordpress/2007/12/18/jboss-richfaces-313-esta-nas-ruas/</guid>
		<description><![CDATA[Foi liberado ontem (17/12/2007) mais uma nova versão do conjunto de componentes para JSF conhecido como JBoss RichFaces. Nesta nova versão foram corrigidos dezenas de bugs, aperfeiçoados alguns componentes, atualizados os frameworks Prototype e script.aculo.us(para 1.6.0 e 1.8.0 respectivamente), além da adição de 4 novos componentes: Ordering List, List Shuttle, Component Control e Context Menu. [...]]]></description>
			<content:encoded><![CDATA[<p>Foi liberado ontem (17/12/2007) mais uma nova versão do conjunto de componentes para JSF conhecido como JBoss RichFaces. Nesta nova versão foram corrigidos dezenas de bugs, aperfeiçoados alguns componentes, atualizados os frameworks Prototype e script.aculo.us(para 1.6.0 e 1.8.0 respectivamente), além da adição de 4 novos componentes: Ordering List, List Shuttle, Component Control e Context Menu. Para mais informações sobre as novidades desta versão leia o <a href="http://labs.jboss.com/wiki/RichFacesWhatIsNewIn3_1_3" title="JBoss RichFaces 3.1.3 WhatsNew" target="_blank" id="q_km">WhatsNew</a>. Faça download dos fontes, binários e documentação na <a href="http://labs.jboss.com/jbossrichfaces/" title="JBoss RichFaces - Página Oficial" target="_blank" id="aula">página oficinal</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://submundojava.com.br/wordpress/2007/12/18/jboss-richfaces-313-esta-nas-ruas/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Criando aplicações Ajax, sem Javascript, utilizando Java Server Faces 1.2 e RichFaces</title>
		<link>http://submundojava.com.br/wordpress/2007/12/17/criando-aplicacoes-ajax-sem-javascript-utilizando-java-server-faces-12-e-richfaces/</link>
		<comments>http://submundojava.com.br/wordpress/2007/12/17/criando-aplicacoes-ajax-sem-javascript-utilizando-java-server-faces-12-e-richfaces/#comments</comments>
		<pubDate>Mon, 17 Dec 2007 13:51:14 +0000</pubDate>
		<dc:creator>Henrique Lima</dc:creator>
				<category><![CDATA[Java Server Faces]]></category>

		<guid isPermaLink="false">http://submundojava.com.br/wordpress/2007/12/17/criando-aplicacoes-ajax-sem-javascript-utilizando-java-server-faces-12-e-richfaces/</guid>
		<description><![CDATA[
Introdução
Dando continuidade ao meu último POST, estarei apresentando uma maneira simples de trabalhar com Ajax utilizando componentes JSF.
As aplicações que usufruem de recursos Ajax têm evoluído de diversas maneiras nos últimos tempos e um dos aspectos importantes é a produtividade. Quando iniciei os meus estudos sobre Ajax, era necessário escrever uma quantidade significativa de código [...]]]></description>
			<content:encoded><![CDATA[<p><strong><br />
Introdução</strong></p>
<p>Dando continuidade ao meu último POST, estarei apresentando uma maneira simples de trabalhar com Ajax utilizando componentes JSF.<br />
As aplicações que usufruem de recursos Ajax têm evoluído de diversas maneiras nos últimos tempos e um dos aspectos importantes é a produtividade. Quando iniciei os meus estudos sobre Ajax, era necessário escrever uma quantidade significativa de código javascript, manipulando o objeto XmlHttpRequest diretamente, além de uma porção adicional de código em alguma linguagem server side (para gerar XML dinamicamente). Depois de um certo tempo vieram os frameworks javascript que diminuiram a quantidade de código a ser escrito e atualmente é possível desenvolver aplicações inteiras sem utilizar nenhum código javascript, através dos componentes do RichFaces (entre outros).<br />
<br style="font-weight: bold" /><strong>Requisitos</strong></p>
<p>Antes de seguir os passos aqui descritos, é recomendável  que você leia o POST <a href="http://submundojava.com.br/wordpress/2007/08/27/java-server-faces-12-hello-world/" title="Java Server Faces 1.2 Hello World" target="_blank" id="c:o:">Java Server Faces 1.2 Hello World</a> ou tenha conhecimentos compatíveis.</p>
<p><strong>Configurando o ambiente</strong></p>
<p>Para rodar aplicações Java Server Faces 1.2 é necessário um container que implemente a especificação da JSP 2.1. Para este tutorial iremos utilizar o container Tomcat 6.0.<strong><br />
Download:</strong> <a href="http://tomcat.apache.org/download-60.cgi">http://tomcat.apache.org/download-60.cgi</a></p>
<p>Além dos jars para rodar o Java Server Faces 1.2 serão necessários mais 3 jars do RichFaces. Quando este POST foi escrito a versão mais recente do RichFaces era a 3.1.2. Desta forma, os nomes dos jars são: richfaces-api-3.1.2.GA.jar,  richfaces-impl-3.1.2.GA.jar e richfaces-ui-3.1.2.GA.jar e se encontram dentro da pasta lib do arquivo disponível para download.<br />
<strong>Download:</strong> <a href="http://labs.jboss.com/jbossrichfaces/downloads/" title="http://labs.jboss.com/jbossrichfaces/downloads/" target="_blank" id="rdrb">http://labs.jboss.com/jbossrichfaces/downloads/</a></p>
<p>Para configurar o RichFaces serão necessárias algumas pequenas modificações no <strong>web.xml</strong> demonstrado no POST <a href="http://submundojava.com.br/wordpress/2007/08/27/java-server-faces-12-hello-world/" title="Java Server Faces 1.2 Hello World" target="_blank" id="c:o:">Java Server Faces 1.2 Hello World</a>. A listagem 1 apresenta o código completo do novo<strong> web.xml</strong>.</p>
<p><strong>Listagem 1</strong></p>
<pre class="prettyprint">
&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;web-app version="2.5" 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/webapp_2_5.xsd"&gt;
&lt;display-name&gt;JSFAjax&lt;/display-name&gt;

	&lt;context-param&gt;
		&lt;param-name&gt;com.sun.faces.verifyObjects&lt;/param-name&gt;
		&lt;param-value&gt;true&lt;/param-value&gt;
	&lt;/context-param&gt;

	&lt;context-param&gt;
		&lt;param-name&gt;com.sun.faces.validateXml&lt;/param-name&gt;
		&lt;param-value&gt;true&lt;/param-value&gt;
	&lt;/context-param&gt;

	&lt;context-param&gt;
		&lt;param-name&gt;javax.faces.STATE_SAVING_METHOD&lt;/param-name&gt;
		&lt;param-value&gt;clien+t&lt;/param-value&gt;
	&lt;/context-param&gt;

	&lt;context-param&gt;
		&lt;param-name&gt;org.richfaces.SKIN&lt;/param-name&gt;
		&lt;param-value&gt;blueSky&lt;/param-value&gt;
	&lt;/context-param&gt;

	&lt;filter&gt;
		&lt;display-name&gt;RichFaces Filter&lt;/display-name&gt;
		&lt;filter-name&gt;richfaces&lt;/filter-name&gt;
		&lt;filter-class&gt;org.ajax4jsf.Filter&lt;/filter-class&gt;
	&lt;/filter&gt;

	&lt;filter-mapping&gt;
		&lt;filter-name&gt;richfaces&lt;/filter-name&gt;
		&lt;servlet-name&gt;Faces Servlet&lt;/servlet-name&gt;
		&lt;dispatcher&gt;REQUEST&lt;/dispatcher&gt;
		&lt;dispatcher&gt;FORWARD&lt;/dispatcher&gt;
		&lt;dispatcher&gt;INCLUDE&lt;/dispatcher&gt;
	&lt;/filter-mapping&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;welcome-file-list&gt;
		&lt;welcome-file&gt;faces/index.jsp&lt;/welcome-file&gt;
	&lt;/welcome-file-list&gt;

&lt;/web-app&gt;</pre>
<p>Um novo parâmetro de contexto foi adicionado para configurar qual skin o RichFaces irá utilizar. Por padrão, podem ser utilizados 8 valores: DEFAULT, plain, emeraldTown, blueSky, wine, japanCherry, ruby, classic e deepMarine. É possível criar novas skins e modificar os estilos dos componentes através de CSS, entretanto,  este assunto será abordado em uma outra oportunidade.<br />
Para utilizar o restante dos recursos do RichFaces o filtro <strong>org.ajax4jsf.Filter </strong>deverá ser configurado. Existem algumas opções de configuração e até diferentes tipos de configurações para um grupo de páginas. Para maiores detalhes sobre  configurações dos filtros do RichFaces utilize a <a href="http://labs.jboss.com/file-access/default/members/jbossrichfaces/freezone/docs/devguide/en/html/ArchitectureOverview.html#FilterConfiguration" title="seção 5.5 - Filter Configuration" target="_blank" id="yp8d">seção 5.5 &#8211; Filter Configuration</a> da documentação.</p>
<p><strong>Criando o javabean</strong></p>
<p>Utilizaremos um simples javabean para efetuarmos um CRUD. Na listagem 2 será apresentado a classe Contato.java que deverá ser criada no pacote <strong>br.com.jsfajax.entity.</strong></p>
<p><strong>Listagem 2</strong></p>
<pre class="prettyprint" id="java">
package br.com.jsfajax.entity;

import java.util.Date;

public class Contato {

	private String nome;
	private Date dataNascimento;
	private String email;

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public Date getDataNascimento() {
		return dataNascimento;
	}

	public void setDataNascimento(Date dataNascimento) {
		this.dataNascimento = dataNascimento;
	}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

}</pre>
<p><strong><br />
Criando o Bean Gerenciado (Managed Bean ou Backing Bean)</strong></p>
<p>Crie no pacote <strong>br.com.jsfajax.web.mbean</strong> o arquivo <strong>ContatoManager.java</strong> conforme demostra a listagem 3.</p>
<p><strong>Listagem 3</strong></p>
<pre class="prettyprint" id="java">
package br.com.jsfajax.web.mbean;

import br.com.jsfajax.entity.Contato;

import java.util.ArrayList;
import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.faces.model.DataModel;
import javax.faces.model.ListDataModel;

public class ContatoManager {

	private Contato contato;
	private List&lt;Contato&gt; contatos;
	private DataModel contatosData;

	public ContatoManager() {

		contato = new Contato();
		contatos = new ArrayList&lt;Contato&gt;();
		contatosData = new ListDataModel(contatos);

	}

	public Contato getContato() {
		return contato;
	}

	public void setContato(Contato contato) {
		this.contato = contato;
	}

	public List&lt;Contato&gt; getContatos() {
		return contatos;
	}

	public void setContatos(List&lt;Contato&gt; contatos) {
		this.contatos = contatos;
	}

	public DataModel getContatosData() {
		return contatosData;
	}

	public void setContatosData(DataModel contatosData) {
		this.contatosData = contatosData;
	}

	public void salvar(ActionEvent e) {

		// Se o contato já existia antes na lista de contatos, atualiza os dados. Do contrário adiciona.
		if(contatos.contains(contato))
			contatos.set(contatos.lastIndexOf(contato), contato);
		else
			contatos.add(contato);

		// Zera o contato para que os campos do formulário sejam limpos.
		contato = new Contato();

		// Cria uma nova mensagem de informação para o JSF
		FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO,
							"Contato adicionado com sucesso!",
							"Contato adicionado com sucesso!");

		// Adiciona a mensagem ao formulário de cadastro
		FacesContext.getCurrentInstance().addMessage("formularioCadastro", message);

	}

	public void deletar(ActionEvent e) {
		contatos.remove((Contato)contatosData.getRowData());
	}

	public void editar(ActionEvent e) {
		contato = (Contato)contatosData.getRowData();
	}

	public boolean isRendered() {
		return !contatos.isEmpty();
	}

}</pre>
<p><strong><br />
Configurando o Bean Gerenciado no faces-config.xml<br />
</strong><br />
Adicione ao <strong>faces-config.xml</strong> o código conforme demonstra a listagem 4:</p>
<p><strong>Listagem 4</strong></p>
<pre class="prettyprint">
&lt;managed-bean&gt;
	&lt;managed-bean-name&gt;contatoManager&lt;/managed-bean-name&gt;
	&lt;managed-bean-class&gt;br.com.jsfajax.web.mbean.ContatoManager&lt;/managed-bean-class&gt;
	&lt;managed-bean-scope&gt;session&lt;/managed-bean-scope&gt;
&lt;/managed-bean&gt;</pre>
<p><strong><br />
Criando a página JSP </strong></p>
<p>Crie um arquivo chamado <strong>index.jsp</strong>,  no diretório <strong>WEB-INF/</strong> de sua aplicação WEB, com o conteúdo demonstrado na listagem 5.</p>
<p><strong>Listagem 5</strong></p>
<pre class="prettyprint">
&lt;%@ taglib uri="http://richfaces.org/a4j" prefix="a4j"%&gt;
&lt;%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%&gt;
&lt;%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%&gt;
&lt;%@ taglib uri="http://richfaces.org/rich" prefix="rich"%&gt;
&lt;html&gt;
	&lt;head&gt;
		&lt;meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"&gt;
		&lt;title&gt;Contato CRUD&lt;/title&gt;
	&lt;/head&gt;
	&lt;body&gt;
	&lt;f:view&gt;
          &lt;h:form id="formularioCadastro"&gt;
         	&lt;rich:panel id="cadastro" header="Cadastro de Contatos"&gt;
         		Nome:
         		&lt;h:inputText value="#{contatoManager.contato.nome}" id="nome" required="true"
				requiredMessage="Digite o nome corretamente!"/&gt; &lt;br /&gt;
         		Data Nascimento (dd/mm/aaaaa):
         		&lt;h:inputText value="#{contatoManager.contato.dataNascimento}" id="dataNascimento"
				required="true" requiredMessage="Digite a data de nascimento!"
				converterMessage="Digite a data de nascimento no formato correto!"&gt;
         			&lt;f:convertDateTime pattern="dd/MM/yyyy"  /&gt;
         		&lt;/h:inputText&gt; &lt;br /&gt;
         		E-mail:
			&lt;h:inputText value="#{contatoManager.contato.email}" id="email" required="true"
				requiredMessage="Digite o e-mail corretamente!"/&gt; &lt;br /&gt;
         		&lt;a4j:commandButton value="Salvar"  actionListener="#{contatoManager.salvar}"
				reRender="cadastro,formularioLista" /&gt;&lt;br /&gt;&lt;br /&gt;
         		&lt;h:messages errorStyle="color:red" infoStyle="color:#5ac67e"  /&gt;
         	&lt;/rich:panel&gt;
           &lt;/h:form&gt;
           &lt;h:form id="formularioLista"&gt;
           	&lt;rich:dataTable value="#{contatoManager.contatosData}" var="contato"
			id="listaContatos" rendered="#{contatoManager.rendered}"&gt;
           		&lt;h:column&gt;
				&lt;f:facet name="header"&gt;
					&lt;h:outputText value="Nome" /&gt;
				&lt;/f:facet&gt;
				&lt;h:outputText value="#{contato.nome}"/&gt;
			&lt;/h:column&gt;
			&lt;h:column&gt;
				&lt;f:facet name="header"&gt;
					&lt;h:outputText value="Data Nascimento" /&gt;
				&lt;/f:facet&gt;
				&lt;h:outputText value="#{contato.dataNascimento}"&gt;
					&lt;f:convertDateTime pattern="dd/MM/yyyy"/&gt;
				&lt;/h:outputText&gt;
			&lt;/h:column&gt;
			&lt;h:column&gt;
				&lt;f:facet name="header"&gt;
					&lt;h:outputText value="E-mail" /&gt;
				&lt;/f:facet&gt;
				&lt;h:outputText value="#{contato.email}"/&gt;
			&lt;/h:column&gt;
			&lt;h:column&gt;
				&lt;f:facet name="header"&gt;
					&lt;h:outputText value="Editar" /&gt;
				&lt;/f:facet&gt;
				&lt;a4j:commandLink value="Editar"
					actionListener="#{contatoManager.editar}" reRender="cadastro"/&gt;
			&lt;/h:column&gt;
			&lt;h:column&gt;
				&lt;f:facet name="header"&gt;
					&lt;h:outputText value="Deletar" /&gt;
				&lt;/f:facet&gt;
				&lt;a4j:commandLink value="Deletar"
					actionListener="#{contatoManager.deletar}" reRender="listaContatos"/&gt;
			&lt;/h:column&gt;
           	&lt;/rich:dataTable&gt;
           &lt;/h:form&gt;
        &lt;/f:view&gt;
     	&lt;/body&gt;
&lt;/html&gt;</pre>
<p>Conforme demonstrado na listagem 5, serão utilizadas mais duas taglibs responsáveis pelas funcionalidades Ajax,  <strong>http://richfaces.org/a4j</strong> representada pelo apelido <strong>a4j</strong> e <strong>http://richfaces.org/rich </strong>representada pelo apelido <strong>rich</strong>.<br />
Foram utilizados 2 formulários pois todo formulário com campos cujo atributo <strong>required</strong> possua o valor <strong>true </strong>só pode ser submetido se tais campos estiverem preenchidos. Desta forma, se os botões de editar e deletar (quando em um mesmo form) forem acionados e os campos (com required=true) estiverem vazios uma mensagem de erro será apresentada.<br />
O atributo <span style="font-weight: bold">requiredMessage</span> do componente <span style="font-weight: bold">h:inputText </span>é utilizado para configurar a mensagem de erro a ser apresentada quando este campo não for preenchido e seu atributo <span style="font-weight: bold">required</span> possuir o valor <span style="font-weight: bold">true</span>.<br />
O converter <span style="font-weight: bold">f:converterDateTime </span>é utilizado para transformar a String digitada (no campo em que este converter for aplicado) em um objeto do tipo java.util.Date e vice-versa.<br />
O atributo <span style="font-weight: bold">converterMessage </span>do componente <span style="font-weight: bold">h:inputText </span>é utilizado para configurar a mensagem de erro a ser apresentada quando não for possível efetuar a conversão da String para o objeto java.util.Date ou vice-versa.<br />
Os componentes <span style="font-weight: bold">commandButton</span> e <span style="font-weight: bold">commandLink</span> do <span style="font-weight: bold">a4j </span>serão responsáveis por efetuar as chamadas assíncronas. No atributo <span style="font-weight: bold">actionListener</span> destes componentes é configurado qual método do managed bean será executado. No atributo <span style="font-weight: bold">reRender </span>será configurado quais componentes serão atualizados depois de ser executado o método do managed bean. Desta forma, quando o botão salvar for pressionado o método salvar do managed bean será  executado e o componente cujo ID é listaContatos será atualizado com um novo registro.<br />
O componente h:messages é reponsável por apresentar as mensagens adicionadas ao FacesContext através da classe FacesMessage.<br />
É possível customizar os estilos  CSS das mensagens em função do tipo de mensagem. Um FacesMessage pode ser classificada em 4 tipos:</p>
<ul>
<li><span style="font-weight: bold">FacesMessage.SEVERITY_ERROR</span> &#8211; Indica que um erro ocorreu.</li>
<li><span style="font-weight: bold">FacesMessage.SEVERITY_FATAL </span>-<span style="font-weight: bold"> </span>Indica que um erro grave ocorreu.</li>
<li><span style="font-weight: bold">FacesMessage.SEVERITY_INFO </span>- Mensagem com caráter informativo.</li>
<li><span style="font-weight: bold">FacesMessage.SEVERITY_WARN </span>-<span style="font-weight: bold"> </span>Indica que um erro pode ter acontecido.</li>
</ul>
<p>Para utilizar estilos de CSS diferente para cada tipo de mensagem existem atributos correspondentes no componente h:messages, são eles: errorClass, fatalClass, infoClass, warnClass, errorStyle, fatalStyle, infoStyle e warnStyle. Estes atributos são correspondentes aos atributos style e class dos componentes html.</p>
<p><span style="font-weight: bold">Considerações Finais</span></p>
<p>Através da utilização de componentes JSF é possível ganhar produtividade, diminuindo a quantidade de código e, na maioria das vezes, ganhar performance. Entretanto, em muitas situações isto não ocorre, devido a grande quantidade de chamadas assíncronas, consultas à base de dados desnecessárias, utilização indevida de session entre outros fatores. Em uma próxima oportunidade darei continuidade a este POST adicionando recursos da Java Persistence API e mostrando como otimizar o desempenho desta pequena aplicação.</p>
]]></content:encoded>
			<wfw:commentRss>http://submundojava.com.br/wordpress/2007/12/17/criando-aplicacoes-ajax-sem-javascript-utilizando-java-server-faces-12-e-richfaces/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Java Server Faces 1.2 Hello World</title>
		<link>http://submundojava.com.br/wordpress/2007/08/27/java-server-faces-12-hello-world/</link>
		<comments>http://submundojava.com.br/wordpress/2007/08/27/java-server-faces-12-hello-world/#comments</comments>
		<pubDate>Mon, 27 Aug 2007 17:51:10 +0000</pubDate>
		<dc:creator>Henrique Lima</dc:creator>
				<category><![CDATA[Java Server Faces]]></category>

		<guid isPermaLink="false">http://submundojava.com.br/wordpress/2007/08/27/java-server-faces-12-hello-world/</guid>
		<description><![CDATA[ Requisitos
Será necessário o conhecimento dos seguintes itens para a criarmos nosso primeiro exemplo:

Nível básico de conhecimento de orientação a objetos utilizando Java.
Nível básico de conhecimento na criação de aplicações WEB utilizando Tomcat, de preferência versão 6.0.
Manipulação de bibliotecas jar. (Utilizando IDE ou não).
Nível básico de conhecimento de HTML e XML.

Configurando o ambiente
Para rodar aplicações [...]]]></description>
			<content:encoded><![CDATA[<p><strong> Requisitos</strong></p>
<p>Será necessário o conhecimento dos seguintes itens para a criarmos nosso primeiro exemplo:</p>
<ol>
<li>Nível básico de conhecimento de orientação a objetos utilizando Java.</li>
<li>Nível básico de conhecimento na criação de aplicações WEB utilizando Tomcat, de preferência versão 6.0.</li>
<li>Manipulação de bibliotecas jar. (Utilizando IDE ou não).</li>
<li>Nível básico de conhecimento de HTML e XML.</li>
</ol>
<p><strong>Configurando o ambiente</strong></p>
<p>Para rodar aplicações Java Server Faces 1.2 é necessário um container que implemente a especificação da JSP 2.1.</p>
<p>Para este tutorial iremos utilizar o container Tomcat 6.0.<strong><br />
Download:</strong> <a href="http://tomcat.apache.org/download-60.cgi">http://tomcat.apache.org/download-60.cgi</a></p>
<p>Serão necessários 8 arquivos jars que devem estar no classpath ou no diretorio WEB-INF/lib de sua aplicação WEB, são eles:</p>
<ul>
<li> <strong>jsf-api.jar e jsf-impl.jar</strong><br />
<strong>Download:</strong> <a href="https://javaserverfaces.dev.java.net/download.html">https://javaserverfaces.dev.java.net/download.html</a></li>
<li> <strong>commons-beanutils.jar</strong><br />
<strong>Download:</strong> <a href="http://commons.apache.org/downloads/download_beanutils.cgi">http://commons.apache.org/downloads/download_beanutils.cgi</a></li>
<li> <strong>commons-colletions.jar<br />
Download:</strong> <a href="http://commons.apache.org/downloads/download_collections.cgi">http://commons.apache.org/downloads/download_collections.cgi </a></li>
<li> <strong>commons-logging.jar<br />
Download:</strong> <a href="http://commons.apache.org/downloads/download_logging.cgi">http://commons.apache.org/downloads/download_logging.cgi </a></li>
<li> <strong>commons-diggester.jar</strong><br />
<strong>Download:</strong> <a href="http://commons.apache.org/downloads/download_digester.cgi">http://commons.apache.org/downloads/download_digester.cgi </a></li>
<li> <strong>jstl.jar e standard.jar (Standard Taglib)</strong><br />
<strong>Download:</strong> <a href="http://jakarta.apache.org/site/downloads/downloads_taglibs-standard.cgi">http://jakarta.apache.org/site/downloads/downloads_taglibs-standard.cgi </a></li>
</ul>
<p>Para que o Java Server Faces funcione adequadamente se faz necessário a configuração do Faces Servlet para que este<br />
atenda às requisições das páginas JSF. A Listagem 1 mostra um exemplo de configuração do web.xml.</p>
<p><strong>Listagem 1</strong></p>
<pre class="prettyprint">&lt;?xml version="1.0" encoding="UTF-8"?&gt;&lt;web-app version="2.5"</pre>
<pre class="prettyprint">xmlns="http://java.sun.com/xml/ns/javaee"</pre>
<pre class="prettyprint">xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://java.sun.com/xml/ns/javaee</pre>
<pre class="prettyprint">http://java.sun.com/xml/ns/javaee/webapp_2_5.xsd"&gt;</pre>
<pre class="prettyprint">&lt;context-param&gt;</pre>
<pre class="prettyprint"> 	&lt;param-name&gt;com.sun.faces.verifyObjects&lt;/param-name&gt;

 	&lt;param-value&gt;true&lt;/param-value&gt;

&lt;/context-param&gt;

&lt;context-param&gt;

 	&lt;param-name&gt;com.sun.faces.validateXml&lt;/param-name&gt;

 	&lt;param-value&gt;true&lt;/param-value&gt;

&lt;/context-param&gt;

&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;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;welcome-file-list&gt;

&lt;welcome-file&gt;faces/index.jsp&lt;/welcome-file&gt;

&lt;/welcome-file-list&gt;

&lt;/web-app&gt;</pre>
<p>Como pode-se observar foram configurados 3 parâmetros de contexto. A utilidade destes será descrita a seguir:</p>
<ul>
<li><strong>com.sun.faces.verifyObjects</strong><br />
Esta flag é configurada como true quando se quer que implementação do Java Server Faces verifique se os objetos da aplicação<br />
(conversores, etc) foram criados adequadamente. Seu valor padrão é false, por afetar a performance no início da execução<br />
da aplicação.</li>
<li><strong>com.sun.faces.validateXml</strong><br />
Esta flag é configurada como true quando se quer que a implementação do Java Server Faces verifique a integridade do arquivo<br />
faces-config.xml em função do seu DTD correspondente. Seu valor padrão é false.</li>
<li><strong>javax.faces.STATE_SAVING_METHOD</strong><br />
Esta flag é usada para configurar em que lado da aplicação o estado da “view” deve ser salvo.<br />
Existem 2 valores possíveis: server e client. Quando configurado como client o estado de toda camada de visão será renderizado<br />
em um campo hidden na página jsp. Seu valor padrão é server.</li>
</ul>
<p><strong>Criando o Bean Gerenciado (Managed Bean ou Backing Bean)</strong></p>
<p>O Bean Gerenciado é a camada de negócios das aplicações JSF. Sua principal função é compartilhar seus atributos e métodos<br />
com as páginas JSP. Cada campo de um formulário da página JSP é integrado com uma atributo e cada ação e/ou evento<br />
com um método do Bean Gerenciado, resultando numa ótima separação da camada de negócio da camada de visão. Crie no<br />
pacote <strong>br.com.jsftutorial</strong> o arquivo <strong>HelloWorldBean.java</strong> conforme demostra a listagem 2.</p>
<p><strong> Listagem 2</strong></p>
<pre class="prettyprint">package br.com.jsftutorial;public class HelloWorldBean {private String nome;

public HelloWorldBean() {

}

public String getNome() {

return nome;

}

public void setNome(String nome) {

this.nome = nome;

}

public String acao() {

return "sucesso";

}

}</pre>
<p>Todo Bean Gerenciado deve possuir o construtor default (sem nenhum argumento), do contrário será lançado uma java.lang.InstantiationException.<br />
Todo atributo integrado à página JSP deverá possuir seus métodos setters e getters mesmo que seu modificador de visibilidade<br />
seja public, como por exemplo o atributo nome do HelloWorldBean.</p>
<p><strong>Configurando o Bean Gerenciado no faces-config.xml</strong></p>
<p>O arquivo faces-config.xml é o arquivo de configuração do Java Server Faces.<br />
Este arquivo deve estar na pasta WEB-INF/ de sua aplicação e contém entre outras configurações as declarações dos Beans Gerenciados que deverão ser instanciados pela<br />
implementação do JSF. Na listagem 3 é apresentado um modelo típico de configuração de um Bean Gerenciado.</p>
<p><strong>Listagem 3</strong></p>
<pre class="prettyprint">&lt;?xml version='1.0' encoding='UTF-8'?&gt;</pre>
<pre class="prettyprint">&lt;faces-config version="1.2"</pre>
<pre class="prettyprint"> 	xmlns="http://java.sun.com/xml/ns/javaee"</pre>
<pre class="prettyprint"> 	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

 	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee</pre>
<pre class="prettyprint"> 	http://java.sun.com/xml/ns/javaee/webfacesconfig_1_2.xsd"&gt;

&lt;managed-bean&gt;

&lt;managed-bean-name&gt;hwBean&lt;/managed-bean-name&gt;

&lt;managed-bean-class&gt;br.com.jsftutorial.HelloWorldBean&lt;/managed-bean-class&gt;

&lt;managed-bean-scope&gt;request&lt;/managed-bean-scope&gt;

&lt;/managed-bean&gt;

&lt;/faces-config&gt;</pre>
<p>Entre as tags &lt;faces-config&gt; e &lt;/faces-config&gt; se localizam toda a configuração da aplicação JSF.<br />
A configuração necessária para um Bean Gerenciado é bem intuitiva, abaixo segue a descrição das tags utilizadas:</p>
<ul>
<li> <strong>managed-bean</strong><br />
Toda a configuração de um, e apenas um, Bean Gerenciado deve estar contido nesta tag.</li>
<li> <strong>managed-bean-name</strong><br />
Nome utilizado para referenciar o Bean Gerenciado nas páginas JSP.</li>
<li> <strong>managed-bean-class</strong><br />
O caminho completo para a classe que representa este Bean Gerenciado.</li>
<li> <strong>Managed-bean-scope</strong><br />
Indica de qual escopo (scope) este Bean Gerenciado será resgatado. Existem 4 tipos possíveis.</p>
<ul>
<li> <strong>none</strong><br />
Só poderá ser utilizado como propriedade de um outro managed bean.</li>
<li> <strong>request</strong><br />
Estará disponível através do request, ou seja, seu tempo de vida acaba após a submissão do formulário.</li>
<li> <strong>session</strong><br />
Estará disponível através da session, ou seja, seu tempo de vida é o mesmo que o tempo de vida da session configurada no web.xml.</li>
<li> <strong>application</strong><br />
Estará disponível através do objeto application, ou seja, seu tempo de vida é o mesmo da aplicação.</li>
</ul>
</li>
</ul>
<p>Existem outras tags que adicionam funcionalidades ao Bean Gerenciado, aconselho a utilizar o<br />
Java (TM) EE 5 tutorial capítulo 5 item Backing Beans que pode ser acessado<br />
através da url <a href="http://java.sun.com/javaee/5/docs/tutorial/doc/">http://java.sun.com/javaee/5/docs/tutorial/doc/</a>.</p>
<p><strong>Criando o index.jsp</strong></p>
<p>Crie a página index.jsp na pasta de arquivos WEB (mesma altura que WEB-INF/ e META-INF/) de sua aplicação com o conteúdo da Listagem 4.</p>
<p><strong>Listagem 4</strong></p>
<pre class="prettyprint">&lt;%@page contentType="text/html"%&gt;&lt;%@page pageEncoding="UTF-8"%&gt;

&lt;%@taglib prefix="f" uri="http://java.sun.com/jsf/core"%&gt;

&lt;%@taglib prefix="h" uri="http://java.sun.com/jsf/html"%&gt;

&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"&gt;

&lt;html&gt;

&lt;head&gt;

&lt;meta http-equiv="Content-Type" content="text/html; charset=UTF-8"&gt;

&lt;title&gt;Java Server Faces Tutorial&lt;/title&gt;

&lt;/head&gt;

&lt;body&gt;
<pre class="prettyprint">	&lt;f:view&gt;</pre>
<p>&lt;h:form id="formulario"&gt;</p>
<p>&lt;b&gt;Nome:&lt;/b&gt;</p>
<p>&lt;h:inputText id="nome" value="#{hwBean.nome}" required="true" requiredMessage="O campo nome deve ser preenchido!"/&gt;</p>
<p>&lt;h:commandButton value="GO" action="#{hwBean.acao}" /&gt;&lt;br&gt;</p>
<p>&lt;h:message for="nome" errorStyle="color:red"/&gt;</p>
<p>&lt;/h:form&gt;</p>
<p>&lt;/f:view&gt;</p>
<p>&lt;/body&gt;</p>
<p>&lt;/html&gt;</pre>
<p>Nas linhas 3 e 4 temos as declarações das taglibs core e html do Java Server Faces que serão utilizadas para criarmos os<br />
componentes na página JSP.</p>
<p>A tag &lt;f:view&gt; deve conter os componentes JSF.</p>
<p>A tag &lt;h:form&gt; é análogo a tag &lt;form&gt; do html.</p>
<p>Através da tag &lt;h:inputText&gt; será criado um componente input do html e do tipo text (&lt;input type=”text”&gt;).<br />
O atributo value permite integrar o valor deste componente a uma propriedade do Managed Bean, ou seja, quando o formulário for<br />
submetido o valor deste componente será copiado para a propriedade “nome” do Managed Bean configurado no faces-config.xml<br />
cujo o nome foi configurado como hwBean (&lt;managedbean-name&gt;hwBean&lt;/managed-bean-name&gt;). O atributo<br />
required determina que o formulário não poderá ser submetido caso este campo não seja preenchido.<br />
O atributo requiredMessage determina a mensagem de erro que será apresentada caso, ao submeter o formulário, este componente não seja preenchido.</p>
<p>Através da tag &lt;h:commandButton&gt; será criado um componente button do html (&lt;input type=”button”&gt;).<br />
O atributo action determina o método do Managed Bean que será executado quando este botão for pressionado.</p>
<p>A tag &lt;h:message&gt; é um componente utilizado para apresentar as mensagens ao usuário. O atributo “for” deve ser<br />
preenchido com o id do componente que desejamos que esta mensagem seja integrada, ou seja, serão apresentadas as<br />
mensagens referentes apenas ao campo cujo o id é “nome” do formulário. O atributo errorStyle permite aplicarmos um estilo<br />
CSS ao componente quando a mensagem for de erro.</p>
<p><strong>Criando o resultado.jsp</strong></p>
<p>Crie a página resultado.jsp na pasta de arquivos WEB (mesma altura que WEB-INF/ e META-INF/) de sua aplicação com o conteúdo da Listagem 5.</p>
<p><strong>Listagem 5</strong></p>
<pre class="prettyprint">&lt;%@page contentType="text/html"%&gt;&lt;%@page pageEncoding="UTF-8"%&gt;

&lt;%@taglib prefix="f" uri="http://java.sun.com/jsf/core"%&gt;

&lt;%@taglib prefix="h" uri="http://java.sun.com/jsf/html"%&gt;</pre>
<pre class="prettyprint">&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"

"http://www.w3.org/TR/html4/loose.dtd"&gt;

&lt;html&gt;

&lt;head&gt;

&lt;meta http-equiv="Content-Type" content="text/html; charset=UTF-8"&gt;

&lt;title&gt;Java Server Faces Tutorial&lt;/title&gt;

&lt;/head&gt;

&lt;body&gt;

&lt;f:view&gt;

Ola, &lt;h:outputText value="#{hwBean.nome}" /&gt;!

&lt;/f:view&gt;

&lt;/body&gt;

&lt;/html&gt;</pre>
<p><strong>Criando o fluxo do aplicativo</strong></p>
<p>Para determinarmos o fluxo do aplicativo adicionamos uma “navigation rule” ao faces-config.xml.<br />
Ao executarmos o método acao() do Managed Bean, a String “sucesso” será retornada e pela “navigation rule” determinamos que a página resultado.jsp<br />
deverá ser apresentada. A listagem 6 demonstra o conteúdo do faces-config.xml.</p>
<p><strong>Listagem 6</strong></p>
<pre class="prettyprint">&lt;?xml version='1.0' encoding='UTF-8'?&gt;</pre>
<pre class="prettyprint">&lt;faces-config version="1.2"</pre>
<pre class="prettyprint">xmlns="http://java.sun.com/xml/ns/javaee"</pre>
<pre class="prettyprint">xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://java.sun.com/xml/ns/javaee</pre>
<pre class="prettyprint">http://java.sun.com/xml/ns/javaee/webfacesconfig_1_2.xsd"&gt;</pre>
<pre class="prettyprint">&lt;managed-bean&gt;

&lt;managed-bean-name&gt;hwBean&lt;/managed-bean-name&gt;

&lt;managed-bean-class&gt;br.com.jsftutorial.HelloWorldBean&lt;/managed-bean-class&gt;

&lt;managed-bean-scope&gt;request&lt;/managed-bean-scope&gt;

&lt;/managed-bean&gt;

&lt;navigation-rule&gt;

&lt;navigation-case&gt;

&lt;from-outcome&gt;sucesso&lt;/from-outcome&gt;

&lt;to-view-id&gt;/resultado.jsp&lt;/to-view-id&gt;

&lt;/navigation-case&gt;

&lt;/navigation-rule&gt;

&lt;/faces-config&gt;</pre>
<p>Após a submissão do formulário, a propriedade “nome” do Managed Bean terá o valor digitado no componente &lt;h:inputText&gt; do index.jsp,<br />
então a página resultado.jsp será apresentada (conforme configurado no faces-config.xml).<br />
Para testar a aplicação inicie o tomcat e acesse a url: http://localhost:8080/HelloJSF/faces/index.jsp</p>
<p><strong>Próximos Passos</strong></p>
<p>Existem ainda diversos recursos e componentes do JSF, aconselho a leitura da referência da API,<br />
acessando a url <a href="http://java.sun.com/javaee/javaserverfaces/reference/api/index.html">http://java.sun.com/javaee/javaserverfaces/reference/api/index.html</a>.<br />
Além disso, existem outras ótimas implementações que disponibilizam novos componentes e<br />
recursos como a utilização de Ajax e DOM na renderização das páginas. Recomendo o estudo do <a href="http://www.icefaces.org">IceFaces</a> e do <a href="http://www.icefaces.org">Ajax4Jsf</a>, ambos open source.</p>
<p><strong>Conclusão</strong></p>
<p>Apesar de muita discussão sobre a qualidade dos diversos frameworks open source do mercado, Java Server Faces se apresenta<br />
como uma ótima opção no desenvolvimento de interfaces para aplicações JEE. Com a inclusão deste framework na JEE 5,<br />
existe uma grande tendência ao crescimento de sua utilização o que torna indispensável o conhecimento de seus recursos e<br />
de suas diversas implementações. Neste tutorial foi abordado o conceito básico do funcionamento deste framework e em<br />
uma nova oportunidade voltarei a escrever sobre esta tecnologia. Até lá.</p>
]]></content:encoded>
			<wfw:commentRss>http://submundojava.com.br/wordpress/2007/08/27/java-server-faces-12-hello-world/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>
