FORMタグが送信するデータから情報を取得するためのユーティリティクラスです。
■ クラスの概要
クラス名 | HtmlFormUtil |
パッケージ名 | com.fujitsu.form |
文法 | public class HtmlFormUtil |
継承関係 | java.lang.Object | +--- com.fujitsu.form.HtmlFormUtil |
■ フィールドの概要
型 | 名称 | 説明 |
---|---|---|
public static final int | CGIパラメタ形式を表すgetEnctypの戻り値です。 | |
public static final int | XMLデータ形式を表すgetEnctypの戻り値です。 |
■ コンストラクタの概要
コンストラクタ名 | 説明 |
---|---|
リクエストオブジェクトを指定して、HtmlFormUtilオブジェクトを生成します。 | |
public | リクエストオブジェクトを指定して、HtmlFormUtilオブジェクトを生成します。また、HTMLフォームデータストリーム解析時のデータサイズの上限値およびメモリ使用量の上限値を指定します。 |
■ メソッドの概要
戻り値型 | メソッド名 | 説明 |
---|---|---|
static int | エンコード形式を返します。 | |
java.lang.String | 指定したパラメタ名に対応するパラメタ値を返します。(注1) | |
java.util.Enumeration | getParameterNames() | 推奨されていません。 |
java.util.Enumeration | 電子フォーム名を返します。(注1) | |
java.io.InputStream | HTMLフォームデータストリームを返します。(注1) |
(注1)エンコード形式がCGIパラメタ形式の場合、値は返しません。
(注2)Formcoordinatorの予約語(FjXMLで始まるパラメタ名)については、一覧に含まれません。
■ フィールドの詳細
形式:
public static final int URLENCODED
説明:
CGIパラメタ形式を表すgetEnctypの戻り値です。
関連項目:
getEnctyp()
形式:
public static final int MULTIPART
説明:
XMLデータ形式を表すgetEnctypの戻り値です。
関連項目:
getEnctyp()
■ コンストラクタの詳細
HtmlFormUtil(javax.servlet.http.HttpServletRequest)
形式:
public HtmlFormUtil(javax.servlet.http.HttpServletRequest request) throws java.lang.IllegalArgumentException
説明:
リクエストオブジェクトを指定して、HtmlFormUtilオブジェクトを生成します。
ただし、リクエストオブジェクトから生成できるHtmlFormUtilオブジェクトは1つだけです。2回目以降は、「java.lang.IllegalArgumentException:入力ストリームオブジェクトにデータがありません。」という例外が通知されます。
パラメタ:
HttpServletRequestオブジェクト
例外:
次に示すどちらかの場合
パラメタ「request」がnullの場合
HTMLフォームデータストリームまたはコンテントタイプのどちらかがXMLデータ形式として正しくない場合
HtmlFormUtil(javax.servlet.http.HttpServletRequest,int,int)
形式:
public HtmlFormUtil(javax.servlet.http.HttpServletRequest request, int dataSizeLimit, int memUseLimit) throws java.lang.IllegalArgumentException
説明:
リクエストオブジェクトを指定して、HtmlFormUtilオブジェクトを生成します。
ただし、リクエストオブジェクトから生成できるHtmlFormUtilオブジェクトは1つだけです。2回目以降は、「java.lang.IllegalArgumentException:入力ストリームオブジェクトにデータがありません。」という例外が通知されます。
データサイズの上限値に指定したバイト数を超えるデータがフォーム送信データに含まれていた場合、「入力ストリームオブジェクトのデータ解析でエラーが発生しました。」という例外が通知されます。
メモリ使用量の上限値に指定したバイト数を超えるデータがフォーム送信データに含まれていた場合、TEMP領域に一時ファイルを作成しメモリを使用しないようにします。
データサイズの上限値、メモリ使用量の上限値に0を指定すると、上記の解析時の例外や一時ファイルの作成を抑止することができます。ただし、その場合はJava VMの起動オプションで最大ヒープサイズを増加させるなど、サーバ負荷を考慮してください。なお、データサイズの上限値は設定するが一時ファイルは作成しない場合、データサイズの上限値と同じサイズをメモリ使用量に指定してください。
getInputStream()メソッドで通知するフォームデータストリームについては、データサイズの上限に関係なく、メモリ使用量を超えるデータ量となる場合はTEMP領域に一時ファイルが作成されます。メモリ使用量に0を指定することでgetInputStream()メソッドで通知するフォームデータストリームについても一時ファイルの作成を抑止できます。
パラメタ:
HttpServletRequestオブジェクト
フォーム送信データ解析でのデータサイズの上限値(単位:バイト)
フォーム送信データ解析でのメモリ使用量の上限値(単位:バイト)
例外:
次に示すどちらかの場合
パラメタ「request」がnullの場合
HTMLフォームデータストリームまたはコンテントタイプのどちらかがXMLデータ形式として正しくない場合
■ メソッドの詳細
getEnctyp(javax.servlet.http.HttpServletRequest)
形式:
public static int getEnctyp(javax.servlet.http.HttpServletRequest request)
説明:
HTMLフォームデータストリームのエンコード形式を返します。
パラメタ:
HttpServletRequestオブジェクト
戻り値:
エンコード形式を表す値。
CGIパラメタ形式の場合はURLENCODED、XMLデータ形式の場合はMULTIPART。
また、リクエストオブジェクトの不正により、形式が不明な場合はCGIパラメタ形式として返されます。
関連項目:
URLENCODED、MULTIPART
getParameter(java.lang.String)
形式:
public java.lang.String getParameter(java.lang.String name)
説明:
指定したパラメタ名に対応するパラメタ値を検索して返します。
ただし、返されるのは、次に示す項目だけです。
コマンド種別が「送信」または「キャンセル」のコマンドボタン項目
hidden項目
パラメタ:
パラメタ名
戻り値:
パラメタ値を表す文字列。パラメタ名がnull、または存在しないパラメタ名の場合は、null
形式:
public java.util.Enumeration getDescriptorNames()
説明:
電子フォーム名の一覧を返します。電子フォーム名を1つだけ返します。
パラメタ:
なし
戻り値:
電子フォーム名の文字列から成る列挙オブジェクト。該当するパラメタがない場合は、空の列挙オブジェクト
形式:
public java.io.InputStream getInputStream()
説明:
HTMLフォームデータストリームを返します。
パラメタ:
なし
戻り値:
HTMLデータを格納した入力バイトストリームオブジェクト
■ 補足
入力データの解析について、データサイズが1メガバイトを超える場合は、TEMP環境変数に設定されたフォルダに一時ファイルが作成されます。システムを再起動してもTEMP環境変数に設定されたフォルダにf3hk****.tmpのファイルが残っていた場合は、削除する必要があります。
また、入力データ中に添付ファイルなど、10メガバイトを超えるデータが含まれていた場合は、コンストラクタで「入力ストリームオブジェクトのデータ解析でエラーが発生しました。」という例外が通知されます。
ただし、HtmlFormUtilクラスのデータサイズの上限値およびメモリ使用量の上限値が指定できるコンストラクタを利用することによりアプリケーションごとに上記の制御をカスタマイズすることができます。詳細については、「C.1.4 クラス:HtmlFormUtil」の「■ コンストラクタの詳細」を参照してください。
■ 使用例
HtmlFormUtilクラスの使用例を次に示します。
Webブラウザから送信されたデータがXMLデータ形式かを判断し、InputDataBuilderクラスを生成する場合
import javax.servlet.* ; import javax.servlet.http.* ; import java.io.* ; import com.fujitsu.form.* ; public class SampleServlet extends HttpServlet { public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { // XMLデータ形式かを調べます。 if (HtmlFormUtil.getEnctyp(request) == HtmlFormUtil.MULTIPART) { try { // InputDataBuilderオブジェクトを生成します。 InputDataBuilder idb = new InputDataBuilder(request); // 処理の続き ・ ・ ・ } catch(Exception e){ // 例外処理 ・ ・ ・ } } else { // CGIパラメタ形式の場合の処理 ・ ・ ・ } } }
Webブラウザから送信されたパラメタを取得する場合
getParameter()メソッドでコマンドボタンの項目名を引数に、コマンドボタンのラベル文字列を取得します。コマンドボタンのラベル文字列を取得できない場合は違うコマンドボタンであり、取得できる場合はコマンドボタンのラベル文字列を判定するという制御方法です。
なお、キャンセルボタン送信では、このクラス構築時に例外が発生するため、HtmlFormUtilクラスを利用してください。
コマンドボタン項目で、項目名に「送信ボタン項目」、ラベルに「申請」、コマンド種別に「送信」が設定されている場合の例を、次に示します。
import javax.servlet.* ; import javax.servlet.http.* ; import java.io.* ; import com.fujitsu.form.* ; public class SampleServlet extends HttpServlet { public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { // XMLデータ形式かを調べます。 if (HtmlFormUtil.getEnctyp(request) == HtmlFormUtil.MULTIPART) { // HtmlFormUtilオブジェクトを生成します。 HtmlFormUtil hfu = new HtmlFormUtil(request); // 「申請」ボタンで送信されてきたデータかを判定します。 String button = hfu.getParameter("送信ボタン項目") ; if (button != null && button.equals("申請")) { // 申請処理の続き ・ ・ ・ } // 申請処理以外の続き ・ ・ ・ } else { // CGIパラメタ形式の場合の処理 ・ ・ ・ } } }
Webブラウザで表示されていた電子フォーム名を取得する場合
import javax.servlet.* ; import javax.servlet.http.* ; import java.util.* ; import java.io.* ; import com.fujitsu.form.* ; public class SampleServlet extends HttpServlet { public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { // XMLデータ形式かを調べます。 if (HtmlFormUtil.getEnctyp(request) == HtmlFormUtil.MULTIPART) { // HtmlFormUtilオブジェクトを生成します。 HtmlFormUtil hfu = new HtmlFormUtil(request); // 電子フォーム名の一覧を取得します。 Enumeration enum = hfu.getDescriptorNames(); String formName = null ; if (enum != null && enum.hasMoreElements()) { // 電子フォーム名を取得します。 formName = (String)enum.nextElement(); } // 処理の続き ・ ・ ・ } else { // CGIパラメタ形式の場合の処理 ・ ・ ・ } } }
データサイズの上限値およびメモリ使用量の上限値を指定してHtmlFormUtilオブジェクトを生成し、Webブラウザから送信されたパラメタを取得する場合
この例では、データサイズの上限値を20メガバイト、メモリ使用量の上限値を20メガバイトに指定してHtmlFormUtilオブジェクトを生成し、クライアントのWebブラウザから送信されたパラメタを取得しています。
import javax.servlet.* ; import javax.servlet.http.* ; import java.util.* ; import java.io.* ; import com.fujitsu.form.* ; public class SampleServlet extends HttpServlet { // データサイズの上限値を20メガバイトに指定します。 static final int dataSizeLimit = (1024*1024)*20; // メモリ使用量の上限値を20メガバイトに指定します。 static final int memUseLimit = (1024*1024)*20; public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { // XMLデータ形式かを調べます。 if (HtmlFormUtil.getEnctyp(request) == HtmlFormUtil.MULTIPART) { // HtmlFormUtilオブジェクトを生成します。 HtmlFormUtil hfu = new HtmlFormUtil(request, dataSizeLimit, memUseLimit); // パラメタに「申請」ボタンがあるかどうかを調べます。 String button = hfu.getParameter("送信ボタン項目") ; if (button != null && button.equals("申請")) { // 処理の続き ・ ・ ・ } // 処理の続き ・ ・ ・ } else { // CGIパラメタ形式の場合の処理 ・ ・ ・ } } }