SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

WTPではじめるサーバサイドJava入門

サーバサイドJava入門 フォームデータの取り扱いとページ遷移の基本

第3回 フォーム送信とデータのやり取り


アトリビュートを管理する

 アトリビュートによる値の利用については、ここであげたsetAttribute/getAttribute以外にもいくつかのメソッドが用意されています。次のようなものです。

すべてのアトリビュート名をEnumerationで得る
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のシステムというのは、多数のページの組み合わせで構成されているのが普通ですから、「ページ間のやりとり」は確実にマスターしておくべき知識といってよいでしょう。

 もう一つ、重要なのは「セッション」というものです。これにより、サーバとクライアントの間で連続した接続が可能となります。が、今回の説明だけではセッションというのがどういうものなのか、なんの役に立つのか、今一つ理解できなかったかも知れません。セッションは非常に重要な概念ですので、改めて説明をする予定です。

この記事は参考になりましたか?

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
WTPではじめるサーバサイドJava入門連載記事一覧

もっと読む

この記事の著者

掌田 津耶乃(ショウダ ツヤノ)

三文ライター&三流プログラマ。主にビギナーに向けたプログラミング関連の執筆を中心に活動している。※現在、入門ドキュメントサイト「libro」、カード型学習サイト「CARD.tuyano.com」を公開...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/1369 2008/08/19 19:12

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー