Ajuda jsf

13 respostas
CristianPalmaSola10
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package pacote;

import java.util.ArrayList;
import java.util.List;
import javax.faces.bean.ManagedBean;

/**
 *
 * @author cristian.urbainski
 */
@ManagedBean
public class PessoaAux {
    private List<Pessoa> lista = new ArrayList<Pessoa>();

     public List<Pessoa> getLista() {
        return lista;
    }

    public void setLista(List<Pessoa> lista) {
        this.lista = lista;
    }

    public void addPessoa(Pessoa p)
    {
        this.lista.add(p);
    }

}
package pacote;

import javax.faces.bean.ManagedBean;

/**
 * @author cristian.urbainski
 */
@ManagedBean
public class TesteBean {

    private String texto;

    public TesteBean()
    {
        this.texto = "Cristian";
    }

    public String getTexto() {
        return texto;
    }

    public void setTexto(String texto) {
        this.texto = texto;
    }

    public void transformaCaixaAlta()
    {
        this.texto = this.texto.toUpperCase();
    }
}
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core">
    <h:head>
        <title>Facelet Title</title>
    </h:head>
    <h:body>
        <h:form>
            <h:outputLabel value="Cadastro de Pessoas"/>

            <br/>
            &lt;h:panelGrid columns="2"&gt;
                &lt;h:outputLabel value="Nome : " for="txtNome"/&gt;
                &lt;h:inputText id="txtNome" value="#{pessoa.nome}"/&gt;
                &lt;h:outputLabel value="Idade : " for="txtIdade"/&gt;
                &lt;h:inputText id="txtIdade" maxlength="2" value="#{pessoa.idade}" /&gt;
                &lt;h:outputLabel value="Endereço : " for="txtRua"/&gt;
                &lt;h:inputText value="#{pessoa.rua}" id="txtRua" /&gt;
                &lt;h:commandButton value="Adicionar Pessoa" action="#{pessoaAux.addPessoa(pessoa)}"/&gt;
            &lt;/h:panelGrid&gt;
        &lt;/h:form&gt;

        &lt;h:dataTable value="#{pessoa.lista}" var="pessoa" border="1" cellspacing="0" width="350" &gt;
            &lt;f:facet name="header"&gt;Lista de Pessoas&lt;/f:facet&gt;

            &lt;h:column&gt;
                &lt;f:facet name="header"&gt;Nome&lt;/f:facet&gt;
                #{pessoa.nome}
            &lt;/h:column&gt;

             &lt;h:column&gt;
                &lt;f:facet name="header"&gt;Idade&lt;/f:facet&gt;
                #{pessoa.idade}
            &lt;/h:column&gt;

             &lt;h:column&gt;
                &lt;f:facet name="header"&gt;Endereço&lt;/f:facet&gt;
                #{pessoa.rua}
            &lt;/h:column&gt;
        &lt;/h:dataTable&gt;
    &lt;/h:body&gt;
&lt;/html&gt;

quanto executei obtive o seguinte erro

/index.xhtml @21,100 action="#{pessoaAux.addPessoa(pessoa)}" Error Parsing: #{pessoaAux.addPessoa(pessoa)}

como resolver isso:

13 Respostas

nel

Tem a área correta de JEE para postar sua dúvida, não no Java Básico.
E o objeto pessoa está dentro da sua datatable e não foram como tu quer.

O que tu tem que fazer é um método que não recebe parametro, mas simplesmente instancia um novo objeto Pessoa e adiciona a lista, entendeu?
Abraços.

CristianPalmaSola10

tentei o seguinte e tambem não funcionou

&lt;h:commandButton value="Adicionar Pessoa" action="#{pessoaAux.addPessoa(pessoa.nome, pessoa.idade, pessoa.rua)}"/&gt;
nel

CristianPalmaSola10:
tentei o seguinte e tambem não funcionou

&lt;h:commandButton value="Adicionar Pessoa" action="#{pessoaAux.addPessoa(pessoa.nome, pessoa.idade, pessoa.rua)}"/&gt;

Cadê o seu objeto pessoa, mestre ? :slight_smile:
Tens que criar um objeto Pessoa, ser um ManagedBean e fazer os famosos getters e setters. Assim, quando der o submit tu tens o Bean pronto, com as devidas informações e bastante adicionar a lista…

DarthCego

Ola amigo

dentro do seu ManagedBean vc precisa criar um objeto Pessoa criar seus get e set e instancia-lo
dai no seu metodo adicionar vc nao passa parametro nenhum simplesmete adiciona o objeto pessoa tente assim

@ManagedBean
@SessionScoped
public class PessoaAux {  
    private Pessoa pessoa;
    private List<Pessoa> lista = new ArrayList<Pessoa>();  
  
     public PessoaAux(){
         pessoa = new Pessoa();
    }
     
     public List<Pessoa> getLista() {  
        return lista;  
    }  
  
