JSP ファイルの開発

このセクションでは、JSP で実行できるいくつかの基本的タスクについて説明します。ここで示している例は Java ですが、JSP では Java 以外のスクリプト言語も使用できます。その場合は、それに対応してコード例を変更してください。

このセクションでは、次のタスクについて説明します。

JSP の保存

JSP を Web サーバーのドキュメントのルート ディレクトリに保存します。たとえば、IIS を使用している場合、このディレクトリは c:¥Inetpub¥wwwroot です。 default JRun サーバーに JRun Web サーバーを使用している場合、このディレクトリは <JRun home dir>¥servers¥default¥default-app です。ここで、<JRun home dir> は JRun のホーム ディレクトリ、default-app は既定の JRun Web アプリケーションを表します。

変数の宣言

JSP は、ほかのスクリプト作成機能と同様に、変数宣言を受け付けます。次の例で示すように、変数を定義してから再び割り当てることができます。

<html>
<head><title>Using variables</title></head>
<body>
<p>
<% 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 内でだけアクセスできます。

ページ内で変数を再度割り当てることはできますが、名前自体は 1 回しか宣言できません。次の例では、変数が正しく使用されていません。この例では、myVar が最初の Java ブロック内で int として宣言され、3 番目の Java ブロックで再び int として宣言されているため、コンパイラ エラーが発生します。

<html>
<head><title>Using variables</title></head>
<body>
<p>
<% int myVar = 5; %>
<b> <% out.println ("Value of myVar:" + myVar); %> </b>
<p>
<%
  int myVar = 2;  //ここに間違いがあります
  out.println("Value of myVar again:" + myVar);
%>
</body>
</html>

JSP への条件ロジックの追加

次の例では、JSP 内で条件ステートメントを使用しています。

<html>
<head><title>Account Balance</title></head>
<body>
<p>
<% double accountBalance = 1.00; %>
Your Current Balance:<% out.println( accountBalance ); %> <br>
<% if(accountBalance <= 1.00) { %>
  <b> Get a Job.</b> <br>
<% } %>
</body>
</html>

この例では、変数 accountBalance の値を出力します。accountBalance が 1 ドル以下である場合、次のステートメントはユーザに " Get a job" と指示します。ステートメントを変更して、accountBalance を調整できます。

条件ステートメントでは、if ステートメントを閉じるためにブロック <% } %> を使用します。この構文によって、条件が true である場合に HTML"<b> Get a job</b> <br>" が表示されます。条件を 1 つの Java ブロックだけで表す場合は、次の構文でも同じ結果が得られます。

<% if(accountBalance <= 1.00) out.println("<b>Get a job.</b> <br>"); %>

この例では、ステートメント"<b> Get a job</b> <br>" がドキュメント内で HTML テキストとして指定されるのではなく、スクリプト コードに含まれます。どちらの方法でもブラウザは同じようにメッセージを受け取り、表示します。

式の使用

これまでの例では、変数値を表示するために out.println() メソッドを使用しました。しかし、このメソッドを使用すると、値を表示したときにドキュメントが煩雑になる場合があります。式要素を使用すると、out.println() を使用せずに評価されたステートメントを表示でき、JSP が読み取りやすくなります。

次の例は、式要素の使用法を示しています。

<html>
<head><title>Account Balance</title></head>
<body>
<p>
<% double accountBalance =1.00; %>
Your Current Balance:<%=accountBalance %> <br>
<% if(accountBalance <= 1.00) { %>
  <b> Get a Job.</b> <br>
<% } %>
</body>
</html>

上の例は、前の条件ステートメントの例を変更したものです。この例では、
<% out.println(accountBalance); %> の代わりに式 <%= accountBalance %> を使用します。このステートメントは、out.println() を使用せずに、式の値を表示します。

JSP オブジェクトの使用

既定では、JRun は JSP 内で使用するいくつかの JSP オブジェクトを作成します。これらの JSP オブジェクトは、JSP 仕様、Java サーブレット API、またはコア Java ライブラリによって定義されたオブジェクトのインスタンスです。

JSP 内で使用するすべてのスクリプト言語は、JSP オブジェクトにアクセスするのに必要です。これらのオブジェクトへのアクセスとは、オブジェクトのメソッド、すなわち関数を呼び出してオブジェクト内に保存されているデータにアクセスすることです。

