JSF commandLink,POSTing和后退按钮

Ste*_*dge 5 jsf post commandlink

我最近开始做一些JSF工作 - 在此之前我总是使用PHP或Python进行Web开发.

当使用h:commandLink标记时,我发现JSF使用HTTP POST进行导航,我感到有些惊讶.

我一直在使用commandLink,因为这显然是构建JSF应用程序的正确方法.为什么JSF使用POST进行导航?GET有什么问题?我只能假设JSF为onclick事件自动生成的Javascript可能超过GET请求的最大长度.

我已经有很多使用h:commandLink导航的页面.这很好用,直到我使用浏览器的后退按钮.我该如何处理JSF中的后退按钮?

我很难理解为什么JSF是围绕POST构建的.它打破了书签,反向分页以及将您的页面编入索引的功能.

McD*_*ell 4

它不会帮助您在客户端上构建链接,但请注意outputLink

导航规则有一个重定向元素,可以帮助解决某些刷新问题。

<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>
Run Code Online (Sandbox Code Playgroud)

如果所有其他方法均失败,您可以自己执行重定向 URL,如以下操作所示:

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;
}
Run Code Online (Sandbox Code Playgroud)

注意事项:我不记得 URL 编码是否正确。

各种第三方库添加了不同的过剩功能。我不确定 JSF 2.0 是否在这方面做了什么,但可能值得一看。