Problem with @form of Primefaces - JSF

1

I have a problem with the auto update @form of the primefaces, it should update the dataTable automatically but it is not working.

Below is JSF and managedBean.

Thank you!

             Products     

<h:form>
    <p:toolbar>
        <p:toolbarGroup>
            <p:commandButton value="Adicionar" action="#{produtoBean.adicionar()}" update="@form"></p:commandButton>
            <p:commandButton value="Atualizar" action="#{produtoBean.listar()}" update="@form"></p:commandButton>
        </p:toolbarGroup>
    </p:toolbar>

    <p:messages autoUpdate="true" showDetail="true"></p:messages>

    <p:fieldset legend="Produtos">
        <p:panelGrid  columns="2">
            <h:outputLabel value="Código:"></h:outputLabel>
            <p:inputText value="#{produtoBean.produto.codigo}"></p:inputText>

            <h:outputLabel value="Quantidade:"></h:outputLabel>
            <p:inputMask mask="9?9999999" value="#{produtoBean.produto.quantidade}" placeHolder=""></p:inputMask>

            <h:outputLabel value="Descrição:"></h:outputLabel>
            <p:inputText value="#{produtoBean.produto.descricao}"></p:inputText>

        </p:panelGrid>

        <p:dataTable value="#{produtoBean.produtos}" var="produto">  
            <p:column headerText="Código" sortBy="#{produto.codigo}">
                <h:outputText value="#{produto.codigo}"></h:outputText>
            </p:column>
            <p:column headerText="Quantidade" sortBy="#{produto.quantidade}">
                <h:outputText value="#{produto.quantidade}"></h:outputText>
            </p:column>
            <p:column headerText="Descrição" sortBy="#{produto.descricao}">
                <h:outputText value="#{produto.descricao}"></h:outputText>
            </p:column>
            <p:column>
                <p:commandButton value="Editar" action="#{produtoBean.editar(produto)}" update="@form" ></p:commandButton>
            </p:column>
            <p:column>
                <p:commandButton value="Deletar" action="#{produtoBean.deletar(produto)}" update="@form" ></p:commandButton>
            </p:column>
        </p:dataTable>
    </p:fieldset>
</h:form>  

package bean;

import controller.ProdutoDAO;
import java.util.ArrayList;
import java.util.List;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.context.FacesContext;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import model.Produto;
import util.ErroSistema;

@ManagedBean
@SessionScoped
public class ProdutoBean {

    private Produto produto = new Produto();
    private List<Produto> produtos = new ArrayList<>();
    public  ProdutoDAO produtoDAO = new ProdutoDAO();

    public void adicionar(){
        try {
            produtoDAO.salvar(produto);       
            produto = new Produto();
            adicionarMensagem("Produto", "salvo com sucesso!", FacesMessage.SEVERITY_INFO);
       } catch (ErroSistema ex) {
            adicionarMensagem(ex.getMessage(), ex.getCause().getMessage(), FacesMessage.SEVERITY_ERROR);
       }
    }

    public void listar(){
        try {                
            produtos = produtoDAO.buscar();
            if(produtos == null || produtos.isEmpty()){
                adicionarMensagem("Nenhum dado encontrado!", "Sua busca não retornou nenhum dado!", FacesMessage.SEVERITY_WARN);   
            }
        } catch (ErroSistema ex) {
            adicionarMensagem(ex.getMessage(), ex.getCause().getMessage(), FacesMessage.SEVERITY_ERROR);
        }
    }

    public void editar(Produto c){
        produto = c;                
    }

    public void deletar(Produto c){
        try {
           produtoDAO.deletar(c.getId());
           FacesContext context = FacesContext.getCurrentInstance();
           context.addMessage(null, new FacesMessage("Produto",  "deletado com sucesso!") );
        } catch (ErroSistema ex) {
            adicionarMensagem(ex.getMessage(), ex.getCause().getMessage(), FacesMessage.SEVERITY_ERROR);
        }
    }
    public void adicionarMensagem(String sumario, String detalhe, FacesMessage.Severity tipoErro){
         FacesContext context = FacesContext.getCurrentInstance(); 
         FacesMessage message = new FacesMessage(tipoErro, sumario, detalhe);
         context.addMessage(null, message);
    }

    public Produto getProduto() {
        return produto;
    }

    public void setProduto(Produto produto) {
        this.produto = produto;
    }

    public List<Produto> getProdutos() {
        return produtos;
    }

    public void setProdutos(List<Produto> produtos) {
        this.produtos = produtos;
    }
}
    
asked by anonymous 08.11.2017 / 01:09

2 answers

0

On the Add and Update buttons:

<p:commandButton value="Adicionar" action="#{produtoBean.adicionar()}" update="@form"></p:commandButton>

Change action with actionListener

It will look like this:

<p:commandButton value="Adicionar" actionListener="#{produtoBean.adicionar}" update="@form"></p:commandButton>
    
08.11.2017 / 03:10
0

You are prompted to update the entire form, you must first add an id to the Form and DataTable

<h:form id="form">...
<p:dataTable id="id_tabela" ...> ...

and make the update call only in the table element so

 <p:commandButton actionListener="#{produtoBean.editar(produto)}"
update=":form:id_tabela"
process="@this" /* isso aqui caso ele não execute o form parcialmente */
/>
    
08.11.2017 / 14:09