[RESOLVIDO] Problema com <p:commandButton> não ta executando o método do actionListener

Boa Noite Pessoal,
Sou iniciante em Java Web estou com dificuldade em fazer um <p:commandButton> executar um método que está na minha classe controller.
Nos métodos dos botões eu coloquei apenas para imprimir qualquer coisa, a intenção era pra ver se o botão tava excutando o metodo, porém ele não imprime nada.
se alguem poder ajudar desde ja, agradeço

minha pagina pesquisar.xhtm:

[code]<?xml version="1.0" encoding="UTF-8"?>


            <h:panelGrid columns="3">
                <h:outputLabel for="numero" value="Número"/>
                <p:inputText size="20" id="numero" value="" label="numero"/>
                
                <p:commandButton value="Pesquisar" id="pesquisar" action="#{apartamentoController.pesquisarApartamento()}"/>
            </h:panelGrid><br/>
            
            <p:dataTable var="apartamento" value="#{apartamentoController.listarApartamentos}">  

                    <p:column headerText="Número">  
                        <h:outputText value="#{apartamento.numero}" />  
                    </p:column>   

                    <p:column headerText="Descrição">  
                        <h:outputText value="#{apartamento.descricao}" />  
                    </p:column>  

                    <p:column headerText="Status">  
                        <h:outputText value="#{apartamento.statusApartanto}" />  
                    </p:column>  
                    
                    <p:column headerText="Ação">  
                        <h:outputText value="" />  
                    </p:column>  
                </p:dataTable>  
            <br/>
            <p:commandButton value="Novo" actionListener="#{apartamentoController.novo()}"/>
            <h:panelGrid>
                
            </h:panelGrid>
            
            </h:form>
        </p:panel>
    </ui:define>
</ui:decorate>
[/code]

minha classe apartamentoController:

[code]package br.com.sgh.controller;

import br.com.sgh.dao.ApartamentoDao;
import br.com.sgh.dao.ApartamentoDaoImp;
import br.com.sgh.model.Apartamento;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.model.DataModel;
import javax.faces.model.ListDataModel;

@ManagedBean
@SessionScoped
public class ApartamentoController {

private Apartamento apartamento;
private DataModel listaApartamentos;

public DataModel getListarApartamentos() {
    List<Apartamento> lista = new ApartamentoDaoImp().list();
    listaApartamentos = new ListDataModel(lista);
    return listaApartamentos;
}

public Apartamento getApartamento() {
    return apartamento;
}

public void setApartamento(Apartamento apartamento) {
    this.apartamento = apartamento;
}

public String prepararAdicionarApartamento() {
    apartamento = new Apartamento();
    return "gerenciarApartamento";
}

public String prepararAlterarApartamento() {
    apartamento = (Apartamento) (listaApartamentos.getRowData());
    return "gerenciarApartamento";
}

public String excluirApartamento() {
    Apartamento apartamentoTemp = (Apartamento) (listaApartamentos.getRowData());
    ApartamentoDao dao = new ApartamentoDaoImp();
    dao.remove(apartamentoTemp);
    return "index";
}

public String adicionarApartamento() {
    ApartamentoDao dao = new ApartamentoDaoImp();
    dao.save(apartamento);
    return "index";
}

public String alterarApartamento() {
    ApartamentoDao dao = new ApartamentoDaoImp();
    dao.update(apartamento);
    return "index";
}

public void pesquisarApartamento(){
    System.out.println("Acionou o botão pesquisar!");
}

public void novo(){
    System.out.println("Acionou!");
}

}[/code]

dica rapida, qndo vc for utilizar actionListener
seu metodo tem que receber o parametro ActionEvent,
se não for utilizar, não use actionListener use o somente o action. Segundo ponto é colocar o que deseja processar com o atributo “process” com alguns valores possiveis, como @this @form @all @none @parent.

troque action por actionListener.

Obs: creio que não precisa passar mais o evento como parâmetro.

Cara uma pergunta…o botão novo está funcionando???

[]s,

troque action por actionListener.

Obs: creio que não precisa passar mais o evento como parâmetro.

Quanta resposta repetida :smiley:

HAHUHUAHUA sem querer :stuck_out_tongue:

então pessoal, nem um dos botões está funcionando, nem o com action e nem o com actionListener :confused:
não sei o que pode ta errado, coloquei o form mas mesmo assim parece que não ta entrando o método.

colocou o atributo process no botao?

coloquei o atributo <p:commandButton value="Novo" process="@parent" action="#{apartamentoController.novo()}"/> com todos os parâmetros que você mencionou acima, mas mesmo assim não ta funcionando :confused: é como se nem chamasse meu método.

vc quer processar o form todo? coloque @form
alterou já o actionListener para action? ou ajustou o método para receber um evento?

