ビジネスロジックやDAOが定義されたBean定義ファイルは、web.xmlに「ContextLoaderListener(リスト5-(1))」を定義することでTomcatの起動時に読み込まれる。ContextLoaderListenerはリスト5-(2)のcontextConfigLocationで定義された場所(/WEB-INF/applicationContext.xml)からBean定義ファイルを読み込んでいる。
リスト5:web.xml
(画像をクリックすると別ウィンドウに拡大図を表示します)
これでサーブレットからSpringのDIコンテナにアクセスすることができるようになった。NexawebとSpringを連携する最も単純な例は、リスト6のようにサーブレットを用意し、リクエストパラメータやURLなどから画面からどのようなリクエストがされたか解釈し(リスト6-(1))、SpringのDIコンテナから「ProductService」を取得して(リスト6-(2))処理する方法だ。
リスト6:最も単純なNexaweb-Spring連携
(画像をクリックすると別ウィンドウに拡大図を表示します)
しかし、これではあまりにも連携が稚拙であり、決まりきったような処理のサーブレットを毎回自作するのも面倒だといえる。このようなとき、画面がリクエストしてくるURLを解釈して処理するMVCフレームワークと連携すべきだろう。そこで今回はSpringが提供するMVCフレームワークである「SpringMVC」を利用する。
SpringMVCを利用するには、まずweb.xmlに画面からのリクエストをコントローラに振り分けてくれるサーブレット「DispatcherServlet」を定義する。
リスト7:web.xml(SpringMVCとの連携)
(画像をクリックすると別ウィンドウに拡大図を表示します)
次に画面からのリクエストをどのコントローラに振り分けるかという定義が必要となる。今回「findAllProduct.htm」へのリクエストは、商品の一覧を取得する際に画面がリクエストするURLには、order.htmへのリクエストが商品を注文する際に画面がリクエストするURLとしよう。
このように定義したリクエストとコントローラの振り分けの定義ファイルはリスト7-(1)で指定された「サーブレット名 & "-servlet.xml"」というファイル名で、WEB-INF以下に配置する(リスト8)。
リスト8:hokkaien-servlet.xml
(画像をクリックすると別ウィンドウに拡大図を表示します)
リスト8-(1)はURLからどのコントローラを呼び出すか定義している箇所だ。「findAllProduct.htm、order.htm」というURLをリクエストされた場合、productControllerを呼び出すというマッピングがされている。
マッピングされたコントローラ「productController」はリスト8-(2)で定義されている。1つのコントローラで、複数のリクエストを解決するため「findAllProduct.htm」というリクエストはhandleFindAllProductメソッドに定義されており、order.htmへのリクエストはhandleOrderメソッドに振り分ける定義がリスト8-(3)となる。
|