アプリケーション層の実装¶Caution本バージョンの内容は既に古くなっています。最新のガイドラインはこちらからご参照ください。formを使った画面遷移型のアプリケーションにおけるアプリケーション層の実装について説明する。APIの開発で必要となる実装についての説明は以下のページを参照されたい。Ajaxアプリケーション層の実装は、以下の3つにわかれる。Controllerの実装Controllerは、リクエストの受付、業務処理の呼び出し、モデルの更新、Viewの決定といった処理を行い、リクエストを受けてからの一連の処理フローを制御する。アプリケーション層の実装において、もっとも重要な実装となる。formとアプリケーションの間での値の受け渡しを行う。Viewの実装View(JSP)は、モデル(フォームオブジェクトやドメインオブジェクトなど)からデータを取得し、画面(HTML)を生成する。Controllerの実装¶まず、Controllerの実装から説明する。Controllerは、以下5つの役割を担う。リクエストを受け取るためのメソッドを提供する。@RequestMappingアノテーションが付与されたメソッドを実装することで、リクエストを受け取ることができる。リクエストパラメータの入力チェックを行う。入力チェックが必要なリクエストを受け取るメソッドでは、@Validatedアノテーションをフォームオブジェクトの引数に指定することで、リクエストパラメータの入力チェックを行うことができる。Validationでチェックを行う。業務処理の呼び出しを行う。Controllerでは業務処理の実装は行わず、Serviceのメソッドに処理を委譲する。業務処理の処理結果をModelに反映する。Serviceのメソッドから返却されたドメインオブジェクトをModelに反映することで、Viewから処理結果を参照できるようにする。処理結果に対応するView名を返却する。Controllerでは処理結果に対する描画処理を実装せず、描画処理はJSP等のViewで実装する。Controllerでは描画処理が実装されているViewのView名の返却のみ行う。Frameworkより提供されているViewResolverによって行われ、処理結果に対応するView(JSPなど)が呼び出される仕組みになっている。ルーティング処理の実装に徹することを推奨する。Controllerの実装について、以下4つの点に着目して説明する。Controller)として作成する。Controller)もあるが、Spring3以降はDeprecatedになっているため、原則使用しない。リクエストとハンドラメソッドのマッピング方法¶リクエストを受け取るメソッドは、@RequestMappingアノテーションを付与する。本ガイドラインでは、@RequestMappingが付加されたメソッドのことを「ハンドラメソッド」と呼ぶ。valueマッピング対象にするリクエストパスを指定する(複数可)。methodマッピング対象にするHTTPメソッド(RequestMethod型)を指定する(複数可)。API向けのリクエストをマッピングする際に使用する。paramsマッピング対象にするリクエストパラメータを指定する(複数可)。form向けのリクエストをマッピングする際に使用する。form上に複数のボタンが存在する場合のマッピングを簡単に実現する事ができる。headersマッピング対象とするリクエストヘッダを指定する(複数可)。APIやAjax向けのリクエストをマッピングする際に使用する。consumesリクエストのContent-Typeヘッダを使ってマッピングすることが出来る。マッピング対象とするメディアタイプを指定する(複数可)。APIやAjax向けのリクエストをマッピングする際に使用する。producesリクエストのAcceptヘッダを使ってマッピングすることが出来る。マッピング対象とするメディアタイプを指定する(複数可)。APIやAjax向けのリクエストをマッピングする際に使用する。Noteマッピングの組み合わせについて複数の属性を組み合わせることで複雑なマッピングを行うことも可能だが、保守性を考慮し、可能な限りシンプルな定義になるようにマッピングの設計を行うこと。2つの属性の組み合わせ(value属性と別の属性1つ)を目安にすることを推奨する。以下、マッピングの具体例を6つ示す。リクエストパスでマッピングHTTPメソッドでマッピングリクエストパラメータでマッピングリクエストヘッダでマッピングContent-TypeヘッダでマッピングAcceptヘッダでマッピング以降の説明では、以下のControllerクラスにハンドラメソッドを定義する前提となっている。scanの対象となる。(2)クラスレベルで@RequestMapping("sample")アノテーションを付けることでこのクラス内のハンドラメソッドがsample配下のURLにマッピングされる。いうURLにアクセスすると、helloメソッドが実行される。{複数指定した場合は、OR条件で扱われる。いうURLにアクセスすると、helloメソッドが実行される。{指定するリクエストパスは、具体的な値ではなくパターンを指定することも可能である。Documentを参照。いうURLにPOSTメソッドでアクセスすると、helloメソッドが実行される。指定しない場合、サポートしている全てのHTTPメソッドがマッピング対象となる。{複数指定した場合は、OR条件で扱われる。いうURLにGET又はHEADメソッドでアクセスすると、helloメソッドが実行される。いうURLにアクセスすると、helloメソッドが実行される。POSTでリクエストする場合は、リクエストパラメータはURLになくてもリクエストBODYに存在していればよい。{複数指定した場合は、AND条件で扱われる。いうURLにアクセスすると、helloメソッドが実行される。{サポートされている指定形式は以下の通り。指定したparameNameのリクエストパラメータが存在する場合にマッピングされる。指定したparameNameのリクエストパラメータが存在しない場合にマッピングされる。指定したparameNameの値がparamValueの場合にマッピングされる。指定したparameNameの値がparamValueでない場合にマッピングされる。APIやAjax向けのリクエストをマッピングする際に使用するため、詳細は以下のページを参照されたい。APIやAjax向けのリクエストをマッピングする際に使用するため、詳細は以下のページを参照されたい。APIやAjax向けのリクエストをマッピングする際に使用するため、詳細は以下のページを参照されたい。以下の方針でマッピングを行うことを推奨する。業務や機能といった意味のある単位で、リクエストのURLをグループ化する。"xxx")をクラスレベルのアノテーションとして定義することを意味する。処理内の画面フローで使用するリクエストのURLは、同じURLにする。"xxx")のvalue属性の値を同じ値にすることを意味する。処理内の画面フローで使用するハンドラメソッドの切り替えは、HTTPメソッドとHTTPパラメータによって行う。以下にベーシックな画面フローを行うサンプルアプリケーションを例にして、リクエストとハンドラメソッドの具体的なマッピング例を示す。サンプルアプリケーションの概要¶サンプルアプリケーションの機能概要は以下の通り。EntityのCRUD処理を行う機能を提供する。作成済みのEntityを全て取得し、一覧画面に表示する。指定した内容で新たにEntityを作成する。指定されたIDのEntityを取得し、詳細画面に表示する。指定されたIDのEntityを更新する。指定されたIDのEntityを削除する。機能全体の画面フローは以下の通り。画面フロー図には記載していないが、入力チェックエラーが発生した場合はフォーム画面を再描画するものとする。必要となるリクエストのURLの設計を行う。機能内で必要となるリクエストのリクエストURLをグループ化する。Patternsと呼ばれ、任意の値を指定する事ができる。サンプルアプリケーションでは、操作するEntityのIDを指定する。画面フロー図に各処理に割り振られたURLをマッピングすると以下のようになる。リクエストとハンドラメソッドのマッピング¶リクエストとハンドラメソッドのマッピングの設計を行う。以下は、マッピング方針に則って設計したマッピング定義となる。deleteCompleteEntity新規作成、Entity更新、Entity削除処理では、処理内に複数のリクエストが存在しているため、HTTPメソッドとHTTPパラメータによってハンドラメソッドを切り替えている。以下に、Entity新規作成処理を例に、処理内に複数のリクエストが存在する場合のリクエストフローを示す。HTTPメソッドとHTTPパラメータの組み合わせでハンドラメソッドを切り替えている点に注目すること。processing以下に、Entity新規作成処理のハンドラメソッドの実装コードを示す。ここではリクエストとハンドラメソッドのマッピングについて理解してもらうのが目的なので、@RequestMappingの書き方に注目すること。ハンドラメソッドの引数や返り値(View名及びView)の詳細については、次章以降で説明する。