| Oracle® Fusion Middleware Oracle WebLogic Server Webアプリケーション、サーブレット、JSP の開発 12c (12.2.1.3.0) E90351-03 |
|
![]() 前 |
![]() 次 |
この章の内容は以下のとおりです。
WebLogic JSPフォーム検証タグは、JSPページによって生成されるHTMLフォームのテキスト・フィールドにユーザーが入力するエントリを検証するための便利な方法です。WebLogic JSPフォーム検証タグを使用すると、よく使用される検証ロジックを繰返しコーディングする必要がなくなります。検証は、WebLogic Server配布キットに含まれている複数のカスタムJSPタグによって行われます。
タグは次のことができます::
必須フィールドに値が入力されているかどうかを検証します(Required Field Validatorクラス)。
フィールド内のテキストを正規表現と照らしあわせて検証します(Regular Expression Validatorクラス)。
フォーム内の2つのフィールドを比較します(Compare Validatorクラス)。
ユーザーが記述したJavaクラスによってカスタム検証を実行します(Custom Validatorクラス)。
WebLogic JSPフォーム検証タグには、以下のものがあります。
<wl:summary>
<wl:form>
<wl:validator>
検証タグによってフィールド内のデータが正しく入力されていないことが判明した場合、そのページが再表示され、再入力が必要なフィールドがテキストまたは画像で示され、エンド・ユーザーにアラートを通知します。フォームに正しく入力されると、エンド・ユーザーのブラウザには検証タグで指定された新しいページが表示されます。
WebLogicフォーム検証タグとその属性について説明します。
タグを表すために使用される接頭辞は、JSPページのtaglibディレクティブで定義できます。このドキュメントでは、理解しやすいようにwlという接頭辞を使用してWebLogicフォーム検証タグを表します。
<wl:summary>は、検証用の親タグです。<wl:summary>の開始タグは、JSP内のすべての要素またはHTMLコードの前に置きます。終了タグの</wl:summary>は、終了タグ</wl:form>の後の任意の場所に置きます。
name - (オプション) JSPページの<wl:validator>タグによって生成されるすべての検証エラー・メッセージを保持するベクトル変数の名前です。この属性を定義しない場合、デフォルト値のerrorVectorが使用されます。エラー・メッセージのテキストは、<wl:validator>タグのerrorMessage属性で定義されます。
このベクトル内の値を表示するには、<wl:errors/>タグを使用します。<wl:errors/>タグを使用するには、出力を表示するページ上の場所にこのタグを配置します。例:
<wl:errors color="red"/>
かわりに、スクリプトレットを使用することもできます。例:
<% if (errorVector.size() > 0) {
for (int i=0; i < errorVector.size(); i++) {
out.println((String)errorVector.elementAt(i));
out.println("<br>");
}
} %>
ここでerrorVectorは、<wl:summary>タグのname属性で割り当てられたベクトルの名前です。
name属性は、1つのページで複数のフォームを使用するときに必要になります。
headerText - ページに表示されるテキストを格納する変数です。ページでエラーが発生したときにのみこのテキストを表示する場合、スクリプトレットを使用してこの条件をテストできます。例:
<% if(summary.size() >0 ) {
out.println(headerText);
}
%>
ここでsummaryは、<wl:summary>タグのname属性で割り当てられたベクトルの名前です。
redirectPage - フォーム検証でエラーが返されない場合に表示されるページのURLです。この属性は、<wl:form>タグのaction属性にURLを指定する場合には必要ありません。
redirectPage属性を<wl:summary>タグが配置されているページに設定しないでください。無限ループとなってStackOverFlow例外が発生します。
<wl:form>タグはHTML <form>タグとほぼ同じで、WebLogic JSPフォーム検証タグを使って検証できるHTMLフォームを定義します。name属性を使用して各フォームを一意に識別することによって、単一のJSPで複数のフォームを定義できます。
method - GET またはPOSTを入力します。この機能は、HTML <form>タグのmethod属性とまったく同じです。
action - フォーム検証でエラーが返されない場合に表示されるページのURLです。この属性の値は、<wl:summary>タグのredirectPage属性の値に優先します。この属性は、単一のJSPページに複数のフォームを定義する場合に便利です。
action属性を<wl:form>タグが配置されているページに設定しないでください。無限ループとなってStackOverFlow例外が発生します。
name - この機能は、HTML <form>タグのname属性とまったく同じです。同じページで複数のフォームが使用される場合にフォームを識別します。また、name属性はフォームへのJavaScript参照にも便利です。
フォーム・フィールドごとに、1つまたは複数の<wl:validator>タグを使用します。たとえば、正規表現と照らし合わせて入力を検証し、かつ、フィールドに何らかの入力が必要な場合、2つの<wl:validator>タグを使って、1つではRequiredFieldValidatorクラス、もう1つはRegExpValidatorクラスを使用します(空の値は正規表現フィールド・バリデータにより有効と評価されるので、これらのバリデータを両方とも使用する必要があります。)
errorMessage - <wl:summary>タグのname属性によって定義されるベクトル変数に格納される文字列です。
expression - RegExpValidatorクラスを使用すると、正規表現が評価されるようになります。RegExpValidatorを使用しない場合、この属性は省略できます。
fieldToValidate - 検証するフォーム・フィールドの名前です。フィールド名は、HTML <input>タグのname属性で定義されます。
validatorClass - 検証ロジックを実行するJavaクラスの名前です。3つのクラスを使用できます。また、独自のバリデータ・クラスを作成することもできます。「カスタム・バリデータ・クラスの使用方法」を参照してください。
使用できる検証クラスは以下のとおりです。
weblogicx.jsp.tags.validators.RequiredFieldValidator - テキストがフィールドに入力されているかどうかを検証します。
weblogicx.jsp.tags.validators.RegExpValidator - 標準の正規表現を使用してフィールド内のテキストを検証します。注意: 空白の値も有効と評価されます。
weblogicx.jsp.tags.validators.CompareValidator - 2つのフィールドに同じ文字列が入力されているかどうかをチェックします。このクラスを使用する場合、fieldToValidate属性をこれらの2つのフィールドに設定します。例:
fieldToValidate="field_1,field_2"
両方のフィールドが空白の場合でも、比較は有効と評価されます。
myPackage.myValidatorClass - カスタム・バリデータ・クラスを指定します。
JSPで検証タグを使用するための手順を検証します。
JSPを記述します。
taglibディレクティブを入力して、WebLogic JSPフォーム検証タグがあるタグ・ライブラリを参照します。例:
<%@ taglib uri="tagl" prefix="wl" %>
接頭辞属性では、JSPページのすべてのタグを参照するために使用される接頭辞を定義します。接頭辞は任意の値に設定できますが、このドキュメントではwlという接頭辞を使用してタグを参照します。
<wl:summary> ... </wl:summary>タグを入力します。
開始タグの<wl:summary ...>を、ページ上のすべてのHTMLコード、JSPタグ、スクリプトレット、式の前に配置します。
終了タグの</wl:summary>を、</wl:form>の後の任意の場所に置きます。
付属のタグ・ライブラリに登録されている<wl:form> JSPタグを使用して、HTMLフォームを定義します。「<wl:form>」および「<wl:form>タグを使用したHTMLフォームの作成」を参照してください。フォーム・ブロックは必ず</wl:form>タグを使用してクローズしてください。フォームごとに<wl:form>タグのname属性を一意に定義する場合、単一のページに複数のフォームを作成できます。
HTML <input>タグを使用して、HTMLフォームのフィールドを作成します。
<wl:validator>タグを追加します。このタグの構文については、「<wl:validator>」を参照してください。エラー・メッセージまたは画像を表示するページ上の場所に<wl:validator>タグを配置します。同じページで複数のフォームを使用する場合、<wl:validator>タグを、検証するフォーム・フィールドがある<wl:form>ブロックの中に配置します。
次の例は、必須フィールドの検証を示したものです。
<wl:form name="FirstForm" method="POST" action="thisJSP.jsp"> <wl:validator errorMessage="Field_1 is required" expression="" fieldToValidate="field_1" validatorClass= "weblogicx.jsp.tags.validators.RequiredFieldValidator" > <img src="images/warning.gif"> <font color=red>Field 1 is a required field</font> </wl:validator> <p> <input type="text" name = "field_1"> </p> <p> <input type="text" name = "field_2"> </p> <p> <input type="submit" value="Submit FirstForm"> </p> </wl:form>
ユーザーがfield_1に値を入力しなかった場合は、ページが再度表示され、warning.gif画像と「Field 1 is a required field」というテキスト(赤色)が表示され、値を再入力するための空のフィールドが続いて表示されます。
WebLogic Serverインストールのextディレクトリのweblogic-vtags.jarファイルを、使用するWebアプリケーションのWEB-INF/libディレクトリにコピーします。このディレクトリは、作成が必要な場合もあります。
Webアプリケーションのweb.xmlデプロイメント記述子にtaglib要素を追加することによって、Webアプリケーションでタグ・ライブラリが使用されるよう構成します。例:
<taglib>
<taglib-uri>tagl</taglib-uri>
<taglib-location>
/WEB-INF/lib/weblogic-vtags.jar
</taglib-location>
</taglib>
JSPページにHTMLフォームを作成する方法について説明します。
ページに1つまたは複数のフォームを作成するには、<wl:form>タグを使用します。
weblogic-vtags.jarタグ・ライブラリに含まれている<wl: form>タグを以下のように使用します。
<wl:form method="POST" action="nextPage.jsp"><p> <input type="text" name ="field_1"> </p><p> <input type="text" name ="field_2"> </p><p> <input type="submit" value="Submit Form"> </p></wl:form>
このタグの構文については、「<wl:form>」を参照してください。
ページで複数のフォームを使用する場合は、name属性を使用して各フォームを識別します。例:
<wl:form name="FirstForm" method="POST" action="thisJSP.jsp"> <p> <input type="text" name="field_1"> </p> <p> <input type="text" name="field_2"> </p> <p> <input type="submit" value="Submit FirstForm"> </p> </wl:form> <wl:form name="SecondForm" method="POST" action="thisJSP.jsp"> <p> <input type="text" name="field_1"> </p> <p> <input type="text" name="field_2"> </p> <p> <input type="submit" value="Submit SecondForm"> </p> </wl:form>
バリデータ・タグによってエラーが発見され、JSPページが再表示されたときに、ユーザーが入力した値を再表示して、フォーム全体を再び入力する必要がないようにしておくと便利です。この場合、HTML <input>タグのvalue属性を使用するか、Apache Jakartaプロジェクトから利用できるタグ・ライブラリを使用します。次に、この両方の手順について説明します。
javax.servlet.ServletRequest.getParameter()メソッドとHTML <input>タグのvalue属性を一緒に使用すると、検証の失敗によってページが再表示されるときにユーザーの入力を再表示できます。例:
<input type="text" name="field_1"
value="<%= request.getParameter("field_1") %>" >
クロス・サイト・スクリプティングによるセキュリティの脆弱性をなくすには、ユーザーが入力したデータ内のHTML特殊文字をすべてHTMLエンティティ参照に置き換えます。詳細は、「JSP式言語」を参照してください。
Apache Jakartaプロジェクトの無償で利用できるJSPタグ・ライブラリを使用することもできます。このタグ・ライブラリには、HTML <input>タグの代わりとして<input:text>タグが用意されています。たとえば、次のHTMLタグがあるとします。
<input type="text" name="field_1">
このタグは、Apacheタグ・ライブラリを使用すると次のように入力できます。
<input:text name="field_1">
詳細およびドキュメントは、http://attic.apache.org/projects/jakarta-taglibs.htmlで入手可能なInputタグ・ライブラリをダウンロードしてください。
Apacheタグ・ライブラリをJSPで使用するには:
独自のバリデータ・クラスの使用方法について説明します。
weblogicx.jsp.tags.validators.CustomizableAdapter抽象クラスを拡張するJavaクラスを記述します。「CustomizableAdapterクラスの拡張」を参照してください。
validate()メソッドを実装します。このメソッドでは、次のことを行います。
検証するフィールドの値をServletRequestオブジェクトからルックアップします。例:
String val = req.getParameter("field_1");
フィールドが検証条件を満たしている場合、trueを返します。
バリデータ・クラスをコンパイルし、コンパイル結果の.classファイルをWebアプリケーションのWEB-INF/classesディレクトリに格納します。
バリデータ・クラス名をvalidatorClass属性に指定することによって、そのクラスを<wl:validator>タグで使用します。例:
<wl:validator errorMessage="This field is required" fieldToValidate="field_1" validatorClass="mypackage.myCustomValidator">
CustomizableAdapterクラスは、Customizableインタフェースを実装し、以下のヘルパー・メソッドを提供する抽象クラスです。
getFieldToValidate() - 検証するフィールド(<wl:validator>タグのfieldToValidate属性によって定義される)の名前を返します。
getErrorMessage() - <wl:validator>タグのerrorMessage属性で定義されるエラー・メッセージのテキストを返します。
getExpression() - <wl:validator>タグに定義されるexpression属性のテキストを返します。
CustomizableAdapterクラスを拡張するかわりに、Customizableインタフェースを実装できます。
例15-1 ユーザーの記述によるバリデータ・クラスのサンプル
import weblogicx.jsp.tags.validators.CustomizableAdapter;
public class myCustomValidator extends CustomizableAdapter{
public myCustomValidator(){
super();
}
public boolean validate(javax.servlet.ServletRequest req)
throws Exception {
String val = req.getParameter(getFieldToValidate());
// perform some validation logic
// if the validation is successful, return true,
// otherwise return false
if (true) {
return true;
}
return false;
}
}
WebLogic JSPフォーム検証タグを使用するJSPの基本的な構造を示すサンプル・コードについて検証します。
WebLogic Serverと一緒にサンプルをインストールした場合は、完全に機能するサンプル・コードも使用できます。サンプル・コードの実行手順については、インストールしたWebLogic Serverのsamples/examples/jsp/tagext/form_validation/package.htmlを参照してください。
例15-2 WebLogic JSPフォーム検証タグとJSP
<%@ taglib uri="tagl" prefix="wl" %>
<%@ taglib uri="input" prefix="input" %>
<wl:summary
name="summary"
headerText="<font color=red>Some fields have not been filled out correctly.</font>"
redirectPage="successPage.jsp"
>
<html>
<head>
<title>Untitled Document</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<body bgcolor="#FFFFFF">
<% if(summary.size() >0 ) {
out.println("<h3>" + headerText + "</h3>");
} %>
<% if (summary.size() > 0) {
out.println("<H2>Error Summary:</h2>");
for (int i=0; i < summary.size(); i++) {
out.println((String)summary.elementAt(i));
out.println("<br>");
}
} %>
<wl:form method="GET" action="successPage.jsp">
User Name: <input:text name="username"/>
<wl:validator
fieldToValidate="username"
validatorClass="weblogicx.jsp.tags.validators.RequiredFieldValidator"
errorMessage="User name is a required field!"
>
<img src=images/warning.gif> This is a required field!
</wl:validator>
<p>
Password: <input type="password" name="password">
<wl:validator
fieldToValidate="password"
validatorClass="weblogicx.jsp.tags.validators.RequiredFieldValidator"
errorMessage="Password is a required field!"
>
<img src=images/warning.gif> This is a required field!
</wl:validator>
<p>
Re-enter Password: <input type="password" name="password2">
<wl:validator
fieldToValidate="password,password2"
validatorClass="weblogicx.jsp.tags.validators.CompareValidator"
errorMessage="Passwords don't match"
>
<img src=images/warning.gif> Passwords don't match.
</wl:validator>
<p>
<input type="submit" value="Submit Form"> </p>
</wl:form>
</wl:summary>
</body>
</html>