Spring MVC @PathVariableを使ってURLに含まれる動的なパラメータを取得

1.やりたいこと

URLにユーザーIDとかを含めて、その値を受け取りたい。
たとえば、

http://localhost:8080/samples/user/hoge

としたときは、最後の「hoge」を取得。

http://localhost:8080/samples/user/fuga

としたときは、最後の「fuga」を取得するみたいに。

で、そういうパラメータを動的に取得するときは、@PathVariableアノテーションを使う。

下準備の方は、このブログの「Spring」カテゴリの他の記事を参考にしてほしい。

2.コントローラ

メソッドの直前に、@RequestMappingで、URLとの紐付けを行う。たとえば、以下のように。

@RequestMapping(value = "/hello/{userName}/{greeting}", method = RequestMethod.GET)

で、メソッドの引数のところに、

public String printWelcome(@PathVariable("userName") String userName,
@PathVariable("greeting") String greeting,
ModelMap model) {

のように、@RequestMappingと対応するパラメータを@PathVariableの引数に渡す。
これが@RequestMappingと合ってないと、HTTPの400番のエラーが出てしまう。

全体としては、こんな感じ。

package samples.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@Controller
public class SampleController {
@RequestMapping(value = "/hello/{userName}/{greeting}", method = RequestMethod.GET)
public String printWelcome(@PathVariable("userName") String userName,
@PathVariable("greeting") String greeting,
ModelMap model) {
model.addAttribute("userName", userName);
model.addAttribute("greeting", greeting);
return "greet";
}
@RequestMapping(value="user/{userId}", method = RequestMethod.GET)
public String printUserId(@PathVariable("userId") int userId, ModelMap model) {
System.out.println("User ID:" + userId);
model.addAttribute("userId", userId);
return "hello";
}
}

3.jsp

greet.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>
<head>
<title>sample</title>
</head>
<body>
<h4>${greeting}, ${userName}</h4>
</body>
</html>

hello.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>
<head>
<title>sample</title>
</head>
<body>
<h2>UserID→ ${userId}</h2>
</body>
</html>

4.デモ

http://localhost:8080/samples/user/fuga

f:id:sho322:20140301080442j:plain

f:id:sho322:20140301080449j:plain

http://localhost:8080/samples/hello/takuya/good%20morning

f:id:sho322:20140301080547j:plain

SpringによるWebアプリケーションスーパーサンプル 第2版

SpringによるWebアプリケーションスーパーサンプル 第2版