Struts2はStrutsというよりはWebWork2の動作を多く継承している印象。
とりあえず、インスコとかEclipseとかの設定は割愛(気が向いたらメモるけど)。 Struts2を利用するというとき、Struts経験者は、まずその過去の経験を一度忘れる。WebWork?経験者は結構そのままの知識で移行可能。
Struts2の設定の基本は次のファイル。
開発時に頻繁に書き換えるのは3になるでしょう。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| - ! |
|
アクションやインターセプタなどの定義はこのファイルに書くことになるが、規模が大きくなるに連れてこのファイルに書く設定の量が肥大化してくる。そこで、あるカテゴリごと、機能ごとなどにxmlを分割して作成し、それをここにincludeすることができる。
例えば上記ではcategory1.xml、category2.xml、category3.xmlの3つの外部ファイルをincludeしている。
category1.xml の例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| - ! |
|
アクションが呼び出されるときの挙動例。
次のように書いたら、
<action name="login" method="login" class="category1.LoginAction"> <result name="input">/category1/login.vm</result> <result name="success">/category1/top.vm</result> </action>
Struts2ではexecute()というメソッドを必ず用意しなければならない、ということはない。好きな名前のメソッド名をつくって使える。
ちなみに、vmというのはvelocityというテンプレートエンジンが使用するファイルの拡張子。jspのようなもの。
上記は、nameで指定されているアクション(エイリアス)名とメソッド名が同じなので、次のようにも記述できる。
<action name="*" method="login" class="category1.LoginAction"> <result name="input">/category1/login.vm</result> <result name="success">/category1/top.vm</result> </action>
これでlogin.doなどで呼び出されたら、LoginAction?クラスのloginメソッドが呼び出されることになる。
<action name="*Menu" method="{1}" class="category1.MenuAction"> <result name="input">/category1/init.vm</result> <result name="success">/category1/menu.vm</result> </action>
この場合、呼び出されるメソッド名は自動的にMenuAction?クラスが実装しているメソッドから検索される。例えば、initMenu.doなどと呼び出せば、methodには"init"が挿入され、MenuAction?のinitメソッドが呼び出されることになる。
さらに上記はresultで指定されているinit.vmというファイル名がメソッド名と同じなので、
<action name="*Menu" method="{1}" class="category1.MenuAction"> <result name="input">/category1/{1}.vm</result> <result name="success">/category1/menu.vm</result> </action>
と書けば、戻り値がinputのときにinit.vmというページが表示されることになる。
Struts2では、標準で"action"という拡張子が設定されている(Strutsの"do"に相当する拡張子)。これが気に入らないという場合、これも自由に変更可能。
struts.properties ファイルの中に
1 2 |
|
という行があるので、ここを好きな拡張子に書き換えるか追記する。
例えば、従来のStrutsのようにdoじゃないとダメだという人は、
struts.action.extension=do
と書いてしまえば良い。
ここは何でも良い。極端な話、"html"とか"aspx"などを指定することもできるので、静的ページや.NETで動いているページに偽装することもできるヨ?(そんな意味ないけど)。
Strutsのexecute()メソッドではActionMapping?、ActionForm?、HttpServletRequest?、HttpServletResponse?の4つの引数が渡されてきていた。しかし、Struts2のアクションクラスで呼び出されるメソッドには引数がない。Strutsから移行してきた人の多くは、まずこれに戸惑うはず?
どこからパラメータを取れば良いのか?の回答は、どこでも取れる、ということになる。 例えば、ログイン画面から入力されたユーザ名とパスワードをアクションが取得して認証する、という処理を書きたい場合、
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
| - | | | - | ! - | - - | ! | ! | - | ! | | - | ! - | ! | - | ! | | - | ! - | ! ! |
|
と書けば良い。
ActionSupport?を継承したクラスをアクションクラスとし、パラメータ名を設定するsetterメソッド(publicスコープで)を用意しておくだけ。
これで、アクションが起動されたときに、その名前のパラメータが渡されてきたら、自動的にそのsetterが呼び出され、メンバ変数に設定されることになる。なんと便利。
アクションの中にすべての変数を用意してそこにsetterを書いても良いが、パラメータは別オブジェクトに分離して持たせることができる。そのオブジェクトのことを「モデル」と呼ぶ。
モデルとなるクラスにはパラメータとなる変数を持たせておいて、そのsetter、getterを用意しておくだけ。これで、アクションクラスに持つパラメータはモデルのみとなり、処理に専念するクラスにすることができる。
モデルドリブンを実装するには、ModelDriven?をimplementsしておく。
アクション側
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
| - | | | - | ! - | - - | ! | ! | - | ! | | - | ! - | ! ! |
|
モデル側
File not found: "java" at page "Struts2 メモ";