5

我最近开始做一些 JSF 工作——在此之前我一直使用 PHP 或 Python 进行 Web 开发。

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

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

我已经有许多使用 h:commandLink 导航的页面。在我使用浏览器的后退按钮之前,这很有效。我应该如何处理 JSF 中的后退按钮?

我很难理解为什么 JSF 是围绕 POST 构建的。它破坏了书签、倒页和让您的页面在搜索引擎中编入索引的能力。

4

3 回答 3

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>

如果一切都失败了,您可以自己执行重定向 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;
}

警告:我不记得我是否正确编码了 URL。

各种 3rd 方库添加了不同的功能过剩。我不确定 JSF 2.0 在这方面是否做了任何事情,但可能值得一看。

于 2009-08-04T20:45:43.097 回答
1

是的。JSF 是围绕 POST 构建的,它是 JSF 最大的症结之一。查看 JAX-RS/Seam 或 Spring 以获得可收藏的 GETable 页面。

于 2009-08-04T19:18:48.043 回答
1

正如 BalusC 在他的博客上所说,GET 应该用于页面之间的导航。用于h:outputLink导航。

您可以阅读他的 PostRedirectGetListener ,它将解决返回/刷新表单重新提交确认消息。

我建议您添加以下内容以beforePhase处理部分 ajax 处理(如果相关):

if(event.getFacesContext().getPartialViewContext().isAjaxRequest())
{
    return;
}
于 2012-01-06T15:33:05.453 回答