JavaのWebアプリケーション開発フレームワークによる、Webサイト開発の顛末記です。

EclipseのMavenを使った、Spring-MVC、Thymeleaf、MyBatis 等のプログラミングテクニックを、
備忘録的に記録しています。実際に動くソースコードを多用して説明していますので、
これからEclipseや、Spring-MVCを始めたいと思っている人にとって、少しでも参考になれば幸いです。
■SpringMVC の小径 第4歩 Spring-MVCの初期設定
4-2)Spring-MVC設定
最後の岩場をひと踏ん張り。
Spring-MVCが動くか動かないかは、このSpring-MVC設定にかかってます。
一息、コーヒーブレイクしてもいいですが、ここは一気に突き進みましょう。

前節、「4-1)web.xml 設定」で、あらかじめ設定ファイル名を「applicationContext.xml」と決めたので
これに従って、ファイルを作成します。
そろそろ、みなさん武器(Eclipse)の使い方も慣れてきたころだと思うし、
私もいちいち画像の貼り付けが苦痛になってきたので、手抜きできるところは手抜きしながら話を進めます。^^);
Eclipse「ナビゲータ」の「WebContent/WEB-INF」を選択し、マウス右ボタンクリックでメニューを表示し、
表示されたメニューから「新規」ー「ファイル」を選択します。

「新規ファイル」画面が開くので、ファイル名に「applicationContext.xml」を入力して決定します。
「エディットビュー」に空の「applicationContext.xml」が開くので、以下の内容を入力します。
WebContent/WEB-INF/applicationContext.xml
※)上のapplicationContext.xmlの内容は、自由にコピペしてもらって結構です。

では、すこし丁寧に説明します。

1)2行目~18行目 Spring bean宣言
  Spring-MVCで使用する、おまじないの各種bean定義です。
  他にも色々追加できますが、とりあえず今回は必要なだけ。
  applicationContext.xmlは、<beans>で始まり、最後の</beans>で完了します。
  この間に、様々な設定を記述していきます。

2)20行目~30行目 アノテーション有効化
  Spring-MVCで使用する、@Controllerなどのアノテーションを有効にするためのおまじないです。
  通常、@Controllerアノテーションしか使用しないプロジェクトの場合は、
  <mvc:annotation-driven /> の宣言で十分なようですが、
  @RestControllerアノテーションを使用して、JSON形式のパラメータの受け渡しを行う場合、
  ContentNegotiationManagerとかいう輩が、HTTPヘッダのメディアタイプをチェックして、
  場合によっては、406を返すことがあります。
  これを回避するため、ContentNegotiationManagerの機能をOFFとします。
  (※)Spring-MVC3.2以降から、デフォルトでContentNegotiationManager:ON らしいです。
  おいおい具体的な説明をしていきますが、今のところは「おまじない」と思ってください。

3)32行目~34行目 @Autowired有効化
  Spring-MVCで使用する、 @Autowiredステレオタイプアノテーションを有効にするためのおまじないです。
  これを宣言しておかないと、後で作成するJavaファイルで、
  @AutowiredアノテーションによりクラスのDI(ついに出ました!DIちゃん)ができません。

4)35行目~40行目 コンポーネントスキャン宣言
  Spring-MVCが、@Controllerなどのアノテーションで指定されているコンポーネントをスキャンして。
  DIするための宣言部です。
  ここで宣言されていないパッケージ階層にクラスを作っても、Spring-MVCはDIしてくれません。
  今回は、このプロジェクト用のパッケージ階層で、DIする必要のあるパッケージ階層を指定しています。
  ここはプロジェクト毎に調整してください。

5)42行目~43行目 Javaの魔法呪文
  後々説明しますが、AOP というJavaの魔法を使えるようにするための呪文です。

6)45行目~49行目 Validatorメッセージリソースファイル指定
  入力検証結果のエラーメッセージ定義ファイルを指定する定義です。
  必須ではありませんが、型変換エラー(数値フィールドに文字を入力した場合など)の場合は
  これを指定しておかないと
  
  Failed to convert property value of type [java.lang.String]
   to required type [java.lang.Integer] for property propertyname;
   nested exception is java.lang.NumberFormatException: For input string: "XXX"

  
  みたいな検証エラーが表示されるので書いておきましょう。

