連載
» 2003年05月23日 00時00分 公開

JSPの基本「暗黙オブジェクト」を使う基礎から学ぶサーブレット/JSP(5)(2/3 ページ)

[山田祥寛,@IT]

クライアントからの要求を受け取る−requestオブジェクト−

 requestオブジェクトはoutオブジェクトに次いで、頻繁に用いられるオブジェクトです。requestオブジェクトは、クライアント(ユーザー)側から送信されたフォームデータやクエリ情報(URLの末尾に「?キー名=値」の形式で付加された情報)、クッキー(クライアントに保存された小さなテキスト)、ヘッダ情報など、いわゆる「リクエスト(要求)情報」と呼ばれる「行きの情報」全般を取得するためのメソッドを提供します。

フォームデータの取得

 まずはrequestオブジェクトの中でも最も頻繁に使用されることの多いgetParameterValues、getParameterNamesメソッドを使用してみましょう。

 以下のサンプルでは、request_form.jspに対して送信された任意のリクエストデータを一覧表として出力します。

request_form.jsp
<%@ page contentType="text/html;charset=Shift_JIS" import="java.util.*" %>
 <html>
 <head>
 <title>フォームデータの取得(requestオブジェクト1)</title>
 </head>
 <body>
 <table border="1" width="250">
 <tr><th>キー名</th><th>値</th></tr>
 <%
 request.setCharacterEncoding("Shift_JIS");
 Enumeration objEnm=request.getParameterNames();
 while(objEnm.hasMoreElements()){
   String strKey=(String)(objEnm.nextElement());
 %>
    <tr>
      <td><%=strKey%></td>
      <td><%=request.getParameter(strKey)%></td>
    </tr>
 <%
 }
 %>
 </table>
 </body>
 </html>
送信されたクエリ情報の値を出力(クリックすると全体を表示します) 送信されたクエリ情報の値を出力(クリックすると全体を表示します)

