[Resolvido]Excluir JSF

10 respostas
EHS

Estou querendo fazer um botão de excluir em minha datatable, pesquisei pela net e vi que recomendam usar um commandlink, mas naum entendo como passar para o metodo exlcuir da classe controller a linha que quero apagar. Abaixo está minha datatable, então precisaria de ajuda para fazer o metodo excluir.

<p:dataTable id="tabela" var="produtos" value="#{produtoController.produtos}"> <p:column> <f:facet name="header"> <h:outputText value="Código"/> </f:facet> <h:outputText value="#{produtos.id}"/> </p:column> <p:column> <f:facet name="header"> <h:outputText value="Nome"/> </f:facet> <h:outputText value="#{produtos.nome}"/> </p:column> <p:column> <f:facet name="header"> <h:outputText value="Descrição"/> </f:facet> <h:outputText value="#{produtos.descricao}"/> </p:column> <p:column> <f:facet name="header"> <h:outputText value="Excluir"/> </f:facet> <h:commandLink value="Excluir" action="#{produtoController.excluir}"/> </p:column> </p:dataTable>

10 Respostas

elton.souza

Na tua classe controller, o método excluir recebe o item a ser excluido por parâmetro, e a chamada do commandLink ficaria assim:

<h:commandLink value=“Excluir” action="#{produtoController.excluir(produtos)}"/>

rafaelsantini
public class ProdutoController {

    UIData tabela;

    public String excluir() {
        Produto produto = (Produto) FacesContext.getCurrentInstance().getExternalContext().getRequestMap().get(tabela.getVar());
        /* Excluir... */
        return "SUCCESS";
     }

}
<p:dataTable id="tabela" var="produtos" value="#{produtoController.produtos}" binding="#{produtoController.tabela}">
elton.souza
public class ProdutoController {  
     
       UIData tabela;  
     
       public String excluir(Produto produto) {  
           //Produto produto = (Produto) FacesContext.getCurrentInstance().getExternalContext().getRequestMap().get(tabela.getVar());  
           /* Excluir... */  
           return "SUCCESS";  
        }  
     
   }
<p:dataTable id="tabela" var="produtos" value="#{produtoController.produtos}">  
                     <p:column>  
                         <f:facet name="header">  
                             <h:outputText value="Código"/>  
                         </f:facet>  
                         <h:outputText value="#{produtos.id}"/>  
                     </p:column>  
                     <p:column>  
                         <f:facet name="header">  
                             <h:outputText value="Nome"/>  
                         </f:facet>  
                         <h:outputText value="#{produtos.nome}"/>  
                     </p:column>  
                     <p:column>  
                         <f:facet name="header">  
                             <h:outputText value="Descrição"/>  
                         </f:facet>  
                         <h:outputText value="#{produtos.descricao}"/>  
                     </p:column>  
                     <p:column>  
                         <f:facet name="header">  
                             <h:outputText value="Excluir"/>  
                         </f:facet>  
                         <h:commandLink value="Excluir" action="#{produtoController.excluir(produtos)}"/>  
                     </p:column>  
                 </p:dataTable>
viniciuspadua

tente isso

<p:dataTable id="tabela" var="produtos" value="#{produtoController.produtos}">    
	<p:column>    
		 <f:facet name="header">    
			 <h:outputText value="Código"/>    
		 </f:facet>    
		 <h:outputText value="#{produtos.id}"/>    
	 </p:column>    
	 <p:column>    
		 <f:facet name="header">    
			 <h:outputText value="Nome"/>    
		 </f:facet>    
		 <h:outputText value="#{produtos.nome}"/>    
	 </p:column>    
	 <p:column>    
		 <f:facet name="header">    
			 <h:outputText value="Descrição"/>    
		 </f:facet>    
		 <h:outputText value="#{produtos.descricao}"/>    
	 </p:column>    
	 <p:column>    
		 <f:facet name="header">    
			 <h:outputText value="Excluir"/>    
		 </f:facet>    
		 <h:commandLink value="Excluir" action="#{produtoController.excluir(produtos)}">
		         <f:setPropertyActionListener value="#{produtos}" target="#{produtoController.produtos}" />
		 </p:commandLink>
	 </p:column>    
 </p:dataTable>
EHS

tentei fazer como o rafaelsantini falou e aconteceu o seguinte erro:

binding="#{produtoController.tabela}": The class 'controller.ProdutoController' does not have the property 'tabela'.

já como o elton.souza falou me retorna um nullPointerException nessa linha do metodo excluir:

produto = (Produto) FacesContext.getCurrentInstance().getExternalContext().getRequestMap().get(tabela.getVar());

e do modo que o viniciuspadua falou me retorna o seguinte erro:

Cannot convert model.Produto@1a437e of type class model.Produto to interface java.util.List
pelo que entendi está dizendo que naum pode transfomar uma lista de produtos em produto,
pois o meu objeto produtos que eu estou passando como parametro no commandlink é um ArrayList de produto,
e no meu metodo excluir está para receber um objeto do tipo produto, então agora naum sei como transformar esse arrayList de produtos em produto.

viniciuspadua

no caso que lhe mandei vc deve ter uma propriedade que seja apenas o bean e apontar para ele! e não para a lista

<h:commandLink value="Excluir" action="#{produtoController.excluir(produtos)}">  
       <f:setPropertyActionListener value="#{produtos}" target="#{produtoController.beanDoProduto}" />  
</p:commandLink>
EHS

Então como voce falou alterei meu commandlink e ficou assim:

<h:commandLink value="Excluir" action="#{produtoController.excluir(produtos)}"> <f:setPropertyActionListener value="#{produtos}" target="#{produtoController.produto}" /> </h:commandLink>

e agora acontece nullPointerException e aqui está todo o erro:

javax.faces.el.EvaluationException: java.lang.NullPointerException at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:102) at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102) at javax.faces.component.UICommand.broadcast(UICommand.java:315) at javax.faces.component.UIData.broadcast(UIData.java:912) at org.primefaces.component.datatable.DataTable.broadcast(DataTable.java:620) at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:775) at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1267) at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:82) at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118) at javax.faces.webapp.FacesServlet.service(FacesServlet.java:312) at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1523) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:343) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:215) at org.primefaces.webapp.filter.FileUploadFilter.doFilter(FileUploadFilter.java:79) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:215) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:277) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:188) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:641) at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:97) at com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:85) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:185) at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:325) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:226) at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:165) at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:791) at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:693) at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:954) at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:170) at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:135) at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:102) at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:88) at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:76) at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:53) at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:57) at com.sun.grizzly.ContextTask.run(ContextTask.java:69) at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:330) at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:309) at java.lang.Thread.run(Thread.java:619) Caused by: java.lang.NullPointerException at controller.ProdutoController.excluir(ProdutoController.java:97) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at javax.el.BeanELResolver.invokeMethod(BeanELResolver.java:737) at javax.el.BeanELResolver.invoke(BeanELResolver.java:467) at javax.el.CompositeELResolver.invoke(CompositeELResolver.java:246) at com.sun.el.parser.AstValue.invoke(AstValue.java:228) at com.sun.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:297) at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:98) at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:88) ... 39 more

só que eu depurei e o objeto produto naum está vazio, está com todos os dados da linha em que eu aperto para exlcuir
então naum sei o que pode estar caousando isso.

viniciuspadua

verifique se inicializou o objeto.
ou seja

public class produtoController {

   private Produto produto = new Produto(); //Verifique se colocou isso

   //get and sets

}
EHS

sim inicializei o objeto
naum sei se tem algo errado com o metodo excluir, aqui vai o codigo

public void excluir(Produto produto) { produto = (Produto) FacesContext.getCurrentInstance().getExternalContext().getRequestMap().get(tabela.getVar()); ProdutoDAO produtoDAO = new ProdutoDAO(); produtoDAO.delete(produto); }

EHS

Consegui resolver o problema da exclusão adicionando o binding="#{produtoController.tabela}"> na dataTable.
Então segue meu código.

<p:dataTable id="tabela" var="produtos" value="#{produtoController.produtos}"
                             binding="#{produtoController.tabela}">
                    <p:column>
                        <f:facet name="header">
                            <h:outputText value="Código"/>
                        </f:facet>
                        <h:outputText value="#{produtos.id}"/>
                    </p:column>
                    <p:column>
                        <f:facet name="header">
                            <h:outputText value="Nome"/>
                        </f:facet>
                        <h:outputText value="#{produtos.nome}"/>
                    </p:column>
                    <p:column>
                        <f:facet name="header">
                            <h:outputText value="Descrição"/>
                        </f:facet>
                        <h:outputText value="#{produtos.descricao}"/>
                    </p:column>
                    <p:column>
                        <f:facet name="header">
                            <h:outputText value="Excluir"/>
                        </f:facet>
                        <h:commandLink value="Excluir" action="#{produtoController.excluir(produto)}">
                            <f:setPropertyActionListener value="#{produto}" target="#{produtoController.produto}" />
                        </h:commandLink>
                    </p:column>
                </p:dataTable>
Controller
UIData tabela;

    public UIData getTabela() {
        return tabela;
    }

    public void setTabela(UIData tabela) {
        this.tabela = tabela;
    }

public void excluir(Produto produto) {
        produto =  (Produto) FacesContext.getCurrentInstance().getExternalContext().getRequestMap().get(tabela.getVar());
        ProdutoDAO produtoDAO = new ProdutoDAO();
        produtoDAO.delete(produto);
        preencherTabela();
    }

Só que agora toda vez que clico no Excluir a minha dataTable diminui de tamanho :?
será que tem alguma explicação para isso ??

Criado 21 de fevereiro de 2011
Ultima resposta 21 de fev. de 2011
Respostas 10
Participantes 4