CommandLink do prime não funciona

Boa noite pessoall,estou quebrando a cabeça com alguns componentes do prime um dele é o cammandLink.

Veja o código

 <?xml version="1.0" encoding="ISO-8859-1" ?>   
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
<html xmlns="http://www.w3.org/1999/xhtml"  
     xmlns:h="http://java.sun.com/jsf/html"  
     xmlns:p="http://primefaces.prime.com.tr/ui"  
     xmlns:f="http://java.sun.com/jsf/core">  
<h:head>  
     <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />  
     <title>Cadastro de Usuários</title>  
 </h:head>  
  <f:view>  
      <h:body>  
         <h:form id="frmGridUsuario">  
              <p:growl id="menssagensUsuario"  
                       life="3000"/>    
              <p:dataTable widgetVar="dtUsuario"  
                           var="usuario"   
                           value="#{usuarioMB.usuarios}"   
                          paginator="true"  
                          rows="5"   
                           selection="#{usuarioMB.usuario}"   
                           selectionMode="single"  
                           onRowSelectComplete="dlgUsuario.show();"  
                           emptyMessage="Nao existe Usuário cadastrado"  
                           style="width:70%"  
                           update="frmCadastroUsuario">  
                  <p:column sortBy="#{usuario.email}"   
                            filterBy="#{usuario.email}">  
                     <f:facet name="header">  
                          <h:outputText value="Email" />  
                      </f:facet>  
                      <h:outputText value="#{usuario.email}" />  
                  </p:column>  
                  <p:column sortBy="#{usuario.cpf}"   
                            filterBy="#{usuario.cpf}">  
                      <f:facet name="header">  
                        <h:outputText value="CPF" />  
                      </f:facet>  
                      <h:outputText value="#{usuario.cpf}" />  
                  </p:column>  
                  <p:column sortBy="#{usuario.nome}"   
                            filterBy="#{usuario.nome}">  
                      <f:facet name="header">  
                          <h:outputText value="Nome" />  
                      </f:facet>  
                      <h:outputText value="#{usuario.nome}" />  
                  </p:column>  
                  <p:column sortBy="#{usuario.perfil}"   
                            filterBy="#{usuario.perfil}">  
                      <f:facet name="header">  
                          <h:outputText value="Perfil" />  
                     </f:facet>  
                      <h:outputText value="#{usuario.perfil}" />  
                  </p:column>  
              </p:dataTable>  
              <p:panel style="width:69.2%">  
                  <p:commandLink title="Incluir"  
                                 oncomplete="dlgUsuario.show();"  
                                 action="#{usuarioMB.incluir}"  
                                 update="dlgUsuario">  
                      <h:graphicImage url="/imagens/novo.jpg"  
                                      style="border:0"/>  
                  </p:commandLink>  
                  <p:commandLink title="Apagar"  
                             actionListener="#{usuarioMB.apagar}"  
                             style="margin-left:20px"  
                             update="frmGridUsuario">  
                      <p:graphicImage url="/imagens/apagar.jpg"  
                                      style="border:0"/>  
                  </p:commandLink>  
                  <h:commandLink title="Voltar"  
                                action="#{usuarioMB.voltar}"  
                                 ajax="false"  
                                 style="margin-left:20px">  
                      <h:graphicImage url="/imagens/voltar.jpg"  
                                      style="border:0"/>  
                  </h:commandLink>  
              </p:panel>  
          </h:form>       
          <h:form id="frmCadastroUsuario">  
              <p:dialog id="dlgUsuario"  
                        widgetVar="dlgUsuario"  
                        header="Usuario"  
                        width="500"  
                        modal="true">   
                  <h:panelGrid columns="2">  
                      <h:outputLabel value="Nome"   
                                     for="itxNome" />  
                      <p:inputText id="itxNome"  
                                   value="#{usuarioMB.usuario.nome}"   
                                   size="35"  
                                   required="true"  
                                   requiredMessage="Informe o Nome"/>  
                      <h:outputLabel value="CPF"   
                                     for="mskCpf" />  
                      <p:inputMask id="mskCpf"  
                                   mask="999.999.999-99"  
                                   value="#{usuarioMB.usuario.cpf}"                                  
                                   required="true"  
                                   requiredMessage="Informe o Cpf"/>  
                      <h:outputLabel value="Perfil"   
                                     for="somPerfil" />  
                      <h:selectOneMenu id="somPerfil"  
                                       value="#{usuarioMB.usuario.perfil}"  
                                       required="true"  
                                     requiredMessage="Informe o Perfil" >  
                          <f:selectItems value="#{usuarioMB.perfils}"/>  
                      </h:selectOneMenu>  
                      <h:outputLabel value="Email"   
                                     for="itxEmail"/>  
                      <p:inputText id="itxEmail"  
                                   value="#{usuarioMB.usuario.email}"   
                                   size="35"  
                                   required="true"  
                                   requiredMessage="Informe o Email"/>  
                      <h:outputLabel value="Senha"   
                                     for="pswSenha"   
                                     rendered="#{empty usuarioMB.usuario.cpf}"/>  
                      <p:password  id="pswSenha"  
                                   value="#{usuarioMB.usuario.senha}"   
                                   required="true"  
                                   requiredMessage="Informe a Senha"  
                                   rendered="#{empty usuarioMB.usuario.cpf}"/>  
                      <h:outputLabel value="Confirmar Senha"   
                                     for="pswConfirmarSenha"   
                                     rendered="#{empty usuarioMB.usuario.cpf}"/>  
                      <p:password  id="pswConfirmarSenha"  
                                   value="#{usuarioMB.senha}"   
                                   required="true"  
                                   requiredMessage="Informe a Confirmação da Senha"  
                                   rendered="#{empty usuarioMB.usuario.cpf}"/>  
                  </h:panelGrid>  
                  <h:panelGrid columns="2">  
                      <p:commandLink title="Gravar"  
                                     action="#{usuarioMB.gravar}"  
                                     rendered="#{empty usuarioMB.usuario.cpf}"  
                                     update="menssagensUsuario, itxId, itxNome, mskCpf, somPerfil,itxEmail ,pswSenha, pswConfirmarSenha, frmGridUsuario">  
                          <p:graphicImage url="/imagens/gravar.jpg"  
                                      style="border:0"/>  
                      </p:commandLink>  
                      <p:commandLink title="Alterar"  
                                     actionListener="#{usuarioMB.alterar}"  
                                     rendered="#{!empty usuarioMB.usuario.cpf}"  
                                     oncomplete="dlgUsuario.hide();"  
                                     update="menssagensUsuario, itxId, itxNome, mskCpf, somPerfil,itxEmail ,pswSenha, pswConfirmarSenha, frmGridUsuario">  
                          <p:graphicImage url="/imagens/gravar.jpg"  
                                      style="border:0"/>  
                      </p:commandLink>  
                      <p:commandLink title="Alterar Senha"  
                                     rendered="#{!empty usuarioMB.usuario.cpf}"  
                                     style="margin-left:20px">  
                           <p:graphicImage url="/imagens/alterarSenha.jpg"  
                                      style="border:0"/>  
                      </p:commandLink>  
                  </h:panelGrid>  
              </p:dialog>  
          </h:form>  
      </h:body>  
  </f:view>  
  </html>   