    public void setLista(List<Pessoa> lista) {  
        this.lista = lista;  
    }  

    ////get e set de Pessoa
  
    public void addPessoa()  
    {  
        this.lista.add(pessoa);  
    }
<h:panelGrid columns="2">  
                <h:outputLabel value="Nome : " for="txtNome"/>  
                <h:inputText id="txtNome" value="#{pessoaAux.pessoa.nome}"/>  
                <h:outputLabel value="Idade : " for="txtIdade"/>  
                <h:inputText id="txtIdade" maxlength="2" value="#{pessoaAux.pessoa.idade}" />  
                <h:outputLabel value="Endereço : " for="txtRua"/>  
                <h:inputText value="#{pessoaAux.pessoa.rua}" id="txtRua" />  
                <h:commandButton value="Adicionar Pessoa" action="#{pessoaAux.addPessoa()}"/>  
            </h:panelGrid>

Abraços

CristianPalmaSola10

eu não tinha percebido que não tinha postado a classe pessoa, acabei me confundido na hora que postei

@ManagedBean
public class Pessoa {
    private String nome;
    private Integer idade;
    private String rua;

    public Pessoa()
    {
    }

    public Integer getIdade() {
        return idade;
    }

    public void setIdade(Integer idade) {
        this.idade = idade;
    }

    public String getNome() {
        return nome;
    }

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

    public String getRua() {
        return rua;
    }

    public void setRua(String rua) {
        this.rua = rua;
    }

fiz o seguinte com a classe PessoaAux

@ManagedBean
public class PessoaAux {
    private List&lt;Pessoa&gt; lista = new ArrayList&lt;Pessoa&gt;();
    private Pessoa pessoa;

    public Pessoa getPessoa() {
        return pessoa;
    }

    public void setPessoa(Pessoa pessoa) {
        this.pessoa = pessoa;
    }

     public List&lt;Pessoa&gt; getLista() {
        return lista;
    }

    public void setLista(List&lt;Pessoa&gt; lista) {
        this.lista = lista;
    }

    public void addPessoa()
    {
        this.lista.add(pessoa);
    }

e quanto executei me apresentou o seguinte erro

/index.xhtml @21,94 action="#{pessoaAux.addPessoa()}" Error Parsing: #{pessoaAux.addPessoa()}
DarthCego

Amigo tenta retorna uma String no teu metodo de adicionar pessoa

public String addPessoa() { this.lista.add(pessoa); return null; }

CristianPalmaSola10

O erro persiste amigo, o que podera ser?

nel

Tira os parentes. tenta só

<h:commandButton value="Adicionar Pessoa" action="#{pessoaAux.addPessoa}"/>

E é importante verificar senão está gerando mais nenhum log de erro.

CristianPalmaSola10

Agora funcionou retirei os parenteses e inicializei a variavel pessoa dentro de PessoaAux, mas na tabela aparece apenas uma pessoa, ou seja se eu adicionar uma pessoa, ela vai para a grid mas se eu adicionar outra, é como eu apenas atualizasse a primeira, a primeira sai da tabela e no seu lugar vai a segunda, naum fika mais de uma pessoa na tabela

pq?

nel

CristianPalmaSola10:
Agora funcionou retirei os parenteses e inicializei a variavel pessoa dentro de PessoaAux, mas na tabela aparece apenas uma pessoa, ou seja se eu adicionar uma pessoa, ela vai para a grid mas se eu adicionar outra, é como eu apenas atualizasse a primeira, a primeira sai da tabela e no seu lugar vai a segunda, naum fika mais de uma pessoa na tabela

pq?

Simples. A lista está no seu ManagedBean sem anotação do tipo de escopo, sendo assim, ele passa a ser um Request. Isso significa que a cada requisição ele simplesmente cria uma nova pessoa e uma nova lista de pessoas. Essa forma de implementação não é condizente com o que desejas. Ali teria de ser uma SessionScoped. Mesmo assim, tu podes criar outro Bean de escopo apenas para a lista.

Minha recomendação é tu parar e pensar um pouco o que precisa e aplicar isso. Se fosse um banco de dados, essa preocupação não existiria, ao invés de adicionar diretamente na lista como fez.

DarthCego

public String addPessoa() { this.lista.add(pessoa); pessoa = new Pessoa(); return null; }

assim qnd vc inserir uma pessoa o objeto sera limpo e podera ser inserido de novo testa ae

Abraços

CristianPalmaSola10

Na mosca, troquei o tipo de escopo do meu bean e funcionou certinho, obrigado pela ajuda :smiley:

CristianPalmaSola10

DarthCego eu ja havia tentado fazer desse jeito e naum havia funcionado o que resolveu mesmo foi trocar o escopo do bean, e dai funcionou bele

Criado 13 de fevereiro de 2012
Ultima resposta 13 de fev. de 2012
Respostas 13
Participantes 3