[Resolvido] Editar registro selecionado em um dataTable utilizando @RequestScoped

14 respostas
A

E ae galera,

Agora que deu para pegar bem quando utilizar cada tipo de escopo surgiu a dúvida, como faço para editar um valor selecionado em minha tabela utilizando um @RequestScoped. Não quero utilizar o @SessionScoped porque não vejo toda essa necessidade.

Abaixo segue o meu código, teoricamente a ideia é atribuir a entidade do MB o registro selecionado na tabela, mas não sei porque isso não está funcionando. Ou seja, quando clico no botão editar, a entidade do MB que deveria vir do registro selecionado é nulo.

Detalhe: Os meus botões não estão em minha tabela, e sim em uma página acima da página com a tabela de registros.

Tela principal do caso de uso

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:p="http://primefaces.org/ui"
    xmlns:f="http://java.sun.com/jsf/core"
    template="/resources/theme/template.xhtml">
  <ui:define name="centro">
    
    <p:layout>  
      
      <h:form id="botoes">
        <p:layoutUnit position="north" size="5%">
        
          <p:splitButton value="Listar" icon="ui-icon-refresh"   action="#{paisController.lista}"  >  
            <p:menuitem  value="Novo" icon="ui-icon-document" action="#{paisController.preparaParaAdicionar}" ajax="false"/> 
            <p:menuitem  value="Editar" icon="ui-icon-arrowrefresh-1-w" action="#{paisController.preparaParaAlterar}"/>
            <p:menuitem  value="Apagar" icon="ui-icon-close" action="#{paisController.remove}" ajax="false" />  
          </p:splitButton> 
       
        </p:layoutUnit>
      
      <p:layoutUnit position="center">  
        <ui:insert name="form">

        </ui:insert>
      </p:layoutUnit>
     </h:form>
    
    </p:layout>  
  
  </ui:define>
</ui:composition>

Lista do caso de uso

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:p="http://primefaces.org/ui"
    xmlns:f="http://java.sun.com/jsf/core"
    template="/pages/ope/pais/PaisManagementView.xhtml">
        
  <ui:define name="form">
      <p:dataTable id="tabela" var="pais" value="#{paisController.paises}" selectionMode="single" selection="#{paisController.pais}" rowKey="#{pais.nome}">  
        <p:column headerText="Código"> #{pais.id.codigo} </p:column>  
        <p:column headerText="Filial"> #{pais.id.filial.nome} </p:column> 
        <p:column headerText="Nome"> #{pais.nome} </p:column>  
      </p:dataTable>  
  </ui:define>
</ui:composition>

Ficha do caso de uso

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:p="http://primefaces.org/ui"
    xmlns:f="http://java.sun.com/jsf/core"
    template="/pages/ope/pais/PaisManagementView.xhtml">
        
  <ui:define name="form">
    <p:panelGrid id="panel" columns="2" style="margin-bottom:10px">
            
      <h:outputLabel value="Código:" />
      <p:inputText id="codigo" value="#{paisController.pais.id.codigo}"/>
 
      <h:outputLabel value="Filial:" />
      <p:inputText id="filial" value="#{paisController.pais.id.filial.id.codigo}"/>
            
      <h:outputLabel value="Nome:" />
      <p:inputText id="nome" value="#{paisController.pais.nome}"/>
          
      <p:commandButton id="inserir" value="Inserir" action="#{paisController.adiciona}" ajax="false" />
    </p:panelGrid>
  </ui:define>
</ui:composition>

MB

@ManagedBean
@RequestScoped
public class PaisController extends ControllerAbstract<Pais,PaisService>
{
  private Pais pais = new Pais();
  private List<Pais> paises = new ArrayList<Pais>();
  
  @Autowired
  public PaisController() 
  {
    pais = new Pais();
    pais.getId().setFilial(new Filial());
  }
        
  public String lista() 
  {
    paises = getService().getAllEntityAtivo();
    
    return "/pages/ope/pais/form/ListaPais";
  } 
  
  private void limpa() 
  {
    pais = new Pais();
    pais.getId().setFilial(new Filial());
  }
  
  public String preparaParaAdicionar()
  {
    limpa();
    
    return "/pages/ope/pais/form/FichaPais";
  }
  
  public String adiciona() 
  {
    pais.setSituacao("A");
    getService().insert(pais);
    lista();
    return "/pages/ope/pais/form/ListaPais";
  } 
  
  public void remove() 
  {
    getService().remove(pais);
    lista();
  }
  
  public String preparaParaAlterar() 
  {
    this.pais = getService().findById(pais.getId(),true);
    return "/pages/ope/pais/form/FichaPais";
  } 
  
