代码之家  ›  专栏  ›  技术社区  ›  Steve Claridge

jsf命令链接、发布和后退按钮

  •  5
  • Steve Claridge  · 技术社区  · 15 年前

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

    当使用h:commandlink标记时,我有点惊讶地发现JSF使用HTTP文章来导航。

    我一直在使用commandlink,因为这显然是构建JSF应用程序的正确方法。为什么JSF使用Post进行导航?GeT怎么了?我只能假设JSF为onclick事件自动生成的javascript可能超过get请求的最大长度。

    我已经有了许多使用h:commandlink导航的页面。在我使用浏览器的“后退”按钮之前,这种方法很有效。如何处理JSF中的后退按钮?

    我很难理解为什么JSF是围绕着这个帖子构建的。它破坏了书签、反向分页和在搜索引擎中索引页面的能力。

    3 回复  |  直到 13 年前
        1
  •  4
  •   McDowell rahul gupta    15 年前

    它不会帮助您在客户机上建立链接,但请注意 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中是否在这方面做了什么,但它可能值得一看。

        2
  •  1
  •   Drew    15 年前

    是的。JSF是围绕Post构建的,它是JSF最大的症结之一。查看JAX-RS/Seam或Spring中的书签可获取页面。

        3
  •  1
  •   Daniel    13 年前

    正如俾路支在他的 blog ,应使用get在页面之间导航。 使用 h:outputLink 用于导航。

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

    我建议你在 beforePhase 为了处理部分Ajax处理(如果相关的话):

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