ajax リクエストのみを使用している場合jsf.ajax.addOnEvent
は、JSF JavaScript API のハンドラーを使用できます。以下の例は、 のすべてのボタンに適用されますtype="submit"
。
function handleDisableButton(data) {
if (data.source.type != "submit") {
return;
}
switch (data.status) {
case "begin":
data.source.disabled = true;
break;
case "complete":
data.source.disabled = false;
break;
}
}
jsf.ajax.addOnEvent(handleDisableButton);
または、特定のボタンのみでこれが必要な場合は、 のonevent
属性を使用します<f:ajax>
。
<h:commandButton ...>
<f:ajax ... onevent="handleDisableButton" />
</h:commandButton>
onclick
これを同期リクエストにも適用する必要がある場合は、 の実行中にボタンを無効にすると、ボタンのname=value
ペアがリクエスト パラメータとして送信されないため、JSF がアクションを識別できないことを考慮する必要があります。そしてそれを呼び出します。したがって、ブラウザから POST リクエストが送信された後にのみ無効にする必要があります。このための DOM イベント ハンドラーはありませんsetTimeout()
。クリックしてから約 50 ミリ秒後にボタンを無効にするハックを使用する必要があります。
<h:commandButton ... onclick="setTimeout('document.getElementById(\'' + this.id + '\').disabled=true;', 50);" />
これはかなり脆いだけです。遅いクライアントでは短すぎるかもしれません。タイムアウトを増やすか、別のソリューションに進む必要があります。
とはいえ、これは Web ページから送信する場合の二重送信を防ぐだけであることに注意してください。これは、Apache HttpClient、Jsoup などのプログラムによる HTTP クライアントによる二重送信を防止しませんURLConnection
。データ モデルで一意性を強制したい場合は、二重送信を防止するのではなく、二重挿入を防止する必要があります。UNIQUE
これは、対象の列に制約を設定することにより、SQL で簡単に実現できます。
以下も参照してください。