springmvc

Post on 12-Jan-2015

2.425 Views

Category:

Technology

0 Downloads

Preview:

Click to see full reader

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

top related