  public void altera() 
  {
    getService().update(pais);
  }

  /*-------------------------------------------------------------------
  *		            GETTERS AND SETTERS
  *-------------------------------------------------------------------*/

  public Pais getPais()
  {
    return pais;
  }

  public void setPais(Pais pais)
  {
    this.pais = pais;
  }

  public List<Pais> getPaises()
  {
    return paises;
  }

  public void setPaises(List<Pais> paises)
  {
    this.paises = paises;
  }
}

14 Respostas

K

Já ouviu falar sobre ViewScope?

A

kleberdamasco:
Já ouviu falar sobre ViewScope?

Então kleberdamasco, já vi sim, até tentei usar ele, só que tive problemas.
Nesse caso, fazendo uma simples requisição para preencher os valores da lista ele me dispara a seguinte exception:

SEVERE: Error Rendering View[/pages/ope/pais/form/ListaPais.xhtml]
javax.faces.FacesException: java.io.NotSerializableException: .ope.manterPais.controller.PaisController
	at com.sun.faces.renderkit.ResponseStateManagerImpl.getViewState(ResponseStateManagerImpl.java:137)
	at javax.faces.application.StateManager.getViewState(StateManager.java:555)
	at com.sun.faces.context.PartialViewContextImpl.renderState(PartialViewContextImpl.java:416)
	at com.sun.faces.context.PartialViewContextImpl.processPartial(PartialViewContextImpl.java:288)
	at javax.faces.context.PartialViewContextWrapper.processPartial(PartialViewContextWrapper.java:183)
	at javax.faces.component.UIViewRoot.encodeChildren(UIViewRoot.java:981)
	at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1757)
	at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:391)
	at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:131)
	at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:121)
	at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
	at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139)
	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:594)
	at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1550)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:281)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
	at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:655)
	at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:595)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:161)
	at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:331)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:231)
	at com.sun.enterprise.v3.services.impl.ContainerMapper$AdapterCallable.call(ContainerMapper.java:317)
	at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:195)
	at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:860)
	at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:757)
	at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1056)
	at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:229)
	at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137)
	at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104)
	at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90)
	at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79)
	at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54)
	at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59)
	at com.sun.grizzly.ContextTask.run(ContextTask.java:71)
	at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532)
	at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513)
	at java.lang.Thread.run(Thread.java:662)
Caused by: java.io.NotSerializableException: ope.manterPais.controller.PaisController
	at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1164)
	at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:330)
	at java.util.HashMap.writeObject(HashMap.java:1001)
	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 java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:940)
	at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1469)
	at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1400)
	at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1158)
	at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1518)
	at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1483)
	at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1400)
	at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1158)
	at java.io.ObjectOutputStream.writeArray(ObjectOutputStream.java:1346)
	at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1154)
	at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:330)
	at java.util.HashMap.writeObject(HashMap.java:1001)
	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 java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:940)
	at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1469)
	at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1400)
	at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1158)
	at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:330)
	at com.sun.faces.renderkit.ClientSideStateHelper.doWriteState(ClientSideStateHelper.java:325)
	at com.sun.faces.renderkit.ClientSideStateHelper.writeState(ClientSideStateHelper.java:169)
	at com.sun.faces.renderkit.ResponseStateManagerImpl.getViewState(ResponseStateManagerImpl.java:135)
	... 36 more

WARNING: StandardWrapperValve[Faces Servlet]: PWC1406: Servlet.service() for servlet Faces Servlet threw exception
java.lang.IllegalStateException: CDATA tags may not nest
	at com.sun.faces.renderkit.html_basic.HtmlResponseWriter.startCDATA(HtmlResponseWriter.java:630)
	at javax.faces.context.ResponseWriterWrapper.startCDATA(ResponseWriterWrapper.java:172)
	at javax.faces.context.PartialResponseWriter.startError(PartialResponseWriter.java:342)
	at org.primefaces.context.PrimePartialResponseWriter.startError(PrimePartialResponseWriter.java:210)
	at com.sun.faces.context.AjaxExceptionHandlerImpl.handlePartialResponseError(AjaxExceptionHandlerImpl.java:200)
	at com.sun.faces.context.AjaxExceptionHandlerImpl.handle(AjaxExceptionHandlerImpl.java:123)
	at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:119)
	at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139)
	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:594)
	at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1550)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:281)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
	at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:655)
	at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:595)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:161)
	at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:331)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:231)
	at com.sun.enterprise.v3.services.impl.ContainerMapper$AdapterCallable.call(ContainerMapper.java:317)
	at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:195)
	at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:860)
	at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:757)
	at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1056)
	at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:229)
	at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137)
	at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104)
	at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90)
	at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79)
	at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54)
	at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59)
	at com.sun.grizzly.ContextTask.run(ContextTask.java:71)
	at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532)
	at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513)
	at java.lang.Thread.run(Thread.java:662)