Consegui fazer o botão novo acionar o método, coloquei o <h:commandButton> com o atributo process="@this" fora do <p:panel>, mas o botão pesquisar ainda não ta acionando o método, ele só funciona se eu fizer a mesma coisa do botão novo, porém se eu tentar fazer desse jeito vou bagunçar a minha pagina, alguém tem ideia de como eu devo fazer para funcionar? valeu :slight_smile:

Bom dia, eduardos

Adiciona o atributo ajax=“false” no <p:commandButton> que funciona, no primeFaces o commandButton vem com o ajax=“true” por default.

[quote=Everton Koga]Bom dia, eduardos

Adiciona o atributo ajax=“false” no <p:commandButton> que funciona, no primeFaces o commandButton vem com o ajax=“true” por default.[/quote]

Boa tarde everton koga,
Tentei resolver meu problema usando a tal ajax=“false” no meu botão pesquisar, mas não funcionou :confused: com essa tag parece que ele atualiza a pagina mas não aciona o método.

posta o código do xhtml e do controlador para eu dar uma olhada

Boa Tarde, consegui resolver esse problema, hoje mais cedo pesquisando no trabalho, descobri esse problema tava relacionado ao <h:form> pois eu estou usando um template.
Lá na minha pagina template.xhtml eu declarei um <p:layoutUnit > dentro de uma tag <h:form> e tava colocando também na pagina que herdava esse template.
o problema se resolveu quando eu tirei as tags <h:form> da minha pagina pesquisar.xhtml

minha pagina template.xhtml continuou do jeito que tava:

[code]<h:form>
<p:layoutUnit position=“center” style="border: 0; ">

                    <ui:insert name="centro"  >
                        O que estiver aqui será substituido!
                    </ui:insert>

                </p:layoutUnit> 

</h:form>[/code]

pesquisar.xhtml:

[code]<?xml version="1.0" encoding="UTF-8"?>

            <br/>
            <p:panel id="panel" header="Pesquisar Apartamento" style="border: 0px; background: #dddddd;" >
            <h:panelGrid columns="3">
                <h:outputLabel for="numero" value="Número"/>
                <!--<p:inputText size="20" id="numero" value="" label="numero"/>-->
                
                <p:commandButton value="Pesquisar" actionListener="#{apartamentoController.pesquisarApartamento()}"/>
            </h:panelGrid><br/>
            
            <p:dataTable var="apartamento" value="#{apartamentoController.listarApartamentos}">  

                    <p:column headerText="Número">  
                        <h:outputText value="#{apartamento.numero}" />  
                    </p:column>   

                    <p:column headerText="Descrição">  
                        <h:outputText value="#{apartamento.descricao}" />  
                    </p:column>  

                    <p:column headerText="Status">  
                        <center>
                        <h:outputText value="#{apartamento.statusApartanto ? 'Ocupado': 'Livre'}" />  
                        </center>
                    </p:column>  
                    
                    <p:column headerText="Ação">  
                        <h:outputText value="" />  
                    </p:column>  
                </p:dataTable>  
            <br/>
          
             </p:panel>

       <p:commandButton value="Novo" process="@this" actionListener="#{apartamentoController.novo()}"/>
    </ui:define>
</ui:decorate>
[/code]

e a minha classe ControllerApartamento.java continuou do mesmo jeito também:

[code]package br.com.sgh.controller;

import br.com.sgh.dao.ApartamentoDao;
import br.com.sgh.dao.ApartamentoDaoImp;
import br.com.sgh.model.Apartamento;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.model.DataModel;
import javax.faces.model.ListDataModel;
import javax.swing.JOptionPane;

@ManagedBean
@SessionScoped
public class ApartamentoController{

private Apartamento apartamento;
private DataModel listaApartamentos;

public DataModel getListarApartamentos() {
    List<Apartamento> lista = new ApartamentoDaoImp().list();
    listaApartamentos = new ListDataModel(lista);
    return listaApartamentos;
}

public Apartamento getApartamento() {
    return apartamento;
}

public void setApartamento(Apartamento apartamento) {
    this.apartamento = apartamento;
}

public String prepararAdicionarApartamento() {
    apartamento = new Apartamento();
    return "gerenciarApartamento";
}

public String prepararAlterarApartamento() {
    apartamento = (Apartamento) (listaApartamentos.getRowData());
    return "gerenciarApartamento";
}

public String excluirApartamento() {
    Apartamento apartamentoTemp = (Apartamento) (listaApartamentos.getRowData());
    ApartamentoDao dao = new ApartamentoDaoImp();
    dao.remove(apartamentoTemp);
    return "index";
}

public String adicionarApartamento() {
    ApartamentoDao dao = new ApartamentoDaoImp();
    dao.save(apartamento);
    return "index";
}

public String alterarApartamento() {
    ApartamentoDao dao = new ApartamentoDaoImp();
    dao.update(apartamento);
    return "index";
}

public void pesquisarApartamento(){
    System.out.println("Acionou o botão pesquisar!");
}

public void novo(){
    System.out.println("######Acionou!");
}

}
[/code]

Obrigado pela ajuda de vocês amigos, obrigado :slight_smile: