[Resolvido]Excluir JSF

10 respostas
E

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

E

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)}"/>

R
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}">
E
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>
V

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>
E

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.

V

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>
E

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.

V

verifique se inicializou o objeto.
ou seja

public class produtoController {

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

   //get and sets

}
E

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); }

E

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