Popup em JSF sem Javascript


Tutorial de como fazer um popup sem escrever código javascript na página.

Vou explicar 2 meios de criar popup. Um atualizando o javascript dinamicamente e outro com myfaces.


Nesse tutorial, a lógica é criar um arquivo de script dinâmico, que vou chamar de dynamicScript.js. Vou incluir o método do popup nele dinamicamente e chamar o popup.


Primeiro, através de um jsp vou chamar um action no bean que é quem vai criar o método javascript pra incluir na página. Eu poderia ter incluído o método direto na hora de abrir a página, mas preferi assim.

1 <h:commandButton value="testaPopup" action="#{terminalBean.geraPopup}" />


Agora o método geraPopup. Observe que na minha estrutura, o arquivo dynamicScript.js está dentro da pasta pages/script. As duas barras invertidas se dão por conta do meu ambiente de desenvolvimento, windows.
01 public String geraPopup() {
02     
03     String functionJs = "function popupJsf(url) { " +
04         "window.open(url, '_blank', 'toolbar=1, status=1, location=1,height = 300, width = 400');}";
05     
06     String file = "pages\\script\\dynamicScript.js";
07     FacesContext ctx = FacesContext.getCurrentInstance();
08     HttpServletRequest request = (HttpServletRequestctx
09         .getExternalContext().getRequest();
10     String path = request.getRealPath("/");
11     file = path.concat(file);
12     
13     try {
14       boolean exists = (new File(file)).exists();
15       if (exists) {
16         BufferedWriter out = new BufferedWriter(new FileWriter(file, true));
17           out.write(functionJs);
18           out.close();
19       else {
20         File f = new File(file);
21         BufferedWriter out = new BufferedWriter(new FileWriter(f));
22           out.write(functionJs);
23           out.close();
24       }
25     catch (IOException e) {
26     }
27     
28     ctx.renderResponse();
29     return "/pages/teste/popup.jsf?redirect=true";
30   }


Por último, o arquivo popup.jsf
Dentro da tag head o link para chamar o javascript dinâmico.

1 <script src="#{facesContext.externalContext.requestContextPath}/pages/script/dynamicScript.js" type="text/javascript"></script>


Dentro do body

1 <h:commandButton value="testePopup" onclick="popupJsf('/servlet/qualquerCoisa.jsf');" />

E pronto. É só clicar.

Abaixo deixo um outro meio de fazer utilizando o myfaces.
Precisaremos do Myfaces Tomahawk configurado na aplicação. Esse é um recurso do Tomahawk.

No meu caso, ao clicar em um link, o mesmo deveria executar um action no bean e em seguida exibir o popup com o resultado.

No jsp:




<h:commandButtom actionListener="#{bean.openPopup}" value="Abrir popup" />



No bean:




public void openPopup(ActionEvent event) {
    // consulta o que precisar e manda o resultado pro popup..

    // tamanho do popup
    int tamanhoX = 600
    int tamanhoY = 300;

    String url = "/pages/popup.jsf";

    PopupUtil.montaPopup(tamanhoX, tamanhoY, url);
  }



Classe PopupUtil:




public class PopupUtil {

  public static void montaPopup(int tamanhoX, int tamanhoY, String viewId) {

    FacesContext ctx = FacesContext.getCurrentInstance();
    ViewHandler viewHandler = ctx.getApplication().getViewHandler();
    String actionUrl = viewHandler.getActionURL(ctx, viewId);

    String javascriptText = "window.open('"
        + actionUrl
        "', '_blank', 'dependent=yes, menubar=no, toolbar=no, location=no, status=no, "
        "scrollbars=yes, resizable=no, width=" + tamanhoX
        ", height=" + tamanhoY + ", titlebar=no');";

    AddResource addResources = AddResourceFactory.getInstance(ctx);

    addResources.addInlineScriptAtPosition(ctx, AddResource.HEADER_BEGIN,
        javascriptText);
  }
}




Pronto. Ao clicar no link será criado um método javascript no cabeçalho da página que chama um popup definido no método montaPopup
da classe PopupUtil. Verifique se seu navegador não bloqueia popups e é só testar.

Comentários

Ice-Man disse…
Oi, muito bacaninha o Post!! ;-))

Mas, não saberia dizer como fazer isso, só q c/ a implementação RichFaces ou Woodstock (VisualWebUI)??!
Olá Ice-Man. Parece que esse tipo de popup é só com javascript mesmo. O Tomahawk inclui um javascript no cabeçalho da página. O Richfaces até gera um tipo de popup, mas não invocando uma nova página. Você pode tentar aqui: http://stackoverflow.com/questions/673670/richfaces-displaying-a-notification-popup-when-ajax-operation-succeeded.

Você pode ainda utilizar Richfaces e Tomahawk. Dá pra usar numa boa, sem conflitos!
Ice-Man disse…
Cristiano,

Muito obrigado p/s dicas.
Gostaria muito q visitasse(m) o meu Blog: Engenharia de Software | Agil!
Sei q vc é 1 grande fã do JSF, mas o meu 1º post foi sobre (p/- é 1 framework brazuka) o VRaptor 3: VRaptor3: o framework Java mais CoC que eu já vi…!
1 ]o['ão,

Derlon
Omar disse…
Muito bom o post .
Mais uma pergunta :
e se eu quero que apos fechar a pop se executasse uma action para fazer um reload da pagina qe chamou a popup ? como seria ?
Obrigado
Omar, da forma como foi descrito acima ele irá abrir o popup e fazer o reload da página de baixo.

Postagens mais visitadas deste blog

Utilizando um pool de conexões com hibernate

Gravando dados de um arquivo CSV no Oracle utlizando Python e a biblioteca cx_Oracle