SpringMVC機能について | Java Springの逆引きメモ

Java Springの逆引きメモ

JavaのSpring frameworkのメモを書いていきます!
初心者の勉強ノートなので間違いがあるかもしれませんが、何かヒントになることがあれば幸いです。

'2012.03.23 追記

このブログで扱っているSpringMVCのバージョンは2.5で、情報が古くなっています。

現状、アノテーションを使用してかなり柔軟で使いやすくなっていますにひひ

この記事を削除することはしませんが、最新の情報を検索されることをお勧めします。

Spring MVC 3.xについて(日本語の記事)


ちなみに海外の記事によると、Struts1、Struts2共に今後残っていくWEBフレームワークとしては

あまり評価が高くないようです。SpringMVCが有力候補の1つのようです。

海外の記事は1つの見方であって、将来はどちらにしても分かりません。しかし、新たなWEB開発にはSpringMVC 3.0 以上が良い候補の1つかなと思いました。

2010年のフレームワーク評価一覧日本語の説明記事


-------------------------------------------------------

SpringMVCとはどんな機能かを簡単に見ていきましょう!


名前から分かるようにWEBのModel、View、Controllerを表す機能です。


ここで、念のためそれぞれの説明を書いておきます。


Model ・・・データです。ViewとControllerの間のデータのやりとりなどに使用します。

View ・・・デザインです。Javaなので、JSPを表していると思えばいいと思います。

Controller ・・・リクエストの処理や、パラメタの受け取り、ビジネスロジックへの仲立ちなどを担当します。



上記は一般に言われるものですが、正直、ちゃんと実現しているフレームワークはあまり見かけません。

どれも上記の役割分担から微妙にずれているのです。

(Strutsもそうです)


しかし、SpringのMVCはこのあたりをきれいに分担し、分離しています。

かなりいい機能だと思います。


では、実際にSpringMVCで用意しているクラスが、それぞれMVCのどれを担当するのか見てみましょう。




【SpringMVCの実際のクラス】


MVC SpringMVCの担当クラス
Model

これは自分で作ります。POJO。

View

JSPが担当します。

妥当性エラーを表示するtaglibと、画面のパラメタとModelを結びつけるtaglibとを持ちます。

ただし、SpringはModelとViewをひとつのセットとして扱う仕組みをもっています。

それは、ModelAndViewlクラスです。

名前のとおり、ModelとViewを内部に持つだけのホルダークラスですが、役割が明確になることと処理がやりやすくなる効果があります。

Controller

Controllerインターフェースとその派生クラスが用意されています。

通常はSpringで用意された派生クラスを使用します。

このクラスは、ModelAndViewクラスをreturnするように作成します。

派生クラスには、パラメタからModelを自動的に作成し、実装するメソッドに渡してくれるものもあります。




【妥当性チェック】

SpringにはValidatorが用意されています。

これはWEB用の機能ではなく、WEB以外のアプリケーションにも使用できるように設計されています。

しかし、実際の実装は、自分ですべて書式チェックを書かないといけないので面倒です。

正直言うと、インターフェースが用意されているだけです。

Controllerクラス群とうまく連携できるように放っていますが。。


このわずらわしさを解消してくれるのがSpringModulesです。

ここでは触れませんが、Strutsと同様に書式チェックを設定ファイルに書くだけで実施してくれます。

  参考:・SpringModulesの機能について



【SpringMVCの機能のメリット】

自分は、このSpringのMVCが好きですが、他の人はそれほど好きではないかもしれないですね。

MVCがきれいに分かれていて、再利用性や拡張性の高さがあること、分かりやすいこと。

そんなところが自分は好きです。

でもそれは趣味の問題かも知れないです。


そこで、SpringとStrutsの機能の比較をして、頭を整理してみます。

機能 Strutsの機能

対応するSpringの機能

Controller

Action派生クラスを継承して作成する。

