springmvc
DESCRIPTION
知っ得納得Webフレームワーク勉強会のスライドTRANSCRIPT
SpringMVC-Weapons for the War on Java Complexity -
自己紹介
名前片山 暁雄
IDid:c9katayama
所属株式会社キャピタルアセットプランニング
Agenda
SpringMVCとは基本的な仕組みクラス群アノテーション利用のスタイルデモ利点欠点まとめ
SpringMVCとは
Spring謹製のWebフレームワーク
MVCパターンを採用し、各種View(JSP,XML,XSLT,Tiles,Velocity,FreeMarker,PDF,JasperReport)を利用可能
Controller部分も充実
SpringMVCとは
Spring1.0,JDK1.4以降で動作ただしアノテーションを利用する場合はSpring2.5、JDK1.5が必要
Apache License2.0SpringSourceで開発中
SpringMVC
基本的な仕組み
SpringMVC
DispatcherServlet
WebApplicationContext
HandlerMapping
HandlerAdapter Handler
view
ModelAndView
Model View
SpringMVC
DispatcherServlet
WebApplicationContext
HandlerMapping
HandlerAdapter Handler
view
ModelAndView
Model View
DispatcherServletリクエストを受け付けるサーブレット
初期化時にSpringの設定ファイルを読み込み、WebApplicationContextを初期化
SpringMVC
DispatcheServlet
WebApplicationContext
HandlerMapping
HandlerAdapter Handler
view
ModelAndView
Model View
HandlerMappingリクエストと、実処理を行うHandlerのマッピングURLとクラス名、URLとアノテーションなど
SpringMVC
DispatcheServlet
WebApplicationContext
HandlerMapping
HandlerAdapter Handler
view
ModelAndView
Model View
HandlerAdapterHandlerのメソッドを呼び出す役割Handlerの種類によって決定
SpringMVC
DispatcherServlet
WebApplicationContext
HandlerMapping
HandlerAdapter Handler
view
ModelAndView
Model View
Handlerリクエストを処理する役割(StrutsのAction部分)ここは実装します
SpringMVC
DispatcheServlet
WebApplicationContext
HandlerMapping
HandlerAdapter Handler
view
ModelAndView
Model View
ModelAndView画面に出力するデータ(Model)と画面出力処理(View)
SpringMVC
DispatcheServlet
WebApplicationContext
HandlerMapping
HandlerAdapter Handler
view
ModelAndView
Model View
view JSPとかHTMLとかここも実装
SpringMVC
ポイント各種役割が抽象化されている役割ごとに用意されてるクラスが多数ある設定ファイル・アノテーションで入れ替え可能
SpringMVC
役割ごとのクラス群
SpringMVC
HandlerMapping HandlerAdapter
SpringMVC
HandlerView
ポイントクラスが多い正直、よくわからない
SpringMVC
開発スタイルに応じた様々な便利クラスが混在しているため、混乱してしまう
SpringMVC
開発スタイル設定ファイル+便利クラス群のスタイルアノテーション利用のスタイル
Spring2.5以降なら、アノテーション利用のスタイルがおすすめ
SpringMVC
これだけ押さえようアノテーション利用のスタイル
SpringMVC
HandlerMapping DefaultAnnotationHandlerMapping
Springに登録されたHandlerの中から、RequestMappingアノテーションを読み取り、URLと合致するHandlerを探す
SpringMVC
HandlerAdapter AnnotationMethodHandlerAdapter
HandlerMappingで条件にあったHandlerのRequestMappingアノテーションから、パス・パラメータ・HTTPメソッドを読み取り、リクエストの条件と一致するメソッドを見つけて呼び出す
SpringMVC
・DefaultAnnotationHandlerMapping・AnnotationMethodHandlerAdapter
いずれもデフォルトでDispatcherServletに登録されている。アノテーションを利用する場合は自動的にこれらが使用されるため、特に意識する必要はない
SpringMVC
View
Handler
AnnotationMethodHandlerAdapterがHandlerの戻り値を元に適切に処理してくれるため、ひとまず忘れる
POJOに対してアノテーションを付与して作成ここだけ覚えればMVCマスター!
SpringMVC
アノテーションを使ったHandler
SpringMVC@Controller@RequestMapping("/login.do")public class LoginController {
@RequestMapping(method = RequestMethod.GET) public String setup(Model model) { model.addAttribute(new LoginForm()); return "login.jsp"; } @RequestMapping(method = RequestMethod.POST) public String doLogin(LoginForm loginForm, Errors errors) { if (errors.hasErrors()) { return "login.jsp"; }else{ return “redirect:menu.do”; } }}
SpringMVC
@ControllerSpringにHandlerクラスを登録するためのアノテーション
Handlerクラスに付与
SpringMVC
package sample.springmvc.controller
@Controllerpublic class LoginController {
<context:component-scan basepackage=”sample.springmvc.controller”/>
指定パッケージ以下をスキャン!
SpringMVC
@RequestMappingリクエストと、それを処理するHandlerをひもづけるアノテーション
パス、リクエストパラメータ、HTTPメソッドを利用してひもづけ
クラスとメソッドに付与できる
SpringMVC
@Controller@RequestMapping("/login.do")public class LoginController {
@RequestMapping(method = RequestMethod.GET) public String setup(Model model) { model.addAttribute(new LoginForm()); return "login.jsp"; } @RequestMapping(params=”character=EEDA”) public String character() { return “character.jsp” }
SpringMVC
@Controlleと@RequestMappingさえあれば、リクエストに対して処理を行うクラス/メソッドを関連づけできる。
SpringMVC
Handlerのメソッド
SpringMVC
メソッド名何でもいい(@RequestMappingで関連づけるため)
SpringMVC
メソッド引数J2EEで利用出来るオブジェクトModelSessionStatus@RequestParamPOJO (@ModelAttribute)Errors
必要な物を引数で宣言
SpringMVC
J2EEで利用出来るオブジェクトHttpServletRequest,ResponseHttpSessionReader,InputStreamWriter,OutputStreamPrincipalLocale
SpringMVC
ModelViewに渡すデータを格納するオブジェクトsetAttribute()で値をセットsetAttribute(value)の場合、暗黙的にキーが設定される
@RequestMapping(method = RequestMethod.GET)public String setup(Model model) { model.addAttribute(new LoginForm()); return "login.jsp";} 「loginForm」が
キー値になる
SpringMVC
SessionStatus@ SessionAttributesと対になって動作SessionStatus.setComplete()を呼び出すと、@SesssionAttributeでセッションに格納したオブジェクトがセッションから削除される
削除対象は、setComplete()を呼んだクラスが付与している@SesssionAttributesの値
SpringMVC
@SessionAttributesModelに入っているオブジェクトのうち、セッションに格納しておきたいオブジェクトのキーを指定
SpringMVC
@Controller@RequestMapping("/login.do")@SessionAttributes(“loginForm”)public class LoginController {
@RequestMapping(method = RequestMethod.GET) public String setup(Model model) { model.addAttribute(“loginForm”,new LoginForm()); return "login.jsp"; } 「loginForm」をキーとし
てセッションに入る
SpringMVC
@Controller@RequestMapping("/login.do")@SessionAttributes(“loginForm”)public class LoginController {
@RequestMapping(method = RequestMethod.POST) public String doEnd(SessionStatus status) { status.setComplete(); return "login.jsp"; } 「loginForm」がキー値
のオブジェクトがセッションから削除される
SpringMVC
@RequestParamリクエストパラメータを取得するためのアノテーション
デフォルトでrequired。パラメータがリクエストにない場合、例外が発生
SpringMVC
/sample/login.do?id=hoge
@RequestMapping(method = RequestMethod.POST) public String doLogin(@RequestParam(“id”) String id) { //idに”hoge”が入る }
SpringMVC
POJO (@ModelAttribute)POJOを指定すると、リクエストパラメータがバインドされる
@ModelAttribute(“name”)を付与すると、nameをキーにしてModelにPOJOが入る。(付与しない場合は暗黙的な名前でModelに入る)
SpringMVC
@RequestMapping(method = RequestMethod.POST) public String doLogin(LoginForm loginForm, Errors errors) { }
@RequestMapping(method = RequestMethod.POST) public String doLogin( @ModelAttribute(“loginForm”)LoginForm loginForm, Errors errors) { }
SpringMVC
ErrorsリクエストパラメータをPOJOに変換する際、型変換などが起きた場合にそのエラーを取得するためのクラス
SpringMVC
@RequestMapping(method = RequestMethod.POST) public String doLogin(LoginForm loginForm, Errors errors) { if (errors.hasErrors()) { return "login.jsp"; }else{ return “redirect:menu.do”; } }
SpringMVC
メソッド戻り値通常はStringModelAndViewを返す事も可能voidの場合、ViewResolverというクラスがリクエストパラメータからViewを組み立てる(/login.do -> /login.jspのような変換)
SpringMVC
ポイントいきなり全機能を使うのは難しいまずは@RequestMapping+J2EEのクラスでSessionStatusとSessionAttributeは使わなくてもOK(通常のHttpSessionを使う)
暗黙的な仕様部分は避ける型変換はフレームワークに任せて、それ以外のバリデーションはハンドラメソッド内で行う
SpringMVC
view
SpringMVC
カスタムタグStruts風のFormタグエラータグ
SpringMVC
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %><%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<form:form modelAttribute="loginForm">
ID: <form:errors path="id"/> <form:input path="id" size="30" maxlength="30"/> PASSWORD: <form:errors path="password"/> <form:password path="password" size="10" maxlength="10"/> <input type="submit" value="login"/> </form:form>
SpringMVC
デモ
SpringMVC
利点いくつかアノテーションを覚えれば、すぐにURLとマッピング出来る
柔軟なマッピングリクエストパラメータからPOJOへの型変換を、フレームワークが行ってくれる
Handlerがコンテナ管理されているため、DIが可能
カスタマイズが容易
SpringMVC
欠点ModelやSessionAttributesなどの概念がわかりずらい(オブジェクトのライフサイクルが見えにくい)
CoC的に処理される部分がわりとあるトランザクションはサポートしていない(SpringWebFlow)
コンテナの選択肢がSpringしかない
SpringMVC
まとめアノテーションスタイルなら設定の記述も少なく、手軽に使い始められる
タグはStruts風なので、なじみやすいとりあえず はじめてみよう MVC