1. java
  2. android
  3. c#
  4. .net
  5. javascript
  6. php
  7. jquery
  8. html
  9. sql

p:commandButton não funciona dentro do p:dataTable

Olá Pessoal,

estou desenvolvendo um projeto de gerenciamento de escalas de serviços para onde trabalho em java WEB e me deparei com um problema.

Tenho 2(duas) Divs, cada uma tem um formulario de consulta e um p:datatable. O que estou tentando fazer é realizar uma consulta na primeira Div e quando aparecer o resultado(uma lista de militares) ao lado de cada linha usrgirá o botão de "Adicionar ao Grupo". Quando clicar no botão, eu submeto via ajax(usando o ajax do primeFaces) para que o militar seja adicionado na outra Div que possui um List de militares que sao exibidos num p:datatable.

O grande problema é, quando os militares aparecem na lista, ao acionar o botão "adicionar ao grupo" o JSF não executa nada. tentei dar um sistem.out no metodo, porém ele nem chama o método.

Faz uns 3 dias que estou lutando para resolver isso e não consigo. alguem pode me ajudar?

segue o meu codigo da pagina XHTML e das classes GrupoBean e MilitarBean:

gerenciarGrupo.xhtml

<!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"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:p="http://primefaces.org/ui">

<ui:composition template="/templates/principal.xhtml">
    <ui:define name="corpo">
        <!-- GERENCIAMENTO DE GRUPOS -->
        <div class="row" id="container">
            <!-- BUSCA DE MILITARES PARA ADICIONAR AOS GRUPOS -->
            <div class="span6">
                <h:form id="localizarMilitar">
                    <h1>Consultar Militar</h1>
                    <h:panelGrid columns="2">
                        <h:outputLabel value="Digite o nome do militar" />
                        <h:inputText id="nomeDoMilitar" value="#{militarBean.nome}" />
                    </h:panelGrid>
                    <p:commandButton action="#{militarBean.consultar}"
                        value="consultar" update=":formAddMilitar:listaDeMilitar">
                    </p:commandButton>
                </h:form>

                <!-- TABELA PARA EXIBIR OS MILITARES CONSULTADOS COM AJAX -->
                <h:form id="formAddMilitar">
                    <p:dataTable id="listaDeMilitar" value="#{militarBean.consulta}"
                        var="militar" rules="rows" cellpadding="4"
                        styleClass="table table-striped">
                        <f:facet name="header">Resultado da Consulta</f:facet>
                        <p:column>
                            <f:facet name="header">Matricula</f:facet>
                                 #{militar.matricula}
                             </p:column>
                        <p:column>
                            <f:facet name="header">Patente</f:facet>
                                 #{militar.patente}
                             </p:column>
                        <p:column>
                            <f:facet name="header">Nome</f:facet>
                                 #{militar.nomeDeGuerra}
                             </p:column>
                        <p:column>
                            <f:facet name="header">add</f:facet>
                            <p:commandLink action="#{grupoBean.addMilitar}" update=":listar">
                                <h:graphicImage library="img" name="add.png" />
                                <f:setPropertyActionListener target="#{grupoBean.militar}"
                                    value="#{militar}" />
                            </p:commandLink>
                        </p:column>
                    </p:dataTable>
                </h:form>

            </div>

            <!-- GERENCIAMENTO DE GRUPOS -->
            <div class="span6" id="grupos">
                <h1>Gerenciamento de Grupo</h1>
                <h:form id="localizarGrupo">
                    <h:messages />
                    <h:panelGrid columns="2">
                        <h:outputText value="Selecione um grupo" />
                        <h:selectOneMenu value="#{grupoBean.grupoSelectionado}">
                            <f:selectItems value="#{grupoBean.lista}" />
                        </h:selectOneMenu>
                        <p:commandButton value="Carregar Grupo"
                            actionListener="#{grupoBean.carregarGrupo}" update=":listar" />
                        <!-- TESTE PARA EXIBIR O ID DO GRUPO CARREGADO -->
                        <!--                         <h:outputText value="#{grupoBean.grupo.codigo}" id="teste"/> -->
                    </h:panelGrid>
                </h:form>

                <!-- TABELA PARA EXIBIR OS MILITARES ATUALMENTE NO GRUPO -->
                <p:dataTable id="listar" value="#{grupoBean.grupo.militares}"
                    var="militar" rules="rows" cellpadding="5"
                    styleClass="table table-striped">
                    <f:facet name="header">Militares do grupo</f:facet>
                    <p:column>
                        <f:facet name="header">Nome</f:facet>
                        <h:outputText value="#{militar.nomeDeGuerra}" />
                    </p:column>
                    <p:column>
                        <f:facet name="header">Patente</f:facet>
                        <h:outputText value="#{militar.patente}" />
                    </p:column>
                    <p:column>
                        <f:facet name="header">Matricula</f:facet>
                        <h:outputText value="#{militar.matricula}" />
                    </p:column>
                </p:dataTable>
            </div>
        </div>

        <!--  -->

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