K

NotSerializableException
o que quer dizer???
faça com que seu bean implemente a interface serializable

A

kleberdamasco:
Já ouviu falar sobre ViewScope?

Outra coisa kleber, não vejo como ele resolver o meu problema, pelo contrário vai piorar.
Eu utilizo 3 páginas no total por caso de uso, acredito que ele vai perder o MB cada vez que eu mudar de uma página para a outra.

K

A ideia de vc utilizar o ViewScope é que enquanto a sua pagina estiver sendo visualizada o estado do seu bean está em memória.

A

kleberdamasco:
NotSerializableException
o que quer dizer???
faça com que seu bean implemente a interface serializable

Implementando o serializable parou de disparar a exception.
Mas é bem isso que te comentei acima, quando clico em listar ele vai em meu MB, chama o método listar e quando retorna para a próxima página para exibir a lista, já perdeu tudo.

public String lista() 
  {
    paises = getService().getAllEntityAtivo();
    
    return "/pages/ope/pais/form/ListaPais";
  }
K

Não gosto desse tipo de modelagem que vc fez, onde cada opção do crud é feito em uma tela. Desta maneira vejo que vc terá que colocar esse objeto na session para recuperar em cada pagina que quer utilizar.

A

kleberdamasco, ainda estou montando a infra, pra mim é importante conhecer esses pontos negativos. Como vc faz, coloca todo o crud em um único xhtml? Um rapaz me indicou usar master details, vc conhece?

http://fractalsoft.net/primeext-showcase-mojarra/sections/masterDetail/complexNavigation.jsf

K

eu uso em um mesmo xhtml fazendo um include das paginas para ficar mais organizado e trabalho com ações,
por exemplo, ação = 0 vai exibir o panelGroup = 0 com o include da lista, para salvar um novo ou editar ação = 1, panelGroup = 1 com o include da pagina para salvar. Talvez pra ti seja melhor o editar em um dialog ai vai da sua escolha. Dessa forma funciona perfeitamente com o ViewScope.
Nunca tinha visto aquele masterDetail, mas pelo que vi, trabalha da mesma forma, onde cada ação vai exibir uma pagina em um escopo de View.

A

kleberdamasco:
eu uso em um mesmo xhtml fazendo um include das paginas para ficar mais organizado e trabalho com ações,
por exemplo, ação = 0 vai exibir o panelGroup = 0 com o include da lista, para salvar um novo ou editar ação = 1, panelGroup = 1 com o include da pagina para salvar. Talvez pra ti seja melhor o editar em um dialog ai vai da sua escolha. Dessa forma funciona perfeitamente com o ViewScope.
Nunca tinha visto aquele masterDetail, mas pelo que vi, trabalha da mesma forma, onde cada ação vai exibir uma pagina em um escopo de View.

Hum, bacana.

E como funciona esse include? Eu consigo dividir minha aplicação em mais de uma página e mesmo assim utilizar o @ViewScoped?

K

exemplo:
PastaPessoa
|
-pessoaList.xhtml
-pessoaSave.xhtml

A pagina pessoaList.xhtml

<h:form id="form">
			<h:panelGroup rendered="#{pessoaMB.acao==0}">
                         //sua lista de pessoas cadastradas
                        </h:panelGroup>


			<h:panelGroup rendered="#{pessoaMB.acao==1}">
				<ui:include src=".../pessoaSave.xhtml" />
			</h:panelGroup>

		</h:form>

pegou a lógica do negócio?

A

kleberdamasco:
exemplo:
PastaPessoa
|
-pessoaList.xhtml
-pessoaSave.xhtml

A pagina pessoaList.xhtml

<h:form id="form">
			<h:panelGroup rendered="#{pessoaMB.acao==0}">
                         //sua lista de pessoas cadastradas
                        </h:panelGroup>


			<h:panelGroup rendered="#{pessoaMB.acao==1}">
				<ui:include src=".../pessoaSave.xhtml" />
			</h:panelGroup>

		</h:form>

pegou a lógica do negócio?

Está ficando interessante o negócio, ficaram algumas dúvidas…

  • Dessa maneira eu consigo trabalhar com @ViewScoped?
  • Me parece que assim eu consigo explorar mais Ajax, o que vc acha?
  • Pra que o rendered? Vc pode colocar o MB por favor?

