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

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

Já ouviu falar sobre ViewScope?

[quote=kleberdamasco]Já ouviu falar sobre ViewScope?
[/quote]

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)

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

[quote=kleberdamasco]Já ouviu falar sobre ViewScope?
[/quote]

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.

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

[quote=kleberdamasco]NotSerializableException
o que quer dizer???
faça com que seu bean implemente a interface serializable[/quote]

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

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.

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

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.

[quote=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.
[/quote]

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?

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?

[quote=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?[/quote]

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>

Sim, perfeitamente.

[quote]

  • Me parece que assim eu consigo explorar mais Ajax, o que vc acha?[/quote]
    Com certeza, podes utilizara para varias coisas, conversões, validações, etc.

[quote]

  • Pra que o rendered? Vc pode colocar o MB por favor?[/quote]

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()

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.

[quote]

  • Me parece que assim eu consigo explorar mais Ajax, o que vc acha?[/quote]
    Com certeza, podes utilizara para varias coisas, conversões, validações, etc.

[quote]

  • Pra que o rendered? Vc pode colocar o MB por favor?[/quote]

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()[/quote]