送信されたクエリ情報の値を出力(クリックすると全体を表示します)(クリックすると全体を表示します)

 例えば、ブラウザのアドレス欄に「http://localhost:8080/atmarkit/chap5/request_form.jsp?key1=yyamada&key2=shimajiro」(実際に試す読者はリンクを利用してください)のように指定してみましょう。上記キャプチャのような結果を得られるはずです。

 setCharacterEncodingメソッドは、リクエスト情報の文字エンコーディングを設定します。リクエスト情報に日本語が含まれている場合、このsetCharacterEncodingメソッドが正しく設定されていないと、文字化けの原因ともなりますので注意してください。

 getParameterNamesメソッドは、現在のJSPページに対して送信されたすべてのフォーム情報(あるいはクエリ情報)のキー名をEnumerationオブジェクトとして取得します。Enumerationオブジェクトは、あるひとかたまりの情報を順番に取り出すためのメソッドを提供します。つまり、ここでは次のキー名がなくなるまで(Enumeration#hasMoreElementsメソッドがfalseを返すまで)、キー名を順番に取得することで(nextElementメソッド)、送信されたキーをすべて出力しているわけです。ただし、キーの取り出される順番は、「必ずしも記述順ではない」点に注意してください。

 ループ内で使用されているgetParameterメソッドは、指定されたキー名に対応するパラメータ値を取得します。上の例ではクエリ情報を取得していますが、request_form.jspに対して送信するHTMLフォームを別に用意すれば、そのHTMLフォームの内容を取得することも可能です。

 なお、時には1つのキーで複数の値を持つケースもあるでしょう。「〜?key=yyamada&key=shimajiro」のような場合です。HTMLフォームでもチェックボックスからの入力ではこのようなケースが考えられます。

 そのようなときには、実はこのgetParameterメソッドは使用することができません。getParameterメソッドは、必ずキーにひも付いた最初の値1つのみを返すからです。もしも1つのキーに複数の値がマッピングされる可能性がある場合には、getParameterValuesメソッドを使用してください。getParameterValuesメソッドは、指定されたキーにひも付いた値を文字列配列として返します。ですから、上記のサンプルをより汎用的な形で複数値に対応したいという場合には、getParameterメソッドの行を以下のように書き換えます。

<td>
   <% String[] strVal=request.getParameterValues(strKey);
      for(int i=0;i<strVal.length;i++){out.print(strVal[i] + ",");} %>
 </td>
</td>

ヘッダ情報の取得

 ヘッダ情報は、コンテンツ本体ではなく、クライアントの種類や対応言語、リンク元など、コンテンツに対する付加的な情報を表します。通常、ユーザーの目に触れる機会は少ない不可視の情報ではありますが、そこにはもろもろの制御を行うに当たって、極めて有用な情報が含まれていることが少なくありません。

 例えば、ブラウザの種類(user-agentヘッダ)に応じて、表示するページの内容を変更するということも可能でしょうし、リンク元(refererヘッダ)が外部のサイトであれば処理を受け付けないなどセキュリティ上のガードとして用いることもあります。対応言語(accept-languageヘッダ)によって言語を切り替えることで、マルチ言語対応のサイトを構築することもできるでしょう。

 ここでは、そうした応用的な用途にまで踏み込むことはできませんが、クライアントから送信されたヘッダ情報を一覧表として表示してみることにしましょう。取得の方法さえ分かってしまえば、その後の応用はあなたのアイデア次第で自由自在です。

request_header.jsp
<%@ page contentType="text/html;charset=Shift_JIS" import="java.util.*" %>
 <html>
 <head>
 <title>ヘッダ情報の取得(requestオブジェクト2)</title>
 </head>
 <table border="1">
 <%
 Enumeration objEnm=request.getHeaderNames();
 while(objEnm.hasMoreElements()){
   String strNam=(String)(objEnm.nextElement());
 %>
    <tr>
    <th nowrap><%=strNam%></th>
    <td nowrap><%=request.getHeader(strNam)%></td>
    </tr>
 <%
 }
 %>
 </table>
 </html>
送信されたクエリ情報の値を出力(クリックすると全体を表示します) 送信されたクエリ情報の値を出力(クリックすると全体を表示します)

 getHeaderNamesメソッドは、クライアントから送信されたすべてのヘッダ名を取得し、Enumerationオブジェクトとして返します。Enumerationオブジェクトからのデータの取り出し方は、request_form.jspでも説明しましたので、そちらを参照してください。

 getHeaderメソッドは指定されたヘッダ名に対応するヘッダ値を取得します。ヘッダ値を整数(int型)、あるいは日付(1970/01/01からの経過ミリ秒)として取得したい場合には、getIntHeader、getDateHeaderメソッドを使用することも可能です。

クッキーの取得

 クッキー(Cookie)は、サーバ側から唯一クライアントに対して書き込むことのできる「小さなテキスト」のことをいいます。指定された期間だけデータを永続化できるので、例えば、1度目のアクセスで入力された情報(例えば、E-Mailアドレスなど)を2回目のアクセスでデフォルト表示する、というようなことが可能になります。

 以下のサンプルでは、あらかじめクッキーに保存されたE-Mailアドレスをテキストボックスにデフォルト表示させてみることにします。

request_cookie.jsp
<%@ page contentType="text/html;charset=Shift_JIS" 
%>
<%
String strMal="";
Cookie objCok=null;
Cookie[] aryCok=request.getCookies();
if(aryCok!=null){
  for(int i=0;i<aryCok.length;i++){
  if(aryCok[i].getName().equals("email")){strMal=aryCok[i].getValue();}
  }
}
%>
<html>
<head>
<title>クッキーの取得(requestオブジェクト3)</title>
</head>
<body>
<form method="POST" action="response_cookie.jsp">
  E-Mailアドレス:
   <input type="text" name="email" 
size="50" value="<%=strMal%>" />
   <input type="submit" value="登録" 
/>
</form>
</html>
2度目以降のアクセスでは、1度目のアクセス時に入力されたE-Mailアドレスをテキストボックスにデフォルトでセットする 2度目以降のアクセスでは、1度目のアクセス時に入力されたE-Mailアドレスをテキストボックスにデフォルトでセットする

 getCookiesメソッドは、クライアントから送信されたクッキー情報を取得し、Cookieオブジェクトの配列として返します。ここでは、getCookiesメソッドの戻り値がnull(空)でなく、かつ、Cookie配列から取り出したCookieオブジェクトの中に“email”という名前のクッキーが含まれていた場合に、変数strMalにクッキー値をセットします(requestオブジェクトにはクッキー名をキーに直接クッキーにアクセスする、getParameterやgetHeaderのようなメソッドは存在しません)。

 あとは取得した変数strMalの値をテキストボックスのデフォルト値としてセットするだけです。クッキー値が取得できなかった場合には、空文字列をセットします。

requestオブジェクトのそのほかのメソッド

 これまでに登場したgetParameter、getHeader、getCookiesメソッドのほかにも、requestオブジェクトには多くのメソッドが存在します。以下に、その中でも比較的使用される機会の多いメソッドをまとめてみましょう。

表3 requestオブジェクトの主なメソッド
メソッド 概要
getAttribute() リクエスト属性を取得
getAuthType() 認証の種類を取得
getContentLength() データ本体のバイト長を取得
getContextPath() コンテキストパスを取得
getLocale() ロケールを取得
getMethod() HTTPメソッドの種類を取得
getPathInfo() 拡張パス情報を取得
getRemoteAddr() クライアントのIPアドレスを取得
getRemoteUser() ログインユーザー名を取得
getServletPath() サーブレットパスを取得
isRequestedSessionIdFromCookie() セッションIDをクッキー経由で授受しているか
isUserInRole(role) カレントユーザーが権限roleを持っているか
removeAttribute リクエスト属性を削除
setAttribute リクエスト属性を設定

requestオブジェクトは、フォームデータ、クエリ情報、ヘッダ情報、クッキーそのほか、クライアントから送信された「リクエスト情報」全般にアクセスするためのメソッドを提供します。


Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。