De uma olhada no meu código, é mais ou menos isso que está falando?

Lista

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:p="http://primefaces.org/ui"
    xmlns:f="http://java.sun.com/jsf/core"
    template="/resources/theme/template.xhtml">
  <ui:define name="centro"> 
    <h:form id="form">  
     
      <p:splitButton value="Listar" icon="ui-icon-refresh"   action="#{localidadeController.lista}" update="tabela"  >  
        <p:menuitem  value="Novo" icon="ui-icon-document" action="#{localidadeController.preparaParaAdicionar}" ajax="false"/> 
        <p:menuitem  value="Editar" icon="ui-icon-arrowrefresh-1-w" action="#{localidadeController.preparaParaAlterar}" ajax="false"/>
        <p:menuitem  value="Apagar" icon="ui-icon-close" action="#{localidadeController.remove}" ajax="false" />  
      </p:splitButton> 
      
      <h:panelGroup>  
        <p:dataTable id="tabela" var="pais" value="#{localidadeController.localidades}" selectionMode="single" selection="#{localidadeController.selectedLocalidade}" rowKey="#{localidade.id.codigo}">  
          <p:column headerText="Código"> #{pais.id.codigo} </p:column>  
          <p:column headerText="Nome"> #{pais.nome} </p:column> 
          <p:column headerText="Situação"> #{pais.situacao} </p:column> 
        </p:dataTable>    
      </h:panelGroup>  
  
      <h:panelGroup>  
        <ui:include src="/pages/geo/FichaLocalidade.xhtml" />
      </h:panelGroup>  
    
    </h:form> 
  </ui:define>
</ui:composition>

Ficha

<ui:fragment  
    xmlns="http://www.w3.org/1999/xhtml"  
    xmlns:h="http://java.sun.com/jsf/html"  
    xmlns:f="http://java.sun.com/jsf/core"  
    xmlns:ui="http://java.sun.com/jsf/facelets"  
    xmlns:p="http://primefaces.org/ui">  
      
    <p:panelGrid id="panel" columns="2" style="margin-bottom:10px">
            
      <h:outputLabel value="Código:" />
      <p:inputText id="codigo" value="#{localidadeController.localidade.id.codigo}" readonly="true"/>
 
      <h:outputLabel value="Nome:" />
      <p:inputText id="nome" value="#{localidadeController.localidade.nome}"/>
          
      <p:commandButton id="inserir" value="Inserir" action="#{localidadeController.adiciona}" ajax="false" />
    </p:panelGrid> 
</ui:fragment>
K

Sim, perfeitamente.

  • Me parece que assim eu consigo explorar mais Ajax, o que vc acha?

Com certeza, podes utilizara para varias coisas, conversões, validações, etc.

  • Pra que o rendered? Vc pode colocar o MB por favor?

o rendered vai fazer com que não fique visível a pagina toda, e sim
de acordo com a ação solicitada.

exemplo:

public class ExemploMB implements serializable {

private int acao;
// por default do primitivo int vai ser iniciado com 0
// desta forma a primeira pagina a ser exibida será a lista.
//getters and setters.

public void prepareSave() {
acao = 1;
//restante da logica.
}

ai lá no seu xhtml, vc implementa a logica que precisa para salvar chamando
o prepareSave()

A

Cara, não sei nem como te agradecer.
Ficou muito boa a solução.
O código ainda está meio feio mas vou copiar aqui caso alguém também se interesse.

Valeu amigo.

Lista

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:p="http://primefaces.org/ui"
    xmlns:f="http://java.sun.com/jsf/core"
    template="/resources/theme/template.xhtml">
  <ui:define name="centro"> 
    <h:form id="form">   

      <p:splitButton value="Listar" icon="ui-icon-refresh"   action="#{localidadeController.lista}" update="tabela"  >  
        <p:menuitem  value="Novo" icon="ui-icon-document" action="#{localidadeController.preparaParaAdicionar}" ajax="false"/> 
        <p:menuitem  value="Editar" icon="ui-icon-arrowrefresh-1-w" action="#{localidadeController.preparaParaAlterar}" ajax="false"/>
        <p:menuitem  value="Apagar" icon="ui-icon-close" action="#{localidadeController.remove}" ajax="false" />  
      </p:splitButton> 
       
      <h:panelGroup rendered="#{localidadeController.acao==0}">  
        <p:dataTable id="tabela" var="localidade" value="#{localidadeController.localidades}" selectionMode="single" selection="#{localidadeController.selectedLocalidade}" rowKey="#{localidade.id.codigo}">  
          <p:column headerText="Código"> #{localidade.id.codigo} </p:column>  
          <p:column headerText="Nome"> #{localidade.nome} </p:column> 
        </p:dataTable>    
      </h:panelGroup>  
          
