2012年3月15日木曜日

View Resolver と View


Spring MVC には、ビュー関連で 2 種類のインターフェース“ViewResolver”と“View”が用意されています。

Spring Framework Reference Documentation 3.1の16.5 Resolving viewsによると、コントローラがディスパッチャーに投げたビュー名と実際のビュー(リソース)、所謂テンプレートファイルのマッピングを行うのがView resolver、ビューをレンダリングする機能へのリクエストを準備して、渡す役割を果たすのがViewと呼ばれるインターフェースです。

View resolver, View共に対象とするビュー技術(JSP, Velocity, FreeMaker, XSLTなど)に応じた実装クラスが用意されています。

今回は JSP と JSTL でやってみようと思っているので、[servlet-name]-servlet.xml に以下のような感じで InternalResourceViewResolver のビーンを登録しました。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:p="http://www.springframework.org/schema/p"
   xmlns:context="http://www.springframework.org/schema/context"
   xmlns:aop="http://www.springframework.org/schema/aop"
   xmlns:tx="http://www.springframework.org/schema/tx"
   xsi:schemaLocation="
    http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-3.0.xsd
    http://www.springframework.org/schema/aop
    http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
    http://www.springframework.org/schema/tx
    http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">
  :
 中 略
  :
 <!-- View Resolver -->
 <bean id="internalResourceViewResolver"
  class="org.springframework.web.servlet.view.InternalResourceViewResolver"
  p:viewClass="org.springframework.web.servlet.view.JstlView"
  p:prefix="/WEB-INF/jsp/"
  p:suffix=".jsp"/>

</beans>

InternalResourceViewResolver は UrlBasedViewResolver のサブクラスです。これが示唆するとおり、ビュー名を対応するビューリソースの URL に解決します。ビュー名として直接 URL を指定することも可能ですが、URL の一部をアプリケーション内でユニークなビュー名として使用し、これを URL に変換するルールを指定することもできます。

今回は internalResourceViewResolverビーンのプロパティviewClassで、ビュークラスとして JstlView を使用することを指定しています。また、prefix と suffix にある通り、/WEB-INF/jsp/ というフォルダーに .jsp という拡張子で JSP ファイルを配置することを指示しています。

Spring Framework では、ビーン定義中にプロパティを設定するとインスタンス化した際に、対応するクラスのセッターメソッド――この場合は InternalResourceViewResolver クラスの setViewClass と setPrefix, setSuffix――を介して値が反映される点が便利です。

尚、UrlBasedViewResolver では、2つの特別なプリフィックスがサポートされています。一つは URL リダイレクトを指示する“redirect:”、もう一つが URL フォワードを指示する“forward:”。ビュー名にこれらのプリフィックスが付いていた場合は、ViewResolverに設定された標準ルールより、優先して処理されます。

プロトタイプ
先日のダミー要件(※「難しいことは後回し」参照)に従って、PHP と作り置きの CSS、JavaScript をかき集めて、動く登録画面を作ってみました。割といい感じなのでこれをもとに JSP を作ろうと思います。

0 件のコメント:

コメントを投稿