これらのオブジェクトを使用して JSP 内から基本的なタスクを実行できます。次のようなオブジェクトがあります。

たとえば、次の JSP は out オブジェクトを使用してクライアントに出力を返します。

<html>
<head><title>Using variables</title></head>
<body>
<p>
<% int myVar = 5; %>
<b> <% out.println ("Value of myVar:" + myVar); %> </b>
<p>
</body>
</html>

この例では、出力情報にテキストだけが含まれます。しかし、クライアントに返されるすべての出力は、クライアントの HTML ブラウザによって解釈されます。したがって、このテキスト出力内に HTML タグを含めることができます。

たとえば、出力行を書き直して、返された出力に「Heading 2 のテキストである」とマークを付けることができます。

<b> <% out.println ("<h2>Value of myVar:" + myVar + "</h2>"); %> </b>

クライアントから JSP に HTTP 要求の一部として送信されたデータにアクセスするには、JSP request オブジェクトを使用します。たとえば、要求には HTML フォームから JSP に渡されたデータを含めることができます。フォーム データは HTTP 要求の名前/値ペアとして JSP ページに送られます。この情報にアクセスするには、request オブジェクトとそのオブジェクトのメソッドを使用します。

また、パラメータをJSP の要求 URL の一部として、JSP に渡すこともできます。たとえば、JSP を要求するために次の URL を使用し、この要求と合わせて 2 つのパラメータを渡すことができます。

http://localhost/my.jsp?fName=Bob&lName=Smith

request オブジェクトの getParameter メソッドを使用して、フォームまたは要求 URL から JSP に渡されたパラメータを取得できます。

<%
  String firstName = request.getParameter("fName");
  String lastName = request.getParameter("lName");
  out.println("Welcome " + firstName + " " + lastName);
%>

第 9 章では、JRun によってサポートされているすべてのオブジェクトについて説明しています。

JSP オブジェクトとパラメータおよび属性の使用

多くの JSP オブジェクトは、パラメータ、属性、またはその両方の形式でオブジェクト内に保存されているデータにアクセスするためのメソッドを含んでいます。JSP オブジェクトを使用するとき、どのような場合にパラメータおよび属性を使用するかを知っている必要があります。

パラメータは常に文字列として 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 や Java サーブレットのようなサーバー側のコンポーネントの間で情報を伝達するために使用するデータ タイプです。たとえば、ある JSP から別の JSP を呼び出すとき、呼び出し側の JSP はアクセス先のページに渡す情報を request または session オブジェクト内の属性として指定できます。

属性は名前/値ペアとして保存されます。名前は属性名に対応し、値は Java オブジェクトのインスタンス java.lang.Object として保存されます。これがパラメータと属性の主な違いです。パラメータは常に文字列として保存され、属性は 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 のタイプのオブジェクトを返すからです。このキャストが返されたオブジェクトを送信先のフォーマットに変換します。この場合は、文字列として返されます。

属性を使用すると、サーバー側のアプリケーションをより柔軟に開発できます。なぜなら、パラメータを使用する場合と違って、文字列以外のオブジェクトを保存および取得できるからです。属性を使用すると、どのようなタイプのオブジェクトでも保存および取得でき、それらのオブジェクトをアプリケーションのコンポーネントに渡すことができます。

include の実行

include ディレクティブを使用して、解析時にほかのファイルを JSP ファイルにインクルードできます。一般的には include ディレクティブの引数として、インクルード ファイルの名前を指定する文字列リテラルを指定します。include タグの構文は次のとおりです。

<%@ include file="path" %>

path を指定したファイルのパスに設定します。指定したファイルの内容が、JSP ファイルのこのステートメントの位置に挿入されます。

JSP で、include ディレクティブを使用したとき、1 つの JSP が作成されます。これは、1 つの JSP を別の JSP にインクルードした場合でも同様です。JRun は 1 つの JSP とそれに対応する 1 つのサーブレットを作成します。これはもとの 2 つの JSP の内容を含んでいます。

JRun はインクルードされたすべてのファイルについて、実行時に依存チェックを実行します。インクルードしたファイルがメモリにロードされた後でインクルードされたファイルが変更された場合、インクルードしたファイルは次に要求されたときに再変換されます。

