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:remoteCommand
para 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:commandButton
executa uma ação no servidor, onde o link de pagamento é gerado e armazenado em uma variável do bean (paymentLink
). - O
p:remoteCommand
chama o método no servidor para garantir que a URL seja gerada de forma síncrona. - Após o processamento, o
p:remoteCommand
executa 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
createPaymentLink
no 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étodocreatePaymentLink
no 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:remoteCommand
garante que o link seja gerado de forma síncrona antes de executar a ação do cliente (abrir a nova aba).
- Definir