Olá a todos.
Tenho alguns cenários em uma aplicação JSF onde estou utilizando managed beans com scope session. Gostaria de saber se existe alguma alternativa para isso, já que acredito que esses beans podem causar um problema de escalabilidade quando a aplicação for para produção.
Cenário 1: tabela com lista editável.
Tenho um MB que faz a pesquisa de funcionários, e os lista num datatable. Cada linha da tabela tem um botão que permite a edição do registro do funcionário. Quando o usuário clica no botão, eu pego o funcionário correspondente da lista e mando para outra tela que permite a edição.
Cenário 2 : Combo carrega combo
Na tela de edição/cadastro de funcionários, tenho alguns combos que dependem de outros pra carregar. por exemplo, eu trago na tela todas as diretorias. Quando o usuário escolhe uma diretoria, eu preencho o combo de gerências com as gerências daquela diretoria, quendo ele escolhe a gerência eu preencho o combo de departamentos com todos os departamentos daquela gerência, e assim por diante.
Então, tem algum meio de fazer esses dois cenários sem que os MB sejam scope session?
Valeu!
yorgan
Julho 8, 2009, 8:35am
#2
Você pode utilizar o scopo REQUEST.
Mas provavelmente você terá que guardar alguns dados na sessão, pois a cada submit do formulário ele cria uma nova instância do Bean.
[]´s
Daniel
Então yorgan, o problema é esse gerenciamento mesmo. Eu até consigo ficar gerenciando os objetos em memória, mas isso é muito sujeito a falhas.
Eu tava procurando algum esquema estilo @DataModel do Seam, ou scope Flash do Spring WebFolw
A idéia é tornar os beans scope request mesmo, mas eu queria que esse gerenciamento fosse algo mais automático.
[]'s
Olá mario.fts!
No cenário 1 você pode usar o scope de request da seguinte maneira, ao chamar a outra página para edição você envia o código do funcionário por paramêtro!
No cenário 2 você pode usar ajax, quando trocar de diretoria(onchange) você manda renderizar(reRender) o combo de gerência … e assim por diante, tornando o managed bean como scope de request! Utilize o A4JForJSF
Qualquer dúvida estamos ai!
Abraços
putz… acabei de descobrir porque estava como scope session:
segue o código cenário 1
<rich:panel styleClass="tabela-form" id="pnlTblForm">
<h:panelGrid columns="1" id="gridForm">
<h:panelGroup>
<h:outputLabel value="Diretoria "/>
<h:selectOneMenu styleClass="selectform" required="true" id="diretoria" label="Diretoria" value="#{colaboradorCad.colaborador.diretoria.id}" valueChangeListener="#{colaboradorCad.changeDiretoria}">
<f:selectItems value="#{colaboradorCad.diretorias}"/>
<a4j:support event="onchange" ajaxSingle="true" reRender="pnlGerencia, pnlCoordenacao"/>
</h:selectOneMenu>
</h:panelGroup>
<h:panelGroup id="pnlGerencia">
<h:outputLabel value="Gerência "/>
<h:selectOneMenu styleClass="selectform" required="true" id="gerencia" label="Gerência" value="#{colaboradorCad.colaborador.gerencia.id}" valueChangeListener="#{colaboradorCad.changeGerencia}" >
<f:selectItems value="#{colaboradorCad.gerencias}"/>
<a4j:support event="onchange" ajaxSingle="true" reRender="pnlCoordenacao"/>
</h:selectOneMenu>
</h:panelGroup>
<h:panelGroup id="pnlCoordenacao">
<h:outputLabel value="Coordenação "/>
<h:selectOneMenu styleClass="selectform" required="true" id="coordenacao" label="Coordenação" value="#{colaboradorCad.colaborador.coordenacao.id}">
<f:selectItems value="#{colaboradorCad.coordenacoes}"/>
</h:selectOneMenu>
</h:panelGroup>
</h:panelGrid>
</rich:panel>
quando o usuário clica no combo de gerencia, o evento do valueChangeListener não é chamado se o scope do bean não for session.
Acho que isso tem a ver com http://www.theserverside.com/news/thread.tss?thread_id=44186 , um problema de commandLinks dentro de datatables.
Existe alguma soluição alternativa pra esse problema? no cenário 2 é a mesma coisa, quando eu clico no botão editar ele tbm não chama o evento e faz um submit pra mesma página.
[]'s
Você está utilizando que tipo de form um <h:form> ou a4j:form ?
Pelo que sei ocorre esse problema somente quando o form é <h:form>!
Tente utilizar a4j:form
Abraços
Cara é <h:form>.
Vou testar aqui e já mando o resultado.
Value!
nada feito.
segue a página:
[code]
<%@ page language=“java” contentType="text/html; charset=UTF-8"
pageEncoding=“UTF-8”%>
<%@ taglib prefix=“f” uri=“http://java.sun.com/jsf/core ”%>
<%@ taglib prefix=“h” uri=“http://java.sun.com/jsf/html ”%>
<%@ taglib uri=“http://richfaces.org/rich ” prefix=“rich”%>
<%@ taglib uri=“http://richfaces.org/a4j ” prefix=“a4j”%>
<jsp:include page="_top.jsp" />
Pesquisa de Colaboradores
<rich:panel styleClass="tabela-form">
<h:panelGrid columns="1">
<h:panelGroup>
<h:outputLabel value="Matricula " />
<h:inputText size="10" value="#{colaboradorPesq.matricula}" />
</h:panelGroup>
<h:panelGroup>
<h:outputLabel value="Nome " />
<h:inputText size="50" value="#{colaboradorPesq.nome}" />
</h:panelGroup>
<rich:panel styleClass="rich-no-border">
<h:panelGrid columns="2" style="width:100%">
<h:panelGroup styleClass="fieldset">
<h:outputLabel value="Situacao " />
<h:selectOneRadio value="#{colaboradorPesq.situacao}">
<f:selectItems value="#{colaboradorPesq.situacoes}" />
</h:selectOneRadio>
</h:panelGroup>
<h:panelGroup styleClass="fieldset">
<h:outputLabel value="Tipo de Colaborador " />
<h:selectOneRadio value="#{colaboradorPesq.tipoColaborador}">
<f:selectItems value="#{colaboradorPesq.tiposColaboradores}" />
</h:selectOneRadio>
</h:panelGroup>
</h:panelGrid>
</rich:panel>
<rich:panel styleClass="rich-no-border">
<h:panelGroup styleClass="botaoform">
<h:commandLink value="Pesquisar"
actionListener="#{colaboradorPesq.pesquisar}">
<a4j:support event="onclick" ajaxSingle="true"
reRender="frmCadastro, resultado, messages" />
</h:commandLink>
</h:panelGroup>
</rich:panel>
<h:panelGrid columns="1" id="resultado"
rendered="#{!empty colaboradorPesq.lista}">
<rich:dataTable width="700" id="colabList" rows="10"
columnClasses="col" value="#{colaboradorPesq.lista}" var="col"
columns="7" columnClasses="300,700,150,80,150,80,300"
onRowMouseOver="this.style.backgroundColor='#B5F3FB'"
onRowMouseOut="this.style.backgroundColor='#{a4jSkin.rowBackgroundColor}'">
<f:facet name="header">
<rich:columnGroup>
<rich:column>
<h:outputText styleClass="headerText" />
</rich:column>
<rich:column>
<h:outputText styleClass="headerText" value="Matrícula" />
</rich:column>
<rich:column>
<h:outputText styleClass="headerText" value="Nome" />
</rich:column>
<rich:column>
<h:outputText styleClass="headerText" value="Email" />
</rich:column>
<rich:column>
<h:outputText styleClass="headerText" value="Matr.Gestor" />
</rich:column>
<rich:column>
<h:outputText styleClass="headerText" value="Nome Gestor" />
</rich:column>
<rich:column>
<h:outputText styleClass="headerText" value="Situação" />
</rich:column>
<rich:column>
<h:outputText styleClass="headerText" value="Tipo" />
</rich:column>
</rich:columnGroup>
</f:facet>
<rich:column>
<h:commandLink action="#{colaboradorPesq.editar}"
immediate="true"
onclick="javascript:if (!confirm('Deseja editar o registro #{col.nome} ?')) return false;">
<h:graphicImage value="images/editar.gif" style="border: none;"
alt="Editar" />
<f:param name="codigo" value="#{col.id}" />
</h:commandLink>
</rich:column>
<rich:column>
<h:outputText value="#{col.matricula}" />
</rich:column>
<rich:column>
<h:outputText value="#{col.nome}" />
</rich:column>
<rich:column>
<h:outputText value="#{col.email}" />
</rich:column>
<rich:column>
<h:outputText value="#{col.colaboradorImediato.matricula}" />
</rich:column>
<rich:column>
<h:outputText value="#{col.colaboradorImediato.nome}" />
</rich:column>
<rich:column>
<h:outputText value="#{col.ativo ? 'ATIVO': 'INATIVO' }" />
</rich:column>
<rich:column>
<h:outputText value="#{col.tipoColaborador}" />
</rich:column>
<f:facet name="footer">
<rich:datascroller align="left" for="colabList" maxPages="10"
page="#{colaboradorPesq.scrollpage}" id="sc1" />
</f:facet>
</rich:dataTable>
</h:panelGrid>
</h:panelGrid>
</rich:panel>
</a4j:form>
</f:view>
<jsp:include page="_footer.jsp" />[/code]
Quando eu clico no editar, ele dá submit pra mesma página, e não chama o método do MB.
o nome do ben é esse né ? colaboradorPesq
tenta fazer isso:
<a4j:keepAlive beanName="colaboradorPesq" />
com isso vc consegue fazer o submit…
http://www.urubatan.com.br/jsf_commandlink_datatable_problemas/