      <h:panelGroup rendered="#{localidadeController.acao==1}">  
        <ui:include src="/pages/geo/localidade/FichaLocalidade.xhtml" />
      </h:panelGroup>  

    </h:form>
     
  </ui:define>
</ui:composition>

Ficha

<ui:fragment  
    xmlns="http://www.w3.org/1999/xhtml"  
    xmlns:h="http://java.sun.com/jsf/html"  
    xmlns:f="http://java.sun.com/jsf/core"  
    xmlns:ui="http://java.sun.com/jsf/facelets"  
    xmlns:p="http://primefaces.org/ui">  
      
    <p:panelGrid id="panel" columns="2" style="margin-bottom:10px">
            
      <h:outputLabel value="Código:" />
      <p:inputText id="codigo" value="#{localidadeController.localidade.id.codigo}" readonly="true"/>
 
      <h:outputLabel value="Nome:" />
      <p:inputText id="nome" value="#{localidadeController.localidade.nome}"/>
          
      <p:commandButton id="inserir" value="Inserir" action="#{localidadeController.adiciona}" ajax="false" />
    </p:panelGrid> 
</ui:fragment>

Managed Bean

package com.agroleader.taurus.jsf.ui.usecases.geo.manterLocalidade.controller;

import com.agroleader.taurus.domain.entity.geo.Localidade;
import com.agroleader.taurus.domain.service.geo.LocalidadeService;
import com.agroleader.taurus.infrastructure.controllers.ControllerAbstract;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import org.springframework.beans.factory.annotation.Autowired;

@ManagedBean
@ViewScoped
public class LocalidadeController extends ControllerAbstract<Localidade,LocalidadeService> implements Serializable
{
  private Localidade localidade = new Localidade();
  private List<Localidade> localidades = new ArrayList<Localidade>();
  private Localidade selectedLocalidade = new Localidade();
  private int acao; 
  
  @Autowired
  public LocalidadeController() 
  {
    localidade = new Localidade();
  }
        
  public void lista() 
  {
    localidades = getService().getAllEntityAtivo();
  } 
  
  private void limpa() 
  {
    localidade = new Localidade();
  }
  
  public void preparaParaAdicionar()
  {
    acao = 1;
    limpa();
  }
  
  public void adiciona() 
  {
    localidade.setSituacao("A");
    
    if(localidade.getId().getCodigo() == 0)
      getService().insert(localidade);
    else
      getService().update(localidade);
    
    acao = 0;
    lista();
  } 
  
  public void remove() 
  {
    getService().remove(selectedLocalidade);
    acao = 0;
    lista();
  }
  
  public void preparaParaAlterar() 
  {
    this.localidade = getService().findById(selectedLocalidade.getId(),true);
    acao = 1;
  } 
  
  public void altera() 
  {
    getService().update(localidade);
  }

  /*-------------------------------------------------------------------
  *		            GETTERS AND SETTERS
  *-------------------------------------------------------------------*/

  public Localidade getLocalidade()
  {
    return localidade;
  }

  public void setLocalidade(Localidade localidade)
  {
    this.localidade = localidade;
  }

  public List<Localidade> getLocalidades()
  {
    return localidades;
  }

  public void setLocalidades(List<Localidade> localidades)
  {
    this.localidades = localidades;
  }

  public Localidade getSelectedLocalidade()
  {
    return selectedLocalidade;
  }

  public void setSelectedLocalidade(Localidade selectedLocalidade)
  {
    this.selectedLocalidade = selectedLocalidade;
  }

  public int getAcao()
  {
    return acao;
  }

  public void setAcao(int acao)
  {
    this.acao = acao;
  }
  

}

Sim, perfeitamente.

  • Me parece que assim eu consigo explorar mais Ajax, o que vc acha?

Com certeza, podes utilizara para varias coisas, conversões, validações, etc.

  • Pra que o rendered? Vc pode colocar o MB por favor?

o rendered vai fazer com que não fique visível a pagina toda, e sim
de acordo com a ação solicitada.

exemplo:

public class ExemploMB implements serializable {

private int acao;
// por default do primitivo int vai ser iniciado com 0
// desta forma a primeira pagina a ser exibida será a lista.
//getters and setters.

public void prepareSave() {
acao = 1;
//restante da logica.
}

ai lá no seu xhtml, vc implementa a logica que precisa para salvar chamando
o prepareSave()

Criado 2 de abril de 2013
Ultima resposta 3 de abr. de 2013
Respostas 14
Participantes 2