Duvida com DataTable e Metodo

17 respostas
Schoker

Boa tarde pessoal!

Estou começando a aprender JSF e tenho uma dúvida…

Eu tenho uma dataTable na minha página que lista os contatos de uma agenda…até ai tudo bem…
cada linha da tabela tem um botao de excluir…ai quando o usuario clicar em excluir eu teria q passar o id dele para um metodo de exclusao que eu criei…
esse metodo tem um parametro “id”…

como eu faço para passar um parametro para um metodo?
eu fiz um teste com um metodo sem parametro…eu mesmo passei o id no proprio metodo e deu certo…
mas eu teria q passar o id do contato selecionado…alguem sabe como???

Desde já agradeço!

17 Respostas

R

da uma olhada ai
http://www.guj.com.br/posts/list/222555.java#1139641

Schoker

humm…valeww…mas nao consegui resolver meu problema :S

Alguem tem alguma ideia de como fazer isso?

Schoker

Ninguém??

Schoker

Tem alguma tag para passar o parametro?

R

blz, vou te ajudar melhor, mas o link que eu te passei já ajuda , ehehehe

mostra ai como esta seu datatable e como esta seu backbean

R

ha olha tem esta tag aqui

xmlns:f="http://java.sun.com/jsf/core"

 <f:param name="nome do paramentro" value="valor" />

mas voce pode fazer o seguinte:

<a4j:commandButton value="excluir" action="#{backbean.excluir}" >
	<f:setPropertyActionListener value="#{row}" target="#{backbean.objeto}"/> <!-- este cara aqui deixa vc setar o objeto {row} em uma propriedade do mesmo tipo do seu backbean target -->
</a4j:commandButton>

acho que da segunda forma é melhor

asandro1501

Olá pessoal

Pra não abrir um novo tópico vou pegar carona neste aqui.

Gostaria de fazer a mesma coisa mas estou utilizando primefaces e não consegui adaptar o código.
Se puderem me ajudar eu agradeço.

BuscaPacientePorId.xhtml
<ui:composition template="template.xhtml"
                xmlns="http://www.w3.org/1999/xhtml"
                xmlns:p="http://primefaces.prime.com.tr/ui"
                xmlns:f="http://java.sun.com/jsf/core"
                xmlns:h="http://java.sun.com/jsf/html"
                xmlns:ui="http://java.sun.com/jsf/facelets">

    <ui:define name="title"> Busca de Paciente </ui:define>
    <ui:define name="content">

        <h:form >
            <p:panel style="width: 800PX" >

                <h:panelGrid columns="2"  >
                    <p:panel style="width: 300PX" header="Pesquisar pelo Código" >
                        <h:inputText value="#{pacienteBean.paciente.codPaciente}"/>
                        <h:commandButton value="Pesquisar" action="BuscaPacientePorId.jsf" actionListener="#{pacienteBean.pacientePorId}"/>
                    </p:panel>
                </h:panelGrid>

                <p:dataTable  value="#{pacienteBean.pacientePorId}"   var="pac"  paginator="true" rows="20" scrollable="true" height="400"
                              selectionMode="single" paginatorTemplate="{CurrentPageReport}  {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"
                              rowsPerPageTemplate="5,10,15,20,25">
                    <p:column>
                        <f:facet name="header">
                            <h:outputText value="Código" />
                        </f:facet>
                        <h:outputText value="#{pac.codPaciente}"  />
                    </p:column>

                    <p:column>
                        <f:facet name="header">
                            <h:outputText value="Nome" />
                        </f:facet>
                        <h:outputText value="#{pac.nomePaciente}" />
                    </p:column>

                    <p:column>
                        <f:facet name="header">
                            <h:outputText value="RG" />
                        </f:facet>
                        <h:outputText value="#{pac.rg}" />
                    </p:column>

                    <p:column>
                        <f:facet name="header">
                            <h:outputText value="CPF" />
                        </f:facet>
                        <h:outputText value="#{pac.cpf}" />
                    </p:column>

                    <p:column>
                        <f:facet name="header">
                            <h:outputText value="Nascimento"/>

                        </f:facet>
                        <h:outputText value="#{pac.dataNacimento}" />
                    </p:column>
                </p:dataTable>



                <h:panelGrid columns="2" >
                    <p:panel>
                        <h:outputText value="Nome"/>
                        <h:outputText value="#{pacienteBean.paciente.nomePaciente}" />
                    </p:panel>
                </h:panelGrid>


            </p:panel>
        </h:form>
    </ui:define>
