橋爪 俊雄(はしづめ としお)
NDSインフォス株式会社 東京支社。Struts/Springベースのフレームワーク開発,プロジェクト支援に携わる。
青木 正平(あおき しょうへい)
株式会社DTS ネットワーク事業本部所属。Struts/Springベースのフレームワーク開発,プロジェクト支援に携わる。

 今回から数回に分けて,Springから提供されているSpringMVCと呼ばれる機能について説明していきます。SpringMVCは,Webアプリケーションを簡単に作るための機能を提供します。具体的には,画面遷移や,ブラウザ-サーバー間の入出力パラメータの受け渡しです。Strutsというフレームワークをご存じの方は,SpringMVCも似たようなものととらえてもらえればわかりやすいと思います。

 本稿は,SpringMVCの基本編として,画面遷移や入出力パラメータの受け渡しなど,最小限のWebアプリケーションを作るための説明をします。その他にも,SpringMVCは,ユーザーの送信したパラメータに対する入力チェック,2度押しチェック,セッション値の取り扱いなど,様々な機能を提供しています。これらについては次回以降に説明したいと思います。

※注 Springのバージョンが2.0系から2.5系にバージョンアップするタイミングで,jarファイルの構成に見直しがかけられ,「spring.jar」からwebmvc系のコンポーネントが外されました。記事執筆の時点ではバージョン2.0.6を対象としていたので「spring.jar」のみで問題ありませんでしたが,バージョン2.5.0以降のバージョンで利用する場合には「spring.jar」と「spring-webmvc.jar」の両方含める必要があります。

なぜSpring MVCが必要なのか?

 SpringMVCについて説明する前に,まず,Webアプリケーションを作る際にどのような処理を実装する必要があるのかを,図1のようなオンライン・ショッピング・サイトを例に取って説明します。

図1●ショッピング・サイト(書店)の処理イメージ
図1●ショッピング・サイト(書店)の処理イメージ

 ユーザーはブラウザ上の検索画面に検索キーを入力し,検索ボタンをクリックします。すると,サーバー側で何らかの処理が実行され,条件に一致する検索結果をブラウザに表示します。

 このようなサイトを作る場合,サーバー側では以下の処理をする必要があります。

  1. 検索条件を受け取る
  2. DBにアクセスして商品を検索
  3. 次の画面へ遷移
  4. 画面に検索結果を表示

 今回は,一つの例としてショッピング・サイトを取り上げましたが,他のほとんどのWebアプリケーションにおいても同様の処理があります。

 これらの処理は開発プロジェクトごとに作ることも可能ですが,毎回同じようなものを一から作るのは,あまり効率がよくありません。通常,Webアプリケーションに共通する基本的な機能は,既存のライブラリを利用して作るのが一般的です。その一つが,今回取り上げるSpringMVCなのです。

Spring MVCとは何か?

 SpringMVCは,Webアプリケーションを作るときによく行われる処理を,開発者に提供します。基本機能は,画面遷移と入出力パラメータの受け渡しです。

画面遷移
ブラウザ→業務ロジック(図1では商品検索)→次の画面という遷移機能
入出力パラメータの受け渡し
ブラウザから入力パラメータ(図1では検索条件)を受け取る機能。また,データベース・アクセスなどサーバーの値(図1では検索結果)を次画面で表示する機能

 このほかにも様々な機能がありますが,それらは次回以降に紹介します。

 図2は,SpringMVCの構造を簡単に表わしたものです。特徴は“サーバー内のクラスをDIコンテナで管理している”という点です。したがって,DIを使ったクラスの差し替えや,AOPを使ったオマケ処理を追加することが可能です。DIを管理するクラスは,Bean定義ファイルに記述します。

図2●SpringMVCの処理の流れ
図2●SpringMVCの処理の流れ

SpringMVCの画面遷移

 SpringMVCでは,以下の3ステップで画面遷移をしています。

(1) ブラウザから,サーバーにアクセスする
(2) コントローラを呼び出し,業務ロジックを実行する
(3) 次の画面(JSPファイル)を表示する

(1)ブラウザから,サーバーにアクセスする

 Webアプリケーションの処理は,ブラウザでサブミットボタンを押し,サーバーにアクセスするところから始まります。図2の例では検索ボタンです。このとき,アクセスするボタン(正確にはformタグ)にリクエストするURLを指定します。このURLのコントローラ名が,後でコントローラというものを探す手がかりになります。

(2) コントローラを呼び出し,業務ロジックを実行する

 JavaのWebアプリケーションでは,必ずサーブレットからサーバー側の処理を始める必要があります。SpringMVCでは,DispatcherServletというクラスが用意されています。

 ただし,このサーブレットは一つのアプリケーションに一つしかありません。通常の開発では,たくさんの業務ロジックがあるので,サーブレットに業務ロジックを書くのは,あまりスマートな方法とは言えません。そこで,SpringMVCでは,一つ一つの業務ロジックを実行するために,コントローラというインタフェースを用意しています。一つの業務ロジックにつき,一つのコントローラを用意します。図2の例では,検索コントローラです。

 ブラウザからコントローラを呼び出すときは,手順(1)のリクエストURLを使って呼び出すコントローラ名を指定します。コントローラ名は,Bean定義ファイルのコントローラ定義のname属性のことです。

<bean name="/kensaku.form" class="検索コントローラ" />

 業務ロジックはコントローラ内に書くこともできますが,通常は,図3のように,別のクラスに分けて書くことを推奨します。この連載の冒頭で述べた,レイヤーの分割を意識しているからです。業務ロジックをSpringに依存させない形で実装させると,業務ロジック単独で単体テストができ,保守しやすく,Springを使わないシステムでもクラスの再利用がしやすくなります。

図3●SpringMVCのレイヤー分け
図3●SpringMVCのレイヤー分け

(3)次の画面(JSPファイル)を表示する

 コントローラの処理を終えると,次の画面へと遷移します。遷移先のJSP/HTMLファイルを指定するには,コントローラのロジック内で,「ビュー名」というものを設定します。そして,Bean定義ファイルのコントローラ部分に「ビュー名xxxxxxが設定されたら,”/jsp/result.jsp”を表示してください」という要領で,次に表示するJSPファイルを指定します。

入出力パラメータの受け渡し

 次に,パラメータの受け渡しに注目してみましょう。SpringMVCでは,図4のように,コントローラごとに入出力クラスを指定することができます。

図4●SpringMVCの入出力パラメータの受け渡し
図4●SpringMVCの入出力パラメータの受け渡し

 ブラウザから送信するパラメータは,キーと値のセットでデータを持ちます。キーはテキストボックスなどのコントロール名,値はユーザーの入力値です。図4の例では,keyword=Springというデータが送信されます。

 一方,サーバー側では,入力クラスにkeywordプロパティがあると,ユーザーが入力した文字列“Spring”を自動的にセットします。値を受け渡すためには,コントロール名と入力クラスのプロパティ名が一致していなければなりません。つまり,ブラウザ側のコントロール名がuserNameであれば,入力クラスにuserNameプロパティがなければなりません。

 入力クラスと同様に,検索コントローラで作成した出力クラスの値は,次の画面(JSPファイル)で表示することが可能です。

 では,これ以降,実際にサンプルを作りながら,SpringMVCの設定を見ていきましょう。