サーブレットからJSPに送り返すには?
これで一応サーブレットでフォームを処理することはできるようになりました。が、これでは一方通行ですね。今度は、サーブレットからJSPに送り返す方法について説明をしましょう。
これには、実をいえばさまざまな方法があります。ここでは、もっとも汎用性のある方法として「セッション」というものを使った方法を紹介しましょう。
セッションとは、サーバーとクライアントの間の接続を保ち続けるために考え出されたものです。Webの世界では、クライアント(Webブラウザ)とサーバーの間の接続を保ち続ける機能はありません。サーバーからすれば、接続してくるクライアントは「どのクライアントが、前回これこれの送信をしてきたクライアントなのか」なんてことはわからないのです。
要するに、Webの世界ではサーバーとクライアントは常に「一期一会」、一度送信しても、次に送信するときには「初めての相手」としか思われないのです。けれど、場合によっては「私は他の誰でもない私なのよ。わかるでしょ?」ということをサーバーに求めたくなることもあります。例えば、オンラインショップなどでは、「今、接続しているこの相手は誰なのか」ということをきちんと識別できないといけません。
そこで考え出されたのが「セッション」です。セッションはクッキー情報などを利用し、「現在接続している人間は誰なのか」ということを識別できるようにするための概念です。サーバーとクライアントの間は、一度接続すると「セッション」というものが確立され、このセッションが保たれている間は「同一人物」であると判断されます。このセッションのおかげで、常に「私は私」ということが保証され続けるようになったのです。
まぁ、セッションの詳しい仕組みについてはここでは触れません。ここでは「セッション」を使うことで、サーバーとクライアントの間で常に情報を共有し続けることができる、ということだけ知っておいてください。
セッションを利用するには、以下のようにします。
●JSPでセッションをとりだす
「session」という名前の暗黙オブジェクトが用意されているのでこれを使います。
●サーブレットでセッションを取り出す
HttpServletRequestの「getSession」というメソッドで、HttpSessionクラスのインスタンスとして取り出します。
●セッション(HttpSessionまたはsession暗黙オブジェクト)で
値をやりとりする
変数 = (session).getAttribute( 名前 );
(session).setAttribute( 名前 , 値 );
sessionまたはHttpSessionのgetAttributeを使うと、指定した名前の値を取り出すことができます。またsetAttributeでは、指定した名前で値を登録することができます。これを利用すれば、サーブレットからJSPにデータを送ることが可能になります。
では、実際にやってみましょう。まずは、JSP側を修正してみましょう。
<%@page contentType="text/html"%>
<%@page pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JSP Page</title>
</head>
<body>
<h1>JSP Page</h1>
<%
String msg = (String)session.getAttribute("message");
if (msg == null || msg.equals("")) {
out.println("<br/>※お名前を入力ください。<br/>");
} else {
out.println("<br/><h3>" + msg + "</h3><br/>");
}
%>
<form action="NewServlet" method="POST">
<input name="msg" type="text">
<input type="submit">
</form>
</body>
</html>
session.getAttributeで、セッションから"message"という名前の値を取り出していますね。このgetAttributeで取り出された値はObjectインスタンスになっているので、ここではStringにキャストして利用しています。このようにして、サーブレットから送られた値を、JSPで受け取ることができるのですね。