1

奇妙な欠陥が見られます。これが簡単なテストケースです。

管理対象Beanは次のとおりです。

@ManagedBean
public class Controller {
    private int counter = 0;
    //getter and setters...
    public String next() {
        ++counter;
        return null;
    }
    public String prev() {
        --counter;
        return null;
    }
}

ビューは次のとおりです。

<h:form>
<p>Value: #{controller.counter}</p>
<h:inputHidden value="#{controller.counter}" />
<h:commandButton action="#{controller.prev()}" value="Previous" disabled="#{controller.counter == 0}"/>
<h:commandButton action="#{controller.next()}" value="Next"     disabled="#{controller.counter == 5}"/>
</h:form>

ビューが最初に表示されるとき、[前へ]ボタンは無効になっています。[次へ]をクリックすると、[前へ]ボタンが有効になります。ここまでは順調ですね。ただし、[前へ]ボタンをクリックすると、アクションハンドラーメソッドprev()が呼び出されません。ボタンのdisabled属性を削除すると、すべて正常に機能します。私は何か間違ったことをしていますか、それともクロサギに欠陥がありますか?JBoss7.1とMojarraを使用しています。ありがとう。

4

1 に答える 1

0

counterこれは、Beanがリクエストスコープであり、リクエストパラメータに基づいて(ポスト)構築中にプロパティを事前初期化しない場合に発生する可能性があります。このようにして、JSFがリクエスト値を適用しようとしているときに、ボタンは引き続き無効になります。改ざん/ハッキングされたリクエストに対する保護の一環として、JSFはアクションイベントをキューに入れません。

Beanをビュースコープに配置するか、要求パラメーターに基づいて(post)コンストラクターで関連するプロパティを適切に事前初期化することで修正する必要があります。ちなみに、あなたが持っているものは、この<h:inputHidden>構成にはまったく価値がありません。Beanビューのスコープを設定する場合は、それを削除してください。<f:param>リクエストスコープに固執する場合は、両方のボタンで置き換え、を使用して設定します@ManagedProperty

参照:

于 2012-10-05T19:28:36.383 に答える