JSP/Servlet | クライアントとサーバー間の値の受け渡し | Ajaxを使ってJSPに情報を渡す
フォーム送信は確かにHTMLの基本ではあるが、最近ではそれほど多く使われなくなっている。送信するたびにページを毎回サーバーから再ロードして読み直し、更新するため、それを嫌う人も多い。
フォーム送信の代わりに、サーバーとの通信でよく使われているのが「Ajax」である。AjaxはJavaScriptを利用してサーバーと非同期通信を行う機能である。非同期、つまり処理が終わるまで待たずに先へ進める方式なので、通信中に他の操作ができなくなることもなく、必要な情報をバックグラウンドで取得するため、ページを移動せずに画面表示を更新できる。
Ajax自体は、JSPがなくてもHTMLとJavaScriptだけで使用できる。つまり、普通のHTMLファイルで実現できる。Ajaxからアクセスする「サーバーサイドプログラム」にJSPを使えばよい。
これは実際にサンプルを見るほうが早い。以下の簡単な例を見てみよう。
index.html
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>Hello App Engine</title>
<style>
h1 {font-size:16pt; background:#AAFFAA; padding:5px; }
</style>
<script type="text/javascript">
function doAction(){
var req = createRequest();
if (req == null){
alert("実行できません!");
return;
}
var s = document.getElementById('input').value;
req.open("post", "hello.jsp?param=" + encodeURI(s));
req.setRequestHeader("User-Agent","XMLHttpRequest");
req.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
var msg = document.getElementById('msg');
msg.innerHTML = this.responseText;
}
}
req.send();
}
function createRequest(){
var httplist = [
function(){ return new XMLHttpRequest(); },
function(){ return new ActiveXObjct("Msxml2.XMLHTTP"); },
function(){ return new ActiveXObject("Microsoft.XMLHTTP"); }
];
for(var i = 0;i < httplist.length;i++){
try {
var http = httplist[i]();
if (http != null) return http;
} catch(e){
continue;
}
}
return null;
}
</script>
</head>
<body>
<h1>Hello App Engine!</h1>
<p id="msg">何か書いて送信してください。</p>
<table>
<tr>
<td>入力</td>
<td><input type="text" id="input" name="input"></td></tr>
<tr>
<td></td>
<td><button onclick="doAction();">Send</button></td>
</tr>
</table>
</body>
</html>
hello.jsp
<%@ page language="java" contentType="text/plain; charset=utf-8"
pageEncoding="utf-8"%>
<%
String method = request.getMethod();
if ("GET".equals(method)){
out.println("can't access!");
} else {
String inpt = request.getParameter("param");
out.println("あなたは「" + inpt + "」と書きました。");
}
%>
ここではindex.htmlとhello.jspを使用している。index.htmlにアクセスし、入力フォームに何かを書いてボタンを押すと、Ajax通信でhello.jspへアクセスして結果を表示する。
Ajax通信についてはJSPとは関係ないため、説明は省略する。興味のある人は「Ajaxによる非同期サーバー通信」について調べてほしい。ここではAjaxでアクセスするJSP側の処理を確認する。
今回はhello.jspにPOSTでアクセスし、結果を受け取れるようにしている。直接このページにアクセス、つまりGETでアクセスした場合は「can not access!」が表示されるようになっている。このようなGETとPOSTの使い分けはrequestメソッドで調べられる。
String method = request.getMethod();
if ("GET".equals(method)){...中略...}
requestオブジェクトのgetMethodはアクセスメソッドを返す。戻り値は「GET」または「POST」のどちらかである。JSPのgetParameterメソッドは、GETでもPOSTでも同じように呼び出し値を取得できる。利用上、JSPはGET/POSTを意識せず同じように扱えるように設計されている。しかし、ときには「GETの場合の処理、POSTの場合の処理」のように処理を分けなければならないことがある。そのような場合にgetMethodが使われる。
他の部分に特に難しいところはないだろう。out.printlnで出力したものが、そのままAjax通信でクライアントへ送信される。また今回はAjaxでテキスト値を受け取るだけである。冒頭にあるpageディレクティブは次のように書かれている。
<%@ page language="java" contentType="text/plain; charset=utf-8"
pageEncoding="utf-8"%>
よく見るとcontentType="text/plain; charset=utf-8"になっている。text/htmlではなくtext/plainに変更されている。このように「サーバーに要求して結果を受け取るだけ」の場合は、単にテキストを出力するだけなのでtext/plainにする必要がある。