08.Controllerの処理メソッドの引数と返り値
概要
Spring MVCの処理メソッドでは、リクエストのパラメタだけでなく、ヘッダ、モデルなど様々な値を引数として受け取れます。
HttpServletRequestなどのWEB用のクラスも受け取れます。
また、returnとして返せる型も様々あり、柔軟な設計が可能です。
ここでは、それらの記述の仕方を見ていきます。
様々な値の受け取り方
実は、メソッドの引数にアノテーションを記述するだけです。
ですので結局、どのようなアノテーションがあるか分かれば受け取り方が分かることになります。
【アノテーションの例】
public String input(Form form, @RequestHeader(required=false, value="User-Agent") String agent) {
return "user-Edit-Input";
}
アノテーションの一覧
以下が使用できるアノテーションです。
・@PathVariable(“var”) ・・・リクエストパラメタ
・@RequestHeader(“name”) ・・・リクエストのヘッダ
・@CookieValue(“name”) ・・・クッキーの値
・@RequestBody ・・・リクエストのボディの内容
メソッドの引数に使用できるクラス
Spring MVCではWEB用のクラスを引数として受け取れます。
単純に、引数に必要なクラスを指定するだけです。
ただ、引数にできるクラスは決まっているので、それだけ紹介したいと思います。
【引数で受け取る例】
public String input(Form form, HttpSession session, HttpServletRequest request) {
return "user-Edit-Input";
}
使用できる引数の型(クラス)
以下のクラスを処理メソッドの引数に使用できます。
・HttpServletRequest (or its more portable WebRequest wrapper)
・Principal
・Locale
・InputStream
・Reader
・HttpServletResponse
・OutputStream
・Writer
・HttpSession
モデルとバインドのエラー
上記の引数の他に、Userのような自作のモデルクラスも受け取れます。
このとき、@ModelAttributeアノテーションを使用します。
そして、バインドのエラー(型変換エラーや妥当性チェックエラー)も受け取ることは可能で、
必ずモデルの次の引数にするルールになっています。
【記述例】
public String input(@ModelAttribute("form") Form form, BindingResult result) {
このあたりは以下の記事も必ずお読みください。
【動作】
Formオブジェクトには、"id"、"name"などのパラメタが自動的にバインドされます。
【ModelAttributeの記述の省略について】
実は上記の記述例では、アノテーションを記述しなくても同じ動作になります。
省略された場合、Spring MVCは、クラス名の先頭を小文字にした名前をモデル名とみなして引数に渡そうとします。
この省略は便利ですが、同じクラスを別々のモデルとして扱いたいときには注意が必要です。
【その他の注意点】
BindingResultが引数に存在しないと、妥当性チェックエラー、型変換エラーなどのバインドエラーがある場合にメソッド自体が呼ばれないことに
ご注意ください。
また、以下の記事の「Controllerの処理メソッドの引数のルール」の項も読んでいただければと思います。
参考: 02.基本概念:Spring MVCにおける設計のルール
処理メソッドの返り値
Controllerの処理メソッドでは以下のクラスをreturnとして返却できます。
【返却可能なクラス】
・String
View名を返します。
このView名を元にViewResolverが実際のView処理を解決します。
例えばJSPファイルに変換するViewResolverの場合、"input"というView名を返せば
"/WEB-INF/jsp/input.jsp"に変換してJSPファイルを取得し、クライアントに返します。
プレフィックス:
"forward:","redirect:"というプレフィックスを使うと、リダイレクト処理などができます。
(例:"redirect:user.html?id=001")
・ModelAndView
ModelとView名を持つクラスです。
Spring MVCの以前のバージョンから存在する有名なクラスです。
・void
引数にHttpServletResponseなどを指定して、メソッド内で直接クライアントに処理を返した場合、返り値は不要です。
引数については先ほど上で見ていますので、分かるかなと思います。
【記述例】
@RequestMapping(value = "/something", method = RequestMethod.PUT)
public void handle(@RequestBody String body, Writer writer) throws IOException {
writer.write(body);
}
・@ResponseBody
returnの型は自由で、HttpMessageConvertersで処理できるものを指定します。
HttpMessageConvertersは、AnnotationMethodHandlerAdapterクラスのプロパティで設定できます。デフォルトで設定されているものもあります。
・HttpEntity<?> や ResponseEntity<?>
両方ともSpring3から導入されたクラスで、ヘッダとボディをもつクラスです。
このクラスだけでレスポンスの情報を全て持っているので、ヘッダとデータ部の両方を細かく制御したい場合は便利だと思います。
Javadocなどを見ていただければすぐ使い方が分かるかと思います。
以下も参照ください。
参考: 6.Spring3.0から追加された新しい部品の紹介
Created Date: 2012/04/08