次の例では、JSP がヘッダ情報を含む別の JSP をインクルードします。JSP でこの構造を使用して各ページの外観を統一できます。また、この構造を使用するとヘッダ情報の変更が簡単になります。なぜなら、一度変更するだけで済むからです。

<html>
<%@ include file="my_header.jsp" %>
<%-- 残りの JSP --%>
...
</body>
</html>

ここで my_header.jsp を定義できます。この JSP はヘッダ情報を含んでいます。

<head>
<title>Greetings</title>
</head>

<body bgcolor="white" style="font-family:Arial; font-weight:medium; 
font-style:normal">

<center>
<table width=80%>
<tr>
<td><img src="logo.gif" width=200 height=21 alt="Example Include" 
border="0"><P></td>
<td><H1><font color="#336699">Greetings</font></h1></td>
</tr>
</table>
</center>

このページは、タイトルを定義し、body タグの既定の色を設定し、ロゴと単語 URL " Greetings" を含むテーブルを作成します。

前の例は、静的なヘッダ ファイルを示しています。したがって、ヘッダ ファイルはそれを含む JSP に関わりなく同じ情報を表示します。しかし、ヘッダ ページにそれをインクルードする JSP から情報を渡すことによって、ヘッダ ページをより柔軟に使用できます。

JSP request オブジェクトを使用して、インクルードされた JSP に情報を渡すことができます。たとえば、入力としてページのタイトルを定義する属性を取るヘッダ JSP を作成できます。インクルードするページは、request オブジェクト内で、次のようにこの属性を設定できます。

<html>
<%request.setAttribute("title", "Greetings"); %>
<%@ include file="my_header.jsp" %>
</body>
</html>

<%-- 残りの JSP --%>
...

この例では、パラメータではなく属性を使用して、インクルードされるページに値を渡します。属性では、JSP 間でオブジェクトを渡すことができますが、パラメータでは文字列のみを渡すことができる点に注意してください。

ヘッダ ファイル my_header.jsp は、次のようにこの属性にアクセスできます。

<html>
<head>
<title><%= request.getAttribute("title")%></title>
</head>

属性を処理する機能を追加すれば、インクルードされるファイルを柔軟に使用でき、より広い用途に使用できます。

別の JSP の呼び出し

JSP から別の JSP を呼び出すことによってモジュール式 JSP を開発し、それを使用して複雑なアプリケーションを作成できます。JSP から別の JSP を呼び出すとき、2 つの呼び出し方法のいずれかを選択できます。

  1. 呼び出されたページが処理を完了してから、呼び出し側のページに制御を戻す。この呼び出しを行うには、jsp:include アクションを使用します。
  2. 呼び出し側のページが呼び出されたページに制御を渡して終了する。この場合、呼び出されたページは呼び出し側のページに制御を戻しません。この呼び出しを行うには、jsp:forward アクションを使用します。

jsp:include および jsp:forward アクションの詳細については、124 ページの「アクション」を参照してください。

これらの 2 つの呼び出し操作を次の図に示します。


呼び出されたページをロードした後に変更した場合、そのページを呼び出したときに JRun はそれを再変換します。しかし、呼び出されたページが変更された場合は、呼び 出し側の JSP を再変換しません。


既定では、JRun は JSP からクライアントに送信された出力データをバッファに入れます。jsp:include または jsp:forward アクションを呼び出すと、JRun は JSP の出力バッファをフラッシュします。この出力バッファの詳細については、"JSP 出力のバッファ"を参照してください。

次の例は、JSP から別の JSP を呼び出す方法を示しています。また、呼び出された JSP に属性を渡す方法についても説明しています。

  1. 新しいテキスト ファイルを作成して、次の行を入力します。
    <% request.setAttribute("Greeting", "Hello World"); %>
    <jsp:include page="b.jsp" flush="true"/>
    

    ファイルを Web ドキュメント ルートに a.jsp の名前で保存します。

    この例では、JSP request オブジェクトを使用して属性 Greeting と値 "Hello World" を渡します。この属性は、b.jsp 内の request オブジェクトから取得でき ます。request オブジェクトの詳細については、第 9 章を参照してください。

  2. b.jsp ファイルを作成します。また、このファイルは Web サーバーのドキュメント ルートに保存する必要があります。b.jsp に次のように入力します。
    The greeting from b is:<%=request.getAttribute("Greeting")%>
    

    この例では、ページ間でデータを受け渡しします。属性の値は文字列に限定され ません。どのようなタイプのオブジェクトでも属性として渡すことができます。

