![]() |
iPlanet Application Server 開発者ガイド |
第 3 章 JavaServer Pages によるアプリケーションページの表示
この章では、JSP (JavaServer Pages) を iPlanet Appllication Server Web アプリケーションのページテンプレートとして使う方法について説明します。
JSP の紹介
JSP の紹介
JSP は HTML または XML で書かれたブラウザページです。JSP には Java コードを含めることもできるため、複雑な処理を実行したり、出力に条件を付けたり、アプリケーション内のほかのオブジェクトと通信したりできます。iPlanet Application Server の JSP は JSP 1.1 仕様に準拠しています。この仕様書は install_dir/ias/docs/index.htm からアクセス可能です。install_dir は iPlanet Application Server がインストールされている場所です。iPlanet Application Server アプリケーションでは、JSP はアプリケーションを構成する個々のページです。Servlet から JSP を呼び出してユーザ対話からの出力を処理できます。また、JSP はほかのアプリケーションコンポーネントと同じ方法でアプリケーション環境にアクセスするので、JSP を対話の相手として利用できます。
JSP の機能
JSP は、JSP 要素とテンプレートデータから構成されています。テンプレートデータとは、JSP 仕様書に定義されていないテキストや HTML タグなどのデータのことです。たとえば、最小の JSP は JSP エンジンによる処理が不要なスタティック HTML ページです。iPlanet Application Server は、JSP が最初に呼び出されたときにその JSP を HTTP Servlet にコンパイルします。これにより、JSP を標準オブジェクトとしてアプリケーション環境で使えるようになり、URL を使ってクライアントから JSP を呼び出すことが可能になります。
JSP はサーバ上の Java プロセス内で実行されます。JSP エンジンと呼ばれるこのプロセスは、JSP 固有のタグを解釈し、そのタグが指定するアクションを実行することによってダイナミックコンテンツを生成します。このコンテンツは、それを囲んでいるテンプレートデータとともに出力ページにまとめられ、呼び出したユーザに返されます。
レスポンスオブジェクトには呼び出し側クライアントへの参照が含まれており、JSP は作成したページをここに表示します。RequestDispatcher インタフェースの forward() メソッドを使って Servlet から JSP を呼び出した場合は、forward() メソッドがレスポンスオブジェクトを JSP パラメータとして提供します。クライアントから JSP を直接起動した場合は、呼び出し側クライアントとの関係を管理するサーバがレスポンスオブジェクトを提供します。
どちらの場合も、ページは、レスポンスオブジェクトの参照によってクライアントに自動的に返されるので、それ以上のプログラミングは必要ありません。
特定のアプリケーションの一部ではない JSP を作成できます。このような JSP は汎用アプリケーションの一部であると見なされます。JSP は iPlanet Web Server やほかの Web サーバでも実行可能ですが、このような JSP はアプリケーションデータへのアクセス権を持たないため、使用法は制限されます。
JSP およびほかのアプリケーションコンポーネントはサーバを再起動しなくても実行時に更新できるので、サービスを中断しないでアプリケーションの外観や機能を簡単に変更することができます。詳細は、付録 B 「実行時の注意事項」を参照してください。
JSP の設計
この節では、JSP を記述する際に考慮すべき決定事項について説明します。JSP は Servlet にコンパイルされるので、Servlet の設計上の決定事項は JSP にも関係します。Servlet の設計上の決定事項については、第 2 章「Servlet によるアプリケーションの制御」を参照してください。ページの情報は、タグとページ構成情報から構成されるページレイアウト要素と、ユーザに送信される実際のページ情報から構成されるページコンテンツ要素に大別できます。
ページレイアウトは、ブラウザページの設計と同じように、必要な場所にコンテンツ要素をインターリーブして設計できます。たとえば、ページの一番上に「私たちのアプリケーションにようこそ !」のようなウェルカムメッセージで表示するとします。ユーザの認証後は、そのユーザの名前を使って「私たちのアプリケーションにようこそ、アインシュタインさん !」のようなメッセージを表示できます。
ページレイアウトは単純なタスクであるため、設計上必要な決定事項はむしろ JSP のアプリケーションとの対話方法や JSP の最適化の方法に関係しています。
コンポーネントの選択
コンポーネントの選択
最初の作業は JSP と Servlet のどちらを使うかを判断することです。ページレイアウトを主眼とし、ページを作成するための処理がほとんどない場合は、対話には JSP だけを使います。JSP と Servlet を 1 枚のコインの表と裏と考えてください。JSP のタスクは Servlet でも実行でき、その逆の操作も可能です。しかし、JSP のタスクは JSP に最適化されており、Servlet のタスクは Servlet に最適化されています。Servlet は処理能力と適応性に優れています。また、Servlet は Java ファイルなので Servlet を記述する際は統合開発環境を利用できます。ただし、Java ファイルから HTML の出力を実行すると、println ステートメントが多量に発生します。Printin ステートメントは、手動でコーディングする必要があるため処理が面倒です。それに対し、JSP は HTML ファイルなので、計算や処理タスクの実行には不向きですが、HTML エディタで編集できるので、レイアウト作業に優れています。作業に適したコンポーネントを選択してください。
たとえば、JSP と Servlet の簡単なコンポーネントを比較してみましょう。このコンポーネントは、複雑なコンテンツ生成作業がないため、JSP として最適に動作します。
<html><head><title>Feedback</title></head><body>
<h1>The name you typed is:<% request.getParameter("name"); %>.</h1>
</body></html>import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class myServlet extends HttpServlet {
public void service (HttpServletRequest req,
HttpServletResponse res)
throws ServletException, IOException
{
response.setContentType("text/html");
PrintWriter output = response.getWriter();
output.println("<html><head><title>Feedback</title></head>"
+ "<body>¥n"
+ "<h1>The name you typed is:"
+ req.getParameter("name") + ".</h1>"
+ "</body></html>";
}
}Servlet については、第 2 章「Servlet によるアプリケーションの制御」を参照してください。
メンテナンスの容易さを考慮した設計
各 JSP はほかの任意の JSP を呼び出したり取り込んだりできます。たとえば、汎用のコーポレートヘッダー、標準のナビゲーションバー、左側の目次カラムなどを作成できます。このカラムの各要素は、個別の JSP に入っており、作成されたページごとに取り込まれています。このページは、各サブフレームを読み込むページをダイナミックに決めるフレームセットとして機能する JSP で構成できます。JSP は、Servlet へのコンパイル時またはリクエストの到着時に取り込むこともできます。
移植性を考慮した設計
JSP は、異なるアプリケーションおよび異なるサーバ間で完全に移植できます。特定のアプリケーションデータの知識を保持しないという欠点がありますが、そのようなデータが不要な場合は問題ありません。汎用 JSP を使う例としては、ナビゲーションバーやコーポレートヘッダーおよびフッターのような移植性のあるページ要素があります。これはほかの JSP に取り込まれることを想定しています。再利用可能な汎用ページ要素のライブラリを作成してアプリケーション全体で使ったり、ほかの複数のアプリケーションで使ったりできます。
たとえば、もっとも簡単な汎用 JSP は JSP 固有のタグを持たないスタティック HTML ページです。これよりやや複雑な JSP は、日時の印刷などの一般データを操作したり、リクエストオブジェクトの標準の値セットに基づいたページ構造に変更したりする Java コードを持っています。
例外の処理
検出されていない例外が JSP ファイルで発生すると、iPlanet Application Server では、通常、404 または 500エラーの例外を生成します。この問題を避けるには、<%@ page%> タグの errorPage 属性を設定します。
JSP の作成
JSP は基本的に、スタティック HTML ファイルと同様に作成します。HTML エディタを使ってページを作成したりレイアウトを編集したりできます。ページを JSP にするには生のソースコードの適切な位置に JSP 固有のタグを挿入します。次の節では、HTML ファイルで JSP 固有のタグを使って、JSP要素、ディレクティブ要素、スクリプト要素、アクション要素を含む、JSP を作成する方法について説明します。
一般シンタックス
JSP 1.1 仕様に準拠する JSP は、ほとんどの部分が、HTML と似ていてより厳密な XML シンタックスに従っています。つまり、タグは < と > で囲まれています。構造体には開始タグ (<tag>) および終了タグ (</tag>) があります。タグでは、大文字と小文字が区別されます。たとえば、<tag> は <Tag> や <TAG> とは異なります。JSP タグは通常、標準の HTML タグと同様に、ファイル内の適切な場所に挿入します。たとえば、ユーザ名を格納するパラメータ name がリクエストに含まれている場合、ウェルカムメッセージは次のようになります。
<p>Hello, <%= request.getParameter("name"); %>.</p>
JSP タグ
JSP タグは XML の形式をとる <jsp:tag> の形式を使います。特にスクリプトタグなどの一部のタグには、HTML ファイルで使うためのショートカットがあり、一般に <% で始まり、%> で終わります。
空の要素、つまり開始タグと終了タグの間に何もないタグ構成は、/> で終わる 1 つのタグに省略できます。次に例を示します。
<jsp:include page="/corporate/banner.jsp"></jsp:include>
<jsp:include page="/corporate/banner.jsp" />
通常、空白は重要ではありませんが、開始タグと任意の属性との間には空白文字を入れる必要があります。たとえば、<%= myExpression %> は有効ですが、<%=myExpression %> は無効です。
エスケープ文字
属性で、入れ子の単一引用符および二重引用符の扱いが困難な場合は、次のようなエスケープ文字を使います。
JSP コメント
JSP コメントは <%-- と --%> で囲み、 --%> を除く任意のテキストを含めることができます。したがって、次の例は誤りです。また、Java コメントを使って JSP にコメントを配置する方法もあります。次のようにします。
クライアントへの出力でのコメントの生成
レスポンス出力ストリーム内でリクエストを出したクライアントへのコメントを生成するには、次の例のような HTML および XML コメントシンタックスを使います。JSP エンジンは、解釈されていないテンプレートテキストとしてコメントを扱います。生成されたコメントがダイナミックデータを持つ場合、このダイナミックデータは、次の例のような expression シンタックスを使って取得します。
<!-- コメント <%= expression %> さらにコメント ... -->
ディレクティブ
ディレクティブを使って JSP にプリファレンスを設定します。各ディレクティブには、JSP の動作や状態に影響を与える多くの属性があります。<%@ directive { attr="value" }* %>
<%@ page%>
<%@ page%>
page ディレクティブは JSP のページレベルのプリファレンスを設定します。
シンタックス
<%@ page language="java"
extends="className"
import="className{,+}"
session="true|false"
buffer="none|sizeInKB"
autoFlush="true|false"
isThreadSafe="true|false"
info="text"
errorPage="jspUrl"
isErrorPage="true|false"
contentType="mimeType{;charset=charset}"
%>
属性
表 3-1 に有効な属性を示します。
例
<%@ page errorpage="errorpg.htm" %>
<%@ page import="java.io.*,javax.naming.*" %>
<%@ include%>
include ディレクティブを使うと、JSP を Servlet にコンパイルするときに、ほかの JSP (またはスタティックページ) を取り込むことができます。このリソースは JSP の一部として扱われます。ほかのリソースを取り込むためには、要求時にリソースを取り込む <jsp:include> アクションを使う方法もあります。ファイルを取り込む方法については、「ほかのリソースの取り込み」を参照してください。
シンタックス
<%@ include file="file" %>
属性
表 3-2 に有効な属性を示します。
表 3-2    JSP の include ディレクティブ
属性
有効な値
説明
file 属性は、現在の JSP の相対パス、またはアプリケーションのコンテキストルートの絶対パスになります。相対 file 属性の場合は、ファイル名をスラッシュ ('/') で始めないでください。絶対 file 属性の場合は、ファイル名をスラッシュ ('/') で始める必要があります。
例
who.jsp がアプリケーション MyApp 内にある場合 (通常は install_dir/ias/APPS/MyApp に置かれている)、who.jsp には次のタグが含まれています。<%@include file="/add/baz.jsp"%>
次に、システムは install_dir/ias/APPS/MyApp/add/baz.jsp から baz.jsp ファイルを取り込みます。
システムはファイル install_dir/ias/APPS/MyApps/add/who.jsp を取り込みます。
<%@ taglib... %>
tag library ディレクティブを使うと、カスタムタグを作成できます。カスタムタグの作成方法については、「付加価値機能」を参照してください。
シンタックス
<%@ taglib uri="uriToTagLibrary" prefix="prefixString" %>
属性
表 3-3 に有効な属性を示します。
例
アプリケーション MyApp 内の次のような JSP ファイル who.jsp と、それに対応する次のような Web アプリケーションセクションを持つ XML 配置記述子ファイルがあるとします。<taglib>
<taglib-uri> http://www.mytaglib.com/spTags </taglib-uri>
<taglib-location> /who/add/baz.tld</taglib-location>
<taglib><%@ taglib uri="http://www.mytaglib.com/spTags" prefix="mytags" %>
<mytags:specialTag attribute="value"> ...</mytag:specialTag>JSP エンジンは web app 記述子の内部で、http://www.mytaglib.com/spTags と一致するタグリブの場所を検出します。エンジンは /who/add/baz.tld を探します。つまり、XML ファイル install_dir/ias/APPS/MyApp/who/add/baz.tld を探します。これは、このファイルで使われているタグを記述するタグリブ記述子ファイルです。
URI、つまりタグリブの場所 (URIがエイリアス指定されている場合) を相対パスにすることもできます。この場合、現在のディレクトリを基準に .tld ファイルが検索されます。詳細については、JSP 仕様書 バージョン 1.1 の第 5.2 節を参照してください。
スクリプト要素
スクリプト要素は次のタグから構成されています。
宣言 <%! ... %>
スクリプトには、リクエスト/レスポンスオブジェクトを含む複数の暗黙的オブジェクトを使用できます。暗黙的オブジェクトについては、「暗黙的オブジェクト」を参照してください。
宣言 <%! ... %>
宣言の要素は、JSP 全体で使われる有効な変数を定義します。宣言が完全であるかぎり、メソッドなどの、正しい Java のスクリプトはすべて宣言できます。宣言の結果として、出力ストリームには何も表示されません。
例
<%! int i=0; %>
<%! String scriptname="myScript"; %>
<%! private void myMethod () { ... } %>
式 <%= ... %>
式の要素は変数を評価します。式の値は式が発生する場所に代入されます。結果は出力ストリームに現れます。式の結果は、文字列、または結果を文字列にキャストできる式でなければなりません。
例
<p>My favorite color is <%= userBean.favColor %>.</p>
スクリプトレット <%...%>
スクリプトレットの要素は実行するコードブロックを定義します。正しいコードはすべてここに表示されます。
例
<% int balance = request.getAttribute("balance");
if (balance < LIMIT) {
println (UNDERLIMIT_ALERT);
}
String balString = formatAsMoney(balance);
%>
Your current balance is <%= balance %>.
アクション
アクションは、ほかの JSP の取り込み、必要なプラグインの指定、JavaBeans の作成や読み込み、Bean プロパティの設定や取得などのアクティビティを実行します。要求時の式をパラメータとして許可するアクションでは、これらの属性の値をダイナミックにリクエストに設定できます。式をパラメータとして許可する属性には、<jsp:setProperty> の value および name 属性と <jsp:include> および <jsp:forward> の page 属性があります。
<jsp:useBean> は JavaBeans を作成したり、アクセスしたりする
<jsp:setProperty> は Bean のプロパティを設定する
<jsp:getProperty> は Bean のプロパティを取得する
<jsp:include> は要求時にほかの JSP または HTML ページを取り込む
<jsp:forward> は別の JSP に実行の制御権を渡す
<jsp:plugin> は特別なデータタイプのブラウザプラグインをダイナミックに読み込む
<jsp:useBean>
<jsp:useBean> アクションは指定された名前 (id) と scope を持つ JavaBeans を検出します。Bean が存在する場合はこのアクションを使用できますが、存在しない場合は、入力された名前、scope、およびタイプ/クラスの情報を使って作成されます。アクションが成功したらそのオブジェクトにアクセスできるように、属性 id="name" で指定する name と呼ばれる変数を JSP で使用できます。<jsp:useBean> は <jsp:useBean .../> のように空のタグにできます。または、ほかのアクションを含めたり、終了タグ </jsp:useBean> で終了することもできます。通常ここに表示されるアクションは、主に新規作成された Bean のプロパティを設定する <jsp:setProperty> アクションです。テンプレートテキスト、ほかのスクリプト、宣言などは正常に処理されます。<jsp:useBean> タグボディは、Bean 作成時に一度だけ実行されます。
<jsp:useBean> アクションには必ず固有の id="name" 属性を指定します。アクションがオブジェクトの作成やアクセスに成功した場合、この名前によって、JSP 細部のスクリプトタグでもこのオブジェクトを使用できます。
シンタックス
<jsp:useBean id="name" scope="scope"
class="className" |
class="className" type="typeName" |
beanName="beanName" type="typeName" |
type="typeName">
// optional body
</jsp:useBean>
属性
表 3-4 に有効な属性を示します。
例
次の例で、com.iplanet.myApp.User タイプで currentUser という名前の Bean の作成、または既存の Bean へのアクセスを示します。<jsp:useBean id="currentUser" class="com.iplanet.myApp.User" />
この例では、オブジェクトがこのセッションに存在します。その場合、オブジェクトには WombatType を持つローカル名 wombat が指定されます。このオブジェクトのクラスが正しくない場合は、ClassCastException が発生する可能性があり、オブジェクトが定義されていない場合は、InstantiationException が発生する可能性があります。
<jsp:useBean id="currentUser"
type="com.iplanet.myApp.User"
scope="session" />詳細については、「例」を参照してください。
<jsp:setProperty>
<jsp:setProperty> アクションは Bean プロパティの値を設定します。<jsp:userBean> タグボディの内側または外側の両方で、Bean プロパティを設定できます。プロパティの値は、式を使って決めたり、リクエストオブジェクトから直接決めたりできます。
シンタックス
<jsp:setProperty name="beanName"
property="propertyName"
param="requestParameter" | value="value"
</jsp:setProperty>
属性
表 3-5 に有効な属性を示します。
表 3-5    <jsp:setProperty> の属性
属性
説明
プロパティを設定する Bean の名前。名前は、<jsp:useBean> を使って、ファイル内であらかじめ定義しておく必要がある
値を設定する Bean プロパティの名前。プロパティは、有効な Bean プロパティでなければならない。property="*" の場合、タグは、リクエストオブジェクトのパラメータを繰り返して、パラメータ名および値のタイプを Bean のプロパティ名およびセッターメソッドタイプと比較し、比較したパラメータの値に対して一致した各プロパティを設定する。パラメータの値が空の場合、対応するプロパティは変更されない。パラメータの以前の値はすべて保持される
Bean プロパティに与える値を持つリクエストオブジェクトパラメータの名前。param を削除すると、リクエストのパラメータ名は Bean のプロパティ名と同じであると想定される。param がリクエストオブジェクト内に設定されていない場合や空の値を持つ場合は、<jsp:setProperty> アクションによる効果はない。<jsp:setProperty> アクションは、param と value のどちらの属性も持たないことがある
指定されたプロパティに割り当てる値。この属性は式を値として受け入れる。この式は要求時に評価される。<jsp:setProperty> アクションは、param と value のどちらの属性も持たないことがある
例
この例では、name および permissions プロパティが次のように設定されています。<jsp:useBean id="currentUser" class="com.iplanet.myApp.User" >
<jsp:setProperty name="currentUser"
property="name"
param="name">
<jsp:setProperty name="currentUser"
property="permissions"
param="permissions">
</jsp:useBean>この例では、プロパティ name の値を、対応するリクエストパラメータに設定します。これらのプロパティは次の name でも呼ばれます。
<jsp:setProperty name="myBean" property="name" param="name" />
<jsp:setProperty name="myBean" property="name"
value="<%= request.getParameter(¥"name¥" %>)" />
<jsp:getProperty>
<jsp:getProperty> アクションは、文字列に変換された Bean プロパティの値を出力ストリームに配置します。
シンタックス
<jsp:getProperty name="beanName"
property="propertyName">
属性
表 3-6 に有効な属性を示します。
表 3-6    <jsp:getProperty> の属性
属性
説明
プロパティを取得する Bean の name。name は、<jsp:useBean> を使って、ファイル内であらかじめ定義しておく必要がある
値を取得する Bean property の名前。property は、有効な Bean プロパティでなければならない。
例
<jsp:getProperty name="currentUser" property="name" />
<jsp:include>
<jsp:include> アクションは、現在のページのコンテキストを保持しながら、要求時に、指定されたページを現在のページに取り込みます。この方法を使うと、取り込まれたページは出力ストリームに書き込まれます。コンパイル時にリソースを取り込む <%@ include%> ディレクティブを使って、ほかのリソースを取り込むこともできます。ファイルを取り込む方法については、「ほかのリソースの取り込み」を参照してください。
シンタックス
<jsp:include page="URI" flush="true|false" />
属性
表 3-7 に有効な属性を示します。
表 3-7    <jsp:include> の属性
属性
説明
ページへの絶対参照または相対参照を取り込む。絶対参照の場合、このフィールドはスラッシュ (/) で始まり、アプリケーションのコンテキストルートがそのルートになる。相対参照の場合、このフィールドは取り込みを実行している JSP ファイルに対応しており、要求時に評価される式を持つ
例
<jsp:include page="/templates/copyright.html" flush="true" />
<jsp:forward>
<jsp:forward> アクションを使うと、現在のページの実行を終了して、現在のページと同じコンテキスト内にあるスタティックリソース、JSP ページ、または Java Servlet への現在のリクエストを実行時にディスパッチできます。このアクションは RequestDispatcher インタフェースの forward() メソッドと同じです。
シンタックス
<jsp:forward page="URL" />
属性
表 3-8 に有効な属性を示します。
表 3-8    <jsp:forward> の属性
属性
説明
取り込むページを指す有効な URL。この属性は要求時に評価される式を含んでいる場合がある。式は有効な URL でなければならない
注 ページ出力が <% page buffer="none" %> を使ってバッファから書き出され、データが出力ストリームにすでに書き込まれている場合、このタグはランタイムエラーになります。
例
<jsp:forward page="/who/handleAlternativeInput.jsp" />次の要素は、ダイナミックな状態に基づいてスタティックページを転送する方法を示しています。
<% String whereTo = "/templates/"+someValue; %>
<jsp:forward page="<%= whereTo %>" />
<jsp:plugin>
<jsp:plugin> アクションを使うと、JSP の作成者は、適切なクライアントブラウザの従属構造体 (object または embed) を含む HTML を作成して、必要に応じて適切な Java プラグインをダウンロードし、アプレットまたは JavaBeans コンポーネントを実行するようにブラウザに指示できます。<jsp:plugin> タグの属性は、要素を表現するための設定データを提供します。<jsp:plugin> タグは、リクエストを出したユーザエージェントの適切な <object> または <embed> タグのどちらかに置換され、レスポンスの出力ストリームに送信されます。
関連する次の 2 つのアクションは<jsp:plugin> アクション内だけで有効です。
<jsp:params> は、アプレットまたは JavaBeans コンポーネントにパラメータブロックを送信します。個々のパラメータは次のように設定されます。
プラグインが起動しても、アプレットまたは JavaBeans コンポーネントが見つからないか、または起動できない場合は、プラグイン固有のメッセージがユーザに送信されます。このメッセージは、多くの場合、ClassNotFoundException を報告するポップアップウィンドウとして表示されます。<jsp:param name="name" value="value">
object または embed がサポートされていないなどの問題でプラグインが起動できない場合、<jsp:fallback> はブラウザのコンテンツを示します。<jsp:plugin> で囲まれた部分で障害が発生すると、このタグの本体がブラウザに表示されます。次のようにします。
- このセクションは、</jsp:params> で終わります。名前および値はコンポーネントに依存します。
<jsp:plugin ...>
<jsp:fallback><b>Plugin could not be
started!</b></jsp:fallback>
</jsp:plugin>
シンタックス
<jsp:plugin type="bean|applet"
code="objectCode"
codebase="objectCodebase"
{ align="alignment" }
{ archive="archiveList" }
{ height="height" }
{ hspace="hspace" }
{ jreversion="jreversion" }
{ name="componentName" }
{ vspace="vspace" }
{ width="width" }
{ nspluginurl="URL" }
{ iepluginurl="URL" } >
{ <jsp:params
<jsp:param name=" paramName" value="paramValue" />
</jsp:params> }
{ <jsp:fallback> fallbackText </jsp:fallback> }
</jsp:plugin>
属性
<jsp:plugin> タグは、その属性の多くを HTML の <applet> および <object> タグから取得します。<applet> は HTML 3.2 で定義されて廃止され、<object> は HTML 4.01 で定義されています。これらのタグについては、HTML 4.01 の公式仕様書を参照してください。http://www.w3.org/TR/REC-html40/
表 3-9 に有効な属性を示します。
表 3-9    <jsp:plugin> の属性
属性
説明
Microsoft Internet Explorer の JRE プラグインをダウンロードできる URL。デフォルトは定義済みの実装
例
<jsp:plugin type="applet"
code="Tetris.class"
codebase="/html" >
<jsp:params>
<jsp:param name="mode" value="extraHard"/>
</jsp:params>
<jsp:fallback>
<p> unable to load Plugin </p>
</jsp:fallback>
</jsp:plugin>
暗黙的オブジェクト
JSP 1.1 仕様書では、すべての JSP に暗黙的に使用できる複数のオブジェクトを定義しています。これらのオブジェクトは、<jsp:useBean> などであらかじめ定義しておかなくても JSP の任意の場所で参照できます。表 3-10 に、すべての JSP に暗黙的に使用できるオブジェクトを示します。
たとえば、 <%= request.getParameter("param"); %> のように、リクエストパラメータの一つを使ってリクエストオブジェクトを参照できます。
高度な JSP プログラミング
この節では、高度なプログラミングテクニックを使うための手順について説明します。この節には次の項があります。
ほかのリソースの取り込み
ほかのリソースの取り込み
JSP の重要な特徴は、ほかのページが生成するリソースやその結果を実行時にダイナミックに取り込む機能があることです。スタティック HTML ページのコンテンツを取り込んだり、別の JSP を処理してその結果を出力ページに取り込んだりできます。たとえば、コーポレートヘッダーおよびフッターは、取り込まれた要素だけを持つページスタブを作成することによって、各ページに取り込むことができます。条件付きの基準に従ってページ全体を取り込めるので、単層型ナビゲーションバーやコーポレートヘッダーを単に挿入するよりもはるかに柔軟性が向上します。
JSP にリソースを取り込むには、次の 2 つの方法があります。
<%@ include%> ディレクティブの場合
<%@ include%> ディレクティブを使ってリソースを取り込む場合、そのリソースは、JSP が Servlet にコンパイルされるときに取り込まれます。したがって、このリソースは元の JSP の一部として処理されます。取り込んだリソースも JSP である場合、そのコンテンツは親 JSP とともに処理されます。詳細については、「ディレクティブ」を参照してください。<%@ include file="filename" %>
<jsp:include> アクションの場合
<jsp:include> アクションを使ってリソースを取り込む場合、リソースは、JSP が呼び出されたときに取り込まれます。詳細については、「アクション」を参照してください。
次の例は、ある JSP からアクセスした場合に、ページの各部分が個々のリソースからどのように提供されるかを示します。このページのソースコードは、リソースを取り込むための方法を示します。スタティックリソースは <jsp:include> アクションを使って取り込まれ、ダイナミックリソースは <%@ include%> ディレクティブを使って取り込まれます。
afterLogin.jsp
<html><head><title>Sample Corporate Page</title></head><body>
<p align="left"><jsp:include page="corpHead.htm" flush="true" /></p>
<%@ include file="navBar.jsp" %>
<hr size="3">
<table border=0><tr>
<td width="25%"><%@ include file="appToc.jsp" %></td>
<td width="75%"><%@ include file="appToc.jsp" %></td>
</tr></table>
<hr>
<p align="left"><jsp:include page="corpFoot.htm" flush="true" /></p>
</body></html>
JavaBeans の使用法
JSP は、JavaBeans をインスタンス化したりアクセスしたりするためのタグをサポートしています。Bean は計算を行ってリザルトセットを取得します。この結果は Bean のプロパティとして格納されます。JSP では、Bean の作成とプロパティの調査が自動的にサポートされます。Bean 自体は、JavaBeans の仕様に従って作成された個々のクラスです。JavaBeans については、以下のサイトを参照してください。
一般に、Bean ではゲッターメソッドとセッターメソッドを使って、Bean プロパティを取得したり、設定したりします。ゲッターメソッドには getXxx() という名前が付けられます。ここで、Xxx は xxx と呼ばれるプロパティです (メソッド名の先頭文字は大文字)。これに対応する setXxx() という名前のセッターがある場合、このセッターは、ゲッター戻り値とパラメータタイプが同じである必要があります。
この機能では標準の JavaBeans をサポートしていますが、EJB は対象外です。JSP から EJB にアクセスする方法については、「ビジネスオブジェクトへのアクセス」を参照してください。JSP 0.92 仕様では、リクエストおよびレスポンスオブジェクトは「暗黙的 Bean」からアクセスしました。JSP 1.1 仕様では、このサポート内容が変更され、リクエストおよびレスポンスオブジェクトを含む複数のオブジェクトを広範囲に、かつ暗黙的に使用できます。詳細については、「暗黙的オブジェクト」を参照してください。
ビジネスオブジェクトへのアクセス
JSP は、実行時に Servlet にコンパイルされるため、すべてのサーバプロセス (EJB を含む) にアクセスできます。Java コードがエスケープタグに埋め込まれている場合に限り、Servlet からのアクセスと同じ方法で、Bean や Servlet にアクセスできます。ここで記述する EJB にアクセスするためのメソッドは、Servlet からのアクセスに使うメソッドと同じです。EJB へのアクセスについては、「ビジネスロジックコンポーネントへのアクセス」を参照してください。
次の例では、カートのリモートインタフェースをインポートし、ユーザのセッション ID を使ってカートへのハンドルを作成して、ShoppingCart という名前の EJB にアクセスする JSP を示しています。
<%@ import cart.ShoppingCart %>;
...
<% // ユーザのセッションおよびショッピングカートを取得します。
ShoppingCart cart = (ShoppingCart)session.getValue(session.getId());
// ユーザがカートを持っていない場合は新規に作成します。
if (cart == null) {
cart = new ShoppingCart();
session.putValue(session.getId(), cart);
} %>
...
<%= cart.getDataAsHTML() %>次の例は、カートのプロクシまたはハンドルを検索する JNDI (Java Naming Directory Interface) の使用法を示しています。
<% String jndiNm = "java:/comp/ejb/ShoppingCart";
javax.naming.Context initCtx;
Object home;
try {
initCtx = new javax.naming.InitialContext;
} catch (Exception ex) {
return null;
}
try {
java.util.Properties props = null;
home = initCtx.lookup(jndiNm);
}
catch(javax.naming.NameNotFoundException e)
{
return null;
}
catch(javax.naming.NamingException e)
{
return null;
}
try {
IShoppingCart cart = ((IShoppingCartHome) home).create();
...
} catch (...) {...}
%>
...
<%= cart.getDataAsHTML() %>
注 上記の getDataAsHTML() のように、ページが受け入れ可能なフォーマットに生データを変換するには、EJB メソッドを指定する必要があります。
JSP の配置
iPlanet Application Server が JSP を配置する方法は 2 つあります。未登録 JSP か 登録 JSP のいずれかで配置します。
未登録 JSP
未登録 JSP は、AppPath 内の対応するディレクトリ構造体 (applicationName/moduleName) にコピーすることによって配置します。これらの JSP は、次のような URL アクセスを使って起動します。http://server:port/AppPrefix/ModuleName/JSPFileName
詳細については、「JSP の起動」を参照してください。
登録 JSP
iPlanet Application Server では、XML を使って JSP を GUID に登録できます。これによって、JSP は、ロードバランスのような iPlanet Application Server の付加価値機能を使用できます。この機能は、Servlet 2.2 仕様に記載されているように、<jsp-file> エントリとともに XML ファイルを使うことによって実行されます。次の XML ファイルは、登録 JSP の配置記述子の例です。これは web.xml ファイルです。
<?xml version="1.0" ?>
<!DOCTYPE web-app>
<web-app>
<display-name> An Example Registered JSP File </display-name>
<Servlet>
<servlet-name>JSPExample</servlet-name>
<jsp-file>JSPExample.jsp</jsp-file>
</servlet>
<servlet-mapping>
<servlet-name>JSPExample</servlet-name>
<url-pattern>/jspexample</url-pattern>
</servlet-mapping>
</web-app><?xml version="1.0" ?>
<ias-web-app>
<Servlet>
<servlet-name>JSPExample</servlet-name>
<guid>{aaaabbbb-A456-161A-8be4-0800203942f2}</guid>
</servlet>
</ias-web-app>この例では、ias-MyApp.xml ファイルに指定された GUID に JSP を登録します。この例では Servlet 名を JSPExample としていますが、.jsp 拡張子は不要です。JSPExample.jsp という Servlet 名にすることも可能です。
この JSP は、次の例のどちらかの URL からアクセスされます。
http://server:port/AppPrefix/ModuleName/JSPExample
http://server:port/AppPrefix/ModuleName/JSPExample.jsp (XML ファイルの servlet-name エントリが JSPExample.jsp の場合に使用)
JSP の起動
JSP は、プログラムで Servlet から起動するか、URL を使ってクライアントから直接アドレス指定することによって起動します。また、JSP を取り込むこともできます。詳細については、「ほかのリソースの取り込み」を参照してください。
URL による JSP の呼び出し
JSP は、アプリケーションページにリンクとして埋め込まれている URL を使って呼び出すことができます。この節では、標準の URL を使って JSP を起動する方法について説明します。
特定のアプリケーションでの JSP の起動
特定のアプリケーションの一部である JSP は次のようにアドレス指定します。http://server:port/AppPrefix/ModuleName/jspName?name=value
表 3-11 で、URL の各セクションを説明します。
URL 要素
説明
iPlanet Application Server アプリケーションの URL であることを Web サーバに示す。リクエストは iPlanet Application Server の Executive Server に転送される。この要素は、レジストリのエントリ SSPL_APP_PREFIX を使って設定する
http://www.mycompany.com/BookApp/OnlineBookings/directedLogin.jsp
JSP の汎用アプリケーションの使用には、Servlet の汎用アプリケーションの使用と同様の要件と制限があります。XML ファイルが登録されている Default と呼ばれるアプリケーションが必要です。/servlet/ エントリを使って Servlet または JSP にアクセスする URL リクエストは、汎用アプリケーション Default に送信されます。この要件については、「汎用アプリケーション Servlet の起動」を参照してください。
汎用アプリケーションでの JSP の起動
特定のアプリケーションの一部でない JSP は次のようにアドレス指定されます。http://server:port/servlet/jspName?name=value
表 3-12 で、URL の各セクションを説明します。
http://www.Who.com/servlet/calcMort.jsp?rate=8.0&per=360&bal=180000
Servlet からの JSP の起動
Servlet は、次のどちらかの方法で JSP を呼び出すことができます。
RequestDispatcher インタフェースの include() メソッドが、JSP を呼び出し、JSP が返されてから処理を続行する。
これらのメソッドについては、「クライアントへの結果の配信」を参照してください。public class ForwardToJSP extends HttpServlet
{
public void service (HttpServletRequest req,
HttpServletResponse res)
throws ServletException, IOException
{
RequestDispatcher rd = req.getRequestDispatcher("/test.jsp");
rd.forward(req, res);
}
}
JSP 1.1 タグの要約
次の節では、JSP 1.1 タグの概要について説明します。
ディレクティブ
<%@ page|include|taglib { attr="value" }* %>attr: page language="java"
extends="className"
import="className{,+}"
session="true|false"
buffer="none|sizeInKB"
autoFlush="true|false"
isThreadSafe="true|false"
info="text"
errorPage="jspUrl"
isErrorPage="true|false"
contentType="mimeType{;charset=charset}"taglib uri="uriToTagLibrary"
prefix="prefixString"詳細については、「ディレクティブ」を参照してください。
詳細については、「スクリプト要素」を参照してください。
詳細については、「スクリプト要素」を参照してください。
コメント
<%-- コメント --%> クライアントに渡されない JSP コメント
<!-- コメント --> クライアントに渡される標準 HTML コメント
<% /** コメント **/ %> スクリプトレットにカプセル化されてクライアントに渡さ れる Java コメント詳細については、「コメント」を参照してください。
Bean 関連アクション
<jsp:useBean id="name" scope="scope"
class="className" |
class="className" type="typeName" |
beanName="beanName" type="typeName" |
type="typeName">
// optional body
</jsp:useBean><jsp:setProperty name="beanName"
property="propertyName"
param="requestParameter" | value="value"
</jsp:setProperty><jsp:getProperty name="beanName"
property="propertyName">詳細については、「アクション」を参照してください。
その他のアクション
<jsp:include page="relativeUrl"
flush="true|false" /><jsp:plugin type="bean|applet"
code="objectCode"
codebase="objectCodebase"
{ align="alignment" }
{ archive="archiveList" }
{ height="height" }
{ hspace="hspace" }
{ jreversion="jreversion" }
{ name="componentName" }
{ vspace="vspace" }
{ width="width" }
{ nspluginurl="URL" }
{ iepluginurl="URL" } >
{ <jsp:params
<jsp:param name=" paramName" value="paramValue" />
</jsp:params> }
{ <jsp:fallback> fallbackText </jsp:fallback> }
</jsp:plugin>詳細については、「アクション」を参照してください。
JSP 1.1 用カスタムタグの変更
iPlanet Application Server のカスタムタグは、JSP 1.1 用に変更が必要な場合があります。理由は次のとおりです。
.tld ファイルは次の場所にある DTD に適合しない
JSP コマンドラインコンパイラを使う場合にこれらの変更が必要です。このコンパイラについては、「JSP のコンパイル : コマンドラインコンパイラ」を参照してください。
- http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd
次の DOCTYPE 要素がない
- たとえば、prefix 属性へのすべての参照を shortname に変更する必要がある
- <!DOCTYPE taglib
PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN" "http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd">
JSP のコンパイル : コマンドラインコンパイラ
iPlanet Application Server Service Pack 3 では、Apache Tomcat 3.2 から Jasper JSP コンパイラを使って JSP 1.1 互換のソースファイルを Servlet にコンパイルします。このバージョンの Jasper で使用可能なすべての機能が、iPlanet Application Server 環境で利用できます。
注 Jasper は iPlanet Application Server の必要条件を満たすように変更されているため、iPlanet Application Server とともに提供される Jasper バージョンを使ってください。ほかのバージョンは iPlanet Application Server で動作しません。
開発者は、配置前に JSP コンパイラを使って JSP ファイルのシンタックスチェックを実行できます。また、WAR ファイルをアプリケーションサーバに配置する前に、JSP ファイルを WAR ファイルにプリコンパイルすることもできます。
jspc コマンドラインツールは、install_dir/ias/bin の下にあります。このディレクトリがパスに含まれていることを確認してください。jspc コマンドのフォーマットは次のとおりです。
Web アプリケーションがあるディレクトリ。指定したディレクトリとそのサブディレクトリ内のすべての JSP がコンパイルされる。WAR、JAR、または ZIP ファイルを指定できない。最初に、iasdeploy を使ってオープンディレクトリ構造にそれらのファイルを配置する必要がある
jspc コマンドの基本的な options は次のとおりです。
jspc コマンドの高度な options は次のとおりです。
JSP がコンパイルされると、それに対してパッケージが作成されます。パッケージは、install_dir/ias/APPS/appName/moduleName/WEB-INF/compiled_jsp/ にあります。コードを個々のモジュールとして配置する場合、moduleName は modules です。パッケージ名は、iPlanet Application Server のデフォルトのパッケージプレフィックス名である jsp.APPS で始まる必要があります。
iPlanet Application Server 用に JSP をコンパイルするときは、jspc の基本オプションを使います。iPlanet Application Server では標準の Jasper 命名規則を使わないので、生成されるファイル名、クラス名 (-c)、パッケージ (-p)、およびディレクトリ (-d) を指定する必要があります。
たとえば、fortune.jsp を fotune.java にプリコンパイルするには、次のコマンドを使います。
cd install_dir/ias/APPS/fortune/fortune
jspc -d WEB-INF/compiled_jsp -p jsp.APPS.fortune -c fortune fortune.jsp
fortune.java ファイルとそれぞれのクラスは、次のディレクトリに生成されます。
install_dir/ias/APPS/fortune/fortune/WEB-INF/compiled_jsp/jsp/APPS/fortune
fortune が JSP のパッケージ名であり、iPlanet Application Server では jsp.APPS をプレフィックスとして使うので、fortune.class ファイルのパッケージ名は、jsp.APPS.fortune になります。
注 iPlanet Application Server 6.5 では、Forte For Java Internet Edition 3.0 によって、コンパイルされた Servlet コードをデバッグできます。ただし、コンパイルされていない JSP ページはデバッグできません。
JSP コンパイラのその他のマニュアルは次の Jakarta サイトにあります。
http://jakarta.apache.org/tomcat-4.0/jakarta-tomcat-4.0/jasper/doc/jspc.html
付加価値機能
ここでは、iPlanet の付加価値機能の概要について説明します。
カスタムタグエクステンション
カスタムタグエクステンション
JSP 1.1 仕様は、ユーザ定義のカスタムタグプロトコルをサポートしています。この仕様にタグについての規定はありませんが、iPlanet Application Server では、付加価値機能として JSP 1.1 定義のタグエクステンションプロトコルに従うカスタムタグがサポートされています。詳細については、JSP 1.1 仕様書の第 5 章を参照してください。一部のタグは LDAP およびデータベースクエリをサポートしますが、この仕様では基本的にサポートされないため、それ以外のタグは JSP 内で条件付きでサポートしています。
JSP のページキャッシュをサポートするために、iPlanet Application Server は Cache タグリブとともに配布されます。詳細については、 「JSP ページキャッシュ」を参照してください。
iPlanet Application Server で使われるほかのタグは、GX タグの変換をサポートするために内部使用に限定されています。これらのタグは、GX タグがサポートされている JSP 0.92 ページから JSP 1.1 ページを生成する際に使います。外部使用はできません。
iPlanet Application Server には、次のタグリブが用意されています。
カスタムタグエクステンションの例については、install_dir/ias/ias-samples/iastags/ ディレクトリのサンプルを参照してください。
データベースクエリタグリブ
クエリタグリブは、リザルトセットをループするループやカラム値を表示する表示タグとともに、JSP ページでの行セットの宣言をサポートします。次の節ではクエリタグリブについて説明します。
useQuery タグ
useQuery タグは使用するリザルトセットを宣言します。useQuery タグは、どのクエリが行われているのか、またどのフィールドが使用可能かを定義します。useQuery が保存するリザルトセットが scope 内にすでに存在する場合、このタグの本体はスキップされます。また、行セットが作成されても無視されます。リザルトセットが存在しない場合、作成された行セットは、指定された scope で useQuery タグの id 属性を使って、デフォルトであれば request にエクスポートされます。指定された command が使われたり、queryFile に配置されたクエリが読み込まれたりすることがあります。読み込まれたクエリのファイル名は、queryName 属性に配置されている名前です。名前が指定されていない場合は、タグの id 属性の値になります。行セットが初期化されると、execute タグが指定済みであれば実行されます。ループの外で field タグを使うには、クエリを実行する必要があります。
command 属性に指定されていないファイルからクエリが読み込まれると、そのファイルは QueryLoader クラスによって読み込まれ、キャッシュされます。2 つの属性、queryFile と queryName は連動します。queryFile はクエリファイルを検索します。属性の値が相対パスの場合、この値は RDBMS.path.query パスで検索されます。この変数が設定されていない場合は、iPlanet Application Server 固有の GX.path.query プロパティが使われます。このファイルが JSP に対して相対的に配置されていない場合、クエリファイルは次のようになります。
query name1 [using (ODBC, cdx, iplanet)] is select *
from Who, add where :whereClause
/* :whereClause は、指定されたパラメータ bindOnLoad の例です*/query name2 is select * from Who, add where Who.x = add.y and Who.name = :name
/* :name は、指定されたパラメータの例です */query ... is 構造体を使って指定するクエリは、スペースやタブなどがない空白行で区切ります。
シンタックス
<rdbm:useQuery id="export_name" scope="[page|request|session|application]" command="select * from..."="Who.gxq" queryName="firstQuery"
execute="[true|false]" dataSourceName="jdbc/..." url="odbc:...">...</rdbm:useQuery>
param タグ
param タグは行セットにパラメータを設定します。パラメータの名前は、インデックスか、またはディクショナリに保存されている実際のパラメータ名のどちらかです。bindOnLoad パラメータは、bindOnLoad 以外のパラメータを指定する前に、useQuery タグの本体に存在している必要があります。パラメータの値は、値属性に格納されている値か、または param タグ本体のコンテンツのどちらかです。JSP 1.1 のタグは、一般にネストしないので (<%= ...%>は顕著な例外)、別のクエリからの値にパラメータをバインドする唯一の方法は、param タグの本体に field タグを配置して、param タグがその本体を値として使うようにします。これによって、タグの本体に値を配置できます。param タグが useQuery タグ内に存在する場合は、その親クエリに直接パラメータを設定します。それ以外の場合は、loop タグが行セットを再実行する前に、useQuery タグがエクスポートした行セットにパラメータを設定します。
シンタックス
<rdbm:param query="query-declaration-export-name" name="name-of-parameter" value="value" bindOnLoad="[true|false]" type="[String|Int|Double|Float|BigDecimal|Date|Boolean|Time|Timesta mp"
format="java-format-string for dates">value</rdbm:param>
loop タグ
loop タグはリザルトセットのコンテンツをループします。query 属性は、リザルトセットまたは囲んでいる useQuery タグ内を検索するときに使います。start 属性はループの開始位置の指定に使います。start はパラメータまたは属性を参照するか、定数の整数値を参照します。属性の検索には PageContext.findAttribute() を使います。この値は、開始するレコード番号または last のレコード番号を指定します。これにより、行セットは最後までスクロールされたあと、max 行に戻ります。max 属性は表示する最大レコード数の指定に使います。execute が指定されると、行セットはループ開始前に実行されます。
シンタックス
<rdbm:loop id="export_name" scope="[page|request|session|application]" query="query-declaration-export-name" start="[request-parameter-name|request-attribute-name|last|constant ]"
max="integer-maximum-number-of-rows" execute='{true|false]">...</rdbm:loop>
field タグ
field タグは、リザルトセットの特定のカラムを表示します。query 属性は、それを囲んでいる useQuery タグまたは以前に useQuery タグによってエクスポートされたリザルトセットを検索します。name 属性は表示するカラムの名前を識別します。format 属性は文字列、数値、または日付を適切なタイプにフォーマットできるようにします。urlEncode 属性は、文字列のエンコードに使用できます。カラムが null の場合、field タグの本体が出力されます。
シンタックス
<rdbm:field query="query-declaration-export-name" name="field name"
format="format for doubles" urlEncode="{false/true}">default value</rdbm:field>
close タグ
close タグはシステムリソースを解放します。resource 属性は、エクスポートされたクエリリソース (リザルトセット) を検索し、それに対して close() を呼び出します。
シンタックス
<rdbm:close resource="query-declaration-export-name"/>
execute タグ
execute タグは識別されたクエリを実行します。
シンタックス
<rdbm:execute query="query-declaration-export-name"/>
goRecord タグ
goRecord タグは指定されたクエリを実行し、start 属性によって指定されたレコードにそのリザルトセットを移動します。start は、パラメータ、属性、または定数を参照します。start 属性に last が指定された場合は、リザルトセットを最後のレコードに移動します。
シンタックス
<rdbm:goRecord query="query-declaration-export-name" execute="{false/true}" start="[request-parameter-name|request-attribute-name|last|constant ]">
default start</rdbm:goRecord>
<HTML>
<BODY>
<%@ taglib prefix="rdbm" uri="rdbmstags6_0.tld" %>
<h2>Now let us see</h2>
<rdbm:useQuery id="a" queryFile="dbms/queries.gxq"
dataSourceName="jdbc/cdx">
</rdbm:useQuery>
<rdbm:useQuery id="b" queryFile="dbms/queries.gxq"
dataSourceName="jdbc/cdx">
</rdbm:useQuery><table border=1 cellPadding=3>
<tr><th>name</th><th>phone</th><th>Titles Owned</th></tr>
<rdbm:loop id="loop1" query="a" max="5" execute="true">
<tr>
<td><rdbm:field query="a" name="name"/></td>
<td><rdbm:field query="a" name="phone"/></td>
<td>
<rdbm:param query="b" id="owner" type="Int">
rdbm:field query="a" name="id"/></rdbm:param>
<table border=1 cellPadding=3 width="100%">
<tr><th>title</th><th>price</th><th>artist</th></tr>
<rdbm:loop id="loop2" query="b" max="5"execute="true">
<tr>
<td><rdbm:field query="b" name="title"/></td>
<td><rdbm:field query="b" format="$#,###.00"name="price"/>
</td>
<td><rdbm:field query="b" name="artist"/></td>
</tr>
</rdbm:loop>
</table>
</td>
</tr>
</rdbm:loop>
</table>
</td>
</tr>
</rdbm:loop>
</table>
<rdbm:close resource="a"/>
<rdbm:close resource="b"/>
</BODY>
</HTML>
LDAP タグリブ
LDAP コネクションで問題となる点は、リクエスト固有のコネクションになる可能性が高いことです。つまり、現在のユーザが、そのユーザのデータの LDAP 属性を読み取れるように認証されている唯一のユーザであるということです。この理由から、LDAP 検索の実行に使うコネクションと現在のユーザ間のマッピングをプログラミング可能にする LDAPAuthenticate/Authorize タグを追加する必要があります。LDAP サーバがリモートで、一般認証可能なログインを利用できない場合は、LDAPAuthenticate タグを使います。次の節では LDAP タグリブについて説明します。
authenticate タグ (コネクションとも呼ばれる)
authenticate タグは LDAPTagSearch のコンテキストで動作します。LDAPTagSearch は、findAttribute および query 属性の名前を使って PageContext から取得されるか、または親 useQuery タグを検索し LDAPTagSearch を得ることによって取得されます。url および password 属性は、LDAPTagSearch が保持する LDAPConnection の認証に使われます。url 属性がパラメータを持つ場合、つまり、この属性が標準の ldap://server:portNumber/ LDAP URL セクションのあとに : Who 値を持つ場合は、authenticate タグの本体は各パラメータに対する param タグを含んでいる必要があります。password 属性が指定されていない場合、authenticate タグの本体は password タグも含んでいる必要があります。このタグは、タグの終わりで LDAPTagSearch を認証します。
シンタックス
<ldap:[authenticate|connection] query="name of ldap exported query" url="ldap://..." password="..."> </ldap:[authenticate|connection]>
authorize タグ
authorize タグは LDAPTagSearch のコンテキストで動作します。LDAPTagSearch は、findAttribute および query 属性の名前を使って PageContext から取得されるか、または親 useQuery タグを検索し LDAPTagSearch を得ることによって取得されます。dn 属性は、LDAPTagSearch が保持する LDAPConnection を認証するために使います。dn 属性がパラメータを持つ場合、つまり、属性が内部に : Who 値を持つ場合、authorize タグの本体は各パラメータに対する param タグを含んでいる必要があります。このタグは、タグの終わりで LDAPTagSearch を認証します。
シンタックス
<ldap:authorize query="name of ldap exported query" dn="distinguished name for the user to authorize against"> </ldap:authorize>
param タグ
param タグは LDAP URL にパラメータを設定します。LDAP URL は、authorize タグの url 属性および dn 属性と、field タグおよび useQuery タグの url 属性で指定します。URL の param は、.gxq ファイルのクエリパラメータと同様に、「:」が先頭に付いた Java レベルの識別子です。次のようにします。
ldap://iplanet.com:389/uid=:user,ou=People,dc=iplanet,dc=com
すべてのパラメータが、field、authenticate、authorize、または useQuery タグの終わりで解消される必要があります。389 が LDAP URL の DN セクションの前にあり、Java レベルの識別子ではないので、389 はタグではありません。
param タグ自体に値が指定されていないものとして、param タグの本体は、name 属性によって指定されたパラメータ値になります。
シンタックス
<ldap:param name="parameter name in authenticate userDN or query url" query="name of ldap exported query" value="...">default value</ldap:param>
password タグ
password タグは、authenticate タグのパスワードを設定します。password タグの属性として値が指定されていないものとして、password タグの本体は、param タグと同様にパスワードの値になります。password タグは、authenticate タグ内だけで有効です。
シンタックス
<ldap:password query="name of ldap exported query" value="...">default value</ldap:password>
useQuery タグ
useQuery タグは、LDAP リポジトリの検索に使われる URL を記述します。タグの本体の終わりに、LDAPTagSearch は、id によって指定された名前を使って scope に指定されたレベルのコンテキスト内に配置されます。url プロパティには query の URL が含まれています。この URL は通常、loop タグがループするか、または field タグが表示します。これは、loop タグが本体以外ではパラメータのマッピングを指定できないからです。loop を使って結果の有無を調べると時間がかかります。field タグは URL を指定できるので、クエリを参照する必要はありませんが、参照することもできます。URL はクエリファイルから読み込むこともできます。2 つの属性、queryFile と queryName は連動します。queryFile はクエリファイルを検索します。属性の値をファイルへの相対パスで指定すると、このファイルは LDAP.path.query で検索されます。この変数が設定されていない場合は、iPlanet Application Server 固有の GX.path.query プロパティが使われます。このファイルは、JSP に対して相対的に検索できません。クエリファイルは次のようになります。
query name1 is
ldap://directory:389/dc=com?blahquery name2 is
ldap://directory:389/dc=org?blahquery ... is 構造体を使って指定するクエリは、スペースやタブなどがない空白行で区切ります。
シンタックス
<ldap:useQuery id="exported LDAPTagSearch" scope="[page|request|session|application]" url="ldap://... queryFile="filename for ldap query" queryName="name of the query in the ldap query file" connection="classname of an LDAPPoolManager" authorize="distinguished name for the user to authorize against">...</ldap:useQuery>
loopEntry タグ
loopEntry タグは、複数のエントリを返す検索から生じる一連の LDAPEntries をループします。query 属性は、エクスポートされた LDAPTagSearch を指します。詳細については、「useQuery タグ」 を参照してください。start および end タグは、クエリの loop タグに指定されたとおりに動作します。useVL 属性が true の場合は、VirtualListResponse の contentCount に対応する {id}_contentCount 値がエクスポートされます。loop を経由する各パス上では、現在の LDAPEntry は、id を使って指定された scope でエクスポートされます。pre および jump 属性は、VirtualListControl 構造体内の beforeCount および jumpTo パラメータに対応します。loop が VirtualListControl を使っており、useVL 属性が設定されている場合、返されたエントリのウィンドウは VirtualListControl を使って配置されます。VirtualList の実際の公開ドラフト URL はこの場所です。
シンタックス
<ldap:loop[Entry] id="name of attribute to export loop'd value" scope="[page|request|session|application]" query="name of ldap exported query" start="request variable name" max="number" pre="number of records before jump" jump="value of sort to jump to" useVL="true/false"> </ldap:loop[Entry]>
loopValue タグ
loopValue タグは、LDAPEntry 複数値属性または LDAPSearchResults の最初の LDAPEntry をループします。query 属性は、エクスポートされた LDAPTagSearch を指します。詳細については、「useQuery タグ」 を参照してください。このタグが指定されていない場合、entry 属性は、含まれている loop タグによって指定されたとおりにエクスポートされたエントリを指します。どちらか一方を指定する必要があります。両方を指定することはできません。attribute タグは複数値属性を指定します。start および end タグは、クエリの loop タグに指定されたとおりに動作します。ループを経由する各パス上では、現在の LDAPAttribute 値は、id を使って指定された scope でエクスポートされます。
シンタックス
<ldap:loopValue id="name of attribute to export loop'd value" scope="[page|request|session|application]" query="name of ldap exported query" entry="name of ldap exported entry from loopEntry" attribute="name of attribute to loop through" start="..." max="..."></ldap:loopValue>
field タグ
field タグは、query 属性、url 属性、または entry 属性、および attribute 属性に指定された単一値属性の値を出力します。値が存在しない場合は、field タグの本体が渡されます。field タグの本体が評価されるのは、url がパラメータを持っていて、本体に評価し設定する必要があるパラメータがバインドがある場合、またはマッピングされた値が null の場合にだけです。属性の名前が $DN$ の場合、entry の識別名は field の値として返されます。
シンタックス
<ldap:field query="name of query to use" entry="name of ldap exported entry from loopEntry" url="ldap://..." attribute="name of attribute to display"> </ldap:field>
sort タグ
sort タグは、useQuery タグと連動して、囲んでいるクエリのソート順を設定します。query 属性は、囲んでいる useQuery タグ (sort タグが useQuery タグの本体の外にある場合は、エクスポートされた LDAPTagSearch) を識別します。order 属性は、LDAPSortKey 構造体の keyDescription パラメータで記述されたとおりにソート順を指定します。useQuery タグは、複数のソートをサポートします。ソートは指定された順番で優先順位が付けられます。
シンタックス
<ldap:sort query="name of ldap exported query" order="..."/>
close タグ
close タグはリソースをシステムに返します。resource 属性は、エクスポートされたクエリリソース (LDAPTagSearch) を検索し、それに対して close() を呼び出します。この呼び出しによって、実行中のすべての SearchResults が中断し、コネクションがコネクションプールに戻されます。コネクションがコネクションプールからのものではなく authenticate タグから生じた場合は、そのコネクションで disconnect() を呼び出します。
シンタックス
<ldap:close resource="name of ldap exported query"/>
例
次の例では、LDAP タグと switch タグの両方を使います。switch タグは、多くの場合自明であると想定します。<HTML>
<BODY>
<%@ taglib prefix="cond" uri="condtags6_0.tld" %>
<%@ taglib prefix="ldap" uri="ldaptags6_0.tld" %>
<%@ taglib prefix="attr" uri="attribtags6_0.tld" %>
<cond:parameter name="user">
<cond:exists>
<ldap:query id="c" url="ldap://localhost:389/uid=:user,
ou=People,dc=iplanet,dc=com?cn,mailalternateaddress,mail">
<cond:parameter name="password">
<cond:exists>
<ldap:authenticate query="c"
url="ldap://localhost:389/dc=
com??sub?(uid=:user)">
<ldap:param name="user">
<attr:getParameter name="user" />
</ldap:param>
<ldap:password>
<attr:getParameter name="password" />
</ldap:password>
</ldap:authenticate>
</cond:exists>
</cond:parameter>
<ldap:param name="user"><attr:getParameter name="user" />
</ldap:param>
</ldap:query>
<h2>Hello
<ldap:field query="c" attribute="cn">
No Contact Name for <attr:getParameter name="user" /> in LDAP!
</ldap:field></h2>
<p>
Your main email is:
<blockquote>
<ldap:field query="c" attribute="mail"/>
</blockquote>
Your alternate email addresses are as follows:
<ul>
<ldap:loopValue id="Who" scope="request" query="c" attribute="mailalternateaddress">
<li><attr:get name="foo" scope="request"/>
</ldap:loopValue>
</ul>
<cond:ldap name="c">
<cond:authenticated>
<p>
Your employee number is:
<ldap:field attribute="employeenumber" query="c">
They removed the employee numbers from ldap -- not good!
</ldap:field>
</cond:authenticated>
<cond:else>
<cond:parameter name="password">
<cond:exists>Your specified password is incorrect.Please retry!</cond:exists>
<cond:else>To see your employee id, please specify a 'password' parameter in the url along with your user name!<p></cond:else>
</cond:parameter>
</cond:else>
</cond:ldap>
<p>
<ldap:close resource="c"/>
</cond:exists>
<cond:else>
To see your employee information, please specify a 'user' parameter in the url!
<p>
</cond:else>
</cond:parameter>
</body></html>
次のいずれかの結果が作成されます。
条件タグリブ
cond タグのファミリは、switch タグや case タグをサポートします。これによって、行セットが最後にある場合、ユーザが管理情報だけを必要とする場合、または高度な処理能力を必要とするコンテンツをユーザが要求する場合に対応できます。ただし、使いやすさと読みやすさを維持するために、次の等価タグを使用できます。
<cond:role> ...</cond:role>
必要以上に表現力豊かなコードもあります。次のようにします。<cond:rowset name="rowset name"> ...</cond:rowset>
<cond:ldap name="ldap connection name"> ...</cond:ldap>
<cond:attribute name="attribute name"> ...</cond:attribute>
<cond:parameter name="parameter name | $REMOTE_USER$"> ...</cond:parameter>
<cond:equals value="..."> ... </cond:equals>
<cond:equalsIgnoreCase value="..."> ... </cond:equalsIgnoreCase>
<cond:exists> ...</cond:exists>
<cond:notEmpty> ...</cond:notEmpty>
<cond:executeNotEmpty> ...</cond:executeNotEmpty>
<cond:isLast> ...</cond:isLast>
<cond:parameter name="Who"> ...</cond:parameter>
<cond:switch><cond:value><%= request.getParameter("Who") %></cond:value> ...</cond:switch>
<cond:rowset value="rowset name">
<cond:exists> ...</cond:exists></cond:rowset><cond:rowset value="rowset name">
<cond:case operation="="> ...</cond:case></cond:rowset>優れた表現力がユーザの混乱を招きかねないことを考慮してください。
switch タグ
switch タグは、デフォルトでは単なる値の比較ですが、一般に、DBRowSet が指定するいくつかのコールバックを置き換える RowSet タイプの switch タグとして使われます。switch タグは、特定の case ステートメントが switch ステートメントの条件を満たしているかどうかを調べて、その本体だけをコンテンツページにエクスポートします。
シンタックス
<cond:switch type="[value|role|rowset|ldap|attribute|parameter]" value="constant value, role name, rowset name, etc."> ... </cond:switch>
case タグ
case タグは、オペレーションと、場合によって 2 番目のオペランドを含んでいます。オペランドは、switch タグの条件を満たすかどうかを調べるときに使います。値が必要であっても指定されていない場合に case と switch の組み合わせが使われると、値は囲んでいる cond:dynamicValue タグから取得されます。これにより、case タグはタグインタフェースだけを実装し、JSP をより効率よく構築します。case タグの本体は、case ステートメントが switch ステートメントの条件を満たさないかぎり評価されません。オペレーションが指定されていない場合、オペレーションは else と見なされます。つまり、switch を無条件に満たします。オペレーションが指定されず、switch のタイプが role の場合、オペレーションは equals と見なされます。
switch タイプが特定の場合にだけ意味を持つ case オペレーションもあります。次のようにします。
isLast および notEmpty タグは、switch タイプが ldap (query または entry) および RowSet の場合に有効です。
executeNotEmpty オペレーションは、switch タイプが RowSet の場合にだけ意味を持ちます。
connected および authenticated オペレーションは、switch タイプが ldap の場合にだけ意味を持ちます。
「=、<、>」などのオペレーションは、数値を比較する場合にだけ意味を持ちます。switch および case の値は、Double (必要なら) に変換され、比較されます。
equalsは switch 値の equals メソッドに対して呼び出されますが、equals および equalsIgnoreCase オペレーションは文字列を比較する場合にだけ意味を持ちます。この equals メソッドは、それ自体を文字列 (常に case 値) と比較するオブジェクトによって実装される場合があります。また、notEmpty は、パラメータに 0 以外の長さが指定された場合に、確認として文字列の意味を持ちます。
シンタックス
<cond:case operation="[=|<|>|<=|>=|!=|<>|><|=>|=<|~=|equals|equalsIgnoreCase|e lse|exists|notEmpty|executeNotEmpty|isLast|connected|authenticated| {method-name}]"
value="..."></cond:case>
value タグ
value タグの本体は評価され、value タグの親に渡されます。親は、switch と dynamicValue の両方が実行する IValueContainingTag を実装します。この値は、value タグの属性にも指定できます。ただし、値を指定する場合は、switch または case に値を直接指定することをお勧めします。
シンタックス
<cond:value value="blah">default value</cond:value>
dynamicValue タグ
dynamicValue タグの本体には少なくとも 2 つの要素があります。1 つは、対象となるダイナミック値を構築する value タグです。もう 1 つは、囲んでいる dynamicValue インスタンスから抽出された value 属性を持つ case タグです。dynamicValue タグは次のような value タグを持ちます。<cond:attribute name="Who">
<cond:dynamicValue value="10">
<cond:case operation="<">less than ten</cond:case>
<cond:case operation="=">equal to ten</cond:case>
<cond:case operation=">">greater than ten</cond:case>
</cond:dynamicValue>
</cond:attribute>ステータスレジスタには比較ビットに相当するマシン値がありません。そのため、このオペレーションは 3 回実行されます。
シンタックス
<cond:dynamicValue value="blah"> ... <cond:value/> ... <cond:*case*/> ...</cond:dynamicValue>
例
次の例は、switch の使用法を示しています。最後の 3 つのリンクは、異なる 3 つのタイプの出力を生成します。<%@ taglib prefix="cond" uri="condtags6_0.tld" %>
<cond:parameter name="showHeader">
<cond:equalsIgnoreCase value="true">
h2>Now let us see</h2>
</cond:equalsIgnoreCase>
<cond:dynamicValue>
<cond:value value="false"/>
<cond:equalsIgnoreCase>
I'm not showing a header.Nope, not me!
</cond:equalsIgnoreCase>
</cond:dynamicValue>
<cond:else>
showHeader not specified or illegal value
</cond:else>
</cond:parameter>
Attribute タグリブ
次に、attribute タグリブについて説明します。
getAttribute タグ
getAttribute タグは、指定された scope から抽出された、特定の属性の値を出力します。scope が指定されていない場合は、findAttribute() を使って属性を検索します。値が見つからない場合は、タグの本体が出力されます。format は query:field タグと同様に使います。
シンタックス
<attr:getAttribute name="attributeName" scope="[|page|request|session|application]" format="...">default value</attr:getAttribute>
setAttribute タグ
setAttribute タグは、指定された scope に特定の属性の値を設定します。scope が指定されていない場合は、page と見なされます。この値は、value 属性に指定した値です。値を指定しない場合はタグの本体です。
シンタックス
<attr:setAttribute name="attributeName" value="..." scope="[page|request|session|application]">value</attr:setAttribute >
getParameter タグ
getParameter タグは特定のパラメータの値を出力します。パラメータ値が存在しない場合は、代わりにタグの本体が出力されます。format 属性は query:field タグと同様に使います。
シンタックス
<attr:getParameter name="parameterName" format="urlEncode">default value</attr:getParameter>
getRemoteUser タグ
getRemoteUser タグは Servlet のリモートユーザ名を出力します。
シンタックス
<attr:getRemoteUser>default value</attr:getRemoteUser>
例
詳細については、「LDAP タグリブ」および「条件タグリブ」を参照してください。
JSP ロードバランス
Servlet では、各 Servlet に割り当てられた GUID があるので、ロードバランスを実行できます。すべての iPlanet Application Server インスタンスにわたって Servlet を分散するだけです。ただし、JSP は実行時に iPlanet Application Server によって Servlet に変換され、最初は個々の GUID が割り当てられていません。このため、JSP をブラウザから直接呼び出すときに、Servlet から呼び出す場合と違って、JSP のロードバランスおよびフェールオーバーを実行できません。iPlanet Application Server 6.5 では JSP のロードバランスを個別にサポートしています。ブラウザから直接呼び出される JSP のロードバランスおよびフェールオーバー機能を使うには、次の手順を実行します。
XML 記述子で、ロードバランスを行う各 JSP に GUID を割り当てます。GUID の JSP への割り当てについては、「登録 JSP」を参照してください。
アプリケーションコンポーネントの分散およびコンポーネントプロパティの変更については、『管理者ガイド』を参照してください。iPlanet Application Server で、システム Servlet JSPRunner および JSPRunnerSticky を使って JSP を実行します。これらの Servlet はインストール時に登録されます。管理ツールを使って、ロードバランスに含めるサーバ全体にこれらのシステム Servlet を分散させます。
System_JSPRunner および System_JSPRunnerSticky の Servlet コンポーネントプロパティを確認します。JSP のロードバランスが行われるすべてのサーバが正しく一覧表示されていることを確認します。
管理ツールによって Servlet のロードバランスを行うように JSP のロードバランスを実行します。ロードバランスに含めるサーバ全体に JSP を分散します。
JSP ページキャッシュ
JSP キャッシュと呼ばれる新しい機能は、JSP を合成するときに役立ちます。これによって、Java エンジンの内部で JSP をキャッシュする機能が提供されます。この機能によって、マスタ JSP に複数の JSP (ポータルページなど) を取り込むことができます。各 JSP に異なるキャッシュ基準を使ってキャッシュできます。たとえば株式相場を表示するウィンドウや気象通報を表示するウィンドウなどを含んでいるポータルページでは、株式相場のウィンドウを 10 分間キャッシュし、気象情報のウィンドウを 30 分間キャッシュするというように設定できます。JSP キャッシュはリザルトキャッシュへの追加機能です。JSP は、それぞれに異なるキャッシュ基準を持つ複数の JSP から構成できます。構成された JSP は、GUID とともにリザルトキャッシュを使って KXS 内にキャッシュできます。詳細については、「登録 JSP」を参照してください。
注 JSP 内で HttpServletRequest から拡張した独自のリクエストオブジェクトを使用するときに、Jasper JSP コンパイラを使用する場合、CacheLib.tld から提供される JSP キャッシュは、その JSP では利用できません。
JSP キャッシュには JSP 1.1 で提供されているカスタムタグリブのサポートを使います。キャッシュ可能な一般的な JSP ページは次のとおりです。
<%@ taglib prefix="ias" uri="CacheLib.tld"%>
<ias:cache>
<ias:criteria timeout="30">
<ias:check class="com.iplanet.server.servlet.test.Checker"/>
<ias:param name="y" value="*" scope="request"/>
</ias:criteria>
</ias:cache>
<%! int i=0; %>
<html>
<body>
<h2>Hello there</h2>
I should be cached.
No? <b><%= i++ %></b>
</body>
</html><ias:cache> および </ias:cache> タグはキャッシュの各制約条件を区切ります。<ias:criteria> タグはタイムアウト値を指定し、別のキャッシュ基準を囲みます。キャッシュ基準は <ias:check> と <ias:param> の両方のタグを使って表現できます。タグのシンタックスは次のとおりです。
<ias:criteria timeout="val" > は、キャッシュされた要素のタイムアウトを秒単位で指定します。キャッシュ基準は、このタグと終了タグ </ias:criteria> の間に指定します。
paramName は属性の名前です。この名前は setAttribute を使ってリクエストオブジェクトまたは URI に渡されます。このパラメータはキャッシュの基準として使われます。<ias:check class="classname" /> は、キャッシュ基準を指定するメカニズムの一つです。classname は、check と呼ばれるメソッドを持つクラスを参照します。これは次のシグネチャを持ちます
<ias:param name="paramName" value="paramValue" scope="request" /> は、キャッシュ基準を指定する別のメカニズムです。
- public Boolean check(ServletRequest, Servlet)
- これは、要素がキャッシュされたかどうかを示すブール値を返します。
表 3-13 に、paramValue パラメータの値を示します。これは、キャッシュを実行するかどうかを決める値です。
表 3-13    paramValue パラメータの値
制約
説明
x は任意の文字列 (パラメータ/属性) にマッピングされる。x=* の場合は、x のリクエストパラメータが、キャッシュされたバッファを格納するときに使われた値と同じ値を持つとき、現在のリクエストの制約は true になる
この範囲は確認する属性のソースを指定します。範囲に指定できるのは、page、request (デフォルト)、session、または application です。
例
次の例はキャッシュされた JSP ページを示しています。<%@ taglib prefix="ias" uri="CacheLib.tld"%>
<ias:cache>
<ias:criteria timeout="30">
<ias:check class="com.iplanet.server.servlet.test.Checker"/>
<ias:param name="y" value="*" scope="request"/>
</ias:criteria>
</ias:cache>
<%! int i=0; %>
<html>
<body>
<h2>Hello there</h2>
I should be cached.
No? <b><%= i++ %></b>
</body>
</html>package com.iplanet.server.servlet.test;
import com.iplanet.server.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class Checker {
String chk = "42";
public Checker()
{
}
public Boolean check(ServletRequest _req, Servlet _serv)
{
HttpServletRequest req = (HttpServletRequest)_req;
String par = req.getParameter("x");
return new Boolean(par == null ? false :par.equals(chk));
}
}この例でキャッシュされた要素は、リクエストのパラメータが x=42 で、y がその要素の保存に使われた値と等しい場合に有効です。<ias:criteria> ブロック内に <ias:param> および <ias:check> の複数の組み合わせを持たせることができます。また、JSP 内に複数の <ias:criteria> ブロックを持たせることもできます。
前へ 目次 索引 DocHome 次へ
Copyright © 2002 Sun Microsystems, Inc. All rights reserved.
最新更新日 2002 年 3 月 6 日