[[Spring-MVC/ステップ・バイ・ステップ]]

#contents

2008/04/09からのアクセス回数 &counter;

** Spring-MVCの規約 [#y6b6dbdb]
Convention over configurationは、日本語では「規約は設定に勝る」と訳されていますが、
設定に適切なデフォルト値を用意することによって、規約を守ればデフォルト値によって
面倒な設定が不要になるということです。

また、Configurationには配置という意味もあり、ディレクトリ構成やファイルの場所を規約
で定めることにより、適切なデフォルト値を用意することができることと重ね合わせている
ように思えます。

Spring MVCでは、Model View Controllerにデフォルト値の規約を用意しています。

** Controllerのデフォルトマッピング [#b6035539]
HTTPのURLで指定された要求を規約に従って振り分けているのが、ControllerClassNameHandlerMapping
クラスです。

- MultiActionController以外のContollerクラスのサブクラスは、クラス名からControllerを除いた
名前でHandlerMappingに登録されます。

 例)WelcomeControllerなら/welcome*にマッピングされ、URLでは/welcome.htmを指定します。

- MultiActionControllerの場合には、クラス名からControllerを除いた名前の後に/を入れ、その後にメソッド名
を指定します。

 例)AdminControllerのloginメソッドの場合/admin/*にマッピングされ、URLでは/admin/login.htmを指定します。

** Modelのデフォルトマッピング [#z178c8c8]
ModelAndViewクラスは、オブジェクトに名前をづけしないで登録された場合、ModelMapクラスを使って自動的に生成されたkeyでオブジェクトを登録します。

プログラム例
#pre{{
    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) {        
         User user = // get the User doing the shopping      
        ModelAndView mav = new ModelAndView("displayShoppingCart"); <-- the logical view name
        mav.addObject(user); <-- ここで、オブジェクト名が指定されていない
        return mav;
    }
}}

- オブジェクトが単一のオブジェクトの場合

 例)x.y.Userのインスタンスが追加された場合、userがキーとなります。

- ハッシュマップの場合

 例)java.util.HashMapの場合、hashMapがキーとなります。

- 配列の場合

 例)x.y.Userの配列が追加された場合、userListがキーとなります。

- ArrayListが追加された場合

 例) x.y.User要素のjava.util.ArrayListが追加された場合、userListがキーとなります。

- HashSetが追加された場合

 例)x.y.Foo要素のjava.util.HashSetが追加された場合、fooListがキーになります。

''注意:空の配列、リスト、セットは登録されません。''

** Viewのデフォルトマッピング [#lf5ae557]
viewの名前が明示的に指定されていない場合、DefaultRequestToViewNameTranslatorクラスがビューの
論理名を決定します。

Bean定義ファイルでviewNameTranslatorを指定します(マニュアルのTipにはDispatcherServletが自動的に配置してくれるとありますが...)。

#pre{{
    <!-- this bean with the well known name generates view names for us -->
    <bean id="viewNameTranslator" class="org.springframework.web.servlet.view.DefaultRequestToViewNameTranslator"/>

    <bean class="x.y.RegistrationController">
        <!-- inject dependencies as necessary -->
    </bean>
    
    <!-- maps request URLs to Controller names -->
    <bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping"/>

    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
}}

ここで、以下のようなRegistrationControllerの場合
#pre{{
public class RegistrationController implements Controller {              
    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) {
        ModelAndView mav = new ModelAndView();// ビューの論理名が指定されていない!!
        // 必要に応じてモデルにオブジェクトを登録
        return mav;        
    }
}
}}}

ControllerClassNameHandlerMappingのマッピングキー(registration)がビューの論理名として使用されるので、
以下のURL
 http://localhost:8080/registration.htm
のビュー名は、/WEB-INF/jsp/registration.jspとなります。

** コメント [#q137dcef]
この記事は、

#vote(おもしろかった[0],そうでもない[0],わかりずらい[1])
#vote(おもしろかった[1],そうでもない[0],わかりずらい[1])

皆様のご意見、ご希望をお待ちしております。

#comment_kcaptcha

}}


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
SmartDoc