01.Struts2の全体概要
(Struts2の役割&処理フロー)

概要

ここではStruts2の概要についてみていきます。

何かをやりたいときに、どの辺り(キーワード)を調べれば良いかが分かるように記述してみたいと思います。

そのためには、WEBの処理全体の中のStruts2の役割と処理フローを把握しておくことが重要かと思っています。

Struts2の全体的な処理フローを理解するには、いくつかの新しい概念を知っておく方が良いです。

ですので、新しい概念をいくつか説明した後に全体のフローについてみていこうと思います。

※Struts2は設定なしでも起動することができる特徴がありますが、全体概要という趣旨とはずれるため、ここでは触れません。

Struts2とは?

Struts2を説明した様々なサイトで「Struts1の概念は忘れた方が良い」と書かれています。

Struts2は名前こそ「Struts」を引き継いでいますが、全く別の思想・機能によって成り立っているからです。

まずはStruts2の役割を見てみましょう。その後、Struts1とは違うというその機能を見ていこうと思います。

【Struts2の役割(機能範囲)】

※上図で、「モデル」はPOJOを表しています。Struts1のようにWEBに特化したActionFormのようなクラスではなく、

一般的にビジネスロジックやDAOで扱うモデルクラスです。

<Struts2の役割>

図でも記述していますが、Struts2の主な役割を簡単に書くと以下のようになります。

