1

次のようなナビゲーション ルールがあります。

<navigation-rule>
    <display-name>forgotPwd</display-name>
    <from-view-id>/login/forgotpwd.jsf</from-view-id>
    <navigation-case>
        <from-outcome>pass</from-outcome>
        <to-view-id>/login/pwdresetcomplete.xhtml</to-view-id>
    </navigation-case>
    <navigation-case>
        <from-outcome>fail</from-outcome>
        <to-view-id>/login/forgotpwd.xhtml</to-view-id>
    </navigation-case>
</navigation-rule>

そこで、ナビゲーション ルールをトリガーするために次のようにします。

  • 案内する/login/forgotpwd.jsf?uuid=fed8b3f7-ed33-4941-8306-3d2afbb8d1d0

このページには次の形式があります。

<h:form id="resetForm">
<!-- Omitting the login fields --> 
    <h:commandButton type="submit" id="resetPassword" value="Save" styleClass="btn small" action="#{registration.resetPassword}" >
        <f:param name="uuid" value="#{facesContext.externalContext.requestParameterMap.uuid}" />
    </h:commandButton>
</h:form>

(クエリ文字列パラメーターとして渡された uuid を受け取り、 registration.resetPassword 関数を呼び出します。)

registration.resetPassword Java コードは次のとおりです。

(簡潔にするために詳細は省略)

public String resetPassword() {
  // If good
  return "pass";
  // If bad
  return "fail"
}

問題: 「pass」を返すと、ナビゲーション ルールが起動しません。/login/pwdresetcomplete.jsf ではなく /login/forgotpwd.jsf に戻ります

これは、UUID パラメータが追加されているためですか? ナビゲーションが起動しないのはなぜですか?

これが機能しない理由を確認するためにトリガーできるlog4jログはありますか?

4

2 に答える 2

1
<from-view-id>/login/forgotpwd.jsf</from-view-id>

from-view-id、仮想 URL ではなく、ビュー ID である必要があります。したがって、.jsf拡張子を含めないでください。

<from-view-id>/login/forgotpwd.xhtml</from-view-id>

ところで、リクエスト パラメータは で使用できるビューにあります#{param}。これにより、 と比較していくつかの文字が節約され#{facesContext.externalContext.requestParameterMap}ます。

<f:param name="uuid" value="#{param.uuid}" />

EL の暗黙的オブジェクトも参照してください。ちなみに、使用している JSF のバージョンは明確ではありませんが、JSF 2.0 (すでに Facelets を使用しているため、使用していると思われます) 以降、ナビゲーション ケースの XML 地獄はもう必要ありません。to-view-idアクションメソッドから直接(相対および/または拡張子なし)を返すことができます。

public String resetPassword() {
  // If good
  return "pwdresetcomplete";
  // If bad
  return "forgotpwd"
}

このようにして、全体を取り除くことができます<navigation-rule>暗黙的なナビゲーションも参照してください。

于 2012-09-23T04:03:51.690 に答える
0

これらの2つのルールを追加しました...これで機能します。どちらがそれをしたかはわかりませんが、from-actionを使用すると、はるかに幸せになりました。

<navigation-rule>
        <display-name>forgotPwd</display-name>
        <from-view-id>/login/forgotpwd.xhtml</from-view-id>
        <navigation-case>
            <from-action>#{registration.resetPassword}</from-action>
            <from-outcome>pass</from-outcome>
            <to-view-id>/login/pwdresetcomplete.xhtml</to-view-id>
        </navigation-case>
        <navigation-case>
            <from-action>#{registration.resetPassword}</from-action>
            <from-outcome>fail</from-outcome>
            <to-view-id>/login/forgotpwd.xhtml</to-view-id>
        </navigation-case>
    </navigation-rule>
    <navigation-rule>
        <display-name>forgotPwd</display-name>
        <from-view-id>/login/forgotpwd.jsf</from-view-id>
        <navigation-case>
            <from-action>#{registration.resetPassword}</from-action>
            <from-outcome>pass</from-outcome>
            <to-view-id>/login/pwdresetcomplete.xhtml</to-view-id>
        </navigation-case>
        <navigation-case>
            <from-action>#{registration.resetPassword}</from-action>
            <from-outcome>fail</from-outcome>
            <to-view-id>/login/forgotpwd.xhtml</to-view-id>
        </navigation-case>
    </navigation-rule>  
于 2012-09-22T21:19:15.390 に答える