faces-redirect=true 的导航规则不触发

Navigation rule with faces-redirect=true not firing

我正在开发一个用于练习的小网络工具,我注意到了导航规则。所以我看了几个网络教程并自己尝试了一下,但它对我不起作用。它不会重定向到所需的页面。

faces-config.xml(只有重要的部分)

    <navigation-rule>  
    <from-view-id>/kursleiter.xhtml</from-view-id>  
        <navigation-case>   
            <from-action>#{verifyCredentials.save}</from-action>
            <from-outcome>ok</from-outcome>   
            <to-view-id>/teilnehmer.xhtml?faces-redirect=true</to-view-id>  
        </navigation-case>  
</navigation-rule>

return的class的值为<from-outcome>

public class verifyCredentials() {
    public String save(Klasse klasse, Module modul) {
    //do some other stuff
    return "ok";
    }
}

按下此命令链接时,应该会发生重定向

<p:commandLink actionListener="#{verifyCredentials.save(klasse, modul)}">#{modul.modulnummer} </p:commandLink>

现在,这给我带来了几个问题:

  1. 我需要在 <from-view-id> 中添加 /faces/ 吗?
  2. 我不能简单地 return link 到我 class 中所需的页面吗?
  3. 我是否犯了任何我太盲目而看不到的逻辑错误?

提前致谢 - Reteras

有两个错误。

首先,您在这里混合了隐式导航和显式导航。

<to-view-id>/teilnehmer.xhtml?faces-redirect=true</to-view-id>

faces-redirect=true 查询字符串参数仅用于隐式导航,如下所示:

public String save(Klasse klasse, Module modul) {
    // ...
    return "/teilnehmer.xhtml?faces-redirect=true";
}

请注意,这不需要任何 XML 配置!隐式导航功能是自 JSF 2.0 以来新增的功能。也许您在学习 JSF 2.x 时 reading/focusing 使用 JSF 1.x 资源而不是 JSF 2.x 资源。注意学习资源中提到的日期和版本。

如果您确实需要在 XML 中通过显式导航配置此重定向,请改用 <redirect>

<navigation-case>
    <from-action>#{verifyCredentials.save}</from-action>
    <from-outcome>ok</from-outcome>
    <to-view-id>/teilnehmer.xhtml</to-view-id>
    <redirect />
</navigation-case>  

其次,您将 actionListeneraction 混合使用。

<p:commandLink actionListener="#{verifyCredentials.save(klasse, modul)}">

actionListener 不支持返回导航结果。请改用 action

<p:commandLink action="#{verifyCredentials.save(klasse, modul)}">

另请参阅:

  • Differences between action and actionListener
  • How to navigate in JSF? How to make URL reflect current page (and not previous one)