</html>

GrupoBean.java

package escala.bean;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.model.SelectItem;

import escala.grupo.Grupo;
import escala.grupo.GrupoRN;
import escala.militar.Militar;

@ManagedBean(name = "grupoBean")
@ViewScoped
public class GrupoBean implements Serializable{
    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    private Grupo grupo;
    private Militar militar;
    private int idMilitar;
    private int grupoSelectionado;
    private List<Militar> militares;

    // LIST DE SELECTITEM PARA UTILIZARMOS NA PAGINA E SELECIONAR O GRUPO QUE
    // DESEJAMOS EDITAR
    private List<SelectItem> gruposSelect;

    public GrupoBean() {
        this.gruposSelect = this.getLista();
        this.militares = new ArrayList<Militar>();

    }

    // METODO PARA RETORNAR A LISTA DE SELECT ITEM COM OS GRUPOS DO BANCO DE
    // DADOS
    public List<SelectItem> getLista() {
        ArrayList<SelectItem> lista = new ArrayList<SelectItem>();
        GrupoRN grupoRN = new GrupoRN();
        List<Grupo> resultado = grupoRN.listar();

        for (Grupo g : resultado) {
            SelectItem item = new SelectItem(g.getCodigo(), g.getNome());
            lista.add(item);
        }

        return lista;
    }

    // ======================================================================
    // ADICIONA O MILITAR NO GRUPO
    // =====================================================================
    public void addMilitar() {
        if(this.grupo.getMilitares() == null)
            this.grupo.setMilitares(new ArrayList<Militar>());
        this.grupo.addMilitar(this.militar);
        GrupoRN rn = new GrupoRN();
        rn.salvar(this.grupo);
        System.out.println("Militar Adicionado");
    }

    // =====================================================================
    // CARREGA O GRUPO PARA SER MANIPULADO
    // =====================================================================
    public void carregarGrupo() {
        GrupoRN rn = new GrupoRN();
        this.grupo = rn.carregar(this.grupoSelectionado);
        System.out.println("grupo Carregado");
    }

    public Grupo getGrupo() {
        return grupo;
    }

    public void setGrupo(Grupo grupo) {
        this.grupo = grupo;
    }

    public Militar getMilitar() {
        return militar;
    }

    public void setMilitar(Militar militar) {
        this.militar = militar;
    }

    public void setGruposSelect(List<SelectItem> gruposSelect) {
        this.gruposSelect = gruposSelect;
    }

    public int getGrupoSelectionado() {
        return grupoSelectionado;
    }

    public void setGrupoSelectionado(int grupoSelectionado) {
        this.grupoSelectionado = grupoSelectionado;
    }

    public List<SelectItem> getGruposSelect() {
        return gruposSelect;
    }

    public Integer getIdMilitar() {
        return this.idMilitar;
    }

    public void setIdMilitar(int id) {
        this.idMilitar = id;
    }

    public List<Militar> getMilitares() {
        if (grupo != null) {
            this.militares = this.grupo.getMilitares();
            return this.militares;
        }
        return null;
    }

    public void setMilitares(List<Militar> m) {
        this.militares = m;
    }

}

MilitarBean.java

package escala.bean;

import java.io.Serializable;
import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;

import escala.militar.Militar;
import escala.militar.MilitarRN;

