JSP を利用することによって、HTML とスクリプトコードの組み合わせを含んでいるテキストファイルからサーブレットを作成できます。クライアントが JSP をリクエストすると、ページがサーブレットに変換されます。JSP のスクリプト部分を使用して、ダイナミックコンテンツを作成し、クライアントに返送できます。さらに、JSP からサーブレットと EJB コンポーネントにアクセスできます。
JSP はテンプレートデータ (通常、テキストと HTML タグ) と JSP 要素の組み合わせです。JSP 要素は、サーブレットに変換されて Web サーバで実行されます。JSP 仕様では、次の 3 種類の JSP 要素が定義されています。
JSP をサーブレットに変換する処理は、ページ変換と呼ばれています。最初に JSP がリクエストされると、JRun はファイルを解析して、Java ソースコードファイルを出力します。Java ソースコードファイルはサーブレットクラスファイルにコンパイルされます。次に、そのサーブレットクラスファイルがロードされ、実行されます。
次の図は、JRun が JSP のリクエストを受け取ったときに実行する手順を示しています。
次の手順は、JSP がリクエストされたときに JRun が実行するアクションを示しています。
JRun はサーブレットからの出力をクライアントに返します。JSP のデフォルト出力は、text/html; charset=ISO-8859-1 の MIME タイプです。このタイプでは、クライアントに直接送信できるように出力を設定します。
これ以後 JSP がリクエストされたときに、JSP が最後に解析されて以降修正されていない場合は、JRun は手順 4 だけを実行します。これは、最初のリクエストの後、サーブレットがメモリに残っているからです。デフォルトでは、JSP ファイルが最後に解析された後で修正された場合、JRun は再コンパイルします。
JSPC コンパイラ使用の詳細については、『JRun アセンブルとデプロイガイド』を参照してください。
JSP ページを表すサーブレットのソースコードを表示することも可能です。JSP ページの XML 表現は、JRun がサーブレットを作成する間一時的にメモリ内に維持されるだけなので、表示できません。
デフォルトでは、JRun は、JSP のソースコードから生成されたサーブレットを保持できません。このセクションでは、Java ファイルを保持するように JRun を設定し、それらを表示する方法について説明します。
生成されたファイルを保持する方法については、 「サーブレットのソースコードの表示」 を参照してください。
JSP を Web サーバのドキュメントのルートディレクトリに保管できます。たとえば、IIS に接続されている JRun を使用している場合、デフォルトでは、このディレクトリは c:¥Inetpub¥wwwroot です。デフォルトの JRun サーバとして JRun Web Server を使用している場合、ディレクトリは <jrun のルート ディレクトリ>
¥servers¥default-ear¥default-war¥ です。
ただし、異なる JSP 保管方法が使用されている可能性もあります。たとえば、JRun を IIS に接続しながら、WAR ファイル内のアプリケーションルートディレクトリに JSP を保管することができます。
他のプログラム言語と同様に、JSP でも変数を宣言できます。次の例に示すように、変数を定義でき、またその割り当てを変更できます。
<html><head><title>変数の使用</title></head><body>
<% int myVar = 5; %> <b> <% out.println ("Value of myVar:" + myVar); %> </b> <p> <% myVar = 2; out.println("Value of myVar again:" + myVar); %> </body></html>
myVar
変数へのアクセスは、この変数を宣言した JSP 内でのみ可能です。
サンプルの JSP を表示するには、samples JRun サーバを起動し、ブラウザで
http://localhost:8200/techniques を開きます。
ページ内で変数を再度割り当てることはできますが、名前自体は 1 回しか宣言できません。次の例で、変数の不適切な使用方法を示します。この例では、myVar
が最初の Java ブロック内で int として宣言され、3 番めの Java ブロックで再び int として宣言されているため、コンパイラエラーが発生します。
<html><head><title>変数の使用</title></head><body>
<% int myVar = 5; %> <b> <% out.println ("Value of myVar:" + myVar); %> </b><P> <% int myVar = 2; //ここに間違いがあります out.println("Value of myVar again:" + myVar);%></body></html>
スクリプトレット内で if
ステートメントを使用すると、JSP で HTML を条件付きで出力できます。次の例は、JSP の条件ステートメントを示しています。
<html><head><title>口座の残高</title></head><body>
<% double accountBalance = 1.00; %> <P>お客様の口座の残高:<% out.println( accountBalance ); %> <br> <% if(accountBalance <= 1.00) { %> <b> 仕事を探してください。</b> <br> <% } %> </body></html>
この例は、変数 accountBalance
の値を出力します。accountBalance
が 1 ドル以下の場合は、次のステートメントで「仕事を探してください」と提案します。accountBalance
を増減させることによって、ステートメントを修正できます。
条件ステートメントは、ブロック <% } %>
を使用してif
ステートメントを閉じます。このシンタックスで HTML で「<b> 仕事を探してください。</b> <br>
」と表示されるのは、条件が true の場合です。
サンプルの JSP を表示するには、samples JRun サーバを起動し、ブラウザで
http://localhost:8200/techniques を開きます。
多くの JSP オブジェクトはメソッドを含んでおり、パラメータや属性としてオブジェクト内に保管されているデータにアクセスします。JSP オブジェクトを使用するときは、パラメータを使用する場合と属性を使用する場合を知っている必要があります。
パラメータは、常に String として JSP オブジェクト内に保管されます。パラメータの主な用途は、クライアントのリクエストの中でクライアントからサーバにデータを渡すことです。
たとえば、クライアントがフォームを送信するときは、すべてのフォームデータが request オブジェクト内の名前/値のペアとしてサーバに送信されます。名前はパラメータ名に対応します。値はパラメータ値を含む文字列です。JSP 内では、request オブジェクトの getParameter
メソッドを使用してパラメータにアクセスします。
次の例では、request オブジェクトを使用して JSP への HTTP リクエストに含まれている 2 つのパラメータ fName
および lName
の値を取得し、次に out オブジェクトを使用してこれらの値をクライアントに渡します。
<%
String firstName = request.getParameter("fName"); String lastName = request.getParameter("lName"); out.println("Welcome " + firstName + " " + lastName); %>
サンプルの JSP を表示するには、samples JRun サーバを起動し、ブラウザで
http://localhost:8200/techniques を開きます。
通常は、JSP、JavaBean、サーブレットなどのサーバサイドコンポーネント間で情報をやり取りするために使用します。たとえば、ある JSP から別の JSP を呼び出す場合、呼び出し側の JSP は、request オブジェクトや session オブジェクト内の属性として、情報をデスティネーションページに渡すことができます。
属性は名前/値のペアとして保管されます。名前は属性名に対応し、値は java.lang.Object
のインスタンスとして保管されます。これがパラメータと属性の主な違いです。パラメータは常に String として保管され、属性は Java オブジェクトとして保管されます。
たとえば、JSP の session オブジェクトに属性 fName
と属性 lName
が含まれる場合、次のコードを使用するとそれらの属性にアクセスできます。
<%
String firstName = (String) session.getAttribute("fName"); String lastName = (String) session.getAttribute("lName"); out.println("Welcome " + firstName + " " + lastName); %>
この例では、getAttribute
の戻り値を String にキャストします。このキャストが必要になるのは、getAttribute
が常に java.lang.Object
のタイプのオブジェクトを返すからです。キャストは、返されたオブジェクトをデスティネーションの形式 (この場合は String ) に変換します。
属性を使用すると、サーバサイドのアプリケーションをより柔軟に開発できます。なぜなら、パラメータを使用する場合と違って、String 以外のオブジェクトを保管および取得できるからです。属性を使用すると、どのようなタイプのオブジェクトでも保管および取得でき、それらのオブジェクトをアプリケーションのコンポーネントに渡すことができます。
サンプルの JSP を表示するには、samples JRun サーバを起動し、ブラウザで
http://localhost:8200/techniques を開きます。
JSP 要素は相対 URL を使用して、JSP、サーブレット、ページ内のその他の Web コンポーネントを参照できます。参照元 JSP 内で URL を指定する方法に応じて、参照元 JSP を含んでいるアプリケーションまたは参照元 JSP のロケーションに対して相対的に指定できます。
たとえば、myErrorPage.jsp という URL では、参照元 JSP のロケーションに対して相対的な myErrorPage.jsp が参照されます。この場合、JRun は、参照元ページと同じディレクトリにある myErrorPage.jsp を検索します。
たとえば、../myErrorPage.jsp という URL では、参照元 JSP のロケーションに対して相対的な myErrorPage.jsp が参照されます。この場合、JRun は、参照元ページの親ディレクトリにある myErrorPage.jsp を検索します。
/errorPages/myErrorpage.jsp という URL には、リファレンスの先頭にスラッシュがあります。リファレンスの先頭に "/" を付けると、JRun は、参照元 JSP を含んでいるアプリケーションのルートに対して相対的に myErrorpage.jsp を検索します。JSP はすべて、1 つのアプリケーションに含まれます。アプリケーションを設定する手順の一部として、/ にマッピングされるディレクトリを定義する必要があります。
JSP から別の JSP を呼び出すことによって、複雑なアプリケーションの作成に使用できるモジュラー JSP を開発できます。ある JSP を別の JSP から呼び出すときは、JSP で次のアクションのいずれかを使用します。
jsp:include
および jsp:forward
アクションの詳細については、 「アクションについて」 を参照してください。
メモ: デスティネーションページをロードした後に変更した場合、JRun はそのページが呼び出されたときにそのページを再変換します。ただし、デスティネーションページが修正された場合、JRun は呼び出し側 JSP を再コンパイルしません。
デフォルトでは、JRun は JSP からクライアントに送信された出力データをバッファーに入れます。jsp:include
アクションと jsp:forward
アクションのいずれかを呼び出すと、JRun によって JSP の出力バッファーがフラッシュされます。出力バッファーの詳細については、 「JSP 出力のバッファリング」 を参照してください。
JRun は JSP からクライアントに送信される出力データをバッファリングします。バッファーを使用しているため、レスポンスヘッダー情報およびその他の出力はバッファーがフラッシュされるまではクライアントに送信されません。このフラッシュは、次のいずれかが発生したときに行われます。
flush
を呼び出したとき。flush
属性が true になっており (デフォルト)、jsp:include
アクションを使用して他の JSP を呼び出したとき。jsp:forward
アクションを呼び出した。redirect
メソッドを使用してリクエストを転送したとき。リクエストを転送する場合、転送元 JSP が設定した Cookie は破棄されず、クライアントに送信されます。バッファリングを無効にしていてもリクエストを転送できますが、それはクライアントにまだ何も出力を書き込んでいない場合に限られます。
バッファリングの影響より、HTTP ヘッダーに依存するオペレーションは、flush メソッドが実行されヘッダーがクライアントに送信されるまで無効です。
page
ディレクティブを使用してバッファーサイズを設定し、ページのバッファリングを有効または無効にします。詳細については、 「page ディレクティブ」 を参照してください。
JSP には、JSP タグと、一般的には HTML であるテンプレートテキストが含まれ、また、オプションとしてタグライブラリにあるカスタムタグが含まれます。タグライブラリを使用すれば、タグ開発者は、自分の JSP、社内の他のユーザー、または顧客が使用するカスタムタグを実装することによって、使用できるタグのセットを拡張できます。
JSP で使用するタグライブラリを宣言するには、JSP 内で taglib
ディレクティブを使用します。taglib
ディレクティブの一部として、タグライブラリへのパスと、ページ内で使用するタグ接頭辞を指定して、ライブラリを識別します。たとえば、次のステートメントでは、接頭辞 myTags
によって参照されるタグライブラリが定義されます。
<%@ taglib uri="/myApp/appTags" prefix="myTags" />
taglib
ディレクティブの後で、接頭辞 myTags
を使用してタグライブラリ内のタグを参照できます。次のステートメントでは、タグライブラリ内の coolTag
を使用します。
<myTags:coolTag>
... </myTags:coolTag>
タグライブラリが見つからない場合、JRun では致命的な変換エラーが発生します。JSP 内で接頭辞 myTag
を使用する別のタグライブラリを定義した場合もエラーが発生します。
taglib
ディレクティブ使用の詳細については、 「taglib ディレクティブ」 を参照してください。
独自のカスタムタグライブラリ作成の詳細については、弟 11 章、「Java のカスタムタグ」を参照してください。
次の表で、JSP を作成するときのシンタックスの基本的な注意点を説明します。
シンタックス |
説明 |
---|---|
テンプレートテキスト |
JSP では、テンプレートテキストは JSP 要素の外側にあるので、JRun によって解釈されることはありません。テンプレート テキストは、修正されずにクライアントに直接返されます。JSP の HTML テキストは、テンプレートテキストと見なされます。 |
空白文字 |
JSP ファイルでは、テンプレートコードに含まれる空白文字はすべて、JSP ファイルに入力されているとおりにクライアントに返されます。 |
開始タグと終了タグ |
開始タグと終了タグ、そしてこれらのタグに囲まれた本文を 持つ JSP 要素。これらのタグは両方とも同じファイル内に 入れる必要があります。開始タグと終了タグを別々のファイル内に入れることはできません。 たとえば、JSP スクリプトレットのシンタックスは <% scriptlet %> です。開始タグ (<%) と終了タグ (%>) は、両方とも同じファイル内になければなりません。 |
属性値 |
すべての JSP 要素の属性値を引用符や二重引用符で囲む必要があります。たとえば、次の例の page ディレクティブは、contentType を text/plain に設定します。 <%@ page contentType = "text/plain" %> 属性値自体に同じタイプの引用符 (引用符や二重引用符) が 含まれている場合は、埋め込まれた引用符の前にエスケープ 文字 (¥) を付けます。エスケープ文字の次に来る文字は、JSP パーサーでは無視されます。属性の引用符には、次のエスケープシーケンスを使用します。
また、引用符に HTML 文字エンティティを使用できます。たとえば、二重引用符の代わりとして属性値に文字リファレンス " を挿入します。HTML 文字エンティティ使用の詳細については、 「HTML エンティティの使用」 を参照してください。 |
文字のエスケープ |
属性値の中で引用符をエスケープできるだけでなく、さらに、JSP の他の領域にある次のような文字をエスケープできます。
|
コメント |
JSP で使用できるコメントには 2 種類あります。
また、スクリプトレットに挿入したコメントもクライアントには表示されません。たとえば次のとおりです。 <% /* 次のコードでユーザー ID を取得します */ String sqlstmt = "SELECT userID FROM users WHERE _ lastname = request.getParameter("lastname")"; %> |