Actionクラスをextendsすることになるのでフレームワークと密に関係してしまいます。

Contorollerまたはその派生クラスを継承して作成する。

ただし、Controllerはinterfaceなのでフレームワークとの独立性が高い特徴があります。

Model

FormActionクラス

FormActionを継承しないといけないためPOJOではない。再利用性は低い。

完全に画面1つについて1つのModelが密接に関係している。

自作Modelクラス。

当然、POJOにできる。再利用性が高い。

画面とModelとの結びつきは弱い。

パラメタとModelのバインド

リクエストのパラメタをFormActionクラスに設定してくれます。設定ファイルでどんなパラメタが存在するかを記述するする必要があります。

バインドできるModelは1種類だけです。

Binderクラスが担当。

Modelを指定すると、リクエストのパラメタの値をModelに設定してくれます。

Modelのsetter名と一致するパラメタ名の値が設定されます。

ですので、特に設定ファイルの記述は必要ありません。

バインドできるModelは1種類だけです。

妥当性チェック

設定ファイルに記述するだけでパラメタの書式チェックをしてくれます。

カスタマイズもできます。

Validator+SpringModulde

設定ファイルに記述するだけでパラメタの書式チェックをしてくれます。

カスタマイズもできます。

パス名の設定

設定ファイルにpathタグとして設定できます。

使用するViewも設定ファイルで設定できます。

継承機能もあり、設定の省略などもできます。

呼び出すメソッド名とパス名を*と{1}などを使用してマッピングすることもできる。

(MappingDispatchActionクラス)

jspファイル名とパス名を結びつけるような機構は存在しません。

設定ファイルにパス名と対応するControllerを設定できる。

使用するViewはControllerクラスを設定するbeanにpropertyとして定義します。

設定の継承の機能はありません。

メソッド名とパス名に*などは使用できないが、マッピングする仕組みはある。

(MultiActionControllerクラス)

jspファイル名の拡張子を変えてパス名に変換する機能もあります。

例外処理 ActionとViewの処理で例外が発生したときにキャッチでき、処理する機構がある。

Controllerの処理について例外が発生したときにキャッチでき、処理する機構がある。

ただし、Viewで発生した例外はキャッチできません。

taglib

HTMLとModelを結びつける強力な機能を用意している。

ただし使用するためには、HTMLタグの他にStruts用のタグの書式を覚える必要がある。

書式エラーを表示する機構もあります。

tilesというレイアウト支援機能があります。

HTMLとModelを結びつける機能を用意している。

Strutsとほぼ同様と思われる。もちろん使用するためには使い方を覚える必要がある。

書式エラーを表示する機構もあります。

tilesのような機能もあります。ただ微妙な面がありそうです。⇒・tilesについて

単体テスト Actionを単体テストする機構は用意されていない。 Controllerを単体テストする仕組みがある。
- - -
- - -




大雑把ですが、なんとなく比較できるでしょうか?


Strutsの特徴としては、View(tiles)に強力な機能があるのと、パス名の管理が得意、という特徴が見えます。

ただし、機能同士の依存度が高いので、再利用性は低いですし、機能の置き換えはしずらいです。

Springの特徴としては、広く浅く機能を提供していて、機能同士の依存度が低いことと、Controllerの単体テストができるのが特徴と思います。

ただし、taglibの機能には豊富さがありません。


ですので、2つを組み合わせて使いたがるのは分かる気がします。




参考:

・Controller内でApplicationContextを取得するには?

・リクエストの文字コードを設定ファイルで制御するには?

・SpringMVCを使用してWEBを作るには? (基礎編)

・Validatorでパラメタの妥当性チェックをするには?

・SpringMVCを使用してWEBを作るには? (実践編) : (パラメタとオブジェクトのバインドの方法)

・tilesについて

・SpringModulesの機能について

Spring MVC本家のHP
SpringのTiles機能(Spring本家のHP)

Tilesについてのフォーラム