Greetingrequest オブジェクト内の属性として渡す代わりに、jsp:param アクションを使用してそれをパラメータとして渡すこともできます。この場合、パラメータは呼び出された JSP に文字列として渡されます。この処理は、呼び出された JSP が HTTP post メソッドによって要求された情報を受け取る場合と同様です。

request オブジェクト内でパラメータを使用して b.jsp に情報を渡すことによって、b.jsp をクライアントからの要求に直接応答できるようにするか、または別の JSP から呼び出せるように構成できます。

次に示す a.jsp は、jsp:param を使用して Greeting パラメータを渡します。

<jsp:include page="b.jsp" flush="true">
  <jsp:param name="Greeting" value="Hello World" />
</jsp:include>

b.jsp 内で、request.getParameter メソッドを使用してこのパラメータにアクセスします。

The greeting from b is:<%=request.getParameter("Greeting")%>

呼び出された JSP は、呼び出し側のページと同様に、JSP out オブジェクトを使用してクライアントにデータを返すことができます。しかし、呼び出し側の出力がバッファに入っている場合、呼び出しの前にバッファがフラッシュされます。このフラッシュによって、呼び出されたページは応答のヘッダを設定できなくなります。バッファの詳細については、"エラーの処理"を参照してください。

また、呼び出されたページは、request オブジェクトを使用して呼び出し側ページに情報を返すことができます。たとえば、呼び出されたページは何かの値を決定して、setAttribute メソッドを使用してそれを request オブジェクトに書き込むことができます。呼び出し側ページに制御が戻ったとき、呼び出し側ページは request オブジェクトの getAttribute メソッドを使用してその情報にアクセスできます。

JSP 出力のバッファ

既定では、JRun は JSP からクライアントに送信された出力データをバッファに入れます。バッファを使用しているため、応答ヘッダ情報およびその他の出力はバッファがフラッシュされるまではクライアントに送信されません。このフラッシュは、次のいずれかが生じたときに行われます。

また、jsp:forward アクションを呼び出すか、response オブジェクトの redirect メソッドを使用して要求を転送した場合にもバッファは消去されます。このルールの唯一の例外は、順方向の JSP によって設定されたクッキーが破棄されず、クライアントに送信されることです。バッファが無効になっていても要求を転送できますが、それはまだクライアントに何も返していない場合に限られます。

バッファを使用しているため、ヘッダに依存する操作は、flush メソッドを実行してヘッダをクライアントに送信するまでは無効になります。


メモ

バッファを無効にするか、または JSP の出力バッファのサイズを設定するには、JSP ディレクティブを使用します。page ディレクティブの詳細については、第 8 章を参照 してください。


タグ ライブラリの使用

JSP は JSP タグと、一般的には HTML であるテンプレート テキストを含み、オプションとしてタグ ライブラリにあるカスタム タグを含めることができます。タグ ライブラリを使用すれば、自分の JSP、社内のほかのユーザ、または顧客が使用するカスタム タグを実装することによって、使用できるタグのセットを拡張できます。

JSP で使用するタグ ライブラリを宣言するには、JSP でtaglib ディレクティブを使用します。ライブラリを識別するには、taglib ディレクティブ内で、タグ ライブラリへのパスと、ページ内で使用するタグ接頭辞を指定します。たとえば、次のステートメントでは、接頭辞 myTags によって参照されるタグ ライブラリが定義されます。

<%@ taglib uri="/myApp/appTags" prefix="myTags" />

タグ ライブラリが見つからない場合、JRun では致命的な変換エラーが発生します。JSP 内で接頭辞 myTag を使用する別のタグ ライブラリを定義した場合にもエラーが発生します。

taglib ディレクティブの後で、接頭辞 myTags を使用してタグ ライブラリ内のタグを参照できます。次のステートメントでは、タグ ライブラリ内の coolTag を使用します。

<myTags:coolTag>
...
</myTags:coolTag>

