URLで呼ばれたメソッドの戻り値と画面への反映

URLとMappingされたメソッドのことなんて呼ぼう…と考えてたところ公式のドキュメントに”@RequestMapping handler methods”ってあったからこれを使用させて頂こうかなと思いつつこんばんは。

今回はハンドラメソッドの戻り値に何を指定するの?とあわよくば画面への反映まで書きたいなと考えています。1)だいたいの計画しかせず書いてます。

今までのサンプルは”HelloWorld”の文字列を返すことで”/WEB-INF/jsp/HelloWorld.jsp”が呼び出されるというシンプルなものでした。ハンドラメソッドはString以外に何を返すとどうなるの?それを書きます。横着ですみませんと思いつつ公式ドキュメントへのリンクを貼ります(笑)。1.4.3 Handler MethodsのReturn Valuesに返す型とその挙動が書かれています。

サンプルで”HelloWorld”を返したときに/WEB-INF/jsp/HelloWorld.jsp”で画面を描画するのはStringの説明で書かれている以下の部分ですね。その他にも色々できそうですがここでは省略します。

A view name to be resolved with ViewResolver’s

String以外にも色々な型を返せますがHttpHeadersクラスならBodyは返さないんですね。今知りました。

今まで使ってたサンプルでStringを返していたところを(よく使われている?)ModelAndViewを返してみます。ついでに受け取ったパラメータを画面に反映させます。内容はパラメータyourNameで指定した名前でHello ○○!するという、よく見るやつです。

少し変えたHello.javaとHelloWorld.jspが以下になります。

@Controller
public class HelloWorld {

	@RequestMapping("/hello")
	public ModelAndView hello(@RequestParam(name="yourName", defaultValue="World") String name) {
		ModelAndView view = new ModelAndView("HelloWorld");
		view.addObject("name", name);
		return view;
	}
}
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Hello World</title>
</head>
<body>
<H1>Hello ${name}!</H1>
</body>
</html>

RequestParamのyourNameで指定した値を@RequestParamのString nameで受け取るようにしています。パラメータが指定されなかったときのためにDefault値を指定。この場合はHello World!ですね。

ModelAndViewで最終的に表示するjspをnew ModelAndView(“HelloWorld”)で指定しています。ココらへんの使い方についてはJavaDoc見るのが早いですかね。
addObjectメソッドでView(ここではHelloWorld.jsp)で使用するObjectを追加します。わかりやすく言えばrequestのAttributeにname/valueで追加と≒です。2)処理の中まで見てないですが、おそらくこのタイミングではrequest.setAttribute(…)はしてないかと。

JSP側では先程追加したnameを${name}で画面上に出力します。”/SampleWebApp/hello?yourName=hikaru”でアクセスすると画面には以下が表示されます。

Hello hikaru!

戻り値の型やハンドラメソッド内での処理結果3)ここでは単にAttributeに設定しているだけです。を画面から参照する内容は以上です。

ここからは余談。今回のサンプルはも少しだけ簡単にかけます。

@Controller
public class HelloWorld {

	@RequestMapping("/hello")
	public String hello(Model model, @RequestParam(name="yourName", defaultValue="World") String name) {
		model.addAttribute("name", name);
		return "HelloWorld";
	}
}

一行ぐらいですけどね(笑)。

公式ドキュメントに書かれているのをそのまま拝借します。

For access to the model that is used in HTML controllers and exposed to templates as part of view rendering.

MapクラスやModelMapクラスも同様に働いてくれるみたいですね。では。

References

References
1 だいたいの計画しかせず書いてます。
2 処理の中まで見てないですが、おそらくこのタイミングではrequest.setAttribute(…)はしてないかと。
3 ここでは単にAttributeに設定しているだけです。