Você está na página 1de 3

o caso do JSF pr 2.0, que o seu caso (est usando o 1.2, certo?

), a passagem de parmetros
e a navegao feita essencialmente usando o mtodo POST do protocolo HTTP. Por esta
razo, neste caso desrecomendvel usar o atributo ID que est sendo passado pela URL.

Nestes casos, a melhor opo manter o padro do framework que, nesta situao a partir
dos atributos dos prprios managed beans.

Sendo assim, para popular um formulrio com os atributos de um bean, voc deve seguir o
procedimento que irei descrever abaixo para voc.

1. Crie o seu managed bean como se fosse um POJO (Plain Old Java Object) comum. Declare na
sua classe os atributos que iro corresponder aos campos do seu formulrio. Para ilustrar a
situao, vou usar um exemplo bastante simples: um formulrio de cadastro de contatos. Nele
teremos apenas dois atributos: nome e login. E um nico mtodo para cadastro, que chamarei
de cadastro, tal como no cdigo fonte abaixo:

class CadastroContatos {
private String nome;
private String email;

public String cadastrar() {


// entra aqui todo o processo de cadatramento (no nosso exemplo, o cadastro sempre
dar certo)
return "cadastro_ok";
}

// getters e setters para nome e e-mail pblicos


}

2. Este managed bean deve ser declarado no arquivo faces-config.xml, que se encontra dentro
do diretrio WEB-INF do seu projeto, tal como no exemplo abaixo:

<managed-bean>
<managed-bean-name>cadastroContato</managed-bean-name>
<managed-bean-class>seupacote.CadastroContatos</managed-bean-class>
<managed-bean-context>request</managed-bean-request/>
</managed-bean>

Neste arquivo, tambm inserimos as regras de navegao. Supondo que o outcome


"cadastro_ok" sempre redirecione para a view cadastro_ok.jsp, teriamos uma regra tal como a
do exemplo abaixo:

<navigation-case>
<from-outcome>cadastro_ok</from-outcome>
<to-view-id>cadastro_ok.jsp</to-view-id>
</navigation-case>

3. Na nossa view, iremos ter um formulrio para cadastro de contatos tal como o abaixo:
<h:form>
Nome: <h:inputText value="#{cadastroContato.nome}"/><br/>
E-mail: <h:inputText value="#{cadastroContato.email}"/><br/>
<h:commandButton value="Incluir" action="#{cadastroContato.cadastrar}"/>
</h:form>

Muita ateno neste terceiro ponto, pois nele que seu problema ser resolvido. O que
ocorre: neste ponto, o JSF ir fazer o link entre as propriedades nome e email do seu managed
bean cadastroContato. Para tal, o framework ir usar o padro Javabeans, ou seja, ir, no
momento de renderizao do formulrio, chamar os getters da classe CadastroContato e, no
momento de submisso do formulrio, chamar os mtodos set relacionados s propriedades.

Sendo assim, se algo der errado neste ponto, as possveis fontes de erro so as seguintes:
* Algum setter ou getter que est mal escrito
* Alguma varivel que no foi definida corretamente e pode levar a um NullPointerException.
Isto muito comum ocorrer em managed beans nos quais uma propriedade no aponte para
um atributo simples como uma String ou tipo primitivo, mas sim a uma outra classe. Nesta
situao, voc dever trabalhar no interior do seu bean para evitar a ocorrncia deste tipo de
problema, seja atravs de testes internos que verifiquem a nulidade dos atributos ou atravs
da construo do managed-bean.
Um exemplo de managed-bean que poderia apresentar este tipo de problema o abaixo:
suponha que exista uma classe chamada Contato, presente em uma verso alternativa do
bean CadastroCOntato que apresentei acima. Esta classe contato possui apenas dois atributos:
nome e e-mail. Esta segunda verso do Managed bean poderia ser escrita tal como no
exemplo abaixo:

class CadastroContato2 {
private Contato contato;

public String getEmail() {return contato.getEmail();}


public void setEmail(String valor) {contato.setEmail(valor);}

public String getNome() {return contato.getNome();}


public void setNome(String valor) {contato.setNome(valor);}
}

Repare que h um erro neste managed bean: ele no verifica a nulidade do atributo contato.
Ele simplesmente chama os mtodos da classe sem que este tenha sequer sido instanciado.
Este problema pode ser resolvido de trs modos bastante simples:

1. Criando um getter para o atributo contato que antes verifique se o atributo est nulo.
Estando nulo, cria uma nova instncia deste.

2. Declarando o atributo contato como uma nova instncia de cara.

3. Implementando um construtor default do bean CadastroContato que j cria uma nova


instncia do contato.

A partir dai, sua view ainda estaria acessando as propriedades nome e email do bean. A
diferena que, internamente, estaria diligenciando o acesso a uma outra classe.

Marcos, este um exemplo bastante simples, mas acredito que com ele eu tenha te exposto
como usar e passar atributos para managed beans usando o JSF. A segunda verso do
CadstroContato ilustra bem como podemos ir alm do acesso direto aos atributos.

Você também pode gostar