Fórum Como atribuir um parametro obtido em JSF a um Objeto #388899

19/10/2010

0

Boa noite. Tenho um managedBean chamado QuartosAlugadosBean onde tenho o seguinte método retornaParametro() que recupera um parametro da página listaQuartos

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

Marcos Sousa

Responder

Posts

19/10/2010

Henrique Weissmann

Oi Marcos,

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.
Responder

Gostei + 0

26/10/2010

Devmedia

Marcos, a resposta do consultor tirou suas duvidas? Podemos encerrar o chamado?
Responder

Gostei + 0

27/10/2010

Marcos Sousa

Henrique, este ponto ficou claro. Quero saber como faço para logo apos credenciar um usuario apos seu login mostrar a mensagem na tela principal do projeto? Seja bem vindo <Nome usuario>                                 logout Voce teria um exemplo de como fechar um sessão? Desde já agradeço.
Responder

Gostei + 0

27/10/2010

Devmedia

Marcos,
assuntos diferentes devem ser tratados em assuntos diferentes. por favor verifique esse assunto em outro chamado, ok.
Estamos concluido esse chamado.
Responder

Gostei + 0

27/10/2010

Marcos Sousa

Ok. irei abrir um chamado diferente.

Muito obrigado.
Responder

Gostei + 0

28/10/2010

Henrique Weissmann

Este chamado pode ser fechado então?
Responder

Gostei + 0

30/10/2010

Marcos Sousa

Ok. Pode fechar o chamado.
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar