Fórum Como atribuir um parametro obtido em JSF a um Objeto #388899
19/10/2010
0
QuartosAlugadosBean: http://paste-it.net/public/q8238ad/
listaQuartos.jsp: http://paste-it.net/public/lc33ab8/
Quero atraves deste parametro popular um formulario com as informações deste objeto na pagina
formAluguelQuartos.jsp : http://paste-it.net/public/zcb2cf6/
fiz a seguinte operação no método
FacesContext context = FacesContext.getCurrentInstance();
String returnValue = context.getExternalContext().getRequestParameterMap().get("paramId");
hospede = returnValue; //ele retorna uma mensagem de tipos incompativeis
System.out.print("retornar "+returnValue);
return "sucessoParametro";
Está e a melhor forma de se fazer isso? Em caso positivo, como devo corrigir este problema?
Desde já agradeço.
Marcos Sousa
Curtir tópico
+ 0Posts
19/10/2010
Henrique Weissmann
no caso do JSF pré 2.0, que é o seu caso (está usando o 1.2, certo?), a passagem de parâmetros e a navegação é feita essencialmente usando o método POST do protocolo HTTP. Por esta razão, neste caso é desrecomendável usar o atributo ID que está sendo passado pela URL.
Nestes casos, a melhor opção é manter o padrão do framework que, nesta situação é a partir dos atributos dos próprios managed beans.
Sendo assim, para popular um formulário 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 irão corresponder aos campos do seu formulário. Para ilustrar a situação, vou usar um exemplo bastante simples: um formulário de cadastro de contatos. Nele teremos apenas dois atributos: nome e login. E um único método para cadastro, que chamarei de cadastro, tal como no código 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 públicos
}
2. Este managed bean deve ser declarado no arquivo faces-config.xml, que se encontra dentro do diretório 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, também inserimos as regras de navegação. 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 formulário 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 atenção 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 padrão Javabeans, ou seja, irá, no momento de renderização do formulário, chamar os getters da classe CadastroContato e, no momento de submissão do formulário, chamar os métodos set relacionados às propriedades.
Sendo assim, se algo der errado neste ponto, as possíveis fontes de erro são as seguintes:
* Algum setter ou getter que está mal escrito
* Alguma variável que não foi definida corretamente e pode levar a um NullPointerException. Isto é muito comum ocorrer em managed beans nos quais uma propriedade não aponte para um atributo simples como uma String ou tipo primitivo, mas sim a uma outra classe. Nesta situação, você deverá trabalhar no interior do seu bean para evitar a ocorrência deste tipo de problema, seja através de testes internos que verifiquem a nulidade dos atributos ou através da construção 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 versão alternativa do bean CadastroCOntato que apresentei acima. Esta classe contato possui apenas dois atributos: nome e e-mail. Esta segunda versão 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 não verifica a nulidade do atributo contato. Ele simplesmente chama os métodos da classe sem que este tenha sequer sido instanciado. Este problema pode ser resolvido de três modos bastante simples:
1. Criando um getter para o atributo contato que antes verifique se o atributo está nulo. Estando nulo, cria uma nova instância deste.
2. Declarando o atributo contato como uma nova instância de cara.
3. Implementando um construtor default do bean CadastroContato que já cria uma nova instância do contato.
A partir dai, sua view ainda estaria acessando as propriedades nome e email do bean. A diferença é 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 versão do CadstroContato ilustra bem como podemos ir além do acesso direto aos atributos.
Gostei + 0
26/10/2010
Devmedia
Gostei + 0
27/10/2010
Marcos Sousa
Gostei + 0
27/10/2010
Devmedia
assuntos diferentes devem ser tratados em assuntos diferentes. por favor verifique esse assunto em outro chamado, ok.
Estamos concluido esse chamado.
Gostei + 0
27/10/2010
Marcos Sousa
Muito obrigado.
Gostei + 0
28/10/2010
Henrique Weissmann
Gostei + 0
30/10/2010
Marcos Sousa
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)