JSP/Servlet | クライアントとサーバー間の値の受け渡し | クエリ文字列で値を受け取る
単に何かを表示するだけであれば、前回説明したJSPの基本タグだけで何とかできるようになった。今回はさらに進んで、「クライアントからサーバーへ何かを送り、それを受け取って再びクライアントへ返す」という対話的な処理を行ってみよう。
このような処理のポイントは、「クライアントからサーバーへ必要な情報をどのように送るか」という点である。これがわかれば、サーバーで必要な処理を行い、それに応じた表示を返すことができる。
方法はいくつかある。まず最も簡単なものとして、「クエリ文字列を使う」方法から試してみよう。クエリ文字列とは、URLアドレスの後ろに付くパラメーターの記述部分である。
Webサイトでhttp://xxx/?abc=xyzのように、URLアドレスの後ろに何かが付いているものを見たことがあるだろう。それがクエリ文字列である。これは次のような形になっている。
http://ドメイン/ファイル指定?名前1=値1&名前2=値2& ...
URLアドレスの後ろに疑問符(?)を付け、その後に「名前=値」の形で値に名前を付けて記述する。複数の値を渡す場合はアンパサンド(&)記号でつなぐ。値が英数字のテキストであればそのままでもよいが、記号や2バイト文字などが入ると問題を起こすため、通常はURLエンコードを使ってエンコードする必要がある。
では、このように送られてきた値をJSPではどのように受け取るのか。ここでは「request」という組み込みオブジェクトを利用する。これは特に宣言しなくても最初から使用できる特別なオブジェクトである。
requestには、サーバーへ送られたリクエスト、つまりクライアントからの要求に関するさまざまな情報が入っている。このオブジェクトにはgetParameterというメソッドが用意されている。これを使ってクエリ文字列の値を取り出せる。
String 変数 = request.getParameter(値の名前);
このように呼び出せばよい。それでは、実際に簡単なサンプルを作り、サーバーとクライアントの間で文字列をやり取りしてみよう。
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<%
String str = request.getParameter("param");
%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Sample jsp</title>
<style>
h1 {font-size:16pt; background:#AAFFAA; padding:5px; }
</style>
<script type="text/javascript">
function doAction(){
var s = document.getElementById('input').value;
var url = 'hello4.jsp?param=' + encodeURI(s);
window.location.href = url;
}
</script>
</head>
<body>
<h1>Sample jsp page</h1>
<p>このページはサンプルです。</p>
<p>パラメーター: <%=str%></p>
<input type="text" id="input">
<button onclick="doAction();">Click</button>
</body>
</html>
上のサンプルは、入力フィールドにテキストを書いてボタンを押すとメッセージが表示される。ここではJavaScriptを使い、クエリ文字列を付けたページのアドレスを作ってそこへ移動している。
var s = document.getElementById('input').value;
var url = 'helo.jsp?param=' + encodeURI(s);
window.location.href = url;
たとえばフィールドに「abc」と入力すると、helo.jsp?param=abcというURLアドレスがサーバーへ送信される。サーバーサイドではJSPコードでパラメーター値を受け取っている。
String str = request.getParameter("param");
これで変数strに「abc」というテキストが割り当てられる。その後は<p>パラメーター: <%=str %></p>のようにして受け取った値を出力している。
今回は単に表示しているだけだが、もちろん受け取った値をもとにさまざまな処理を行い、その結果を出力することもできる。