JSF CommandLink, postagem e o botão traseiro
-
22-07-2019 - |
Pergunta
Recentemente, comecei a fazer algum trabalho da JSF - antes disso, sempre usei o PHP ou o Python para o desenvolvimento da Web.
Fiquei um pouco surpreso ao descobrir que o JSF usa postagens HTTP para navegar quando a tag H: CommandLink é usada.
Eu tenho usado o comandlink, pois essa é aparentemente a maneira correta de criar aplicativos JSF. Por que o JSF usa o post para navegação? O que há de errado com o Get? Só posso assumir que o JavaScript que é gerado automaticamente pelo JSF para os eventos ONCLICK poderia exceder o comprimento máximo para uma solicitação GET.
Eu já tenho várias páginas que são navegadas usando H: CommandLink. Isso funciona bem até que eu use o botão traseiro do navegador. Como devo lidar com o botão traseiro no JSF?
Estou lutando para entender por que a JSF foi construída em torno do post. Ele quebra o livro de livros, a back-paging e a capacidade de indexar sua página nos mecanismos de pesquisa.
Solução
Não vai ajudá -lo a criar um link para o cliente, mas esteja ciente de outputLink.
Existe um elemento de redirecionamento para regras de navegação que podem ajudar para alguns problemas de atualização.
<navigation-rule>
<display-name>navBack</display-name>
<from-view-id>/navBack.jsp</from-view-id>
<navigation-case>
<from-outcome>navTo</from-outcome>
<to-view-id>/navTo.jsp</to-view-id>
<redirect />
</navigation-case>
</navigation-rule>
Se tudo mais falhar, você pode fazer o URL de redirecionamento, como nesta ação:
public String doAction() {
System.out.println("Did some non-idempotent operation");
FacesContext context = FacesContext.getCurrentInstance();
ExternalContext extContext = context.getExternalContext();
Application app = context.getApplication();
ViewHandler viewHandler = app.getViewHandler();
String url = viewHandler.getActionURL(context, "/navTo.jsp");
url = url + (url.indexOf('?') < 0 ? '?' : '+') + "foo=bar";
url = extContext.encodeResourceURL(url);
try {
extContext.redirect(url);
} catch (IOException e) {
throw new FacesException(e);
}
return null;
}
Advertências: não me lembro se estou codificando o URL corretamente.
Várias bibliotecas de terceiros adicionam excelentes excelentes recursos. Não tenho certeza se alguma coisa foi feita no JSF 2.0 nesta área, mas pode valer a pena dar uma olhada.
Outras dicas
Sim. O JSF é construído em torno do post e é um dos maiores pontos de discórdia sobre o JSF. Dê uma olhada no Jax-Rs/costura ou mola para páginas de Getable favoráveis.
Como Balusc disse em seu blog, Get deve ser usado para navegação entre a página. Usar h:outputLink
para navegação.
Você pode ler o postredirectgetListener e ele resolverá a mensagem de confirmação de reenviamento de renderização de volta/atualização.
Eu aconselho você a adicionar o seguinte beforePhase
Para lidar com o processamento parcial do Ajax (se relevante):
if(event.getFacesContext().getPartialViewContext().isAjaxRequest())
{
return;
}