JSF:导航规则在向操作方法添加参数后停止工作

JSF: navigation-rule stopped working after adding parameter to action method

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

目前的工作是简化一个h:dataTable。每条记录都有一个commandLink去相应的详情页。

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

新版本: 操作方法现在是 openDetail(Long id) 当然我在命令中添加了参数 link 还有。

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

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 对重载操作方法有影响吗?

<from-action> 必须 完全 匹配 文字字符串 ,如 action 属性中所定义。

因此,如果它当前看起来像这样:

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

那么 <from-action> 必须正是那个文字字符串:

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

然而,整个导航规则系统在 JSF 中并没有被证明是真正有用的,并且自从 2009 年 JSF 2.0 发布以来,它实际上已被弃用,该版本引入了对立即 returning <to-view-id> 作为 return 值,称为“隐式导航”。本质上,基于 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.

中摆脱整个 <navigation-rule> 膨胀

另请参阅:

  • JSF implicit vs. explicit navigation