ブラウザからの入力データの取得

  入力データの列挙



Web アプリケーションを作ろうとするなら、フォームの入力データが必要になります。この場合想像通りデータは request オブジェクトに格納されています

request オブジェクトは、HttpServletRequest クラスなのでメソッドを調べてみるとそれらしいものがありません。ここがまた Java らしいところですが、以下の記述を知る事になります

  
public interface HttpServletRequest
extends ServletRequest
  

つまり、元は ServletRequest クラスであるという事が解ります。で、そちらを見ると getParameter という JSP ではお馴染みのメソッドに出会う事ができます。しかし、このままでは一つ一つ指定しなくてはならずデバッグには不向きです。他のスクリプト言語でもそうするように列挙する方法を・・・・と考えると、getParameterNames にたどり着きます。

しかし、戻り値が Enumeration クラスである為そちらを参照すると以下のサンプルコードと出会います

  
     for (Enumeration e = v.elements() ; e.hasMoreElements() ;) {
         System.out.println(e.nextElement());
     }
  

プログラマであれば、これだけ情報が揃えば OK です

  
<%@ page
	language="java"
	import="java.util.*"
	contentType="text/html;charset=Shift_JIS"
%>
<HTML>
<BODY>

<FORM method="post">
<INPUT type="text" name="InputField1"><br>
<INPUT type="text" name="InputField2"><br>
<INPUT type="text" name="InputField3"><br>
<INPUT type="submit" value="送信"><br>
</FORM>

<%
String FieldName;
for (Enumeration e = request.getParameterNames(); e.hasMoreElements() ;) {
	FieldName = e.nextElement().toString();
	out.println( FieldName + "==>" + request.getParameter( FieldName ) + "<br>" );
}
%>

</BODY>
</HTML>

  

import="java.util.*" が追加されていますが、これは Java 2 Platform, Standard Edition で示されている Enumeration があるパッケージです。こう書けば、展開後は以下のようにしっかりインポートされます

  
package org.apache.jsp.simple;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;
import java.util.*;
  

フォームのメソッドは、"POST" ですが、アドレスパーから ?a=b を追加するとしっかり表示されます。つまり、メソッドの意識をせずに入力データを取得できます。メソッドの種類を知りたいのであれば、HttpServletRequest のほうに getMethod があります。HTTPという概念に依存するメソッドはこちらで実装されています



  日本語処理



先のフォームで日本語を入力すると見事に化けます。入力は Shift_JIS であるはずなので、違ったキャラクタに変更されてしまっています。では、どうすればよいか・・・・。

こんな時は Web で探せば必ずヒットします

  
<%
String FieldName;
for (Enumeration e = request.getParameterNames(); e.hasMoreElements() ;) {
	FieldName = e.nextElement().toString();
	out.println(
		FieldName + "==>" + 
		new String(
			request.getParameter( FieldName ).getBytes("ISO_8859_1" ),
			"Shift_JIS"
		) + "<br>"
	);
}
%>
  

しかし、このままでは一つ一つ参照する場合にいちいち変換しなくてはなりません。Enumeration は列挙するには向いていますが、一つ一つを処理する為のものではありません。何を使って良いか正直言ってわかりませんが、汎用的そうな Hashtable クラスを使用してみます

  
<%
Hashtable hashRequest = new Hashtable();
String FieldName;
for (Enumeration e = request.getParameterNames(); e.hasMoreElements() ;) {
	FieldName = e.nextElement().toString();
	hashRequest.put( FieldName, 
		new String(
			request.getParameter( FieldName ).getBytes("ISO_8859_1" ),
			"Shift_JIS" )
	);
	out.println( FieldName + "==>" + hashRequest.get( FieldName ) + "<br>" );
}
%>
  










  infoboard   管理者用   
このエントリーをはてなブックマークに追加





フリーフォントWEBサービス
SQLの窓WEBサービス

SQLの窓フリーソフト

素材

一般WEBツールリンク

SQLの窓

フリーソフト

JSライブラリ