Solucionado (ver solução)
Solucionado
(ver solução)
8
respostas

commandButton alterar parou de funcionar quando passei para <p:>

Olá, Quando mudei meu código HTML para JSF meu botão de alterar parou de funcionar, poderiam me ajudar!

Código JSF

<p:commandButton value="alterar" icon="fa fa-fw fa-edit"
                        actionListener="#{livroBean.carregar(livro)}"/>

Meu método que esta sendo chamado pelo Button

public void carregar(Livro livro) {
        System.out.println("Carregando livro " + livro.getTitulo());
        this.livro = livro;
    }

Deve ser porque esta faltando o Update e Process no button, mas eu não sei usalos

att, Felipe Vasconcellos

8 respostas

Felipe quando você clica no botão é impresso no console essa mensagem "Carregando livro ..."?

Passa o html inteiro para dar uma olhada melhor?

Sim, aparece no console!

<?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://xmlns.jcp.org/jsf/html"
    xmlns:f="http://xmlns.jcp.org/jsf/core"
    xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
    xmlns:p="http://primefaces.org/ui">

<ui:composition template="_template.xhtml">
    <ui:define name="titulo">
        <p:outputPanel>Novo Livro</p:outputPanel>
    </ui:define>
    <ui:define name="conteudo">
        <h:form>

            <p:messages id="messages" />
            <p:fieldset legend="Dados do Livro">
                <p:outputPanel>Dados do Livro</p:outputPanel>
                <p:panelGrid columns="2">

                    <p:outputLabel value="Titulo:" for="titulo" />
                    <p:inputText id="titulo" value="#{livroBean.livro.titulo}"
                        required="true" requiredMessage="Título obrigatório"
                        validadorMessage="Título não pode ser superior a 40 caracteres">
                        <f:validateLength maximum="40" />
                        <f:ajax event="blur" render="messages" />
                    </p:inputText>

                    <p:outputLabel value="ISBN:" for="isbn" />
                    <p:inputMask id="isbn" value="#{livroBean.livro.isbn}"
                        validator="#{livroBean.comecaComDigitoUm}"
                        mask="999-9-99-999999-9">

                    </p:inputMask>

                    <p:outputLabel value="Preço:" for="preco" />
                    <p:inputText id="preco" value="#{livroBean.livro.preco}"
                        label="Preço">
                        <f:validateDoubleRange minimum="1.0" maximum="1000.00" />
                    </p:inputText>

                    <p:outputLabel value="Data de Lançamento:" for="dataLancamento" />
                    <p:calendar id="dataLancamento"
                        value="#{livroBean.livro.dataLancamento.time}"
                        pattern="dd/MM/yyyy" timeZone="America/Sao_Paulo" effect="fold">
                    </p:calendar>
                </p:panelGrid>
            </p:fieldset>

            <p:fieldset legend="Dados do Autor">
                <p:panelGrid columns="4">
                    <p:outputLabel value="Selecione Autor:" for="autor" />
                    <p:selectOneMenu value="#{livroBean.autorId}" id="autor">
                        <f:selectItems value="#{livroBean.autores}" var="autor"
                            itemLabel="#{autor.nome}" itemValue="#{autor.id}" />
                    </p:selectOneMenu>
                    <p:commandButton value="Gravar Autor"
                        action="#{livroBean.gravarAutor}" process="@this autor"
                        update="tabelaAutores" />

                    <p:commandLink value="ou cadastrar novo autor"
                        action="#{livroBean.formAutor}" immediate="true" update="@all" />
                </p:panelGrid>

                <p:dataTable value="#{livroBean.autoresDoLivro}" var="autor"
                    id="tabelaAutores" emptyMessage="Nenhum autor">
                    <p:column>
                        <h:outputText value="#{autor.nome}" />
                    </p:column>
                    <p:column>
                        <p:commandLink value="X"
                            action="#{livroBean.removerAutorDoLivro(autor)}"
                            update="tabelaAutores" process="@this" />
                    </p:column>
                </p:dataTable>
            </p:fieldset>

            <p:commandButton value="Gravar" action="#{livroBean.gravar}"
                process="@form" update="@form :formTabelaLivros:tabelaLivros" />
            <br />

        </h:form>
        <h:form id="formTabelaLivros">
            <p:dataTable value="#{livroBean.livros}" var="livro"
                id="tabelaLivros">

                <f:facet name="header">Livros</f:facet>

                <p:column headerText="Titulo" sortBy="#{livro.titulo}"
                    filterBy="#{livro.titulo}" filterMatchMode="startsWith">
                    <h:outputText value="#{livro.titulo}" />
                </p:column>

                <p:column headerText="ISBN" sortBy="#{livro.isbn}"
                    filterBy="#{livro.isbn}" filterMatchMode="contains">
                    <h:outputText value="#{livro.isbn}" />
                </p:column>

                <p:column headerText="Preço" sortBy="#{livro.preco}"
                    filterBy="#{livro.preco}"
                    filterFunction="#{livroBean.precoEhMenor}">
                    <h:outputText value="#{livro.preco}">
                        <f:convertNumber type="currency" pattern="R$ #0.00"
                            currencySymbol="R$" locale="pt_BR" />
                    </h:outputText>
                </p:column>

                <p:column headerText="Data" sortBy="#{livro.dataLancamento.time}"
                    filterBy="#{livro.dataLancamento.time}" filterMatchMode="contains">
                    <h:outputText value="#{livro.dataLancamento.time}">
                        <f:convertDateTime pattern="dd/MM/yyyy"
                            timeZone="America/Sao_Paulo" />
                    </h:outputText>
                </p:column>

                <p:column headerText="Remover">
                    <p:commandButton icon="fa fa-fw fa-remove" actionListener="#{livroBean.remover(livro)}" 
                         update="@form" process="@form" value="Remove"/> 
                </p:column>

                <p:column headerText="Alterar">
                    <p:commandButton value="alterar" icon="fa fa-fw fa-edit"
                        actionListener="#{livroBean.carregar(livro)}"/>
                </p:column>    

            </p:dataTable>
        </h:form>
        <ui:define name="texto">
                      Cadastro de Livros
                    </ui:define>
    </ui:define>
