Problem with @form Primefaces - JSF

Asked

Viewed 342 times

1

I have a problem in Auto update @form of primefaces, it should automatically update the datatable but 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;
    }
}
  • It may not be that, but instead of using action in the commandButtons, use actionListener. The action serves only for when the Managedbean method returns a String (to redirect).

2 answers

0

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

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

and call update only on the table element like this

 <p:commandButton actionListener="#{produtoBean.editar(produto)}"
update=":form:id_tabela"
process="@this" /* isso aqui caso ele não execute o form parcialmente */
/>
  • Why can’t you reference the whole form? Yes. In addition, you must use the id of the component with the id of the form to reference a component that is in another form.. Within the same form you do not need.

  • The question is why update all the components of the form? You can do this yes, however, for a complex page does not make sense to do this, it would be more convenient to have you update only the component that has update, this will avoid conflict with ajax, because ajax has direct connection to the form, and when vc add a filterBy or sortBy into a colunm you are delivering the form for ajax management, at least that’s what happened in a project of mine, when I used Datatable filterBy

  • yes, I agree with you. But that wasn’t the question. The question is why you don’t update the datatable when you have the form updated

  • It must be running by ajax, so it is not updating, it has tried to remove all filters and sortBy?

0

On the Add and Update buttons:

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

Exchange the action for actionListener

Will stay like this:

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

Browser other questions tagged

You are not signed in. Login or sign up in order to post.