</ui:composition>
PacienteBean.java
public List<Paciente> getPacientePorId() {
        List<Paciente> bpacientesId = new ArrayList<Paciente>();
        String sql = "select * from paciente where codPaciente like ?";

        try {
            PreparedStatement stmt = this.conexao.prepareStatement(sql);
             stmt.setInt(1,getPaciente().getCodPaciente());

            ResultSet rs = stmt.executeQuery();


        while (rs.next()) {
            Paciente pac = new Paciente();

            int codigo = rs.getInt("codPaciente");
            String nome = rs.getString("nomePaciente");
            String rg = rs.getString("rg");
            String cpf = rs.getString("cpf");
            Date data = rs.getDate("dataNascimento");
            String endereco = rs.getString("endereco");
            String cidade = rs.getString("cidade");
            String estado = rs.getString("estado");

            pac.setCodPaciente(codigo);
            pac.setNomePaciente(nome);
            pac.setRg(rg);
            pac.setCpf(cpf);
            pac.setDataNacimento(data);
            pac.setEndereco(endereco);
            pac.setCidade(cidade);
            pac.setEstado(estado);

            bpacientesId.add(pac);
            }

        } catch (SQLException ex) {
            Logger.getLogger(PacienteBean.class.getName()).log(Level.SEVERE, null, ex);
        }
        return bpacientesId;

    }

Minha dúvida é como substituir o datatable por campos editáveis como inputtext para que eu possa tanto editar quanto excluir.
Preciso disso para o meu TCC

Obrigado a todos.

R

tenta isto aqui:

<p:column>  
          <f:facet name="header">  
                    <h:outputText value="Código" />  
          </f:facet>  
          <h:commandbutton action="#{pacienteBean.excluir }">
                     <f:setPropertyActionListener value="#{pac}" target="#{pacienteBean.paciente}"/>
          </h:commandbutton>  
</p:column>

obs.: no seu bean tem que ter um objeto paciente e o excluir pode ser algo do tipo:

public void excluir(){
daoPaciente.excluir(paciente.getId());
paciente = new Paciente();
}

tenta ai e qualquer coisa posta ae

R
asandro1501:
Olá pessoal

Pra não abrir um novo tópico vou pegar carona neste aqui.

Gostaria de fazer a mesma coisa mas estou utilizando primefaces e não consegui adaptar o código.
Se puderem me ajudar eu agradeço.

BuscaPacientePorId.xhtml
<ui:composition template="template.xhtml"
                xmlns="http://www.w3.org/1999/xhtml"
                xmlns:p="http://primefaces.prime.com.tr/ui"
                xmlns:f="http://java.sun.com/jsf/core"
                xmlns:h="http://java.sun.com/jsf/html"
                xmlns:ui="http://java.sun.com/jsf/facelets">

    <ui:define name="title"> Busca de Paciente </ui:define>
    <ui:define name="content">

        <h:form >
            <p:panel style="width: 800PX" >

                <h:panelGrid columns="2"  >
                    <p:panel style="width: 300PX" header="Pesquisar pelo Código" >
                        <h:inputText value="#{pacienteBean.paciente.codPaciente}"/>
                        <h:commandButton value="Pesquisar" action="BuscaPacientePorId.jsf" actionListener="#{pacienteBean.pacientePorId}"/>
                    </p:panel>
                </h:panelGrid>

                <p:dataTable  value="#{pacienteBean.pacientePorId}"   var="pac"  paginator="true" rows="20" scrollable="true" height="400"
                              selectionMode="single" paginatorTemplate="{CurrentPageReport}  {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"
                              rowsPerPageTemplate="5,10,15,20,25">
                    <p:column>
                        <f:facet name="header">
                            <h:outputText value="Código" />
                        </f:facet>
                        <h:outputText value="#{pac.codPaciente}"  />
                    </p:column>

                    <p:column>
                        <f:facet name="header">
                            <h:outputText value="Nome" />
                        </f:facet>
                        <h:outputText value="#{pac.nomePaciente}" />
                    </p:column>

                    <p:column>
                        <f:facet name="header">
                            <h:outputText value="RG" />
                        </f:facet>
                        <h:outputText value="#{pac.rg}" />
                    </p:column>

                    <p:column>
                        <f:facet name="header">
                            <h:outputText value="CPF" />
                        </f:facet>
                        <h:outputText value="#{pac.cpf}" />
                    </p:column>

                    <p:column>
                        <f:facet name="header">
                            <h:outputText value="Nascimento"/>

                        </f:facet>
                        <h:outputText value="#{pac.dataNacimento}" />
                    </p:column>
                </p:dataTable>



                <h:panelGrid columns="2" >
                    <p:panel>
                        <h:outputText value="Nome"/>
                        <h:outputText value="#{pacienteBean.paciente.nomePaciente}" />
                    </p:panel>
                </h:panelGrid>


            </p:panel>
        </h:form>
    </ui:define>
