2012年3月16日金曜日

Controller と Handler Mapping


Spring Framework Reference Documentation 3.1 16.3 Implementing Controllers より
コントローラは、サービスインターフェースを介して定義するアプリケーションの振る舞いへのアクセスを提供する。コントローラーは、ユーザーの入力を解釈し、処理結果をモデルに変換する。このモデルは、ビューを介して最終的にユーザーに見せる形にレンダリングされる。Spring は、コントローラー作成の自由度を高めるために、非常に抽象的な方法でコントローラーを実装している。
つまり、クライアントからのリクエストに応じて、ビューインターフェースに食わせるためのモデルを作るのがコントローラーの役割ということです。

最初(※「難しいことは後回し」参照)に以下のような要件を定義していました。
 /welcome/** : 一般向けコンテンツ
 /front/**  : サービスコンテンツ
 /account/* : アカウント関連の機能を提供(ログイン、アカウント作成)
 /account/ajax/* : Ajaxで処理するアカウント関連の画面

なので、今回はこれらに対応するコントローラーと URL の紐付け規則を [servlet-name]-servlet.xml に定義します。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
  :
    http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">
  :
 中 略
  :
 <!-- Handler Mapping -->
 <bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping"/>
 <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
  <property name="mappings">
   <props>
    <prop key="/account/ajax/**">ajaxAccountController</prop>
   </props>
  </property>
 </bean>
  :
 中 略
  :
 <!-- Controller -->
 <bean id="ajaxAccountController"
 class="picboo.controller.AjaxAccountController">
 </bean>
  :
 中 略
  :
</beans>

ControllerClassNameHandlerMapping は、HandlerMapping インターフェースの実装クラスで、コントローラービーンのクラス名に基づいて、URL とのマッピングを行います。

これを使うことで

 /welcome/ → WelcomeController.class
 /front/  → FrontController.class
 /account/ → AccountController.class

という紐付けが行われます。

一方、クラスと URL の紐付けを明示的に行いたい場合に使うのが SimpleUrlHandlerMapping です。今回アカウント関連の中で Ajax を使いたい部分は、AjaxAccountController にまとめ、/account/ajax/ という URL でアクセスしたいと考えているので、AjaxAccountController ビーンの登録と、SimpleUrlHandlerMapping ビーンの mappings プロパティへの設定で、以下の紐付けを行いました。

 /account/ajax/ → AjaxAccountController.class

ここまでで、リクエストをコントローラーで受ける部分、コントローラーの処理結果をビューにレンダリングさせる部分の設計ができました。

0 件のコメント:

コメントを投稿