No exemplo botão GRAVAR E ALTERAR ,não funciona no seguinte caso.

se eu gerar um mensagem de erro la no ManagendBean a mandar pAra pagina.xhtml ela aparece normal, mais quando eu volta a clicar em alguns dois botoes não funciona mais.

se eu mudar para JSF h:comandLink funciona , mais por um não posso usar, no caso do gravar se eu usar o h:commandLink ele da o submit e fecha o Dialog e do prime ele vai la faz e mantem o Dialog, por isso precisa ser do prime(AJAX)

Erick, então, trabalhei num projeto médio/grande com primefaces e passei por problemas muito similares aos teus. Telas com toolbar, maioria ajax e p:dialogs para todos os lados e, pior, muitas telas ao mesmo tempo em abas diferentes.

O Primefaces é ótimo, mas tem uns probleminhas que incomodam e alguns comportamentos inexplicáveis… tipo esse caso teu, na primeira vez funciona e na sequencia deixa de funcionar.
Frequentei bastante o fórum do próprio Primefaces e pelo que entendi grande parte dos problemas é ocasionado pela mistura de ‘frameworks’ javascript, alguns componentes usam JQuery e outros YUI da Yahoo, e pode complicar mais ainda de você usar o ajax nativo do jsf 2.0.
Durante este projeto fui atualizando a versão do primefaces e alguns componentes JQuery passaram a usar YUI e vice-versa, fazendo com que ao atualizar parasse de funcionar devido aos conflitos.
O que acontece é que o javascript gerado na página ‘quebra’ fazendo o componente não responder mais (nessa hora é bom você ter o plugin firebug do firefox instalado para facilitar a verificação, e até comparar o código html/js gerado antes e depois de ‘quebrar’).

O que eu aconselharia seria:

  • Quando algum componente primefaces que usa ajax=true começar a falhar, tente substituir o mesmo pela versão nativa jsf com immediate=true (importante para que não faça o ciclo completo) e ‘dentro’ dele coloque um <p:ajax>.
    No teu caso experimente <h:commandLink> + <p:ajax>. No nosso projeto em todos os toolbars a ação “novo” teve que utilizar essa combinação, idem para as ações que abriam pdfs. As demais ficaram com p:commandlink mesmo sem problemas (Ex. avançar, voltar etc.)

  • Os <p:dialog> são uma dor de cabeça a parte. No nosso projeto usávamos o <p:layout> pra complicar mais, e os p:dialogs só funcionam direito fora deles, esse se não me engano é um caso da interface YUI, provável razão do conflito. Na dúvida, procure declarar eles o mais ‘por fora’ possível.