</ui:composition>

</html>

Felipe eu ainda estou meio perdido no seu cógido, quando você clica no botão alterar oque que acontecia? oque que você quer que aconteça quando clicar no botão alterar?

Boa tarde Alisson, Quando eu clico no botão alterar, as informações como Titulo, ISBN, Preço e Data de lançamento apareçam nos seus respectivos inputTexts para que eu posso alterar, e depois clicar em gravar para que a alteração seja feita.

ou seja, quando clico em alterar, eu quero jogar as informações nos inputTexts aonde usei para inserir, mas agora queria renomear as informações por lá mesmo.

att, Felipe Vasconcellos

solução!

E quando você ta clicando no botão alterar os seus campos não estou indo pro inputText? Seria isso? Então ta faltando você atualizar a pagina quando você clica no botão, tenta assim ok? No seu primeiro form que os input estão dentro da um nome para ele.

   <h:form id="teste" // aqui coloca um id ok?>

            <p:messages id="messages" />
            <p:fieldset legend="Dados do Livro">
                <p:outputPanel>Dados do Livro</p:outputPanel>
                <p:panelGrid columns="2">

                    <p:outputLabel value="Titulo:" for="titulo" />
                    <p:inputText id="titulo" value="#{livroBean.livro.titulo}"
                        required="true" requiredMessage="Título obrigatório"
                        validadorMessage="Título não pode ser superior a 40 caracteres">
                        <f:validateLength maximum="40" />
                        <f:ajax event="blur" render="messages" />
                    </p:inputText>

                    <p:outputLabel value="ISBN:" for="isbn" />
                    <p:inputMask id="isbn" value="#{livroBean.livro.isbn}"
                        validator="#{livroBean.comecaComDigitoUm}"
                        mask="999-9-99-999999-9">

                    </p:inputMask>

                    <p:outputLabel value="Preço:" for="preco" />
                    <p:inputText id="preco" value="#{livroBean.livro.preco}"
                        label="Preço">
                        <f:validateDoubleRange minimum="1.0" maximum="1000.00" />
                    </p:inputText>

                    <p:outputLabel value="Data de Lançamento:" for="dataLancamento" />
                    <p:calendar id="dataLancamento"
                        value="#{livroBean.livro.dataLancamento.time}"
                        pattern="dd/MM/yyyy" timeZone="America/Sao_Paulo" effect="fold">
                    </p:calendar>
                </p:panelGrid>
            </p:fieldset>

            <p:fieldset legend="Dados do Autor">
                <p:panelGrid columns="4">
                    <p:outputLabel value="Selecione Autor:" for="autor" />
                    <p:selectOneMenu value="#{livroBean.autorId}" id="autor">
                        <f:selectItems value="#{livroBean.autores}" var="autor"
                            itemLabel="#{autor.nome}" itemValue="#{autor.id}" />
                    </p:selectOneMenu>
                    <p:commandButton value="Gravar Autor"
                        action="#{livroBean.gravarAutor}" process="@this autor"
                        update="tabelaAutores" />

                    <p:commandLink value="ou cadastrar novo autor"
                        action="#{livroBean.formAutor}" immediate="true" update="@all" />
                </p:panelGrid>

                <p:dataTable value="#{livroBean.autoresDoLivro}" var="autor"
                    id="tabelaAutores" emptyMessage="Nenhum autor">
                    <p:column>
                        <h:outputText value="#{autor.nome}" />
                    </p:column>
                    <p:column>
                        <p:commandLink value="X"
                            action="#{livroBean.removerAutorDoLivro(autor)}"
                            update="tabelaAutores" process="@this" />
                    </p:column>
                </p:dataTable>
            </p:fieldset>

            <p:commandButton value="Gravar" action="#{livroBean.gravar}"
                process="@form" update="@form :formTabelaLivros:tabelaLivros" />
            <br />

        </h:form>

Depois que colocar um id para o form no seu botão alterar da um update nesse form.

    <p:commandButton value="alterar" icon="fa fa-fw fa-edit"
                        actionListener="#{livroBean.carregar(livro)}" update=":teste" // aqui um update/>
                </p:column>

Testa e me manda a resposta.

Alisson, muito obrigado, funcionou desta forma!

att, Felipe Vasconcellos

Oi Felipe, boa tarde!

Só um adendo para que vc tenha a solução e o entendimento do que aconteceu, foi necessário acrescentar o atributo update=":teste" pq o componente p:commandButton do Primefaces funciona por padrão enviando requisições ajax de modo que sua tela não é recarregada. Portanto, sempre que utilizar um p:commandButton, lembre-se que vc precisará indicar através do atributo update o elemento que vc deseja que seja atualizado após a execução da requisição efetuada pelo botão.

Abraço!