</ui:composition>
PacienteBean.java
public List<Paciente> getPacientePorId() {
        List<Paciente> bpacientesId = new ArrayList<Paciente>();
        String sql = "select * from paciente where codPaciente like ?";

        try {
            PreparedStatement stmt = this.conexao.prepareStatement(sql);
             stmt.setInt(1,getPaciente().getCodPaciente());

            ResultSet rs = stmt.executeQuery();


        while (rs.next()) {
            Paciente pac = new Paciente();

            int codigo = rs.getInt("codPaciente");
            String nome = rs.getString("nomePaciente");
            String rg = rs.getString("rg");
            String cpf = rs.getString("cpf");
            Date data = rs.getDate("dataNascimento");
            String endereco = rs.getString("endereco");
            String cidade = rs.getString("cidade");
            String estado = rs.getString("estado");

            pac.setCodPaciente(codigo);
            pac.setNomePaciente(nome);
            pac.setRg(rg);
            pac.setCpf(cpf);
            pac.setDataNacimento(data);
            pac.setEndereco(endereco);
            pac.setCidade(cidade);
            pac.setEstado(estado);

            bpacientesId.add(pac);
            }

        } catch (SQLException ex) {
            Logger.getLogger(PacienteBean.class.getName()).log(Level.SEVERE, null, ex);
        }
        return bpacientesId;

    }

Minha dúvida é como substituir o datatable por campos editáveis como inputtext para que eu possa tanto editar quanto excluir.
Preciso disso para o meu TCC

Obrigado a todos.

Meu amigo jure por Deus que este projeto é só para estudos mesmo e que não tem nada haver com orientação a objeto :D e tb que depois de entregar o tcc vc pode jogar fora :D
só brincando hein rs
nada pessoal

asandro1501

Não posso jurar por Deus que vou fazer isso, mas neste momento eu preciso terminar este projeto, por incrível que pareça não consigo fazer esta parte.
Depois de formado pretendo estudar o java do zero e fazer coisas descentes.
Bem, quanto a sua colocação não sei dou risadas ou choro, mas valeu pela força que você me deu em outros posts.

Abraço

R

blz cara, desculpa qualquer brincadeira ai valeu. Mas pense o seguinte:
caso seu projeto tenha 10 tabelas para serem criadas, vc vai ter que repetir o codigo para criar alterando poucas coisas tipo o sql e o retorno para criar o objeto a ser passado para o usuario verificar. Então vc poderia criar um class tipo
lembrando ainda que esta não é o melhor método, mas como não estamos falando em padroes , podemos melhorar o seu projeto para vc termina-lo mais rapido e tentar escrever menos código possivel e lembrando que voce esta utilizando jdbc, para realizar consultas no banco fica mais trabalhoso.

não é aconselhavel colocar sql no backbean, pois fica dificil de reutilizar este codigo ai.

vc poderia fazer:

Paciente pacientes = facadePaciente.consultaPorId(id);

neste caso aqui, onde vc precisar consultar o paciente pelo id, voce vai poder reutilizar, no seu caso, se houver uma necessidade de fazer uma consulta do paciente por id, vc vai ter que copiar e colar em todo o projeto. Assim vc vai extender o projeto e caso haja uma necessidade de alterar o codigo de consultaPorId, vc vai ter que sair procurando onde vc colou o codigo e vai ter que fazer alteraçao na mao.

Falei para dar um toque mesmo hein e estou disponivel para ajudar vc, bom não só eu como toda a comunidade… abraços

asandro1501

Não esquenta, eu tenho consciência do padrão do projeto que eu to fazendo, mas pra mim é difícil entender estes conceitos todos, pra quem só programava em delphi isso tudo é muito diferente.
Mas neste momento eu tenho que me preocupar com o tcc, além do desenvolvimento tem toda a parte teórica pra escrever ainda. Fazer isso em menos de 2 meses é complicado. Já andei pesquisando alguns cursos pra fazer em 2011.

Deixando a choradeira de lado, minha ideia é fazer o sistema o mais simples possível utilizando jsf+facelets , pra isso to fazendo um CRUD puro sem framework, até porque pra mim é mais fácil entender o que está acontecendo e não preciso aprender mais uma ferramenta neste momento, só por causa do tempo.

Bem, ontem eu consegui fazer o que queria, já tenho o cadastro, uma listagem geral, lista por nome do paciente e uma lista por id, utilizando qualquer uma destas lista eu consigo selecionar uma linha e direcionar para as telas de exclusão ou alteração.

Ainda tem uns probleminhas como, eu preciso selecionar a linha antes de clicar em um dos botões, sendo que estes botões estão na mesma linha do datatable. Outro probleminha é que cada vez que eu realizo o cadastro, excluo ou altero algum registro o formulário fica preenchido, ele deveria ficar vazio.

E o último passo seria a realização dos relatórios, a criação dos relatórios é tranquila, mas não sei chamar através do jsf. Ainda teria que implementar uma autenticação de usuário, só usuários com permissão podem acessar estes relatórios.

De qualquer forma, eu volto a agradecer você e aos outros usuários da comunidade que se dispuseram a me ajudar, contribuiram muito pra esclarecer algumas dúvidas.

Abraço

R
1 - para apagar o formulario, vc precisa dar um new no tipo de objeto do formulario. Depois que vc salvar é  dar um new Paciente()

2 - na tabela que vc mostrou ai eu não vi os botões. Então coloca o código das tabelas que ficar mais facil de eu te mostrar como pegar a linha da tabela

3 - sempre que vc fizer algo , ou seja, cadastrar, excluir ou alterar , vc deve dar um new no objeto; paciente = new Paciente();

4 - mostra como vc esta chamando o relatorio que te dou um toque;
asandro1501

Boa tarde

Segue o código da página CadastraPaciente.xhtml
<ui:composition template="template.xhtml"
                xmlns="http://www.w3.org/1999/xhtml"
                xmlns:p="http://primefaces.prime.com.tr/ui"
                xmlns:f="http://java.sun.com/jsf/core"
                xmlns:h="http://java.sun.com/jsf/html"
                xmlns:ui="http://java.sun.com/jsf/facelets">


    <ui:define name="title"> Cadastro de Paciente </ui:define>

    <ui:define name="content">

        <h:form >

            <p:panel   header="Cadastro Pacientes" style="width: 550PX">
                <p:messages />
                <h:panelGrid columns="2"  cellspacing="10">

                    <h:outputText value="Nome: "/>
                    <h:inputText value="#{pacienteBean.paciente.nomePaciente}" style="width: 350PX" required="true" requiredMessage="Campo [Nome] obrigatório"/>

                    <h:outputText value="RG "/>
                    <h:inputText value="#{pacienteBean.paciente.rg}" required="true" requiredMessage="Campo [RG] obrigatório"/>

                    <h:outputText value="CPF "/>
                    <h:inputText value="#{pacienteBean.paciente.cpf}"  required="true" requiredMessage="Campo [CPF] obrigatório"/>

                    <h:outputText value="Nascimento: "/>
                    <p:inputMask value="#{pacienteBean.paciente.dataNacimento}" mask="99/99/9999">
                        <f:convertDateTime pattern="dd/MM/yyyy"/>
                    </p:inputMask>
                                       


                    <h:outputText value="Endereço: "/>
                    <h:inputText value="#{pacienteBean.paciente.endereco}" style="width: 350PX"/>

                    <h:outputText value="Cidade: "/>
                    <h:inputText value="#{pacienteBean.paciente.cidade}" style="width: 350PX"/>

                    <h:outputText value="Estado:"/>
                    <h:inputText value="#{pacienteBean.paciente.estado}"  maxlength="2" style="width: 50PX" />

                    <h:commandButton value="Salvar"  action="#{pacienteBean.gravaPaciente}"  style="width: 100PX" />
                    <h:commandButton value="Limpar" type="reset" style="width: 100PX"/>
                    

                </h:panelGrid>

            </p:panel>
        </h:form>

        <h:form>
            <p:panel style="width: 300PX">
                <h:commandButton action="ListaPaciente.jsf"  value="Lista de Pacientes"/>
            </p:panel>
        </h:form>

    </ui:define>
</ui:composition>

O botão está na linha 44

Abaixo segue o método de gravação de um novo registro
public void gravaPaciente() {
        String sql = "insert into paciente(nomePaciente,rg,cpf,dataNascimento,endereco,cidade,estado)"
                + "values (?,?,?,?,?,?,?)";  //String que recebe o código sql usado na inserção

        PreparedStatement Pstmt;
        try {
            Pstmt = this.conexao.prepareStatement(sql);  //Amarra a instrução sql na conexao
            Pstmt.setString(1, paciente.getNomePaciente());//Envia atravé statement o valor na posição 1 o valor pego no form
            Pstmt.setString(2, paciente.getRg());
            Pstmt.setString(3, paciente.getCpf());

            //setDate é um sql.Date, não aceita o que vem do contato que é um util.Date
            //então é feita uma conversão para sql.Date e transformado em milisegundos(tipo long)
            Pstmt.setDate(4, new java.sql.Date(paciente.getDataNacimento().getTime()));
            Pstmt.setString(5, paciente.getEndereco());
            Pstmt.setString(6, paciente.getCidade());
            Pstmt.setString(7, paciente.getEstado());

            Pstmt.execute(); //Executa a instrução sql
            Pstmt.close();
            


        } catch (SQLException ex) {
            Logger.getLogger(PacienteBean.class.getName()).log(Level.SEVERE, null, ex);
        }

    }


   public List<Paciente> getPacientes() throws SQLException {
        List<Paciente> pacientes = new ArrayList<Paciente>();

        String sql = "select * from paciente order by nomePaciente";
        PreparedStatement stmt;


        try {

            stmt = this.conexao.prepareStatement(sql);
            ResultSet rs = stmt.executeQuery(sql);

            while (rs.next()) {
                Paciente paciente = new Paciente();

                int codigo = rs.getInt("codPaciente");
                String nome = rs.getString("nomePaciente");
                String rg = rs.getString("rg");
                String cpf = rs.getString("cpf");
                Date data = rs.getDate("dataNascimento");
                String endereco = rs.getString("endereco");
                String cidade = rs.getString("cidade");
                String estado = rs.getString("estado");

                paciente.setCodPaciente(codigo);
                paciente.setNomePaciente(nome);
                paciente.setRg(rg);
                paciente.setCpf(cpf);
                paciente.setDataNacimento(data);
                paciente.setEndereco(endereco);
                paciente.setCidade(cidade);
                paciente.setEstado(estado);

                pacientes.add(paciente);
        
 
            }
        } catch (SQLException ex) {
            Logger.getLogger(PacienteBean.class.getName()).log(Level.SEVERE, null, ex);
        }


        return pacientes;
    }

A partir da linha 31 tem um método de listagem, você pode me dar uma mão pra fechar a conexão desta listagem? Andei vendo que o método return é a última coisa de uma Lista, não entendi como faço pra fechar as conexões com o banco.

Abraço

R

bom depois que seu dao retornar a lista, vc pode fechar a conexão com o banco, mas…
como seu projeto é web, fica muito custoso ficar abrindo e fechando a conexão com o banco. Seria melhor que vc abrisse uma conexão para o usuario que estivesse logado e quando ele saisse, vc fechava a conexão dele. entende?

vc cria uma conexão e fica gerenciando somente aquela para aquele usuario. Agora vc tem que gerenciar direito tipo, assegurar que o sistema não abra várias conexoes para um mesmo usuario e tb não fechar no momento errado.

asandro1501

Interessante, isso que vc tá sugerindo talvez já sirva pra outra coisa, preciso restringir o acesso por permissão de usuário. Por exemplo, Administrador tem acesso total do sistema, Atendentes somente aos cadastros de pacientes e agendamentos.
Esse tipo de gerenciamento que vc sugeriu poder servir pra isso também né. Você pode me recomendar algum material sobre o assunto?

Abraço

R

para fechar a conexão com o banco, depois do seu while{} ou seja, depois que a lista de pacientes esteja pronta é só vc colocar

this.conexao.close();

assim vc fecha a conexão e sua lista estara toda carregada

Criado 29 de outubro de 2010
Ultima resposta 9 de nov. de 2010
Respostas 17
Participantes 3