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】:<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 以来实际上已被弃用,该版本引入了对立即返回 <to-view-id>
作为返回值的新支持,称为“隐式导航”。从本质上讲,基于 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【讨论】:
这个 Web 应用程序已有 10 多年的历史了,它最初是在 JSF 1.1 中实现的。我希望我也能获得一些用于现代化导航的预算。另一方面......我喜欢集中导航配置的概念,而不是我刚刚了解到的“隐式导航”,其中 to-view-id 分散在整个 Web 应用程序中。使维护 IMO 变得更加困难。以上是关于JSF:向操作方法添加参数后导航规则停止工作的主要内容,如果未能解决你的问题,请参考以下文章