(このレベルで機能を書くとStruts1とほぼ同じですが、それぞれが持つ機能の内容が異なっています

・URLと画面処理(Action)をマッピングする

・パラメタをモデルに変換する

・モデルの妥当性チェックをする

・画面の処理(Action)をする

・Viewの作成をする

Struts1では、「パラメタからモデルへの変換」と「モデルからViewへの変換」を完全にサポートできていませんでした。

具体的な問題点としては、パラメタからモデルへの変換は用意されていたのですが、型変換エラーの補足ができませんでしたし、

Viewにおいて、Date型などの書式変換やnull値への対応などがうまくできませんでした。

Struts2では、「パラメタからモデルへの変換」と「モデルからViewへの変換」ともに完全にサポートしているため、

Controller~Dao間、Controller~View間の連携がスムーズに行きます。

「モデルからViewへの変換」は、JSPのStruts2用タグライブラリで連携します。

つまり、すべてをモデル(POJO)で一貫して扱えるようになりました。

<Springの役割>

Struts2はSpringと共に使用することを想定しているため、フレームワークの中にSpringとの連携用のプラグインが入っています。

Springでは通常、ServiceとDaoだけでなく、Controller(Action)もSpringの管理下に置きます。

Struts2で使用するライブラリ等については、こちらの記事を参照ください。

(必ずお読みください。最新のバージョンについての補足も記述しています。)

最後にStruts2を触った感想です。

「Struts1に比べると、Struts2は使うのは簡単!」

1週間も学習すれば使用できるほど簡単ですし、コード量が減ると思います。

ただ、こんな記事を書いておいて何ですが、strutsはセキュリティホールが次々に見つかっているフレームワークです。(2014/5/11追記)

新規プロジェクトで、どのフレームワークを使うかで悩んでいるのであれば、以下が個人的な感想です。

「Spring MVC3以降などの使いやすくて安全なフレームワークを検討した方が良い!」

以降では、もう少しStruts1とは違う概念について把握して行こうと思います。

新しい概念: ActionInvocationクラスとValueStackクラス

Struts2の新しい概念にActionInvocation(画面処理呼び出し情報)とValueStack(保管庫)があります。

2つとも、リクエスト毎に作成されます。

【クラスの構造】

<ValueStackクラスについて>

ValueStackは、画面情報の保管庫です。画面情報とは、Requestクラス、Responseクラス、Actionクラスなどです。

また、自由に値を取得したり、保管したりできます。

Mapのようにキー名と値のセットのように保管しますが、単純なMapではなくJSPのスコープと同じような概念も持っています。

しかし、この記事では単なる保管庫として読んでもらって大丈夫です。

ActionInvocationクラスに保持され、ActionInvocationが様々な処理に引き回されることで、ValueStackも様々な処理で参照できます。

また、JSPで使用する値はValueStackから参照しますので、JSPにおいて特に重要な概念です。

※詳しくは他の記事を参照ください。

<ActionInvocationクラスについて>

ActionInvocationは、ValueStackを保持すると共に、画面の前後処理を担当するクラスやConfig情報などを持ち、

さらに処理を実行した後の結果情報なども持ちます。

画面処理全般を担当する、Struts2の中核をなすクラスです。

実際の処理は自分の中に保持している処理クラスに任せることになりますが、

そのとき、ActionInvocation自体が引数として渡っていきます。

このクラスは画面の前後処理(Interceptor)のカスタマイズをするときに知っておくべきクラスです。

通常の処理では隠蔽されていて、特に気にする必要もありません。(重要な概念ですが)

必要になったときには思い出していただければと思います。

新しい概念: Actionについて

Struts2の新しい概念です。

Struts1を使ったことがある方は、「Struts1にもActionはあるじゃないか!」と思うかもしれませんね。

しかし、全く別物ですので、新しい概念として捕らえてもらった方が良いかと思います。

Actionクラスは開発者が作成するクラスで、主な役割は以下のようになります。

・画面のパラメタの保持

Actionクラス自体にsetterを用意しておくと、自動的にパラメタ名に対応したsetterにパラメタ値が設定されます。

setterの型は、StringでもListでもMapでも、自作のPOJOでもかまいません。全て自動で設定されます。

Strurs2の古いバージョンではList、Mapなどは対応していなかったようですが、

ここで扱う最新バージョンでは大丈夫です。

また、Actionクラス自身がJSPに引き渡されます。(正確にはValueStackが引き渡されます)

・画面処理

setterで設定された値を元に、画面の処理を行います。

例えば、DBから値を取得したり、DBへ値を保存したりする、一般的な画面の処理です。

取得した値などは、Actionクラス自身に設定し、getterを用意しておけば、JSPなどの画面処理内で使用できます。

Struts2の全体的な処理フロー

【Struts2機能範囲を拡大した図】

※()内は処理を担当するクラス、または処理内容のキーワードを記述しています。

楕円は処理を表しています。

①Struts2のTomcatフィルタ(StrutsPrepareAndExecuteFilter)

StrutsPrepareAndExecuteFilterフィルタは、Struts2を使用するためのフィルタです。必ずweb.xmlに設定します。

古いバージョンでは、FilterDispatcherというフィルタが使用されていました。

これもStruts2を使用するためのフィルタですが、既に廃止されていますので、StrutsPrepareAndExecuteFilterを使用しましょう。

②橋渡し処理 (ActionProxy)

Struts2は、実は、XWorkという別のフレームワークも使用していて、これが中核をなしているようです。

XWorkフレームワークには、Actionという開発者が作成する画面処理クラスがあります。

ActionProxyは、XWorkとActionを橋渡しするProxyです。

もし、他のサーバのRMIへ橋渡しするProxyであれば、RmiProxyという名前になっていたと思います。

③画面処理呼び出し (ActionIncvocation)

"Invocation"の英訳は、「呼び出し」です。つまり、ActionInvocationは、Action処理を呼び出しするという意味になります。

ActionInvocationの役割は、前後処理(Interceptor)と画面処理(Action)の呼び出し、結果処理(Result)の検索と呼び出しです。

上記の章でも記述しましたが、処理結果情報の保管庫の役割もあります。

④画面処理の前後処理 (Interceptor)

"Interceptor"の英訳は、「割り込みする人」という意味です。

Interceptorは、画面処理の前と後で実行される処理(Action処理の割り込み)を担当しています。

図では2つのInterceptorしか記述していませんが、もっとたくさん存在しています。

他にも、リクエストの文字コードを設定したり、パラメタをActionに設定する、型変換エラーの補足する、などです。

Struts2の場合、ほとんどの処理がInterceptorになっています。(参考:Interceptor一覧

ですので、「やりたいことがInterceptorで解決しないか?」と考えて調査することは無駄ではないと思います。

⇒Conversionについてはこちらの記事参照

⇒Validationについてはこちらの記事参照

⑤画面処理実行処理 (Action実行)

Actionのメソッドを実行します。

実行するメソッド名は、Struts2の設定やアノテーションによって、自由に決められます。

また、HTML内でリクエストパラメタで指定することもできます。

Actionの実行後は、実行結果コード(文字列)を返します。

⇒Actionについてはこちらの記事参照

⑥結果検索処理 (コードからResult検索)

⑤から取得した実行結果コード(文字列)をキーにして、結果クラス(Result)を検索します。

実行結果コードとResultとのマッピングは、Struts2の設定ファイルでも、アノテーションでも指定できます。

⑦結果画面作成処理 (Result実行)

Resultの役割は、レスポンスを作ることにあります。

つまり、上記の図ではブラウザへの処理結果としてHTMLを作ります。

実際には返却する結果は、HTMLだけでなく、ファイルにすることなどもできます。

こちらの記事のresutl typesの設定を参照

やりたいことを調べたいときには

自分がやりたいことを調べたいときは、(1)Struts2での各処理にどのようなものがあるか?、(2)それぞれ何を担当するか?

を全体的に把握していれば調査しやすいと思います。

処理と担当は、上記の図が示すものがほぼ全てかと思います。

あとは、少し直感を働かせて、あたりをつけていけばうまく行くかと思います。

ここでは、その直感の手助けができる情報を書けたらよいなと思っています。

探すときは、作業が簡単なものから行うと楽かと思いますので、その順番に記述していきます。

全体の概要は以上です。

もし、参考になれば大変うれしいです。

Created Date: 2012/01/17