Primeiro quero agradecer, então cheio de "bugsinhos " o prime mais ainda acho a melhor opção para JSF, eu preciso usar o dialog mais esta dando muito problema,no caso do botão vou experiementar isto que vc falou qualquer coisa volta aqui.

outra coisa,sabe os rendered do botoes?

não funciona,mudei para disabled ai funciona, porem gostaria de usar o renderd mesmo,sabe algum macete?

Obrigado

Não consigo fazer funciona eu precisava algo deste tipo

<h:commandLink id="clkGravar"
title=“Gravar"
action=”#{usuarioMB.gravar}“
disabled=”#{!empty usuarioMB.usuario.cpf}"
style="margin-right:20px"
immediate=“true”>
<f:ajax event=“complete"
render=“itxId, itxNome, mskCpf, somPerfil,itxEmail ,pswSenha, pswConfirmarSenha, frmGridUsuario”/>
<h:graphicImage url=”/imagens/gravar.jpg"
style=“border:0”/>
</h:commandLink>

mais não existe o o avento complete

no caso de usar o h:commandlink mais o p:ajax,ele fecha o dialog apos a operacao,e eu preciso que ele mantem o dialog e não fecha…

se eu usar o p:commandLink ele mantemm,porem das os bgs conheido por nos

e seu eu usarr assim

   <p:commandLink  id="clkGravar"
                                                       title="Gravar"
                                                       actionListener="#{usuarioMB.gravar}"
				                       disabled="#{!empty usuarioMB.usuario.cpf}"
                                                       style="margin-right:20px">
                                           <p:ajax event="complete"
                                                   update="itxId, itxNome, mskCpf, somPerfil,itxEmail ,pswSenha, pswConfirmarSenha, frmGridUsuario"/>
                                           <h:graphicImage url="/imagens/gravar.jpg"
								style="border:0"/>
					</p:commandLink>

ai não funciona nenhuma vez? oque fazer

Se servir de modelo, aqui vai do jeito que eu uso e funciona um p:dialog (declarado fora do layout/form onde está o commandlink)

Obs. Em vez de usar graphicimage eu uso styleClass e no css lst_aprovarOrcamento está a imagem
Uso rendered normalmente, os updates são sempre agrupados em um Panel - Ex. <p:outputPanel id=“aprovarOrcamentoRevisaoPanel”>

<p:commandLink 
                                    oncomplete="aprovarOrcamentoRevisao.show();"
                                    styleClass="lst_aprovarOrcamento"  
                                    rendered="#{orcamento.permiteAprovarOrcamentoRevisao}"  
                                    actionListener="#{orcamentoListBean.actionAprovarOrcamentoRevisao}"  
                                    immediate = "true" 
                                    process="@form"
                                    update="aprovarOrcamentoRevisaoPanel">
</p:commandLink>

O p:dialog :

<?xml version="1.0" encoding="UTF-8"?>
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:p="http://primefaces.prime.com.tr/ui">

    <f:view contentType="text/html">
        <h:form id="aprovarOrcamentoRevisaoForm">
            <p:dialog rendered="#{controleSession.orcamentoCabAprovarOrcamentoRevisao}" 
                zindex="2000" header="#{i18n.confirmaaprovacaoorcamentorevisao}"
                widgetVar="aprovarOrcamentoRevisao" width="690" height="400"
                resizable="false" modal="true" draggable="true">

.. omitido pra não poluir muito

                <p:commandLink
                    title="#{i18n.fechar_tip}"
                    action="#{orcamentoListBean.actionFecha}" immediate="false"
                    onclick="aprovarOrcamentoRevisao.hide()" styleClass="tb_fechar" value="">
                </p:commandLink></div>
            </p:dialog>
        </h:form>
    </f:view>
</ui:composition>

ta vou testatar muito obrigado

Ola jamirdeajr, eu li num dos post’s alteriores uma dica que voce deu, de como utilizar o commandLink nativo do jsf, para situação onde seja necessario a geração de pdf. então estou com esta necessidade tentei colocar a sua dica em pratica, mais so funcionou em parte. o metodo ate é chamado, faz tudo que tem que fazer so não mostra é o pdf.

agora so para recapitular a sua dica. voce disse para substituir p:commandLink por h:commandLink e ao invez de usar o ajax=false usar o immediate=true e tambem colocar um tag <f:ajax /> é so isso mesmo ou tem mais alguma coisa ?

Antes que voce me peça. aqui esta meu codigo

