A Day In The Life

とあるプログラマの備忘録

StrutsのDispatchActionでハマる

昨日から自前Frameworkの改造してます。

手始めにBaseActionの継承先をActionからDispatchActionに変えてみました。
お手本どおりstruts-configのActionMappingにparameterを追加してActionクラスのメソッドを変更。

実行してみたところ

javax.servlet.ServletException: リクエスト[/path]にbutttonという名前のハンドラパラメータがありません
というエラーが出てうまくいかない。

ソースを追って調べるとどうもボタン名がパラメータにセットされていない模様。

JSPを確認したところ

<html:button property="button" value="save" onclick="clicButton(save)">

これで大丈夫なはず...おかしいなぁ。

2時間ぐらい調べてやっと理由がわかりました。

onclickで呼んでるjavascriptでボタンの2度押防止処理をしていてそれがどうも原因だったみたいです。

var submitFlg = "0";
function clickButton(method){
 if(submitFlg == "1") return;
 document.forms[0].submit();
 submitFlg = "1";
 document.forms[0].disabled = true;
}

disabledにしちゃうとリクエストパラメータにpropertyがセットされないみたいです。

う〜ん困りました。なにか回避策考えないといけませんね〜。

MappingDispatchActionを使うのも手かも、でもstruts-configの修正がでかくなるしなぁ。



……

さんざん格闘して↓のように修正したところ何とか動くようになりました。

var submitFlg = "0";
function clickButton(method){
 if(submitFlg == "1") return;
 document.forms[0].action = document.forms[0].action + '?button=' + method;
 document.forms[0].submit();
 submitFlg = "1";
 document.forms[0].disabled = true;
}

少々強引な気もしますが、これだとclicButton()の引数に対応したメソッドが呼ばれますのでボタンのvalue属性とDispatchActionのメソッド名を必ずしも一致させなくていいのでなかなか良いかなと。