Redirecionamento de URL em PrimeFaces Usando p:remoteCommand
Abstract
Apresentação de uma solução para um problema comum no desenvolvimento de aplicações web com PrimeFaces, onde o redirecionamento para uma URL após a execução de uma ação no servidor não funciona corretamente. A solução envolve o uso de
p:remoteCommandpara garantir que o link seja gerado de forma síncrona antes de ser aberto pelo navegador.
Introdução
Em aplicações web utilizando JSF, pode surgir a situação onde a URL gerada no servidor não é aberta corretamente no navegador. Isso acontece frequentemente porque o redirecionamento é feito antes que o servidor tenha completado o processamento e fornecido o link necessário.
Uma solução simples para garantir que o link seja aberto após a geração correta da URL é utilizar o componente p:remoteCommand do PrimeFaces, o qual permite chamar métodos no servidor e, ao mesmo tempo, executar comandos no lado do cliente (JavaScript).
Solução
1. Uso do p:remoteCommand para Redirecionamento
No PrimeFaces, o p:commandButton é frequentemente usado para disparar ações no servidor. Porém, ao tentar fazer um redirecionamento logo após a ação, pode ocorrer o problema do link não estar disponível ou ser redirecionado incorretamente (como para uma página “about:blank”). Para garantir que o redirecionamento ocorra somente após a URL ser gerada corretamente, utilizamos o p:remoteCommand.
2. Fluxo de Execução
- O
p:commandButtonexecuta uma ação no servidor, onde o link de pagamento é gerado e armazenado em uma variável do bean (paymentLink). - O
p:remoteCommandchama o método no servidor para garantir que a URL seja gerada de forma síncrona. - Após o processamento, o
p:remoteCommandexecuta um comando JavaScript que abre o link gerado em uma nova aba.
Exemplo
<p:column>
<p:commandButton
id="copyPaymentLinkButton"
styleClass="rounded-button ui-button-secondary"
icon="pi pi-link"
process="@this"
actionListener="#{paymentLinkController.createPaymentLink(prospect)}"
update=":form"
oncomplete="openPaymentLink();" />
<p:tooltip for="copyPaymentLinkButton" value="Copiar link de pagamento" showEffect="clip" hideEffect="fold"/>
</p:column>
<p:remoteCommand name="openPaymentLink"
action="#{paymentLinkController.createPaymentLink(prospect)}"
oncomplete="window.open('#{paymentLinkController.paymentLink}', '_blank');" async="false" />-
p:commandButton:- Ao ser clicado, o botão chama o método
createPaymentLinkno bean para gerar o link de pagamento. A ação de processamento (process="@this") garante que o próprio botão seja processado, e o atributoupdate=":form"faz a atualização do formulário após a execução. - O evento
oncomplete="openPaymentLink();"chama a funçãoopenPaymentLink()para abrir o link gerado em uma nova aba do navegador.
- Ao ser clicado, o botão chama o método
-
p:remoteCommand:- A tag
p:remoteCommandé configurada para invocar o métodocreatePaymentLinkno servidor e, ao completar a execução no servidor, dispara um comando JavaScript. - O comando JavaScript
window.open('#{paymentLinkController.paymentLink}', '_blank');abre o link gerado em uma nova aba.
- A tag
-
Síncrono com
async="false":- Definir
async="false"nop:remoteCommandgarante que o link seja gerado de forma síncrona antes de executar a ação do cliente (abrir a nova aba).
- Definir