カスタム タグのフォームは、標準 HTML または JSP タグのどのようなフォームでもかまいません。言い換えると、1 つ以上の必須パラメータまたはオプション パラメータを取ることができます。また、タグ本文を指定することもできます。一般的に、タグ ライブラリはその中に含まれているタグを記述する何らかのドキュメントを含んでいます。

タグ ライブラリの作成

JSP でカスタム タグを使用できますが、Java でカスタム タグを開発するにはサーブレット API バージョン 2.2 仕様を使用します。第 22 章 にはカスタム タグおよびタグ ライブラリの作成についての情報が含まれています。

エラーの処理

JSP のエラーは、JSP ライフサイクル内の 2 つのポイントで発生します。

このセクションでは、そのようなエラーを処理する方法について説明します。

変換エラー

JSP の JSP ソース ファイルから Java クラス ファイルへの変換は、まず Web サーバーがこのファイルに対する最初の要求を受け取ったときに行われます。その後は、ページの最後の変換以降に JSP ソース コード ファイルが変更されたことが検出されたときに変換が行われます。


メモ

JRun 管理コンソールから、それぞれの JSP について、変更された JSP の再変換を有効 または無効にすることができます。詳細については、『JRun セットアップ ガイド』を参照してください。


変換が失敗した場合、クライアントの要求が失敗し、対応するエラー メッセージが返されます。たとえば、変換エラーを検出すると、エラー ステータス コード 500 (サーバー エラー) を返します。

要求処理エラー

クライアント要求の処理中に、JSP の .class ファイル、または JSP の .class ファイルから呼び出されたコード内で実行時エラーが発生することがあります。要求処理エラーは、Java プログラミング言語の例外メカニズム、および JSP の exception オブジェクトを使用してエラーを知らせることによって実装されます。


メモ

エラーの表現フォーマットは、その JSP のために選択したスクリプト言語から独立して います。


要求処理エラーは、それが生成された JSP で捕捉および処理されます。しかし、page ディレクティブを使用してエラー ページを指定することもできます。これは、例外を処理する JSP です。この場合、JSP から捕捉されなかった例外が返されたとき、例外とクライアント要求がエラーページに転送されます。エラー ページを指定しない場合、捕捉されなかった例外が送られると JRun はクライアントにエラー ステータス コード 500 (サーバー エラー) を返します。

エラー ページとして使用する JSP は、JSP の page ディレクティブを使用して isErrorPage 属性を設定する必要があります。エラーを生成した JSP は、そのエラーをエラー ページへ転送するとき、エラー ページの JSP exception オブジェクトを生成されたエラーに設定します。

page ディレクティブの詳細については、116 ページの「page ディレクティブ」を参照してください。exception オブジェクトの詳細については、第 9 章を参照してください。

次の例では、errhand.jsp という名前が付けられたエラー ページに例外を転送する JSP を作成します。存在しない JSP をインクルードしようとすると errortest.jsp ページで例外が発生します。errortest.jsp の定義は次のとおりです。

<%@ page errorPage="errhand.jsp"%>
<html>
<head><title>Error Test Page</title></head>
<body>
<-- 存在しないページをインクルードすることによって例外を発生させる -->
<jsp:include page="xxxxx.jsp" flush="true"/>

</body>
</html>

errhand.jsp の定義は次のとおりです。

<%@ page isErrorPage="true" %>
<P>
<HR>There was an error.
<P>

<%-- エラー メッセージを取得し、出力します。--%>
<B>ERROR:</b><BR>
<%
  String sErrMessage = exception.getMessage();
  out.println(sErrMessage);
%>

<%-- 例外の記述を取得し、出力します。--%>
<B>DESCRIPTION:</b><BR>
<%
  String sErrDescr = exception.toString();
  out.println(sErrDescr);
%>

</body>
</html>

JSP コンパイラの使用

JSP コンパイラは、JRun が JSP を Java クラス ファイルにコンパイルするために使用する Java ツールです。JRun には、このコンパイラの 2 つのバージョンが含まれています。最初のバージョン、JSP コンパイラは、JRun が JSP へのクライアント要求を処理するときにコンパイルを実行します。2 番目のバージョンの JSPC コンパイラは、JSP をオフラインで、言い換えると Web サーバーのコンテキストの外でコンパイルできるコマンドライン ツールです。

これらのコンパイラの詳細については、第 10 章を参照してください。