springmvc

55
SpringMVC -Weapons for the War on Java Complexity -

Upload: akio-katayama

Post on 12-Jan-2015

2.425 views

Category:

Technology


0 download

DESCRIPTION

知っ得納得Webフレームワーク勉強会のスライド

TRANSCRIPT

Page 1: SpringMVC

SpringMVC-Weapons for the War on Java Complexity -

Page 2: SpringMVC

自己紹介

名前片山 暁雄

IDid:c9katayama

所属株式会社キャピタルアセットプランニング

Page 3: SpringMVC

Agenda

SpringMVCとは基本的な仕組みクラス群アノテーション利用のスタイルデモ利点欠点まとめ

Page 4: SpringMVC

SpringMVCとは

Spring謹製のWebフレームワーク

MVCパターンを採用し、各種View(JSP,XML,XSLT,Tiles,Velocity,FreeMarker,PDF,JasperReport)を利用可能

Controller部分も充実

Page 5: SpringMVC

SpringMVCとは

Spring1.0,JDK1.4以降で動作ただしアノテーションを利用する場合はSpring2.5、JDK1.5が必要

Apache License2.0SpringSourceで開発中

Page 6: SpringMVC

SpringMVC

基本的な仕組み

Page 7: SpringMVC

SpringMVC

DispatcherServlet

WebApplicationContext

HandlerMapping

HandlerAdapter Handler

view

ModelAndView

Model View

Page 8: SpringMVC

SpringMVC

DispatcherServlet

WebApplicationContext

HandlerMapping

HandlerAdapter Handler

view

ModelAndView

Model View

DispatcherServletリクエストを受け付けるサーブレット

初期化時にSpringの設定ファイルを読み込み、WebApplicationContextを初期化

Page 9: SpringMVC

SpringMVC

DispatcheServlet

WebApplicationContext

HandlerMapping

HandlerAdapter Handler

view

ModelAndView

Model View

HandlerMappingリクエストと、実処理を行うHandlerのマッピングURLとクラス名、URLとアノテーションなど

Page 10: SpringMVC

SpringMVC

DispatcheServlet

WebApplicationContext

HandlerMapping

HandlerAdapter Handler

view

ModelAndView

Model View

HandlerAdapterHandlerのメソッドを呼び出す役割Handlerの種類によって決定

Page 11: SpringMVC

SpringMVC

DispatcherServlet

WebApplicationContext

HandlerMapping

HandlerAdapter Handler

view

ModelAndView

Model View

Handlerリクエストを処理する役割(StrutsのAction部分)ここは実装します

Page 12: SpringMVC

SpringMVC

DispatcheServlet

WebApplicationContext

HandlerMapping

HandlerAdapter Handler

view

ModelAndView

Model View

ModelAndView画面に出力するデータ(Model)と画面出力処理(View)

Page 13: SpringMVC

SpringMVC

DispatcheServlet

WebApplicationContext

HandlerMapping

HandlerAdapter Handler

view

ModelAndView

Model View

view JSPとかHTMLとかここも実装

Page 14: SpringMVC

SpringMVC

ポイント各種役割が抽象化されている役割ごとに用意されてるクラスが多数ある設定ファイル・アノテーションで入れ替え可能

Page 15: SpringMVC

SpringMVC

役割ごとのクラス群

Page 16: SpringMVC

SpringMVC

HandlerMapping HandlerAdapter

Page 17: SpringMVC

SpringMVC

HandlerView

Page 18: SpringMVC

ポイントクラスが多い正直、よくわからない

SpringMVC

開発スタイルに応じた様々な便利クラスが混在しているため、混乱してしまう

Page 19: SpringMVC

SpringMVC

開発スタイル設定ファイル+便利クラス群のスタイルアノテーション利用のスタイル

Spring2.5以降なら、アノテーション利用のスタイルがおすすめ

Page 20: SpringMVC

SpringMVC

これだけ押さえようアノテーション利用のスタイル

Page 21: SpringMVC

SpringMVC

HandlerMapping DefaultAnnotationHandlerMapping

Springに登録されたHandlerの中から、RequestMappingアノテーションを読み取り、URLと合致するHandlerを探す

Page 22: SpringMVC

SpringMVC

HandlerAdapter AnnotationMethodHandlerAdapter

HandlerMappingで条件にあったHandlerのRequestMappingアノテーションから、パス・パラメータ・HTTPメソッドを読み取り、リクエストの条件と一致するメソッドを見つけて呼び出す

Page 23: SpringMVC

SpringMVC

・DefaultAnnotationHandlerMapping・AnnotationMethodHandlerAdapter

いずれもデフォルトでDispatcherServletに登録されている。アノテーションを利用する場合は自動的にこれらが使用されるため、特に意識する必要はない

Page 24: SpringMVC

SpringMVC

View

Handler

AnnotationMethodHandlerAdapterがHandlerの戻り値を元に適切に処理してくれるため、ひとまず忘れる

POJOに対してアノテーションを付与して作成ここだけ覚えればMVCマスター!

Page 25: SpringMVC

SpringMVC

アノテーションを使ったHandler

Page 26: SpringMVC

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”; } }}

Page 27: SpringMVC

SpringMVC

@ControllerSpringにHandlerクラスを登録するためのアノテーション

Handlerクラスに付与

Page 28: SpringMVC

SpringMVC

package sample.springmvc.controller

@Controllerpublic class LoginController {

<context:component-scan basepackage=”sample.springmvc.controller”/>

指定パッケージ以下をスキャン!

Page 29: SpringMVC

SpringMVC

@RequestMappingリクエストと、それを処理するHandlerをひもづけるアノテーション

パス、リクエストパラメータ、HTTPメソッドを利用してひもづけ

クラスとメソッドに付与できる

Page 30: SpringMVC

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” }

Page 31: SpringMVC

SpringMVC

@Controlleと@RequestMappingさえあれば、リクエストに対して処理を行うクラス/メソッドを関連づけできる。

Page 32: SpringMVC

SpringMVC

Handlerのメソッド

Page 33: SpringMVC

SpringMVC

メソッド名何でもいい(@RequestMappingで関連づけるため)

Page 34: SpringMVC

SpringMVC

メソッド引数J2EEで利用出来るオブジェクトModelSessionStatus@RequestParamPOJO (@ModelAttribute)Errors

必要な物を引数で宣言

Page 35: SpringMVC

SpringMVC

J2EEで利用出来るオブジェクトHttpServletRequest,ResponseHttpSessionReader,InputStreamWriter,OutputStreamPrincipalLocale

Page 36: SpringMVC

SpringMVC

ModelViewに渡すデータを格納するオブジェクトsetAttribute()で値をセットsetAttribute(value)の場合、暗黙的にキーが設定される

@RequestMapping(method = RequestMethod.GET)public String setup(Model model) { model.addAttribute(new LoginForm()); return "login.jsp";} 「loginForm」が

キー値になる

Page 37: SpringMVC

SpringMVC

SessionStatus@ SessionAttributesと対になって動作SessionStatus.setComplete()を呼び出すと、@SesssionAttributeでセッションに格納したオブジェクトがセッションから削除される

削除対象は、setComplete()を呼んだクラスが付与している@SesssionAttributesの値

Page 38: SpringMVC

SpringMVC

@SessionAttributesModelに入っているオブジェクトのうち、セッションに格納しておきたいオブジェクトのキーを指定

Page 39: SpringMVC

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」をキーとし

てセッションに入る

Page 40: SpringMVC

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」がキー値

のオブジェクトがセッションから削除される

Page 41: SpringMVC

SpringMVC

@RequestParamリクエストパラメータを取得するためのアノテーション

デフォルトでrequired。パラメータがリクエストにない場合、例外が発生

Page 42: SpringMVC

SpringMVC

/sample/login.do?id=hoge

@RequestMapping(method = RequestMethod.POST) public String doLogin(@RequestParam(“id”) String id) { //idに”hoge”が入る }

Page 43: SpringMVC

SpringMVC

POJO (@ModelAttribute)POJOを指定すると、リクエストパラメータがバインドされる

@ModelAttribute(“name”)を付与すると、nameをキーにしてModelにPOJOが入る。(付与しない場合は暗黙的な名前でModelに入る)

Page 44: SpringMVC

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) { }

Page 45: SpringMVC

SpringMVC

ErrorsリクエストパラメータをPOJOに変換する際、型変換などが起きた場合にそのエラーを取得するためのクラス

Page 46: SpringMVC

SpringMVC

@RequestMapping(method = RequestMethod.POST) public String doLogin(LoginForm loginForm, Errors errors) { if (errors.hasErrors()) { return "login.jsp"; }else{ return “redirect:menu.do”; } }

Page 47: SpringMVC

SpringMVC

メソッド戻り値通常はStringModelAndViewを返す事も可能voidの場合、ViewResolverというクラスがリクエストパラメータからViewを組み立てる(/login.do -> /login.jspのような変換)

Page 48: SpringMVC

SpringMVC

ポイントいきなり全機能を使うのは難しいまずは@RequestMapping+J2EEのクラスでSessionStatusとSessionAttributeは使わなくてもOK(通常のHttpSessionを使う)

暗黙的な仕様部分は避ける型変換はフレームワークに任せて、それ以外のバリデーションはハンドラメソッド内で行う

Page 49: SpringMVC

SpringMVC

view

Page 50: SpringMVC

SpringMVC

カスタムタグStruts風のFormタグエラータグ

Page 51: SpringMVC

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>

Page 52: SpringMVC

SpringMVC

デモ

Page 53: SpringMVC

SpringMVC

利点いくつかアノテーションを覚えれば、すぐにURLとマッピング出来る

柔軟なマッピングリクエストパラメータからPOJOへの型変換を、フレームワークが行ってくれる

Handlerがコンテナ管理されているため、DIが可能

カスタマイズが容易

Page 54: SpringMVC

SpringMVC

欠点ModelやSessionAttributesなどの概念がわかりずらい(オブジェクトのライフサイクルが見えにくい)

CoC的に処理される部分がわりとあるトランザクションはサポートしていない(SpringWebFlow)

コンテナの選択肢がSpringしかない

Page 55: SpringMVC

SpringMVC

まとめアノテーションスタイルなら設定の記述も少なく、手軽に使い始められる

タグはStruts風なので、なじみやすいとりあえず はじめてみよう MVC