4

私がやろうとしているのは、単純なログアウト機能です。メイン ページはテンプレート ページを呼び出します。ヘッダーとコンテンツで構成されます。ヘッダーには、ログアウト ボタンが含まれています。ページには 2 つのフォームがあり、1 つはヘッダー (ログアウト ボタン) に、もう 1 つはコンテンツ (いくつかのボタン、リンクなど) にあります。

私の問題は、ログアウトリンクを最初にクリックしたときにページが更新され、2回目のクリック後にのみ続行することです。コンテンツフォーム内にプライムフェイスまたは ajax コードを含めると、問題が発生し始めます。その特定のコードを削除すると、ログアウトは意図したとおりに機能します。

メイン テンプレートのログアウト フォームtemplateUser.xhtml:

<h:form id="logout">
    <h:commandLink action="#{tenantController.customLogout(e)}"
        id="logoutBtn" immediate="true" value="Logout" />
</h:form>

バッキング Bean:

public String customLogout(ActionEvent e) {
    return "login.xhtml";
}

参考までに、customLogout メソッドもセッション破棄で構成されていますが、ここではページ リダイレクトを配置しました。

テンプレート クライアントでは、テンプレートは次のように指定されます。

<ui:composition template="/templateUser.xhtml">

JSFライブラリに関しては、現在jsf 2.0を使用しています

私が試した解決策:

  • immediate="true"
  • フォームとコマンドリンクの両方に置くid(テンプレート フォームとコンテンツ フォーム)
  • use primefaces ( <p:commandLink>with ajax false ==> this return to the before page; backed bean のメソッドは実行されていません。

以下は、私がここで試したいくつかのリンクです。

4

1 に答える 1

1

コンテンツフォーム内にプライムフェイスまたは ajax コードを含めると、問題が発生し始めます。その特定のコードを削除すると、ログアウトは意図したとおりに機能します。

commandButton/commandLink/ajax action/listener method not invoked or input value not updatedで説明されているように、問題はポイント 7 が原因です。を使用して ajax リクエストを発行し<f:ajax>、他のすべてのフォームもカバーする更新を実行すると、他のすべてのフォームのビュー ステートが失われます。これにより、最初の送信は常に「何もしない」ようになりますが、次の送信は機能し、問題の症状と正確に一致します。

この問題は、次のいずれかの方法で解決できます。

  1. で他のすべてのフォームのクライアント ID を明示的に指定します<f:ajax render>。複数のクライアント ID をスペースで区切って指定できます。例えば

    <f:ajax ... render="someComponent otherComponent :loginForm" />
    
  2. この回答で提案されている JavaScript ベースの修正を使用してください: h:commandButton/h:commandLink does not work on first click, works only on second click

于 2012-12-05T11:56:29.090 に答える