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]