Hatena::ブログ(Diary)

タツノオトシゴの日記

2012-10-23 Spring MVC 3.0/3.1/3.2 Cookbook

Spring MVC 3.0/3.1/3.2の日本語の実用レベルのまとまった情報が少ないので、ドキュメントとして、クックブック的なレシピ集としてまとめたものとして公開します。

まだ、書きかけのところもありますが、Spring MVCの大体の機能は説明できていると思います。

基本的に、自分が使っている機能をまとめています。

Spring MVCに直接関係しないものも多々あります。書いていたら、いつの間にか増えてました(JAXBやRELAX NGとか)。

今後も主にこの方針で更新していきますが、ページ数が多くなった場合、分割するかもしれません。

目指すところ

  • Webアプリケーションを作成するときに、フレームワークの選定する際の候補としてSpring MVCも入れてほしいので、その参考資料としても使えるようにする。また、目次をみれば、Spring MVCで何ができるのかできるだけわかるようにする。
  • 自分がStrutsを業務で使うに当たり非常に重宝した書籍「Srtuts クックブック」のSpring MVC版を目指す。
  • Struts1.xの経験した人ならば、拡張しづらく、使いづらいと思った部分が、Spring MVCを使用することで改善されていることを知ってほしい。
  • 普段Springを使っていて、Struts2.xを採用しようと迷っているならば、Presentation層もSpringにすることをお勧めしたい。機能の多くは似ており、Spring MVCの方が柔軟性・拡張性は高いと思います。
  • Springの公式リファレンスは、説明文章が多くてサンプルソースが少なく、実際に使うときには、さらにJavadocなど見たりする必要があります。そのため、サンプルソース付きの少し細かな情報を付けて調査の時間を省き、さらに自分が使うに当たって迷ったりしたポイントを説明したい。

今後の主な予定

  • Spring MVC 3.2の変更点一覧をCookbook本文へマージする。:2013年4月06 途中。
  • Spring MVC 3.2の変更点。:2013年2月上旬に公開したいです。:2013/02/10 済
  • RESTテンプレートの使用方法追加。:2013/01/06 済。
  • JSONまわりの機能。:2013/01/06 済。

変更履歴

  • 2013/01/06 「RESTサービス」の章を大幅に加筆。JAXB、REALX NGも追加しました。
  • 2012/11/20 「SiteMesh」の章を追加。
  • 2012/10/28 公開。

Spring3.2変更点一覧

今後、本文へマージする予定です。

http://d.hatena.ne.jp/tatsu-no-toshigo/20130209

Spring4.0変更点一覧

今後、本文へマージする予定です。

http://d.hatena.ne.jp/tatsu-no-toshigo/20140116/1389886428


公開先(Google Drive

ページ数が約480ページと多いため、「ファイル」メニューの「ダウンロード」からファイルをダウンロードして閲覧することをお勧めします。

  • PDF版(Spring3.0〜3.1)(約4MB)

https://googledrive.com/host/0BzR3hjGfqNYFMW9tYVZnY01SbEk/SpringMVC3.1.pdf

  • Word版(Spring3.0〜3.1)(約4MB)

https://googledrive.com/host/0BzR3hjGfqNYFMW9tYVZnY01SbEk/SpringMVC3.1.docx

  • PDF版(Spring3.2のマージ途中のもの)

https://googledrive.com/host/0BzR3hjGfqNYFMW9tYVZnY01SbEk/SpringMVC3.2.pdf

  • Word版(Spring3.2のマージ途中のもの)

https://googledrive.com/host/0BzR3hjGfqNYFMW9tYVZnY01SbEk/SpringMVC3.2.docx

目次

1SPRING3.1の変更点
1.1.SERVLET 3に対応
1.1.1.Sevrlet3.0を使用するためのweb.xmlの記述の変更
1.1.2.TLD(タグライブラリ定義)ファイルの配置場所の変更
1.1.3.Servlet3.0を使用するためのpom.xmlの記述の変更
1.1.4.Springの定義情報読み込み方法の追加
1.1.5.Servlet3.0のマルチパート(ファイルアップロード)に対応
1.2.@REQUESTPARTの説明を行う(:TODO)
1.3.アノテーションンを処理する各種HANDLERMETHODの変更
1.4.アノテーション「@REQUESTMAPPING」の改善
1.5.FLASH ATTRIBUTE(フラッシュ属性、フラッシュスコープ)の実装
1.6.URIテンプレート変数の改良(:TODO)
1.7.@REQUESTBODY時に指定した@VALIDアノテーションの動作
1.8.URIを組み立てるためのURICOMPONENTSBUILDERの追加(:TODO)
2SPRING MVCによる開発
2.1.はじめに
2.2.SPRING MVCの処理フロー
2.3.ファイル構成
2.4.設定ファイルの準備
2.4.1.pom.xml
2.4.2.web.xml
2.4.3.アプリケーション用(共通の)Spring Beanファイル
2.4.4.Spring MVC用の設定ファイル
2.4.5.EclipseのプラグインSpringIDE
3コントローラの作成
3.1.簡単なコントローラの作成
3.1.1.簡単なJSPの定義
3.1.2.ファイルの配置
3.1.3.Webブラウザからアクセスする
3.2.コントローラの引数と戻り値
3.2.1.コントローラの引数一覧
3.2.2.コントローラの戻り値の一覧
3.2.3.よくある処理ごとの引数と戻り値の組合せ
3.3.@REQUESTMAPPINGによる様々なURLの処理
3.3.1.アノテーション「@RequestMapping」の仕様
3.3.2.サンプル「クラスに定義する」
3.3.3.サンプル「メソッドのみに定義する」
3.3.4.サンプル「URLをクラスとメソッドの両方に定義する」
3.3.5.サンプル「Welcome用のURLを定義する」
3.3.6.サンプル「URLの一部が動的に変化するURLを定義する」
3.3.7.同じURLに対してHTTPメソッドにより処理を振り分ける
3.3.8.複数のsubmitボタンにより処理を振り分ける
3.3.9.HTTPヘッダーによりリクエスト/レスポンスを制限する(TODO)
3.4.URLへの転送方法
3.4.1.ForwardによるURL転送
3.4.2.RedirectによるURL転送
3.4.3.フラッシュスコープ(Flash Scope)を使用したredirectによるURL転送(独自実装)
3.4.4.フラッシュ属性を使用したredirectによるURL転送(Spring MVC 3.1)
3.5.VIEWRESOLVER(:TODO)
3.5.1.Apache Tilesを使用する(:TODO)
4FORMデータの送受信
4.1.基本的なデータの送受信
4.1.1.@RequestParamによるデータの送受信
4.1.2.Command(@ModelAttribute)によるデータの送受信
4.2.データバインドエラー(型ミスマッチ)処理
4.2.1.データバインドのエラーメッセージのサンプル
4.2.2.List型、Map型のバインド時のエラーメッセージ
4.2.3.項目名を埋め込む
4.3.独自のデータ型のバインド(@INITBINDER)
4.3.1.日付型のバインド(CustomDateEditor)
4.3.2.数値型のバインド(CustomNumberEditor)
4.3.3.CustomEditorの名前による関連付け方法(pathの指定方法)
4.3.4.システム全体のバインドの設定
4.3.5.様々なCustomEditor(PropertyEditor)
4.3.6.列挙型のバインド
4.3.7.アノテーションを使用したデータバインド(:TODO)
4.4.ファイルアップロード
4.4.1.ファイルアップロードの準備(Spring MVC 3.0+Commons FileUpload)
4.4.2.ファイルアップロードの準備(Spring MVC 3.1+Servlet3.0のマルチパート機能)
4.4.3.単純なファイルアップロード
4.4.4.リスト形式によるファイルアップロード
4.4.5.ファイルサイズの上限値のを超えてアップロードした場合の処理
4.5.リスト、マップなどの複雑なデータ構造を送受信する
4.5.1.プロパティの位置(=path)の表現
4.5.2.リストによるデータの送受信
4.5.3.マップによるデータの送受信
4.5.4.マップとリスト組み合わせたデータの送受信
5RESTサービスの作成
5.1.JSON/XMLデータの送受信
5.1.1.準備
5.1.2.サーバ側でJSONデータを出力/クライアント側で取得する場合
5.1.3.クライアント側でJSONデータを送信/サーバ側で受信する場合
5.1.4.サーバ/クライアント側の両方でJSONデータを送受信する
5.1.5.サーバ側でXMLデータを出力/クライアント側で取得(JAXB)
5.1.6.クライアント側でXMLデータを送信/サーバ側で受信する場合
5.1.7.サーバクライアント側の両方でXMLデータ送受信する
5.2.RESTFULなシステム設計
5.2.1.RESTサービスにおけるURIの決め方
5.2.2.RESTサービスにおけるHTTPメソッドの役割
5.3.SPRING MVCにおけるRESTFULサービスの実現
5.3.1.データの変換「HttpMessageConverter」
5.4.RESTFULなURIの実装
5.4.1.URIにパス変数が1つの場合
5.4.2.URIにパス変数が複数の場合
5.4.3.URIにパス変数とFORMデータをクライアントから送信する
5.4.4.URIにパス変数とJSON/XMLデータを送受信する
5.4.5.パス変数の値を正規表現でフィルタする
5.5.RESTサービスによるエラー処理
5.5.1.サーバ側
5.5.2.クライアント側
5.6.クライアント側「RESTTEMPLATEによるRESTサービスへのアクセス」
5.6.1.RestTemplateをSpring Beanとして定義する
5.6.2.RestTemplateのメソッド(TODO)
5.6.3.URIの組み立て(UriTemplate、UriComponents/UriComponentsBuilder)(TODO)
5.7.JAXBのJAVAソースの自動生成
5.7.1.RELAX NGファイルの作成
5.7.2.TrangによるXML Schemaファイルの変換
5.7.3.xjcコマンドを使用したJAXBのソース生成
5.7.4.RELAX NGからJAXBソースの生成
5.7.5.JAXBのソースを修正するツール
5.7.6.JAXBを利用してXMLを読み書きする(JAXBのライブラリを使用する)
5.7.7.JAXBを利用してXMLを読み書きする(Springのライブラリを使用する)(:TODO)
5.8.RELAX NG(リラクシング)について
5.8.1.RELAX NGの基本
5.8.2.XML Schemaのデータ型
5.8.3.ポイント「使用すべきでないRELAX NGの記述」
5.8.4.ポイント「JAXBのJavaソースのクラス分割の制御」
6EL式(EXPRESSION LANGUAGE)
6.1.EL式の基本
6.1.1.EL式の暗黙オブジェクト
6.1.2.EL式の演算子
6.1.3.EL式の演算子の優先順位
6.2.EL FUNCTIONの作成(:TODO)
6.3.JSTL FUNCTIONS
6.3.1.JSTL Functionsの設定/使用例
6.3.2.JSTL Functionsの一覧
6.4.AMATERAS 「JAVA STANDARD EL FUNCTIONS(JSEL)」
6.4.1.JSELの設定
6.4.2.JSELの使用例
6.5.SPRING EXPRESSION LANGUAGE(SPEL)
6.5.1.SpELの言語仕様
6.5.2.SpELの使用例
7入力値検証
7.1.ERRORSクラスを使用した入力値検証
7.1.1.Errorsを使用した入力値検証のサンプル
7.1.2.エラー時に使用するクラス
7.2.VALIDATORを実装した入力値検証
7.2.1.Validatorの基本
7.2.2.ポイント:ValidatorをSpring Beanとして扱う
7.2.3.ポイント:抽象クラスによりキャスト処理を省略する
7.2.4.ポイント:フィールドを検証する際のユーティリティメソッド
7.2.5.ポイント:フィールド用Validatorを作成し検証する
7.2.6.ポイント:@Validを使用したValidatorの呼び出し
7.2.7.リストを項目とするCommandの入力値検証
7.2.8.マップを項目とするCommandの入力値検証
7.2.9.Validatorによる階層を持つCommandの入力値検証
7.2.10.エラーメッセージの定義
7.3.BEAN VALIDATIONを利用した入力値検証
7.3.1.Bean Validationの準備
7.3.2.Bean Validationを使用する
7.3.3.Bean Validationのアノテーションの一覧
7.3.4.こんなときは:エラーメッセージの定義場所を変更したい
7.3.5.こんなときは:Bean Validationがうまく動作しない場合
7.3.6.こんなときは:Commandごとにメッセージを変更したい
7.3.7.Bean Validationのアノテーションを独自実装する
7.4.OVAL(OBJECT VALIDATION FRAMEWORK)を利用した入力値検証
7.4.1.Ovalの準備
7.4.2.OVal Validatorを使用する
7.4.3.Ovalのアノテーション一覧
7.4.4.Bean Validationのアノテーションを使用する
7.4.5.EJB3 JPAのアノテーションを使用する
7.4.6.XMLによる設定を使用する
7.4.7.POJOConfigureを使用する
7.4.8.OValのエラーメッセージのカスタマイズ
7.4.9.SpringValidatorを拡張する
7.4.10.条件付きチェック
7.4.11.ネストしたComamndの検証を行う「@AssertValid」
7.4.12.Getterメソッドにアノテーションを付与する「@IsInvariant」
7.4.13.独自の検証用メソッドを呼ぶ
7.4.14.OValの独自アノテーションを実装する
7.4.15.条件付きチェックに「SpEL」を使用する
8セッション管理
8.1.セッションスコープ
8.2.SERVLET APIを使用したセッション管理
8.2.1.JSPを使用したセッション管理(:TODO)
8.3.SPRING MVCのセッション管理
8.3.1.セッション上のデータ呼び出し
8.3.2.WebRequestクラスを使用する場合
8.3.3.SpringBeanを使用したセッション管理
8.4.@SESSIONATTRIBUTESを使用したセッション管理
8.4.1.セッションが切れている場合の問題点(:TODO)
8.5.フラッシュスコープの実装
8.5.1.フラッシュスコープの実装にあたって
8.5.2.「FlashMap.java」の実装
8.5.3.「FlashMapFilter.java」の実装
8.5.4.「FlashMapStoringRedirectViewResolver.java」の実装
8.5.5.「web.xml」の編集
8.5.6.「servlet-context.xml」の編集
8.6.JSPでのセッションデータの取得・設定方法(:TODO)
8.6.1.Servlet(:TODO)
8.6.2.Spring MVC(:TODO)
9権限チェック(認証・認可機能)
9.1.「SPRING SECURITY」を利用した権限チェック(:TODO)
9.2.独自実装のアノテーションを利用した権限チェック(SPRING MVC 3.0)
9.2.1.独自アノテーションを利用した権限チェックの実装にあたって
9.2.2.「LoginUserBean.java」の実装
9.2.3.「Authorize.java」の実装
9.2.4.「AuthorizeHandlerMethodAspect.java」の実装
9.2.5.「SessionTimeoutException.java」の実装
9.2.6.「InvalidRoleException.java」の実装
9.2.7.「servlet-context.xml」の編集
9.2.8.アノテーションを使用した権限チェックのサンプル
9.3.独自実装のアノテーションを使用した権限チェック(SPRING MVC 3.1)
9.3.1.「AuthorizeHandlerInterceptor.java」の実装
9.3.2.「servlet-context.xml」の編集
9.4.独自実装のカスタムタグを利用した権限処理
9.4.1.カスタムタグを利用した権限処理の実装にあたって
9.4.2.「AuthorizeTag.java」の実装
9.4.3.「authorize.tld」の実装
9.4.4.カスタムタグを使用した権限チェックのサンプル
10国際化
10.1.JSPからプロパティファイルの値を呼び出す
10.2.CONTROLLER、SERVICE(F層)からプロパティファイルの値を呼び出す
10.3.テーマの設定
10.3.1.テーマの切り替えの基本設定
10.3.2.様々なThemeResolver
10.4.ロケール(地域・言語)の切り替え
10.4.1.ロケールの切り替えの基本設定
10.4.2.様々なLocaleResolver
11例外処理
11.1.CONTROLLERでの例外ハンドリング「@EXCEPTIONHANDLER」
11.1.1.例外処理用メソッドの引数と戻り値
11.1.2.AnnotationMethodHandlerExceptionResolverを明示的に定義する
11.2.システム全体での例外ハンドリング
11.2.1.SimpleMappingExceptionResolverを使用する
11.2.2.DefaultHandlerExceptionResolverを使用する
11.2.3.独自実装したHandlerExceptionResolverを使用する
11.3.WEB.XMLで例外時の遷移先を定義する
11.4.JSPで例外が起きた場合の遷移先の指定
12カスタムタグ
12.1.SPRING MVC用のカスタムタグ1(<SPRING:XXX>)
12.1.1.はじめに
12.1.2.カスタムタグ<spring:bind>
12.1.3.カスタムタグ<spring:escapeBody>
12.1.4.カスタムタグ<spring:hasBindErrors>
12.1.5.カスタムタグ<spring:htmlEscape>
12.1.6.カスタムタグ<spring:message>
12.1.7.カスタムタグ<spring:nestedPath>
12.1.8.カスタムタグ<spring:theme>
12.1.9.カスタムタグ<spring:transform>
12.1.10.カスタムタグ<spring:url>
12.1.11.カスタムタグ<spring:eval>
12.2.SPRING MVC用のカスタムタグ2(<FORM:XXX>)
12.2.1.はじめに
12.2.2.カスタムタグ<form:form>
12.2.3.カスタムタグ<form:errors>
12.2.4.カスタムタグ<form:label>
12.2.5.カスタムタグ<form:input>
12.2.6.カスタムタグ<form:hidden>
12.2.7.カスタムタグ<form:textarea>
12.2.8.カスタムタグ<form:password>
12.2.9.カスタムタグ<form:checkbox>
12.2.10.カスタムタグ<form:checkboxes>
12.2.11.カスタムタグ<form:radiobutton>
12.2.12.カスタムタグ<form:radiobuttons>
12.2.13.カスタムタグ<form:select>、<form:option>
12.2.14.カスタムタグ<form:options>
12.3.標準タグライブラリJSTL
13ページをタイル化する
13.1.APACHE TILES(:TODO)
13.2.SITEMESH
13.2.1.SiteMeshの準備
13.2.2.「web.xml」の編集
13.2.3.「sitemesh.xml」の作成
13.2.4.「decorators.xml」の作成
13.2.5.レイアウト用JSPの作成
13.2.6.SiteMesh用のカスタムタグライブラリ
14ユーティリティ
14.1.ログ出力
14.1.1.Log4jの設定
14.1.2.ログの出力
14.2.アプリケーションの初期化プログラムの実行
14.3.ライブラリ「COMMONS CONFIGURATION」を使用する
14.3.1.「CommonsConfigurationFactoryBean」を使用する
14.3.2.Spring Beanとして「Configutation」を定義、組み立てる
14.4.JSPのページディレクティブのWEB.XMLでの一括指定
15二重送信のチェック
15.1.JAVASCRIPTによる確認ダイアログの表示
15.2.トークンによるチェック
15.2.1.TokenProcessorの実装
15.2.2.トークンによるチェック
16CONTROLLERでDBトランザクションを制御する(:TODO)

参考

現場で使えるJavaライブラリ

現場で使えるJavaライブラリ

経緯など

もともと、Spring 3.0がリリースされてしばらく経った2011年頃に、業務での利用を検討をしたのがきっかけでした。当時、Spring MVCというより Spering 3自体の日本語情報がWebも含め書籍もあまりなく、また、チームのメンバが「フレームワークって何?」という状況でした。


それまでは、Service、DAO機能としてSpringを使っていましたが、Spring MVCを使うのが自分も初めてだったので、勉強と他のチームへの指導も含めてこのドキュメントを作り始めました。


そのシステムの仕事は3か月で終わったのですが、ドキュメントも基本機能しかまとめられていませんでした。

その後、趣味で作っていた自宅のシステムでもSpring MVCを使おうかと思い、少しずつ情報をまとめていました。


その1年後の2012年頃は、ようやくSpring 3および、Spring MVCの情報が日本語のWebでも見られるようになってきました。しかし、まだ基本的な機能の説明が多く、実際に業務で使うとなると情報が足りないと感じていました。


海外では、Spring MVCの認知度も高く使用例もそれなりにあるのに、日本では何故人気がないのかと考えた際に、単純に日本語情報が少ないというのが1つの理由としてあるのではと思いました。

そのため、Spring MVCの日本での普及も含めて情報を公開しようという思いました。単純に普及だけではなく、広く使われることで情報も増えてきて、自分が知らない情報を集めやすくなるという思惑もあります。

さらに、自分でやっとJavaの中級者レベルの地点に到達したと感じるようになったため、さらに上を目指すためにも、情報発信することで自分の知識・技術を評価などしたいと思います。


誤字・脱字は多く、読み辛いかもしれませんが、みなさんのお役にたてれればと思います。