JSF commandLink,POST和后退按钮

5

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

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

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

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

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

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。

各种第三方库添加不同的功能。我不确定JSF 2.0在这个领域是否有任何改进,但值得一看。


似乎JSF 2.X对GET和REST有更好的支持。 - Steve Claridge

1

如BalusC在其博客中所述,GET应用于页面之间的导航。 使用h:outputLink进行导航。

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

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

if(event.getFacesContext().getPartialViewContext().isAjaxRequest())
{
    return;
}

1

是的。JSF是围绕POST构建的,这是JSF最大的争议点之一。可以查看JAX-RS/Seam或Spring以获取可书签的GET页面。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接