Eu tenho um jsf com grid e um form, e renderizo-os conforme o que o usuário quiser, pesquisar ou dar manutenção nos dados.
Depois de muito quebrar a cabeça descobri que para nao instanciar novamente (e perder meus objetos) o meu MB eu teria q colocá-lo no escopo da sessão ou usar o t:saveState do Tomahawk.
O que eu gostaria de saber é, isso é um pau do jsf ou é erro (meu) de conceito??
Eu nao queria usar + 1 framework (Tomahawk) no meu projeto, entao utilizar todas os MB na session fica lento? Perde-se algo?
Cara…
Não é aconselhável você colocar todos os seus managedBean em escopo session pq eles ficam armazenados na sessão do usuário do seu servidor de aplicação. Depois de um tempo de utilização, além de ficar lento, você pode acabar com um “PermGen Space”, acabando com a memória do seu servidor de aplicação, tendo que reiniciá-lo constantemente.
Só use o escopo session com for realmente necessário senão pode acabar com sérios problemas de performance da sua aplicação.
cleriston
Existe outro jeito sem utilizar o Tomahawk?
rponte
Sim, é possível fazer funcionar sem o componente do Tomahawk e sem necessidade de colocar o managed bean na session.
Simplesmente faça teu método acessor da lista de resultados sempre carregar os mesmos valores a cada request, algo como:
public List<Produto> getProdutos() {
if (this.produtos == null)
this.produtos = ProdutosRepositorios.getProdutosPelaDescricao(this.descricao);
return this.produtos;
}
Observe que a consulta é sempre executada no método acessor e não mais no método de pesquisa. Enfim, isso foi um exemplo, o que você precisa entender é que a cada request você precisa dar um jeito de teu método produtos() retornar a mesma lista
Abraços e boa sorte.
cleriston
Olá Rafael!
Primeiramente gostaria de parabenizá-lo pelo seu grupo no google no qual participo.
Opa, obrigado O grupo existe realmente para troca de conhecimentos e experiência!
Bem, em escopo de request o seu managed bean será instanciado novamente e consequentemente o teu objeto que representa o formulário também o será, em seguida os dados do formulário serão convertidos e setados neste teu objeto.
O que está estranho é que seu objeto não deveria chegar como null no managed bean já que o formulário irá setar os valores dele na fase de atualização do modelo!
Poderia mostrar algum trecho de código deste formulário e o método de ação?
Abraços.
cleriston
plantaCRUD.xhtml
<?xmlversion="1.0"encoding="ISO-8859-1"?><!DOCTYPEhtmlPUBLIC"-//W3C//DTD XHTML 1.0 Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><ui:compositionxmlns="http://www.w3.org/1999/xhtml"xmlns:ui="http://java.sun.com/jsf/facelets"xmlns:h="http://java.sun.com/jsf/html"xmlns:f="http://java.sun.com/jsf/core"xmlns:a4j="http://richfaces.org/a4j"xmlns:rich="http://richfaces.org/rich"xmlns:c="http://java.sun.com/jstl/core"template="/pages/myCrudTemplate.xhtml"><!--passapar�metro para o template --><ui:paramname="defaultBean"value="#{plantaMB}"/><ui:definename="title">CadastrodePlantas</ui:define><ui:definename="head"><styletype="text/css">.odd-row{background-color:#ECF3FE;}.even-row{background-color:#FCFFFE;}</style></ui:define><!--definesearchlistBlock--><ui:definename="searchlistBlock"><rich:dataTableborder="2"value="#{plantaMB.listaPlantas}"var="planta"width="320"><rich:columnsortBy="#{planta.id}"><f:facetname="header"><h:outputTextvalue="Código"/></f:facet><h:commandLinkvalue="#{planta.id}"action="#{plantaMB.editar}"><f:setPropertyActionListenertarget="#{plantaMB.planta}"value="#{planta}"/></h:commandLink></rich:column><rich:columnsortBy="#{planta.nomePopular}"filterBy="#{planta.nomePopular}"filterEvent="onkeyup"><f:facetname="header"><h:outputTextvalue="Nome Popular"/></f:facet><h:outputTextvalue="#{planta.nomePopular}"/></rich:column><rich:columnsortBy="#{planta.nomeCientifico}"><f:facetname="header"><h:outputTextvalue="Nome Cientifico"/></f:facet><h:outputTextvalue="#{planta.nomeCientifico}"/></rich:column><rich:columnsortBy="#{planta.dataAquisicao}"><f:facetname="header"><h:outputTextvalue="Data aquisição"/></f:facet><h:outputTextvalue="#{planta.dataAquisicao}"/></rich:column><rich:columnsortBy="#{planta.idadeNaAquisicao}"><f:facetname="header"><h:outputTextvalue="Idade aquisição"/></f:facet><h:outputTextvalue="#{planta.idadeNaAquisicao}"/></rich:column></rich:dataTable></ui:define><!--defineaddUpdateBlock--><ui:definename="addUpdateBlock"><h:inputHiddenid="idplanta"value="#{plantaMB.planta.id}"/><h:panelGridid="painel_grid"columns="2"><h:outputLabelvalue="Nome Científico"for="nomeCientifico"/><h:panelGroup><h:inputTextid="nomeCientifico"value="#{plantaMB.planta.nomeCientifico}"maxlength="50"required="true"></h:inputText><rich:messageid="mensagem_nomeCientifico"for="nomeCientifico"><f:facetname="errorMarker"><h:graphicImagevalue="/images/error.gif"/></f:facet></rich:message></h:panelGroup><h:outputLabelvalue="Nome Popular"for="nomePopular"/><h:panelGroup><h:inputTextid="nomePopular"value="#{plantaMB.planta.nomePopular}"maxlength="50"required="true"></h:inputText><rich:messageid="mensagem_nomePopular"for="nomePopular"><f:facetname="errorMarker"><h:graphicImagevalue="/images/error.gif"/></f:facet></rich:message></h:panelGroup></h:panelGrid><h:messagesshowDetail="true"/><h:commandButtonvalue="Gravar"action="#{plantaMB.salvar}"/></ui:define></ui:composition>
plantaMB.java
/* * To change this template, choose Tools | Templates * and open the template in the editor. */packagebr.keko.mb;importbr.keko.dao.PlantaDAO;importbr.keko.modelo.Planta;importbr.keko.utils.JPAHelper;importjavax.faces.model.ListDataModel;importjavax.persistence.EntityManager;/** * * @author Abner */publicclassplantaMB{publicstaticfinalStringPESQUISAR_STATE="pesquisar";publicstaticfinalStringADICIONAR_STATE="adicionar";publicstaticfinalStringEDITAR_STATE="editar";privateStringcurrentState=PESQUISAR_STATE;privatePlantaplanta;privatePlantaDAOdao=newPlantaDAO();privateListDataModellistaPlantas;publicplantaMB(){planta=newPlanta();consultar();}publicPlantagetPlanta(){returnplanta;}publicvoidsetPlanta(Plantaplanta){this.planta=planta;}publicPlantaDAOgetDao(){returndao;}publicvoidsetDao(PlantaDAOdao){this.dao=dao;}publicListDataModelgetListaPlantas(){returnlistaPlantas;}publicvoidsetListaPlantas(ListDataModellistaPlantas){this.listaPlantas=listaPlantas;}publicvoideditar(){//setPlanta((Planta)getListaPlantas().getRowData());setCurrentState(EDITAR_STATE);}publicvoidsalvar(){EntityManagerem=JPAHelper.createEntityManager();getDao().setEntityManager(em);em.getTransaction().begin();getDao().salvar(getPlanta());em.getTransaction().commit();em.close();this.setCurrentState(PESQUISAR_STATE);}publicvoidconsultar(){EntityManagerem=JPAHelper.createEntityManager();getDao().setEntityManager(em);setListaPlantas(getDao().getAll(Planta.class));em.close();this.setCurrentState(PESQUISAR_STATE);}publicbooleanisPesquisarState(){Stringstate=this.getCurrentState();return(state==null||PESQUISAR_STATE.equals(state));}publicbooleanisAdicionarState(){returnADICIONAR_STATE.equals(this.getCurrentState());}publicbooleanisEditarState(){returnEDITAR_STATE.equals(this.getCurrentState());}publicStringgetCurrentState(){returncurrentState;}publicvoidsetCurrentState(StringcurrentState){this.currentState=currentState;}}
Se quiser eu mando o projeto.
Obrigado desde já
cleriston
rafael, esquece.
Eu descobri o problema, no meu path eu tava com 2 lib de implementacoes diferentes de jsf…
Valeu pela ajuda!
Obs.: Põe mais artigo lah no teu blog… eu curto ler seus artigos