ひよっこ。

I want to…

Posts Tagged ‘mvc’

Spring3の@MVCの@InitBinderの挙動に関して

Posted by hikaruworld : 2011 2月 9

Springの@Controllerにはクライアントから渡された値を任意の型に変換する、
@InitBinderというアノテーションがあります。
Spring1.Xから知っている人にはおなじみのInitBinderそのものです。

簡単にいうと、クライアント側で

2/12

という値を設定してデータが送られた場合、Date型に変換したり、
サーバからクライアントに値を送る際にDate型をDateFormatで
任意の表示形式に変換したりできます。

今回やりたかったのは、このInitBinderの値を特定のフィールド、ないしはパラメータにのみ適用する方法です。
@InitBinderには引数に値を設定出来、おそらくこの値を設定すれば良いのは分かるのですが、
この英語の説明がパッと分からなかったので、ソースを読んでいました。

実際に実行処理が行われているのは、HandlerMethodInvoker.initBinderの部分で以下のようになっています。

String[] targetNames = AnnotationUtils.findAnnotation(initBinderMethod, InitBinder.class).value();
if (targetNames.length == 0 || Arrays.asList(targetNames).contains(attrName)) {
	//ここで実処理
	...

気になるのはattrNameとtargetNamesの部分。
targetNamesはInitBinderのアノテーションで指定可能なvalue値の部分で、
何も設定していない場合は、そのまま全部のデータに対して処理が行われるようです(targetNames.length == 0)。

じゃあattrNameに何が渡されるかというのが今回の興味。

POJOを@RequestMappingの情報に渡した場合は、そのオブジェクトの値が渡されます。
つまり、以下のような設定をしていた場合、

@RequestMapping(value = "/", method = RequestMethod.GET)
public String hogehoge(Piyo piyo) {
  //...
}

attrNameにはpiyoが渡されます。
この変換ロジックはSpringのドキュメントのどこかに書いてあった気がしますが、
忘れたので割愛。

次に、@PathVariableを設定した場合はその変数名が渡されます。
こういうケースですね。この例ではabcが渡されます。

@RequestMapping(value="/{abc}", method=RequestMethod.GET)
public String home(@PathVariable("abc") int def) {
  //...
}

次に@RequestParamを利用したケースです。

@RequestMapping(value="/ab", method=RequestMethod.GET)
public String home2(@RequestParam int id) {
  logger.info("Welcome home!");
  return "home";
}

はい、言わずともがな、attrNameにはidが渡されます。

眠くなってきたのでこの辺で。

ちなみに、同名の名前があった場合はどちらにもInitBinderが適用されるようです。
これは規約ベースの書き方で素敵ですね。

広告

Posted in program | タグ: , , | Leave a Comment »

Spring3のControllerでリダイレクトする方法

Posted by hikaruworld : 2010 12月 22

return "redirect:/detail/1"

でOK。便利デス。

ちょっと補足。

つまり、登録画面などで、

  • 登録画面へ初期遷移
  • 登録してsubmit
  • 詳細画面へ

というような遷移をしたい場合。
@Controllerベースで戻り値をString(対象のJSP)を指定している場合、
リダイレクトしたい場合はModelAndViewを返す実装に直さないといけないのかなと思ったら、
redirect:っていうprefixが使えるらしい。

以下サンプル

@RequestMapping("/edit")
public String insertUser() {
	// 登録処理
	// ...
	
	// いつもだと最後に遷移対象のJSPを指定
	//return "hoge"
	// リダイレクトしたい場合
	return "redirect:/detail/1"
}

いままでだとRedirectViewを利用していたんだけど、
これは便利ですね。

Posted in program | タグ: , , , | Leave a Comment »