概要
Spring MVCにてクライアント側からGETまたはPOSTリクエストを行ってパラメータを取得する方法についてまとめた。
前提
Mavenプロジェクトの作成方法と基本的な画面疎通については以下を参照。
概要 Spring MVCフレームワークを使用して開発を進める際、Mavenプロジェクトの基本的なセットアップ方法についてまとめた。 前提 プロジェクトの具体的な作成方法については以下に記載。 [siteca[…]
概要 Springを学びなおすにあたり、Spring MVCでHello Worldしたのでその基本的な方法についてまとめた。 前回はBean定義ファイルをJavaのアノテーションベースで作成したが、今回はXMLベースで作成する。 […]
リクエスト方法
今回は以下のURLパターンでGETとPOSTリクエストを送信する。
リクエスト画面の表示
リクエストパターンを確認する起点となる画面を表示する。
以下のURLで画面を表示するコントローラーを作成する。
HogeController.java
package com.example.prototype.web.controller.hoge;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping(value = "hoge") // ①
public class HogeController {
/** ロガー */
private static final Logger logger = LoggerFactory.getLogger(HogeController.class); // ②
// リクエスト画面表示
@GetMapping(value = "/") // ③
public String menu() {
return "hoge/menu";
}
}
@RequestMappingアノテーションをコントローラーにつけてvalueを”hoge”とすることで、「http://コンテキストパス/hoge」から始まるURLとマッピングできる。
logback機能のロガーを使用するための定義。
リクエストされたパラメータをコンソールに表示して確認するために使用する。
「http://コンテキストパス/hoge/」というGETリクエストが送信された際に紐づくハンドラメソッド。
hogeフォルダのmenu.jspを表示する。
menu.jspは以下。
<li>タグにリクエストするリンクを用意していく。
menu.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<%@ include file="/WEB-INF/common/header_common.jsp"%>
<title>リクエストパターン</title>
</head>
<body>
<div class="container mt-5">
<h2 class="text-center">リクエストパターン</h2>
<ul>
<li></li>
</ul>
</div>
</body>
</html>
リクエストデータの取得
リクエストデータの取得方法について紹介する。
パス変数値の取得
URLの中のパス変数を取得するには@PathVariableアノテーションを使用する。
画面
以下のリクエストを画面から送信する。
「<c:url value=’/’ />」とすることで、コンテキストパスを省略できる。
上記の「1」の値を取得する。
コントローラー
以下のように記載してパス変数値を取得する。
HogeController.java
// GETリクエストその1
@GetMapping(value="foo/{id}") // ①
public String pattern1(@PathVariable int id) { // ②
logger.info("★★★id:" + id + "★★★\n");
return "hoge/menu";
}
「foo/{id}」はURLテンプレートと呼ばれる。
{id}の部分を取得するため、「{ }」を使用してプレースホルダーを用意している。
@PathVariableアノテーションを記載して、その後に取得したい型でプレースホルダーに定義した変数を記載する。
そうすることで、「{id}」はint型のidとして引数から取得できる。
もちろんString型などで取得することも可能。
複数のパス変数値の取得
パス変数値を複数取得することもできる。
画面
以下のリクエストを画面から送信する。
コントローラー
以下のように記載してパ複数のパス変数値を取得する。
HogeController.java
// GETリクエストその2
@GetMapping(value="foo/{companyId}/bar/{id}") // ①
public String pattern2(@PathVariable int companyId, @PathVariable int id) { // ②
logger.info("★★★companyId:" + companyId + "★★★");
logger.info("★★★id:" + id + "★★★\n");
return "hoge/menu";
}
上記のように複数プレースホルダーを定義することができる。
プレースホルダーに合わせて引数にパス変数を設定する。
クエリパラメータ値の取得
クエリパラメータの値を取得するには@RequestParamアノテーションを使用する。
画面
以下のリクエストを画面から送信する。
コントローラー
以下のように記載してクエリパラメータ値を取得する。
HogeController.java
// GETリクエストその3
@GetMapping(value="foo/param", params= {"id", "name"}) // ①
public String pattern3(@RequestParam int id, @RequestParam String name) { // ②
logger.info("★★★id:" + id + "★★★");
logger.info("★★★name:" + name + "★★★\n");
return "hoge/menu";
}
params属性にクエリパラメータを指定する。
上記は「?id=xxx&name=yyy」または「?name=yyy&id=xxx」どちらかのケースでハンドラメソッドにマッピングする。
@RequestParamアノテーションを記載して、その後に取得したい型でクエリパラメータの変数を記載する。
そうすることで、クエリパラメータを任意の型で取得可能。
リクエストボディの取得
POST送信されたリクエストボディのパラメータを取得するにはフォームバインドを行う。
フォーム
画面からパラメータを取得するためのフォームを定義する。
HogeForm.java
package com.example.prototype.web.form;
import java.io.Serializable;
import lombok.Data;
@Data // ①
public class HogeForm implements Serializable{
/** 名前 */
private String name;
}
@Dataアノテーションをつけることで、getter、setter、toString、equals、hashCodeメソッドを自動的に生成できる。
※Lombokモジュールを参照する必要あり
コントローラー
フォームを画面に渡す。
HogeController.java
// フォームの設定
@ModelAttribute("hogeForm") // ①
public HogeForm setUpForm() {
return new HogeForm();
}
Modelオブジェクトは画面とサーバー間でデータをやりとりする箱のようなもの。
画面のformにバインドさせるため、フォームオブジェクトを渡している。
@ModelAttributeアノテーションを付けたメソッドを用意することで、ハンドラメソッドが実行される前にリクエストスコープにフォームオブジェクト(今回は HogeForm)が自動的に格納される。
画面
以下のリクエストを画面から送信する。
menu.jsp
<form:form modelAttribute="hogeForm" action="/prototype/hoge/" class="mt-4">
<table class="table table-bordered">
<tr>
<th class="col-3">名前</th>
<td class="col-7">
<form:input path="name" cssClass="form-control" />
</td>
</tr>
</table>
<div class="form-group text-center">
<button type="submit" name="send" class="btn btn-primary">送信</button>
</div>
</form:form>
フォームオブジェクトを画面に表示するため、<form:form>タグを使用する。
modelAttribute属性にはフォームオブジェクトの属性名を指定する。
action属性には送信時のリクエストURLを指定する。
method属性を省略するとPOST通信となる。
pathにはバインドさせるフォームオブジェクトのフィールド名を指定する。
サブミットボタンのname属性を指定することで、クエリパラメータを追加できる。
コントローラー
POST送信されたリクエストボディは以下のように取得する。
HogeController.java
// POSTリクエストその1
@PostMapping(value="/", params="send") // ①
public String pattern4(@ModelAttribute("hogeForm") HogeForm form) { // ②
logger.info("★★★名前:" + form.getName() + "★★★");
return "hoge/menu";
}
「http://コンテキストパス/hoge/」かつ「パラメータに”send”が設定」されたPOSTリクエストに紐づくハンドラメソッド。
引数にて上記のように指定することで画面入力値がバインドされたフォームオブジェクトを取得できる。