[Seasar-user:11992] [S2Struts]Actionクラスへのバインディングについて
Yuasa.Takahiro
[E-MAIL ADDRESS DELETED]
2007年 12月 7日 (金) 23:05:26 JST
湯浅と申します。
S2Strutsでの開発に関して悩んでいるところがありまして、
皆さまのお知恵をお借りできればと思い、投稿いたしました。
※投稿内容について前提の環境は以下の通りです。
・Seasar2 2.4.17
・S2Struts V1.3.0-RC2 (POJO Actionクラスを使用した無設定S2Struts)
・Mayaa 1.1.16
S2Strutsの仕様上、
Test1Action.doXXX() → Test2Action.initialize()と遷移した場合、
Test2Actionに用意したsetterメソッドに対して、S2Strutsによりバインドが行われます。
(Test2Action.initialize()の実行には、<s2tmputs:init>タグを使用。)
バインドの優先順位は、
1.HttpServletRequest#getParameter()
2.HttpServletRequest#getAttribute()
3.HttpSession#getAttribute()
です。
このため、Test1ActionからTest2ActionにRequestまたはSessionを介して値を渡そうとした場合、
HTTPパラメータに同名の値がいると、そちらが優先されてしまいます。
この動作は、思わぬ不具合の種にならないかと懸念しております。
具体的には、例えば、
@StrutsAction
public class Test1Action {
private String tmp;
public String doXxx() {
tmp = "aaa";
return TEST2;
}
public String getTmp() {
return tmp;
}
}
@StrutsAction
public class Test2Action {
private String tmp;
public void initialize() {
System.out.plintln(tmp);
}
public void setTmp(String tmp_) {
tmp = tmp_;
}
}
とし、VIEWで<s2tmputs:init>タグを使用し、Test2Action.initialize()を
実行するとします。この場合、
画面1(Test1Actionの画面)の[XXX]ボタンを押下し(doXXX()を実行)、
画面2(Test2Actionの画面)へ遷移・画面を表示(initialize()を実行)
すると、標準出力に「aaa」が出力示されます。
(S2Strutsが、Requesrtを介して変数tmpの値を受け渡してくれるためです。)
次に、画面1で[XXX]ボタンを押下したときにPOSTデータをフックし、
name="tmp" value="bbb"というパラメータを追加してみます。
すると、画面2表示時に標準出力に出力されるのは「bbb」となります。
つまり、Test1Action.doXXX() → Test2Action.initialize()で受け渡す値
の名前が分かれば、上書きが出来てしまいます。(型がStringの場合のみですが。)
ちなみに、受け渡す値の型がString以外(例えば、Listなど)の場合は、
バインド時に型が合わないため、Test2Actionのtmpの値はnullとなりました。
(この場合も、tmpにTest1Actionから受け渡そうとした値が入ることは
ありませんでした。)
以上のように、Action間でRequestまたはSessionを介して値を渡すような
処理を行っている場合、その値の名前が分かれば(そんなケースは稀なのかも
しれませんが)値を上書きもしくはnullに出来てしまうと思われます。
皆さまはこれに対して何か対策を講じられておいででしょうか?
個人的には、<s2struts:init>タグで実施されるバインドの優先順位を
1.HttpServletRequest#getAttribute()
2.HttpServletRequest#getParameter()
3.HttpSession#getAttribute()
に変更してはどうだろうか?と思っています。(浅はかでしょうか?)
もし、よい対策法をご存知であれば、ご教授いただけたら幸いです。
以上です。
よろしくお願いいたします。
--
Yuasa Takahiro
Seasar-user メーリングリストの案内