【问题标题】:JSF: navigation-rule stopped working after adding parameter to action methodJSF:向操作方法添加参数后导航规则停止工作
【发布时间】:2021-05-26 15:27:19
【问题描述】:

我正在对一个 JSF Web 应用程序进行现代化改造,该应用程序是从一个已退休且无法回答问题的人那里接手的。

当前的工作是简化 h:dataTable。每条记录都有一个commandLink可以跳转到对应的详情页。

旧版:动作方法openDetail(),通过绑定dataTable并循环遍历记录获取行来确定选中记录。

新版本:动作方法现在是openDetail(Long id),当然我也在命令链接中添加了参数。

我的操作方法是用正确的参数调用的,我通过添加一些日志输出来验证这一点。 但是导航规则不再有效。虽然action方法返回了正确的结果,但它仍然停留在带有表格的页面上。

faces-config.xml 中的导航规则如下所示:

  <navigation-rule>
    <from-view-id>*</from-view-id>
    <navigation-case>
      <from-action>#{myBean.openDetail}</from-action>
      <from-outcome>success</from-outcome>
      <to-view-id>/mysks/detail.xhtml</to-view-id>
      <redirect/>
    </navigation-case>
  </navigation-rule>

我需要调整导航规则吗? JSF 对重载的操作方法有影响吗?

【问题讨论】:

    标签: jsf navigation faces-config


    【解决方案1】:

    &lt;from-action&gt; 必须完全匹配action 属性中定义的文字字符串

    所以如果它目前看起来像这样:

    <h:commandButton ... action="#{myBean.openDetail(detail.id)}">`
    

    那么&lt;from-action&gt; 一定就是那个字符串:

    <from-action>#{myBean.openDetail(detail.id)}</from-action>
    

    然而,整个导航规则系统并没有被证明在 JSF 中真正有用,并且自 2009 年发布 JSF 2.0 以来实际上已被弃用,该版本引入了对立即返回 &lt;to-view-id&gt; 作为返回值的新支持,称为“隐式导航”。从本质上讲,基于 XML 的导航规则实际上是侏罗纪 JSF 1.x 的“遗留物”,您最好将它们去掉。

    所以如果你只是简单地从

    调整openDetail()方法
    public String openDetail(Long id) {
        // ...
        return "success";
    }
    

    public String openDetail(Long id) {
        // ...
        return "/mysks/detail.xhtml?faces-redirect=true";
    }
    

    然后你可以从faces-config.xml 中摆脱整个&lt;navigation-rule&gt; 膨胀。

    另见:

    【讨论】:

    • 这个 Web 应用程序已有 10 多年的历史了,它最初是在 JSF 1.1 中实现的。我希望我也能获得一些用于现代化导航的预算。另一方面......我喜欢集中导航配置的概念,而不是我刚刚了解到的“隐式导航”,其中 to-view-id 分散在整个 Web 应用程序中。使维护 IMO 变得更加困难。
    猜你喜欢
    • 2017-03-11
    • 1970-01-01
    • 1970-01-01
    • 2015-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多