ぺんぎんらぼ

お笑いとマンガ好きなしょぼしょぼWeb系エンジニアの日記です。たまに絵を描きます。

お笑いとマンガ好きなしょぼしょぼWeb系エンジニアの日記です

Spring MVCでWebアプリを作ろう~Bean定義ファイルを読む~

前回STSを使ってSpringMVCでHelloWorldの表示までを行いました。
今回は自動で生成されたプロジェクトモジュールの中身について、理解したことをまとめていこうと思います。
お仕事で何回かSpringベースの開発に携わりましたが、基本的に技術リーダーの方がプロジェクトモジュールのベースを作ってくださり、自分は1機能の実装を担当、という役回りだったので、設定ファイルをちゃんと読むのはこれが初めてです。

STSを使って作成したテンプレートプロジェクトの中身

日記的なアプリを作ろうと思いプロジェクト名をdiaryにしようと思ったが、この段階ではスペルミスで「dialy」になっていますorz まず、フォルダ構成は以下。以下では赤い枠で囲ったクラスだけ順にみていきます。

① web.xml

一般的なJavaEEのアプリケーションで、Tomcatがまず始めに参照する、アプリの水先案内人的位置づけのweb.xml
ファイルの一番上に書いてあるリンクの意味は、Springではなく基本的なXML文書に関すること。「xmlns = XML Name Space」を列挙して、これから書くXML文書の形式(=タグの名前空間名前空間の意味)を宣言している。・・・くらいに理解している。ファイル内で使われているのは以下のタグ。

  1. <context-param>タグ
  2. <listener>タグ
  3. <servlet>タグ
  4. <servlet-mapping>タグ

1.と2.について。
SpringMVCのWebアプリケーションの場合、SpringがもつContextLoaderListenerクラスか、ContextLoaderServletクラスが自動的にBean定義ファイルをロードするようになっている。ここでしているのはそのための設定。今回は<listener>タグにContextLoaderListenerクラスを指定することで、<context-param>タグに設定した/WEB-INF/spring/root-context.xmlをロードしている。

次に、JavaEEのweb.xmlでは必ず書く必要のある3.と4.について。
3.で、SpringのDispacher Servletクラスを、Servletとして定義している。<init-param>タグ以下。<param-name>タグで「contextConfigLocation」は「/WEB-INF/Spring/appServlet/servlet-context.xml」と指定することで、上のroot-context.xmlと同様に、これもBean定義ファイルとしてロードしてくれるようになる。Dispacher Servletはブラウザからのリクエストを一番初めに受け付け、オブジェクトに指令をだす重要なクラス。なお、dispach:【他動詞])〕〈軍隊・特使などを〉〔…へ〕急派する,特派する;・・・の意。
<load-on-startup>タグは、メモリにロードするサーブレットオブジェクトの数を定義しているらしい。一般的なJavaEEのアプリでも、サーブレットのオブジェクトは基本的に1つしかロードされない仕様になっているようので、わざわざ定義している意味はよく理解していない。
4.では3.で指定したDispacher ServletのURL上の場所を定義している。通常は、コンテキストルートのパス「/」をDispacher Servletのパスにするのが慣例で、このテンプレートもそのようになっている。つまり、ブラウザでURL「http://localhost:8080/dialy/」というリクエストがきたら、dialyモジュール上のDispacher Servletへリクエストしているということである。

servlet-context.xml

このファイルでも、Spring MVCのxmlnsを宣言して、タグ名に「mvc:」というスキーマを使えるようにしている。

  1. <annotation-driven>タグ
  2. <resources>タグ
  3. <beans>タグ
  4. <context:compornent-span>タグ

まず1.の<annotation-driven>タグは、Spring MVCアノテーションを使用するための設定。これを書くだけで@Controllerとか@Autowiredとかが書けるようになる。4.の<context:compornent-span>タグで、アノテーションが指定されたクラスを自動でDIコンテナに登録する設定になっているので、この2つの設定はアノテーションベースのSpring MVCアプリケーションにおいて必須である。

2.の<resources>タグは、DispacherServletを経由して静的コンテンツにアクセスするための設定。mapping属性でURL上のパスを指定し、location属性でこれに対応する物理上のパスを指定する。

3.ではViewResolverの設定をしている。ViewResolverとは。『Spring MVCの概要を理解する』で書いた通り、Dispacher ServletからView名を受け取って、対応するViewオブジェクトを生成し、DispacherServletに返すクラス。

③ root-context.xml

このファイルには中身が書かれていなくて、正直、なんの意味があるのかわからなかったので、職場のスーパープログラマに聞いてみた。
どうやら、Bean定義ファイルは大規模開発をするときは複数のファイルに分けて定義するらしく、このファイルもそのためのファイル。とのことだった。

④ HomeController.java

@RequestMappingのvalue属性が「/」なので、「http://localhost:8080/dialy/」というリクエストがきたら、Dispacher Servletへリクエストがきて、Dispacher Servletは「/」に対応するControllerを探し、この対応するhomeメソッドを実行する。

⑤home.jsp

homeメソッドがview名を返却して生成されるViewオブジェクトがこれ。コントローラーでModeにservlettimeパラメータを設定しているので、jspで参照して表示。

不完全燃焼の感が残りますが、以上です。今後勉強して書き足していきます。