<h:commandLink update="form" process="@form" action="#{meuBean.gerarRelatorio}" immediate="true" target="_blank">
    <img title="Relatório" width="20" height="20" src="#{request.contextPath}/images/pdf.png"/>
    <f:setPropertyActionListener target="#{meuBean.objetoSelecionada}" value="#{objeto}" />
    <f:ajax />
</h:commandLink>

Olá Welson Santos,

Vou colocar aqui o exemplo mais recente que tenho funcionando e abrindo pdf jasper reports em uma janela ou aba do browser.
Ele está com h:commandButton em vez de h:commandLink, mas não teria problema usar commandLink. Detalhe que não precisou usar ajax.

<h:commandButton title="Relatório Materiais" actionListener="#{orcamentoDetalheBean.actionRelatorioListaMateriais}" immediate="true" styleClass="tb_pdf" value="" onclick="this.form.target='_blank'" update="@form"> </h:commandButton>
Esta foi a parte mais complicada, onde tive problemas parecidos com os teus. Mas deste jeito funcionou:

[code]public void actionRelatorioListaMateriais(ActionEvent event) {
FacesContext facesContext = FacesContext.getCurrentInstance();
ServletContext sc = (ServletContext) facesContext.getExternalContext().getContext();

try {
    // Gera .pdf
// É arquivo sempre extensão .jasper

    final String jasper = sc.getRealPath(jasperFile);

// Gera "preenchimento" (dados)
    JasperPrint impressao = JasperFillManager.fillReport(jasper, parametros,connection);

    // Gera array de bytes equivalente ao arquivo .pdf
    byte[] bytes = null;
    bytes = JasperExportManager.exportReportToPdf(impressao);
    HttpServletResponse response = (HttpServletResponse) facesContext.getExternalContext().getResponse();

    if (bytes != null && bytes.length > 0) {

        // envia o relatório em formato PDF para o browser
        response.setContentType("application/pdf");
        response.setHeader("Content-disposition", "inline; filename=\"arquivo.pdf\"");
        response.setContentLength(bytes.length);
        ServletOutputStream ouputStream = response.getOutputStream();
        ouputStream.write(bytes, 0, bytes.length);
        ouputStream.flush();
        ouputStream.close();
    } 
} catch (JRException e) {
   e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
}
// definindo que a resposta ao contexto do faces está completa - importante!
facesContext.responseComplete();

}[/code]
Espero que ajude, boa sorte!

E ae pessoal, então vi esse topico aqui, e estou com o mesmo problemas mas a questão é um pouco diferente
assimm, tenho um botao pesquisar na página, qndo clico nesse botao ele abre um dialog com uma tabela dentro, o commandLink esta no nome da pessoa, qndo clico simplesmente fecha o dialog, vocês podem me ajudar ?
segue ocódigo abaixo,

	[code]&lt;p:dialog id="dlgPacientes" header="Resultado da pesquisa" widgetVar="dtPacientes"
			 	modal="true" width="1000" height="500" rendered="true" &gt;
			&lt;h:form id="formDl"&gt;
				&lt;p:dataTable id="tbl" var="p" value="#{bpaiBean.pacientes}" 
						 	emptyMessage="NENHUM PACIENTE ENCONTRADO" &gt;
						   
    				&lt;p:column style="width:25px"&gt;  
    					&lt;f:facet name="header"&gt;PACIENTE&lt;/f:facet&gt;
    					&lt;h:commandLink action="#{bpaiBean.teste}" &gt;
    						&lt;h:outputText value="#{p.pessoa.nome}" /&gt;
    						&lt;f:setPropertyActionListener target="#{bpaiBean.bpai.paciente}" value="#{p}" /&gt;
    					&lt;/h:commandLink&gt;
    				&lt;/p:column&gt;  

    				&lt;p:column style="width:25px; text-align:center"&gt;  
    					&lt;f:facet name="header"&gt;RG&lt;/f:facet&gt;  
    	 			&lt;h:outputText value="#{p.pessoa.rg}" /&gt;  
    				&lt;/p:column&gt;  

    				&lt;p:column style="width:25px; text-align:center"&gt;  
    					&lt;f:facet name="header"&gt;CPF&lt;/f:facet&gt;  
       				&lt;h:outputText value="#{p.pessoa.cpf}" /&gt;  
        			&lt;/p:column&gt;  

    				&lt;p:column style="width:25px;  text-align:center"&gt;  
       				&lt;f:facet name="header"&gt;CARTÃO SUS&lt;/f:facet&gt;  
       					&lt;h:outputText value="#{p.cartaoSUS}" /&gt;  
    				&lt;/p:column&gt;        				
    			&lt;/p:dataTable&gt;        			
    		&lt;/h:form&gt;
	&lt;/p:dialog&gt;[/code]