2

この種の質問がここで何百万回も聞かれていることは知っていますが、関連する投稿で私の問題の解決策を見つけることができませんでした。

JSF 1.2

valueChangeListenerとして使用されるメソッドを持つリクエストスコープのBeanがあります。

class DoStuff{
    ...
    public void step1ChkStuffIncluded_CheckedChanged(ValueChangeEvent event){
        StuffDocument cd = (StuffDocument)getInfo("StuffDocument");
        if(cd == null){
            Logger.Error("DoStuff", "step1ChkStuffIncluded_CheckedChanged", "No stuff document (null)");
            return;
        }

        if (step1ChkStuffIncludedChecked){
            cd.handleChecked();
        }
        else{
            cd.handleUnchecked();
        }
    }
    ...
}

次のようなselectBooleanCheckboxコンポーネント(.jspx):

    ...
    </h:panelGroup> 
    <h:panelGroup rendered="#{DoStuff.pnlStep1}">
        <p>
        <label for="step1ChkStuffIncluded">#{DoStuff.step1ChkStuffIncludedText}</label>

        <h:selectBooleanCheckbox
            id="step1ChkStuffIncluded"
            onchange="submit();"
            value="#{DoStuff.step1ChkStuffIncludedChecked}"
            valueChangeListener="#{DoStuff.step1ChkStuffIncluded_CheckedChanged}">
        </h:selectBooleanCheckbox></p>
    </h:panelGroup>
    <div id="someDiv">
    ...

どこ

xmlns:h="http://java.sun.com/jsf/html"

Beanのスコープがセッションである場合は常に、チェックボックスのセッターとリスナーの両方が実行されますが、要求スコープでは実行されません。残念ながら、それ以外の手がかりは見つかりません。

どんなアドバイスも大歓迎です。さらなる説明の要求は大歓迎です。

4

1 に答える 1

2

rendered="#{DoStuff.pnlStep1}"親コンポーネントにがあります。フォーム送信の処理中に、JSF は攻撃保護の一環として、入力コンポーネント (およびそのすべての親) がサーバー側の条件に従ってレンダリングされるかどうかを判断します。レンダリングされない場合は、処理中に完全にスキップされます。

セッション スコープの Bean では機能するが、リクエスト スコープの Bean では失敗するということはrendered="#{DoStuff.pnlStep1}"、フォーム表示のリクエスト中には存在したが、フォームの処理リクエスト中には存在しなかったリクエスト ベースの変数/条件に基づいて値が決定されることを示しています。フォーム送信。

rendered="#{DoStuff.pnlStep1}"これを修正するには、フォーム送信の処理のリクエスト中に背後の値に対してまったく同じ変数/条件を保持していることを確認する必要があります。状態の性質とフォームの送信方法に応じて、これを達成する方法はいくつかあります。<f:param>方法の 1 つは、またはによって、リクエスト ベースの変数/条件をリクエスト パラメータとして戻すこと<h:inputHidden>です。

標準的な JSF 2.0 の修正は、JSF 1.2 では使用できないビュー スコープに Bean を配置することですが、トマホークの<t:saveState>コンポーネントを使用してシミュレートできます。

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

于 2011-12-13T20:31:07.257 に答える