@ManagedBean(name="militarBean")
@ViewScoped
public class MilitarBean implements Serializable{
    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    private Militar militar = new Militar();
    private String confirmarSenha;
    private List<Militar> lista;
    //ARMAZENA O DESTIDO ADEQUADO PARA O RETORNO DO METODO SALVAR
    //POIS UTILIZAREMOS O MESMO FORMULARIO DE CADASTRO PARA ATUALIZAR OS DADOS DO MILITAR
    private String destinoSalvar;
    //BUSCA PELO NOME DO MILITAR
    private String nome;
    private List<Militar> consulta;
    private Militar teste;

    public String novo(){
        this.destinoSalvar = "sucesso";
        this.militar = new Militar();
        this.militar.setAtivo(true);
        return "cadastro";
    }

    public String salvar(){
        FacesContext context = FacesContext.getCurrentInstance();

        String senha = this.militar.getSenha();
        if(!senha.equals(this.confirmarSenha)){
            FacesMessage facesMessage = new FacesMessage("A senha não foi confirmada corretamente");
            context.addMessage(null, facesMessage);
            return null;
        }

        MilitarRN militarRN = new MilitarRN();
        militarRN.salvar(militar);

        return this.destinoSalvar;
    }

    public String editar(){
        this.confirmarSenha = this.militar.getSenha();
        return "/admin/cadastro";
    }

    public String excluir(){
        MilitarRN militarRN = new MilitarRN();
        militarRN.excluir(militar);
        //FAZ COM QUE A LISTA SEJA ATUALIZADA SEM O MILITAR EXCLUIDO
        this.lista = null;
        return null;
    }

    public Militar getMilitar() {
        return militar;
    }
    public void setMilitar(Militar militar) {
        this.militar = militar;
    }
    public String getConfirmarSenha() {
        return confirmarSenha;
    }
    public void setConfirmarSenha(String confirmarSenha) {
        this.confirmarSenha = confirmarSenha;
    }

    public List<Militar> getLista(){
        if(this.lista == null){
            MilitarRN militarRN = new MilitarRN();
            this.lista = militarRN.listar();
        }
        return this.lista;
    }

    public String getDestinoSalvar() {
        return destinoSalvar;
    }

    public void setDestinoSalvar(String destinoSalvar) {
        this.destinoSalvar = destinoSalvar;
    }

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

    public String getNome() {
        return nome;
    }

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

    public List<Militar> getConsulta() {
        if(this.nome != null){
            MilitarRN militarRN = new MilitarRN();
            this.consulta = militarRN.buscarPorNomeDeGuerra(this.nome);
        }
        return this.consulta;

    }

    //METODO PARA CONSULTAR MILITAR PELO NOME
    public void consultar(){
        if(this.nome != null){
            MilitarRN militarRN = new MilitarRN();
            this.consulta = militarRN.buscarPorNomeDeGuerra(this.nome);
        }
    }

    public void setConsulta(List<Militar> consulta) {
        this.consulta = consulta;
    }

    public Militar getTeste() {
        return teste;
    }

    public void setTeste(Militar teste) {
        this.teste = teste;
    }





}

Não entendo porque o botão nao funciona. alguem me dá uma luz ai.

Obrigado galera!

RESOLVIDO!

gson! valeu pela ajuda. Consegui resolver o problema:

Seguinte, estou usando annotations para declarar o escopo do BEAN, porém no inicio do projeto coloquei a declaração no faces-config.xml e lá também tinha a declaração do escopo do projeto, logo o XML mandava mais.

removi do faces-config.xml e funcionou legal!

valeu!

  1. Você vai ver essas setas em qualquer página de pergunta. Com elas, você pode dizer se uma pergunta ou uma resposta foram relevantes ou não.
  2. Edite sua pergunta ou resposta caso queira alterar ou adicionar detalhes.
  3. Caso haja alguma dúvida sobre a pergunta, adicione um comentário. O espaço de respostas deve ser utilizado apenas para responder a pergunta.
  4. Se o autor da pergunta marcar uma resposta como solucionada, esta marca aparecerá.
  5. Clique aqui para mais detalhes sobre o funcionamento do GUJ!

3 respostas

Não é a resposta que estava procurando? Procure outras perguntas com as tags primefaces java jsf ou faça a sua própria pergunta.