アトリビュートを管理する
アトリビュートによる値の利用については、ここであげたsetAttribute/getAttribute以外にもいくつかのメソッドが用意されています。次のようなものです。
Enumeration 変数 = [request.session].getAttributeNames();
[request.session].removeAttribute(String name);
getAttributeNamesを使うと、すべてのアトリビュート名がEnumerationとして得られます。これを利用することで、全アトリビュートをまとめて操作することが可能になります。また、removeAttributeは引数に指定した名前のアトリビュートを削除します。この2つのメソッドを組み合わせることで、アトリビュートを管理できるようになります。
では、これらを利用した簡単な例を挙げておきましょう。入力フィールドにアトリビュートの名前と値を入力して送信すると、その値をセッションに保管するサンプルです。
<%@ page language="java" contentType="text/html; charset=Shift_JIS" pageEncoding="windows-31j"%> <%@ page import="java.util.*" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> <title>JSP SAMPLE</title> </head> <body> <% request.setCharacterEncoding("Shift_JIS"); String dstr = request.getParameter("del"); if (dstr != null){ try{ session.removeAttribute(dstr); } catch(IllegalStateException ex){ ex.printStackTrace(); } } String str = request.getParameter("text1"); if (str != null) session.setAttribute(str,request.getParameter("text2")); Enumeration list = session.getAttributeNames(); while(list.hasMoreElements()){ String nm = (String)list.nextElement(); String res = (String)session.getAttribute(nm); out.println("<a href=\"./index.jsp?del=" + nm + "\">"); out.println(nm + ":" + res); out.println("</a><br>"); } %> ※送信元ページ<br><br> <form method="post" action="./index.jsp"> 名前:<input name="text1" type="text"> <br> 値:<input name="text2" type="text"> <input name="submit" type="submit" value="送信"> </form> </body> </html>

ページには、現在セッションに保管されているアトリビュート名とその値が一覧表示されます。表示されている項目はリンクになっており、クリックするとそのアトリビュートをセッションから削除します。
クエリー文字列によるデータの送信
ここでは、「セッションのアトリビュートを一覧表示する」という処理を行っていますが、その部分ではgetAttributeNamesでEnumerationを取得した後、whileで要素を1つずつ取り出して出力をしています。
Enumeration list = session.getAttributeNames(); while(list.hasMoreElements()){ String nm = (String)list.nextElement(); String res = (String)session.getAttribute(nm); out.println("<a href=\"./index.jsp?del=" + nm + "\">"); out.println(nm + ":" + res); out.println("</a><br>"); }
出力する際、aタグを使ってリンクを作成しています。このaタグでは、<a href=\"./index.jsp?del=" + nm + "\">というような形でタグを出力しているのが分かります。「index.jsp?del=名前」といった形になっているわけです。
Webサイトでは、このようにURLの後に?をつけ、さらにテキストがつけられた形をよく見かけます。これは「クエリー文字列」と呼ばれるもので、このようにURLの後に値を続けて記述することでその値を送信することができます。
クエリー文字列の値は、アドレスの後に?をつけ、「名前=値」といった形で記述されたテキストを記述した形になります。複数の値を送る場合は、それぞれをセミコロン(;)で区切ります。ここでの「index.jsp?del=名前」というのは、delという名前の値を送信するものだったわけです。
このクエリー文字列によって送られた値は、request.getParameterでそのまま取り出すことができます。つまり、フォームによって送信される場合とまったく同じなのです。――実際に、フォームのmethodを"GET"に変更して送信をしてみましょう。入力フィールドに書かれたテキストが、クエリー文字列としてアドレスの後につけられ送られていることに気付くはずです。
クエリー文字列による送信は、単純にアドレスの後にテキストを付け足すだけですみますから、さまざまな応用が考えられます。ただし! 1つだけ注意しておきたい点があります。それは、直接テキストを付け足した場合、そのままでは「日本語が化ける」ということです。これについては、また別の機会に。
まとめ
以上で、さまざまなデータをページ間でやり取りするために必要な基礎知識はほぼ身についたことと思います。フォームの主なコントロールを使ったデータ送信、送られたデータの処理、リダイレクト、リクエスト/セッションによる値の受け渡し、作成したアトリビュートの管理。少々詰め込んでしまったので、中にはよくわからないものもあるかも知れません。
今回の最大のポイントは、「リクエストとセッションを利用した値の受け渡し」です。これは、複数のページ間でやり取りをする最も基本となるものです。Webのシステムというのは、多数のページの組み合わせで構成されているのが普通ですから、「ページ間のやりとり」は確実にマスターしておくべき知識といってよいでしょう。
もう一つ、重要なのは「セッション」というものです。これにより、サーバとクライアントの間で連続した接続が可能となります。が、今回の説明だけではセッションというのがどういうものなのか、なんの役に立つのか、今一つ理解できなかったかも知れません。セッションは非常に重要な概念ですので、改めて説明をする予定です。
