Galera é o seguinte ainda estou aprendendo JSF, e estou fazendo uns testes aqui e surgiu um problema que me parece simples, mas foi difícil de resolver, explicando:
Minhas telas são criadas com faceletes e eu faço os ui:insert dinâmicos sendo assim não existem regras de navegação o cliente clica em um menu do lado esquerdo e a tela aparece no centro. Só tem uma navegação no faces-config que é do login, enfim todos os meus commandButtons tem setado o actionListener e não o action e eu uso o reRender do a4j. A dúvida é a seguinte:
Eu tenho uma tela onde o usuário informa alguns filtros (datas inicial e final, numeros, etc) a partir dos filtros eu vou executar um processo, porém, antes de executar o processo eu faço um count com os filtros pra ver quantos registros serão processados. Se esse count der mais de 50.000 eu pergunto vc tem certeza? se sim processo tudo se não paro, mas eu quero criar isso genérico para eu reusar em otros processos que precisem. (Lembrando que isso é sem navegação, se tivesse navegação é claro que seria mais simples).
Como eu estou estudado eu resolvi criar uma solução, que funcionou, porém, eu vim até aqui pra perguntar se existe um jeito mais fácil de fazer isso.
Minha solução:
1. Criei um template com Facelets que vai ser “pai” de todas as telas do meu sistema, nele tem o modalPanel da mensagem:
<h:form id="formMensagem">
<rich:modalPanel id="pnlMsg">
<f:facet name="header">
<h:outputText value="TESTES JSF WEB Mensagem" />
</f:facet>
<h:outputText value="#{mensagemMB.mensagem}" />
<h:panelGrid columns="2">
<a4j:commandButton binding="#{mensagemMB.btn1}"/>
<a4j:commandButton binding="#{mensagemMB.btn2}"/>
</h:panelGrid>
</rich:modalPanel>
</h:form>
<h:form>
<ui:insert name="corpo">Corpo</ui:insert>
</h:form>
2.Criei um ManagedBean chamado MensagemMB e coloquei ele na Session via faces-config:
private String mensagem;private String textBtn1;private String actionBtn1;
private UIAjaxCommandButton btn1;private UIAjaxCommandButton btn2;
public MensagemMB() {
btn1 = new HtmlAjaxCommandButton();btn2 = new HtmlAjaxCommandButton();
btn2.setValue("Não");
UIComponentControl control = new HtmlComponentControl();
control.setId("controlButton");
control.setFor("pnlMsg");
control.setOperation("hide");
control.setEvent("oncomplete");
btn1.getChildren().add(control);
btn2.getChildren().add(control);
}
public static MensagemMB obterPainelMensagem() {
MensagemMB msgMB = (MensagemMB)((HttpSession)FacesContext.getCurrentInstance().getExternalContext().getSession(true)).getAttribute("mensagemMB");
if(msgMB == null) {
msgMB = new MensagemMB();
((HttpSession)FacesContext.getCurrentInstance().getExternalContext().getSession(true)).setAttribute("mensagemMB", msgMB);
}
return msgMB;
}
public void exibirQuestao(String msg, String actionBtn1, String reRender) {
setMensagem(msg);
btn1.setValue("Sim");
btn1.setActionExpression(Utils.getMethodExpression("#{mensagemMB.limparMensagem}", String.class, new Class[] {}));
btn1.setActionListener(Utils.getMethodBinding(actionBtn1, new Class[] {ActionEvent.class}));
btn1.setReRender(reRender);
btn2.setRendered(true);
btn2.setActionExpression(Utils.getMethodExpression("#{mensagemMB.limparMensagem}", String.class, new Class[] {}));
}
public String limparMensagem() {
setMensagem(null);
return "#";
}
- Como eu uso tudo isso(Seguindo o exemplo do processo com 50.000 registro), no ManagedBean do processo eu crio dois metodos:
public void executarProcessoX(ActionEvent evt) {
int qtdRegistros = ProcessoDAO.getInstance().verificaQuantidadeDeRegistros(filtro);
if(qtdRegistros > 50000) {
MensagemMB.obterPainelMensagem().exibirQuestao("O filtro informado na tela retornou mais de 50.000 registros. " +
"Deseja executa-lo assim mesmo?", "#{processoMB.processar}", null);
return;
}
processar(evt);
}
public void processar(ActionEvent evt) {
System.out.println("Processo efetuado com sucesso");
}
Nada de mais eu faço o count para verificar quantos registros serão processados a partir do filtro do usuário, se não der 50.000 eu efetivamente executo o processo no método [i]processar[/i], mas se der mais de 50.000 eu exibo a pergunta (linhas 4,5) e no segundo parâmetro eu passo qual o método eu quero que seja executado caso o cliente clique em SIM:
Ja na tela do processo basta eu incluir o seguinte botão:
<a4j:commandButton actionListener="#{processoMB.executarProcessoX}" value="Executar o Processo X" reRender="formMensagem">
<rich:componentControl for="pnlMsg" operation="show" event="oncomplete" rendered="#{not empty mensagemMB.mensagem}"/>
</a4j:commandButton>
E assim funcionou e ficou genérico em qualquer lugar que tenha processamento e eu queira exibir uma questão no meio basta eu escrever no ManagedBean do processo MensagemMB.obterPainelMensagem().exibirQuestao(… e passar qual o ActionListener se o usuário clicar em SIM.
Existe alguma outra maneira de fazer isso(sem regras de navegação), ou seja no meio do ManagedBean perguntar ao usuário vc quer continuar?
Obrigado pela atenção.