2

この質問が何度も聞かれたことは知っています。私はこれに関するすべての問題で提案されたのが好きで、この質問で私が入れたBalusCを実行しました

と言われましたが、まだ成功していません。したがって、Web アプリのフローは次のようになります。

ログインに成功すると、ブール値の LoggedIn が true になり、ページが home.xhtml にリダイレクトされます。(Bean TestBean および EnterView はインスタンス化され、SessionScope 化されます)。このページでは、loggedIn ブール値が true の場合、4 つのリンクを取得しました。

JSTL の c:choose タグを使用しないために (JSTL と JSF が「ビューのビルド時に実行され、ビューのレンダリング時に実行されます」- BalusC のため)、 render 属性を使用しました。

リンク付きのリストが表示されますが、必要なアクションを実行するにはリンクを 2 回クリックする必要があります。

スニペット:

        <h:form rendered="#{enterView.userBean.loggedIn}">
            <ul id="grileList">
                <li><h:commandLink action="#{menuView.showTestsPage(1)}"
                        value="label1" rendered="#{enterView.userBean.loggedIn}"/></li>
                <li><h:commandLink action="#{menuView.showTestsPage(2)}"
                        value="label2" rendered="#{enterView.userBean.loggedIn}"/></li>
                <li><h:commandLink action="#{menuView.showTestsPage(3)}"
                        value="label3"  rendered="#{enterView.userBean.loggedIn}"/></li>
                <li><h:commandLink action="#{menView.showTestsPage(4)}"
                        value="label4" rendered="#{enterView.userBean.loggedIn}"/></li>
            </ul>
        </h:form>

h:form は正しくレンダリングされているため、レンダリングされたビューのフェーズを経ていますが、リンクをクリックしたとき (リンクを 2 回クリックしたとき) にアクションを実行しないため、ビューのビルド時間ですか? 私はそれらの両方について読みました、私は理解したと思いました...

render 属性を commandLinks に入れてレンダリングしようとしましたが、成功しませんでした。

4

1 に答える 1

3

「アクションを呼び出すために 2 回クリックする必要がある」という症状は、次期 JSF 2.2 で修正されるJSF 仕様の問題 790の結果として認識できます。

要するに、2 つのフォームがあり、一方が ajax によって他方のフォームの親コンポーネントのみを更新すると、他方のフォームは JSF ビュー ステート ( ) を失います<input type="hidden" name="javax.faces.ViewState">。他のフォームで初めて ajax アクションを呼び出すと、アクションは呼び出されませんが、JSF ビューステートが追加され、後続のアクションはすべて成功します。

これを修正するには、ajax レンダリングで他のフォームのクライアント ID を明示的に指定する必要があります。例えば

<f:ajax ... render=":someComponent :otherForm" />
...

<h:someComponent id="someComponent">
    <h:form id="otherForm" rendered="#{enterView.userBean.loggedIn}">
        ...

以下も参照してください。

于 2013-03-22T22:25:40.333 に答える