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

Posted

技术标签:

【中文标题】JSF:向操作方法添加参数后导航规则停止工作【英文标题】:JSF: navigation-rule stopped working after adding parameter to action method 【发布时间】: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 对重载的操作方法有影响吗?

【问题讨论】:

【参考方案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; 膨胀。

另见:

JSF implicit vs. explicit navigation

【讨论】:

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

以上是关于JSF:向操作方法添加参数后导航规则停止工作的主要内容,如果未能解决你的问题,请参考以下文章

js代码在导航路线后停止工作而无需重新启动页面

JSF Maven Tomcat App突然从eclipse停止工作

由于下面的内容,粘性导航栏停止工作[重复]

如何检测由滑动触发的后退导航并在iOS上将其停止?

添加 FCM 支持后,本地通知在 iOS 上停止工作

window.setTimeout() 在 Safari 中的页面导航后停止