感謝のプログラミング 10000時間

たどり着いた結果(さき)は、感謝でした。

リクエストパラメータの値を取得する

<スポンサーリンク>

■リクエストパラメータを受け取る
Spring MVCでリクエストパラメータを受け取るサンプルを作ってみます。
リクエストパラメータは、keyとvalueのペアで、&(アンパサンド)によって区切られます。

http://localhost:8080/springweb/sample?id=3

みたいなイメージです。

サーブレットでは、このようなリクエストパラメータは、

String id = httpServletRequest.getParameter("id");

のように取得します。

Spring MVCでは、もう少し簡単にパラメータを取得することができます。

	@RequestMapping(value = "/sample")
	public String consoleValue(@RequestParam int id) {
		String strId = Integer.toString(id);
		System.out.println("リクエストパラメータはこちら→" + strId);
		return "test";
	}

というコードをコントローラに書いて、

http://localhost:8080/springweb/sample?id=6

みたいにリクエストを投げると、コンソールには

リクエストパラメータはこちら→6

のように表示されます。

複数のリクエストパラメータを取得するには、

	@RequestMapping(value = "/sample")
	public String consoleValue(@RequestParam int[] id) {
		String strIdFirst = Integer.toString(id[0]);
		String strIdSecond = Integer.toString(id[1]);
		System.out.println("1番目のリクエストパラメータはこちら→" + strIdFirst);
		System.out.println("2番目のリクエストパラメータはこちら→" + strIdSecond);
		return "test";
	}

のように、配列にします。

以下のリクエストを投げると・・・

http://localhost:8080/springweb/sample?id=11&id=22

コンソールには以下のように表示されます。

1番目のリクエストパラメータはこちら→11
2番目のリクエストパラメータはこちら→22

次に、URLのリクエストパラメータではなく、URLに変数として値を入れる場合について考えます。

http://localhost:8080/springweb/sample/4

みたいなURLでリクエストを投げて、「4」という数字を取りたい場合ですね。

そういうときは、URLの該当部分を{}で囲って、@PathVariableを引数に持たせます。

@Controller
public class FriendController {

	private static final Log logger =
			LogFactory.getLog(FriendController.class);
	
	@RequestMapping(value = "/sample/{id}")
	public String consoleValue(@PathVariable int id) {
		System.out.println("リクエストパラメータはこちら→" + id);
		return "test";
	}
}

こうすると、コンソールには以下のように表示されて、URLの値を取得できました。

リクエストパラメータはこちら→4


■forwardとredirectの違い

forwardはredirectよりも処理が早くなります。
redirectは、クライアントに対して、再度サーバにリクエストを飛ばせと指示しますが、forwardは(サーバの)内部的に処理を転送するからです。

redirectはクライアントとサーバ間を2往復(ラウンドトリップ)するため、非効率になります。

redirectを使うのは、外部の別サイトにリダイレクトさせたいときです。
forwardでは、外部サイトにリダイレクトすることはできません。

その他に、ユーザがページをリロードすることで、2度同じリクエストが行われるのを避けるために、別ページにredirectするというやり方も考えられます。

何かの登録フォームに値を入力して送信。
ページの読み込みが遅くて2度F5を押してreload。
そうすると、2回同じリクエストが送られてしまいます。

そういうのを避けるために、redirectするわけです。

でも、redirectを使うと、ユーザが再度リクエストを投げる形になるため、Modelに追加した属性がなくなってしまいます。

■リクエスト情報を引き継げるのはフォワードのみ
リダイレクトでは、ページA、Bへの要求はまったく独立した「2つの」リクエストとして扱われるため、リクエストパラメータやリクエスト属性などの情報を両者で共有することはできません。しかし、フォワードでは、ページA、Bの処理は「1つの」リクエスト処理として扱われるため、リクエストパラメータやリクエスト属性はすべて引き継がれます。

http://www.atmarkit.co.jp/fjava/javatips/062jspservlet029.html

そんなリクエスト属性を引き継ぐために、Springはversion3.1からRedirectAttributesというクラスを用意することで、Redirectでも属性を引き継ぐことができるようにしています。

<参考文献>

Spring MVC/Rooプログラミング入門

Spring MVC/Rooプログラミング入門