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.

Foi útil?

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;
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top