7)51行目以降 Thymeleaf設定
  Spring-MVCで、Thymeleafテンプレートエンジンを使用するための設定です。
  Thymeleafは、ここで設定された情報に基づき、テンプレートファイルからview(HTML)を生成します。
  ここの設定は、プロジェクトが異なってもほぼ定型の記述となるので、この通りに設定してください。
  以下、2か所だけ必要に応じて調整してください。
  62行目の、「prefix」は、テンプレートファイルを格納する場所を指定します。
   「/」は、WebContent直下にテンプレートファイルを置くという指示になります。
   これを、例えば「/view」とすれば、WebContent/viewというフォルダの下に
   テンプレートファイルを置くという指示になります。
  64行目の、「suffix」は、HTMLテンプレートファイルの拡張子を指定します。
   WebContent直下にhtmlという拡張子のファイルがあれば、
   Thymeleafはこれをテンプレートファイルと判断して処理します。

applicationContext.xmlに設定できるものは、当然これだけではありません。
実際の業務ではもっと様々な設定が追加されますが、ここでは必要最低限の設定だけにしておきます。
ここで、基本をしっかり理解しておけば、実際のプロジェクトでは何が足りないか分かってくるはずです。
何が足りないかが分かれば、ネット上に散らばっている断片的な情報から、何が必要かも自然に見えてくると思います。

 

さぁ、最後の難所も何とか無事(?)切り抜け、ついにSpring-MVCのお花畑に到着しました。
その前に、お花畑の入り口でちょっと一杯、コーヒブレイクして一息つきましょう。

これまでの設定に間違いがないか動作確認を行ってみます。
2-1)Tomcatサ-バ-の設定」で、サンプルのindex.htmlを作成して、ブラウザに表示される確認を行いました。
この作業をそのまま再現します。
やり方を忘れた人は、「2-1)Tomcatサ-バ-の設定」に戻って思い出してください。
まず、Eclise「サーバービュー」で、ローカルサーバーを起動します。
Spring-MVC動作確認
「コンソールビュー」にTomcatの起動メッセージがずらずらと表示されます。
このメッセージで異常な出力が見られなければ、Spring-MVCの設定は成功しています。
念のため、ブラウザを起動して、URLに「http://localhost:8080/j_Labo/」を入力してみます。
前と同じ画面が表示されれば問題ありません。Spring-MVCの設定は全て成功です。

 

とりあえず、お疲れ様でした。
振り返ってみれば、自宅から随分遠くまで歩いてきましたが、
実は、最終目標はまだ遠くにかすんで見えます。
富士登山に例えれば、やっと五合目に到達したぐらいでしょうか?
ここらでちょっとランチタイムにして、目前に広がるSpring-MVCのお花畑を思い切り楽しみましょう。

 

※)2018/Jun/04 JDK-10移行
JDK-10に移行するにあたり、ちょっとはまってしまったので、
備忘録として残しておきます。
Linux上の、実行環境は単純に、Javaのパスを切り替えるだけですんなりと動いたものの、
いざ、Maven pom.xml を使ってLinuxでビルドしようとしたところ、
いくつかビルドエラーが出てビルドが異常終了します。
(※Eclipse上では特に異常は出ないのですが。。。)
調べたところ、JDK-10では、どうもSpring設定ファイルのThymeleafの定義で微妙な修正が必要なようです。
上の、WebContent/WEB-INF/applicationContext.xmlの66行目の、
<property name="templateMode" value="HTML5" />
の定義があると
org.springframework.beans.factory.BeanCreationException:
Error creating bean with name 'templateResolver'
defined in ServletContext resource [/WEB-INF/applicationContext.xml]:
Error setting property values; nested exception
is org.springframework.beans.PropertyBatchUpdateException;
nested PropertyAccessExceptions (1) are:
というエラーが出て、ビルドが異常終了します。
上の行をコメントアウトするか、削除すればビルドエラーも出ないし、実行時も問題なく動作します。