kuniku’s diary

はてなダイアリーから移行(旧 d.hatena.ne.jp/kuniku/)、表示がおかしな箇所はコメントをお願いします。記載されている内容は日付およびバージョンに注意してください。直近1年以上前は古い情報の可能性が高くなります。

S2Strutsを使った推奨パターンは推奨なんだよ

http://d.hatena.ne.jp/taedium/20080616
にあるS2Strutsの推奨パターンは推奨なんだよ。守るというか、参考にしたほうがいいよ。

基本的にjspとActionFormとActionとInitActionは1対1対1対1で作成

を守り、jsp(画面)からのActionは同じActionにsubmitするようにしないと
けっこう面倒なことが起きる、そして開発者がものすごーく意味不明になり
かねない。
そもそもstrutsの使い方によっては発生するのかな。

推奨パターンを使わずに、Initアクションも使わない場合

例えば、実行するActionは、次の画面に合わせたアクションとする
とした場合はかなり大変。しんどいです。。。。

Input画面Aを呼び出すのはBアクション、そのBアクションはAJSPにforwardする。
JSPから次の画面B(Cアクションを実行して画面B)に移るとする。
B画面からC画面(Cアクションの完了メソッドとか?Dアクションを実行して画面C)に映るとする。

開発者は、もうわけわからない状態に陥る。

えっっっっーーーーーーと
これは、こうだから、次の画面があーだから、ん?1画面内で完了する場合は?
どっちだよ、実行するAction名(confirm)なのにInputだぞ?

などとなる。
他には、

B画面で表示する際にDBの情報などを取得する場合はCアクション内で行う
必要がある。次の画面に必要なことは、実行されたActionですべて行う。

B画面からC画面に映る際に、バリデーションエラーとなった場合に
B画面を再表示する場合は、B画面の表示に必要なものがセッションに
存在しないと表示できない。
(リクエストスコープ内には、表示するものをもっていないから)

バリデーションエラーのために、
何でもかんでも、セッション内に保持するようにしないといけなくなってしまう。
セッションをうまく使えていない状況となりメモリ消費になりかねない。

でも、そのセッションでよくわからないことがある。

Bアクションを実行した際に
BdipDtoのgetterにExportToSessionを定義してセッションに格納
(リクエストならば、単なるgetterでリクエストに格納)

とここまでは普通通りなんだけど

B画面からC画面に映るために、Cアクションを実行し、そのCアクション内の
メソッドが呼ばれてから検証などを行い、異常があるためB画面に戻す場合

B画面の表示に必要な情報(BdispDto)をCアクション内で受け取り、
セッションに格納しなおすことが必要。以下のような感じ

public class Bアクション{
   
   public String goCxxx(){略}

   private BdipDto bipDto;

   public void setBdipDto(BdipDto bipDto){略};

   @ExportToSession
   public BdipDto  getBdipDto(){略};;

}

public class Cアクション{
   
   public String goDxxx(){略}

   private BdipDto bipDto;

   public void setBdipDto(BdipDto bipDto){略};

   @ExportToSession
   public BdipDto  getBdipDto(){略};;

}

上記のようにしないとB.jspでBdipDtoを参照してもnullとなってしまう。
なぜだろ。
(リクエストに入れたのであれば、存在しないのは当然なんだけど・・・)


Bアクション実行時にセッションに格納しているから
Cアクション実行後でもB.jspではBdispDtoは参照できると
思ってたんだけど。

アオノテーション使わずに、自分でsession.setAttribute(xxx)
で試してみるしかないのかな・・・。
もしかしら、session内のbeanの持ち方か? 
jsp側で、 xxx.instance.yyy みたいに参照する必要があるのか?
でも、それは
オペレータ ”.” を利用しましたが、クラス ”・・・” のオブジェクトにおいて ”yyy” に対応する値が見つかりません といったような場合に対応するためだったような・・・。

推奨ターンで唯一問題となりそうなところ

Input画面Aを呼び出すAアクション、そのAアクションはAJSPにforwardする。
JSPから次の画面B(Bアクションを実行して画面B)に移るとする。
B画面からC画面(Cアクションを実行して画面C)に映るとする。

のような場合に
B画面で表示する際にDBの情報などを取得する場合はBInitActionで行う
同じく、C画面で表示する際にDBの情報などを取得する場合はCInitActionで行う

BからC画面に遷移する際にバリデーションを行い、B画面に戻す場合
B画面に必要な情報は、B.jsp内のBInitAction内で行うので画面表示上は
問題ない。
ただし、C画面から「戻る」場合など
初期化処理などをInitAction内で行っている場合はIF文で分岐または

1.initメソッド内で条件分岐
2.initメソッドに適用したインターセプタで条件分岐
3.相当のタグを独自につくり、その中で条件分岐

とのこと。いろいろ工夫のしがいがあるんだね。覚えておこう。

InitActionのよいところ、

前画面のActionFrom(editForm)とこれから表示する画面のActionFrom(confirmForm)の両方が扱えます