前へ     目次     索引     DocHome     次へ     
iPlanet Application Server 開発者ガイド



第 3 章   JavaServer Pages によるアプリケーションページの表示


この章では、JSP (JavaServer Pages) を iPlanet Appllication Server Web アプリケーションのページテンプレートとして使う方法について説明します。

この章には次の節があります。



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 として最適に動作します。

JSP :

<html><head><title>Feedback</title></head><body>
<h1>The name you typed is:<% request.getParameter("name"); %>.</h1>
</body></html>

Servlet :

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 ファイルで使うためのショートカットがあり、一般に <% で始まり、%> で終わります。



これらのショートカットは XML ファイルでは有効ではありません。



空の要素、つまり開始タグと終了タグの間に何もないタグ構成は、/> で終わる 1 つのタグに省略できます。次に例を示します。

本体のない Include タグ :

<jsp:include page="/corporate/banner.jsp"></jsp:include>

本体のない Include タグの省略 :

<jsp:include page="/corporate/banner.jsp" />

通常、空白は重要ではありませんが、開始タグと任意の属性との間には空白文字を入れる必要があります。たとえば、<%= myExpression %> は有効ですが、<%=myExpression %> は無効です。


エスケープ文字

属性で、入れ子の単一引用符および二重引用符の扱いが困難な場合は、次のようなエスケープ文字を使います。

  • ' は ¥' で囲む

  • " は ¥" で囲む

  • %>%¥> で囲む

  • <%<¥% で囲む


コメント

JSP には次の 2 種類のコメントがあります。

  • ページの動作を文書化する、JSP ページへのコメント

  • クライアントに送信される、ドキュメントに生成されたコメント


JSP コメント
JSP コメントは <%----%> で囲み、 --%> を除く任意のテキストを含めることができます。したがって、次の例は誤りです。

<%-- 閉じる以外の操作 --%> ... --%>

また、Java コメントを使って JSP にコメントを配置する方法もあります。次のようにします。

<% /** これはコメントです ... **/ %>


クライアントへの出力でのコメントの生成
レスポンス出力ストリーム内でリクエストを出したクライアントへのコメントを生成するには、次の例のような HTML および XML コメントシンタックスを使います。

<!-- コメント ... -->

JSP エンジンは、解釈されていないテンプレートテキストとしてコメントを扱います。生成されたコメントがダイナミックデータを持つ場合、このダイナミックデータは、次の例のような expression シンタックスを使って取得します。

<!-- コメント <%= expression %> さらにコメント ... -->


ディレクティブ

ディレクティブを使って JSP にプリファレンスを設定します。各ディレクティブには、JSP の動作や状態に影響を与える多くの属性があります。

<%@ directive { attr="value" }* %>

有効なディレクティブは次のとおりです。


<%@ 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 に有効な属性を示します。


表 3-1    JSP の page ディレクティブ 

属性

有効な値

説明

language  

java  

デフォルトはjava。この JSP を記述する言語。現在、iPlanet Application Server がサポートしているのは java のみ  

extends  

有効な Java クラス名  

この JSP に特定のスーパークラスを定義する。これはいろいろな意味で JSP エンジンを制限するので、できるかぎり避ける必要がある  

import  

カンマで区切られている有効な Java クラス名のリスト  

この JSP のほかのメソッドで使用可能なタイプおよびクラス。これは、Java クラスの import ステートメントと同じ

import ディレクティブは、JSP ファイルに複数個指定できる唯一のディレクティブである  

session  

true または false  

デフォルトはtrue。ページが HTTP セッションを共有する必要があることを示す。language=java および session=true の場合、このオプションは javax.servlet.http.HttpSession タイプのセッションを指したり、作成したりする session と呼ばれる暗黙的変数を作成する  

buffer  

none またはバッファサイズ (単位は KB)  

出力バッファを定義する。none に設定すると、すべての出力が出力ストリーム (PrintWriter オブジェクト) に直接書き込まれる。サイズが指定されている場合にバッファが出力で満杯になると、その内容が出力ストリームに書き出されるか例外が発生する。動作は autoFlush 属性によって決まる  

autoFlush  

true または false  

出力バッファが満杯になったときの動作を決める。true の場合、バッファが満杯になると出力は出力ストリームに書き出される。false の場合、バッファが満杯になると例外が発生する  

isThreadSafe  

true または false  

デフォルトはfalse。このページ内のスレッドの安全性のレベルを示す。この値は JSP エンジンの動作を決定する。true の場合は、JSP インスタンスに対して複数のリクエストが同時に作成されるが、それ以外の場合は、複数のリクエストは順番に処理される。この設定はセッションやコンテキストなどの共有オブジェクトに影響を及ぼさないので、多くの場合は、この設定に関係なく JSP をスレッドセーフにする  

info  

テキスト  

翻訳されたページ内の文字列。そのページ内の Servlet.getServletInfo() メソッドから取得  

errorPage  

JSP エラーページの有効な URL  

この JSP のエラーページ。JSP でなければならない。元のページによってスローされるが検出されない Throwable オブジェクトはエラーページに転送される。エラーページには、検出されなかった例外への参照を持つ exception と呼ばれる暗黙的変数がある。autoFlush=true の場合に、最初の JspWriter のコンテンツが ServletResponse 出力ストリームに書き出されていると (ページの一部がすでにクライアントに送信されている場合など)、あとからエラーページを起動しても失敗することがある  

isErrorPage  

true または false  

デフォルトはfalse。現在の JSP ページが、別の JSP ページの errorPage のターゲットになる可能性があるかどうかを示す。true の場合は、暗黙的変数 exception が定義され、その値は、エラーが発生したソース JSP ページからの問題がある Throwable への参照である  

contentType  

コンテンツタイプ、オプションで charset を持つ  

デフォルトは
text/html;charset=ISO-8859-1
。レスポンスの MIME タイプおよび文字エンコードを定義する。値は TYPE または
TYPE;charset=CHARSET のどちらかの形式
 



<%@ 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  

有効な URL (絶対パス) または URI (相対パス)  

取り込むファイル  

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 ファイルを取り込みます。

baz.jsp が次のタグを含んでいる場合、

<%@include file="who.jsp"%>

システムはファイル install_dir/ias/APPS/MyApps/add/who.jsp を取り込みます。


<%@ taglib... %>

tag library ディレクティブを使うと、カスタムタグを作成できます。カスタムタグの作成方法については、「付加価値機能」を参照してください。


シンタックス
<%@ taglib uri="uriToTagLibrary" prefix="prefixString" %>


属性
表 3-3 に有効な属性を示します。


表 3-3    JSP の <taglib> ディレクティブ

属性

有効な値

説明

uri  

有効な URI (相対パス)  

URI は、アプリケーションのコンテキストルートからの絶対参照、またはタグリブを記述する .tld XML ファイルの相対参照。URI は、Web アプリケーションの JSP 記述子内の <taglib> エントリによってエイリアス指定が解除されるエイリアスにできる。詳細については、JSP v1.1 仕様書の第 5.2 節を参照  

prefix  

文字列  

カスタムタグのプレフィックス  




アプリケーション 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>

JSP ファイルには次のセクションがあります。

<%@ 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 のスクリプトはすべて宣言できます。宣言の結果として、出力ストリームには何も表示されません。


シンタックス
<%! declaration %>



<%! int i=0; %>
<%! String scriptname="myScript"; %>
<%! private void myMethod () { ... } %>


式 <%= ... %>

式の要素は変数を評価します。式の値は式が発生する場所に代入されます。結果は出力ストリームに現れます。

式の結果は、文字列、または結果を文字列にキャストできる式でなければなりません。


シンタックス
<%= expression %>



<p>My favorite color is <%= userBean.favColor %>.</p>


スクリプトレット <%...%>

スクリプトレットの要素は実行するコードブロックを定義します。正しいコードはすべてここに表示されます。


シンタックス
<% script %>



<% 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>

<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 に有効な属性を示します。


表 3-4    <jsp:useBean> の属性  

属性

説明

id  

オブジェクト固有の識別名  

scope  

オブジェクトのライフサイクルは次のどれかになる

  • page: リクエストが 2 ページ以上あってもオブジェクトはこのページだけで有効。このオブジェクトはほかのページに転送されない

  • request: オブジェクトはリクエストオブジェクトにバインドされる (このオブジェクトは getAttribute(name) を使って取得。ここで、name はオブジェクトの id)。したがって、このリクエストが有効であるかぎり使用可能

  • session: オブジェクトはセッションオブジェクトにバインドされる (このオブジェクトは getValue(name) を使って取得。ここで、name はオブジェクトの id)。したがって、このセッションが有効であるかぎり使用可能。この scope を使うには、この JSP をアクティブにする必要がある

  • application: オブジェクトは ServletContext にバインドされる (このオブジェクトは、getAttribute(name) を使って取得。name はオブジェクトの id)。したがって、特に破棄されなければ、このアプリケーションが存在するかぎり使用可能

 

class  

有効な Bean クラス名。存在しない場合は、Bean をインスタンス化するときに使う。type が指定されている場合は、classtype に割り当てる必要がある。beanNameclass の両方を同じ Bean に指定できない  

beanName  

a.b.c (クラス名) または a/b/c (リソース名) 形式の Bean の有効な名前。beanNameclass の両方を同じ Bean に指定できない。beanName 属性は式として要求時に評価される  

type  

Bean 変数 type を定義する。この属性を使うと、変数 type を、指定された実装クラスの変数タイプと区別できる。タイプは、クラス自体、クラスのスーパークラス、または指定されたクラスに実装されたインタフェース。指定されていない場合、値は class 属性の値と同じ  



次の例で、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> の属性

属性

説明

name  

プロパティを設定する Bean の名前。名前は、<jsp:useBean> を使って、ファイル内であらかじめ定義しておく必要がある  

property  

値を設定する Bean プロパティの名前。プロパティは、有効な Bean プロパティでなければならない。property="*" の場合、タグは、リクエストオブジェクトのパラメータを繰り返して、パラメータ名および値のタイプを Bean のプロパティ名およびセッターメソッドタイプと比較し、比較したパラメータの値に対して一致した各プロパティを設定する。パラメータの値が空の場合、対応するプロパティは変更されない。パラメータの以前の値はすべて保持される  

param  

Bean プロパティに与える値を持つリクエストオブジェクトパラメータの名前。param を削除すると、リクエストのパラメータ名は Bean のプロパティ名と同じであると想定される。param がリクエストオブジェクト内に設定されていない場合や空の値を持つ場合は、<jsp:setProperty> アクションによる効果はない。<jsp:setProperty> アクションは、paramvalue のどちらの属性も持たないことがある  

value  

指定されたプロパティに割り当てる値。この属性は式を値として受け入れる。この式は要求時に評価される。<jsp:setProperty> アクションは、paramvalue のどちらの属性も持たないことがある  



この例では、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> の属性

属性

説明

name  

プロパティを取得する Bean の namename は、<jsp:useBean> を使って、ファイル内であらかじめ定義しておく必要がある  

property  

値を取得する 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 ファイルに対応しており、要求時に評価される式を持つ  

flush  

取り込んだページを出力ストリームに書き出すかどうかを判断する  



<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 コンポーネントにパラメータブロックを送信します。個々のパラメータは次のように設定されます。

       <jsp:param name="name" value="value">

    このセクションは、</jsp:params> で終わります。名前および値はコンポーネントに依存します。

  • object または embed がサポートされていないなどの問題でプラグインが起動できない場合、<jsp:fallback> はブラウザのコンテンツを示します。<jsp:plugin> で囲まれた部分で障害が発生すると、このタグの本体がブラウザに表示されます。次のようにします。

       <jsp:plugin ...>
           <jsp:fallback><b>Plugin could not be
           started!</b></jsp:fallback>
       </jsp:plugin>

プラグインが起動しても、アプレットまたは JavaBeans コンポーネントが見つからないか、または起動できない場合は、プラグイン固有のメッセージがユーザに送信されます。このメッセージは、多くの場合、ClassNotFoundException を報告するポップアップウィンドウとして表示されます。


シンタックス
<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> の属性 

属性

説明

type  

コンポーネントのタイプを識別する (bean または applet)  

code  

HTML の仕様に準拠  

codebase  

HTML の仕様に準拠  

align  

HTML の仕様に準拠  

archive  

HTML の仕様に準拠  

height  

HTML の仕様に準拠  

hspace  

HTML の仕様に準拠  

jreversion  

コンポーネントが動作するために必要な JRE の仕様書のバージョン番号を指定する。デフォルトは 1.1  

name  

HTML の仕様に準拠  

vspace  

HTML の仕様に準拠  

title  

HTML の仕様に準拠  

width  

HTML の仕様に準拠  

nspluginurl  

Netscape Navigator の JRE プラグインをダウンロードできる URL。デフォルトは定義済みの実装  

iepluginurl  

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 に暗黙的に使用できるオブジェクトを示します。


表 3-10    すべての JSP に暗黙的に使用できるオブジェクト  

オブジェクト

説明

「Scope」

Java のタイプ

request  

この JSP の実行をトリガしたリクエスト  

request  

プロトコルに従属する javax.servlet.ServletRequest のサブタイプ。例 : javax.servlet.HttpServletRequest  

response  

リクエストに対するレスポンス (例 : 呼び出し側に返されたページとそのパス)  

ページ  

プロトコルに従属する javax.servlet.ServletResponse のサブタイプ。例 : javax.servlet.HttpServletResponse  

pageContext  

JSP のページコンテキスト  

ページ  

javax.servlet.jsp.PageContext  

session  

呼び出し側にセッションオブジェクトが作成されると関連付けられる  

session  

javax.servlet.http.HttpSession  

アプリケーション  

getServletConfig()
getContext() を介した Servlet の設定オブジェクトからの、この JSP の Servlet コンテキスト
 

アプリケーション  

javax.servlet.ServletContext  

out  

出力ストリームに書き込みを行うオブジェクト  

ページ  

javax.servlet.jsp.JspWriter  

config  

この JSP の Servlet 設定オブジェクト (ServletConfig)  

ページ  

javax.servlet.ServletConfig  

ページ  

現在のリクエストを処理しているこのページのクラスのインスタンス  

ページ  

java.lang.Object  

exception  

エラーページ専用の、エラーページを起動する検出されていない Throwable 例外  

ページ  

java.lang.Throwable  

たとえば、 <%= request.getParameter("param"); %> のように、リクエストパラメータの一つを使ってリクエストオブジェクトを参照できます。



高度な JSP プログラミング



この節では、高度なプログラミングテクニックを使うための手順について説明します。この節には次の項があります。


ほかのリソースの取り込み

JSP の重要な特徴は、ほかのページが生成するリソースやその結果を実行時にダイナミックに取り込む機能があることです。スタティック HTML ページのコンテンツを取り込んだり、別の JSP を処理してその結果を出力ページに取り込んだりできます。

たとえば、コーポレートヘッダーおよびフッターは、取り込まれた要素だけを持つページスタブを作成することによって、各ページに取り込むことができます。条件付きの基準に従ってページ全体を取り込めるので、単層型ナビゲーションバーやコーポレートヘッダーを単に挿入するよりもはるかに柔軟性が向上します。

JSP にリソースを取り込むには、次の 2 つの方法があります。

  • <%@ include%> ディレクティブの場合

       <%@ include file="filename" %>

  • <jsp:include> アクションの場合

       <jsp:include page="URI" flush="true|false" />

<%@ include%> ディレクティブを使ってリソースを取り込む場合、そのリソースは、JSP が Servlet にコンパイルされるときに取り込まれます。したがって、このリソースは元の JSP の一部として処理されます。取り込んだリソースも JSP である場合、そのコンテンツは親 JSP とともに処理されます。詳細については、「ディレクティブ」を参照してください。

<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 については、以下のサイトを参照してください。

http://java.sun.com/beans

一般に、Bean ではゲッターメソッドとセッターメソッドを使って、Bean プロパティを取得したり、設定したりします。ゲッターメソッドには getXxx() という名前が付けられます。ここで、Xxxxxx と呼ばれるプロパティです (メソッド名の先頭文字は大文字)。これに対応する 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>

これは ias-web.xml ファイルです。

<?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 の各セクションを説明します。


表 3-11    URL の各セクション 

URL 要素

説明

server:port  

リクエストを処理する Web サーバのアドレスおよびオプションのポート番号  

AppPrefix  

iPlanet Application Server アプリケーションの URL であることを Web サーバに示す。リクエストは iPlanet Application Server の Executive Server に転送される。この要素は、レジストリのエントリ SSPL_APP_PREFIX を使って設定する  

moduleName  

Web モジュールの名前 (この名前はサーバー上で一意であること)  

jspName  

JSP のファイル名。.jsp という拡張子を持つ  

?name=value...  

JSP に対するオプションの name=value パラメータ。request オブジェクトからアクセス可能  

次のようにします。

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 の各セクションを説明します。


表 3-12    URL の各セクション 

URL 要素

説明

server:port  

リクエストを処理する Web サーバのアドレスおよびオプションのポート番号  

servlet  

汎用 Servlet オブジェクトの URL であることを Web サーバに示す  

jspName  

JSP の名前。.jsp という拡張子を持つ  

?name=value...  

JSP に対するオプションの name=value パラメータ。request オブジェクトからアクセス可能  

次のようにします。

http://www.Who.com/servlet/calcMort.jsp?rate=8.0&per=360&bal=180000


Servlet からの JSP の起動

Servlet は、次のどちらかの方法で JSP を呼び出すことができます。

  • RequestDispatcher インタフェースの include() メソッドが、JSP を呼び出し、JSP が返されてから処理を続行する。

  • RequestDispatcher インタフェースの forward() メソッドが、対話の制御を 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}"

             include file="filename"

          taglib uri="uriToTagLibrary"
             prefix="
prefixString"

詳細については、「ディレクティブ」を参照してください。




<%= expression %>

詳細については、「スクリプト要素」を参照してください。


スクリプトレット

<% scriptlet %>

詳細については、「スクリプト要素」を参照してください。


コメント

<%-- コメント --%>       クライアントに渡されない 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:forward page="URL" />

<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 に適合しない

    http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd

    たとえば、prefix 属性へのすべての参照を shortname に変更する必要がある

  • 次の DOCTYPE 要素がない

    <!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 コマンドラインコンパイラを使う場合にこれらの変更が必要です。このコンパイラについては、「JSP のコンパイル : コマンドラインコンパイラ」を参照してください。



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 コマンドのフォーマットは次のとおりです。

jspc [options] jsp_files

jsp_files は次のどちらかになります。

files

コンパイルされる 1 つまたは複数の JSP ファイル

-webapp dir

Web アプリケーションがあるディレクトリ。指定したディレクトリとそのサブディレクトリ内のすべての JSP がコンパイルされる。WAR、JAR、または ZIP ファイルを指定できない。最初に、iasdeploy を使ってオープンディレクトリ構造にそれらのファイルを配置する必要がある

jspc コマンドの基本的な options は次のとおりです。

-q

消音モードを有効にする (-v0 と同じ)。重大なエラーメッセージだけ表示する

-d dir

コンパイル済み JSP の出力ディレクトリを指定する。コンパイルされていない JSP が含まれているディレクトリに基づいてパッケージディレクトリが自動的に生成される。デフォルトのトップレベルディレクトリは jspc が起動されるディレクトリである

-p name

すべての指定済み JSP にターゲットパッケージの名前を指定し、-d オプションによって実行されるデフォルトのパッケージ生成をオーバーライドする

-c name

最初にコンパイルされる JSP のターゲットクラス名を指定する。後続の JSP は影響を受けない

-uribase dir

コンパイルに相対的な URI ディレクトリを指定する。コマンドに一覧表示された JSP ファイルだけに適用され、-webapp で指定された JSP ファイルには適用されない

uriroot に相対的な各 JSP ファイルの場所。指定されない場合、デフォルトは /

-uriroot dir

URI ファイルを解決するルートディレクトリを指定する。コマンドに一覧表示された JSP ファイルだけに適用され、-webapp で指定された JSP ファイルには適用されない

このオプションを指定しない場合は、WEB-INF サブディレクトリにある最初の JSP ページのすべての親ディレクトリを検索する。WEB-INF サブディレクトリを持つ JSP ページにもっとも近いディレクトリが使われる

どの JSP の親ディレクトリにも WEB-INF サブディレクトリがない場合は、jspc が起動されるディレクトリが使われる

-webinc file

-webapp オプションの部分的な Servlet マッピングを作成する。これを -webapp ファイルに貼り付け可能

-webxml file

-webapp オプションの web.xml ファイル全体を作成する

-ieplugin class_id

Internet Explorer の Java プラグイン COM クラス ID を指定する。<jsp:plugin> タグによって使われる

jspc コマンドの高度な options は次のとおりです。

-v[level]

詳細モードを有効にする。level はオプション。デフォルトは 2。可能な level 値は次のとおり

  • 0 - 重大なエラーメッセージのみ

  • 1 - エラーメッセージのみ

  • 2 - エラーおよび警告メッセージのみ

  • 3 - エラー、警告、および情報メッセージ

  • 4 - エラー、警告、情報、およびデバッグメッセージ

-dd dir

コンパイルされる JSP のリテラル出力ディレクトリを指定する。パッケージディレクトリは作成されない。デフォルトは、jspc が起動されるディレクトリ

-mapped

各 HTML 行の write 呼び出しと、JSP ファイルの各行の場所を記述するコメントを生成する。デフォルトでは、すべての隣接した write 呼び出しが結合され、場所のコメントは生成されない

-die[code]

重大なエラーが発生した場合に、JVM を終了し、エラー戻り code を生成する。code がない場合や解析できない場合は、デフォルトで 1 に設定される

-webinc file

-webapp オプションの部分的な Servlet マッピングを作成する。これを -webapp ファイルに貼り付け可能

-webxml file

-webapp オプションの web.xml ファイル全体を作成する

-ieplugin class_id

Internet Explorer の Java プラグイン COM クラス ID を指定する。<jsp:plugin> タグによって使われる

JSP がコンパイルされると、それに対してパッケージが作成されます。パッケージは、install_dir/ias/APPS/appName/moduleName/WEB-INF/compiled_jsp/ にあります。コードを個々のモジュールとして配置する場合、moduleNamemodules です。パッケージ名は、iPlanet Application Server のデフォルトのパッケージプレフィックス名である jsp.APPS で始まる必要があります。

iPlanet Application Server 用に JSP をコンパイルするときは、jspc の基本オプションを使います。iPlanet Application Server では標準の Jasper 命名規則を使わないので、生成されるファイル名、クラス名 (-c)、パッケージ (-p)、およびディレクトリ (-d) を指定する必要があります。

たとえば、fortune.jspfotune.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 には、次のタグリブが用意されています。

  • Query

  • LDAP

  • Conditional

  • Attribute

カスタムタグエクステンションの例については、install_dir/ias/ias-samples/iastags/ ディレクトリのサンプルを参照してください。


データベースクエリタグリブ

クエリタグリブは、リザルトセットをループするループやカラム値を表示する表示タグとともに、JSP ページでの行セットの宣言をサポートします。次の節ではクエリタグリブについて説明します。


useQuery タグ
useQuery タグは使用するリザルトセットを宣言します。useQuery タグは、どのクエリが行われているのか、またどのフィールドが使用可能かを定義します。useQuery が保存するリザルトセットが scope 内にすでに存在する場合、このタグの本体はスキップされます。また、行セットが作成されても無視されます。

リザルトセットが存在しない場合、作成された行セットは、指定された scopeuseQuery タグの id 属性を使って、デフォルトであれば request にエクスポートされます。指定された command が使われたり、queryFile に配置されたクエリが読み込まれたりすることがあります。読み込まれたクエリのファイル名は、queryName 属性に配置されている名前です。名前が指定されていない場合は、タグの id 属性の値になります。行セットが初期化されると、execute タグが指定済みであれば実行されます。ループの外で field タグを使うには、クエリを実行する必要があります。

command 属性に指定されていないファイルからクエリが読み込まれると、そのファイルは QueryLoader クラスによって読み込まれ、キャッシュされます。2 つの属性、queryFilequeryName は連動します。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

すべてのパラメータが、fieldauthenticateauthorize、または 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 つの属性、queryFilequeryName は連動します。queryFile はクエリファイルを検索します。属性の値をファイルへの相対パスで指定すると、このファイルは LDAP.path.query で検索されます。この変数が設定されていない場合は、iPlanet Application Server 固有の GX.path.query プロパティが使われます。このファイルは、JSP に対して相対的に検索できません。クエリファイルは次のようになります。

query name1 is
ldap://directory:389/dc=com?blah

query name2 is
ldap://directory:389/dc=org?blah

query ... 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 の場合は、VirtualListResponsecontentCount に対応する {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 タグをサポートします。これによって、行セットが最後にある場合、ユーザが管理情報だけを必要とする場合、または高度な処理能力を必要とするコンテンツをユーザが要求する場合に対応できます。

ただし、使いやすさと読みやすさを維持するために、次の等価タグを使用できます。

  1. <cond:role> ...</cond:role>

  2. <cond:rowset name="rowset name"> ...</cond:rowset>

  3. <cond:ldap name="ldap connection name"> ...</cond:ldap>

  4. <cond:attribute name="attribute name"> ...</cond:attribute>

  5. <cond:parameter name="parameter name | $REMOTE_USER$"> ...</cond:parameter>

  6. <cond:else> ...</cond:else>

  7. <cond:equals value="..."> ... </cond:equals>

  8. <cond:equalsIgnoreCase value="..."> ... </cond:equalsIgnoreCase>

  9. <cond:exists> ...</cond:exists>

  10. <cond:notEmpty> ...</cond:notEmpty>

  11. <cond:executeNotEmpty> ...</cond:executeNotEmpty>

  12. <cond:isLast> ...</cond:isLast>

  13. <cond:Connected> ...</cond:connected>

  14. <cond:authenticated> ...</cond:authenticated>

必要以上に表現力豊かなコードもあります。次のようにします。

<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 タグの親に渡されます。親は、switchdynamicValue の両方が実行する 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() を使って属性を検索します。値が見つからない場合は、タグの本体が出力されます。formatquery: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 のロードバランスおよびフェールオーバー機能を使うには、次の手順を実行します。

  1. XML 記述子で、ロードバランスを行う各 JSP に GUID を割り当てます。GUID の JSP への割り当てについては、「登録 JSP」を参照してください。

  2. iPlanet Application Server で、システム Servlet JSPRunner および JSPRunnerSticky を使って JSP を実行します。これらの Servlet はインストール時に登録されます。管理ツールを使って、ロードバランスに含めるサーバ全体にこれらのシステム Servlet を分散させます。

  3. System_JSPRunner および System_JSPRunnerSticky の Servlet コンポーネントプロパティを確認します。JSP のロードバランスが行われるすべてのサーバが正しく一覧表示されていることを確認します。

  4. 管理ツールによって Servlet のロードバランスを行うように JSP のロードバランスを実行します。ロードバランスに含めるサーバ全体に JSP を分散します。

  5. Web サーバを再起動します。

アプリケーションコンポーネントの分散およびコンポーネントプロパティの変更については、『管理者ガイド』を参照してください。


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> の間に指定します。

  • <ias:check class="classname" /> は、キャッシュ基準を指定するメカニズムの一つです。classname は、check と呼ばれるメソッドを持つクラスを参照します。これは次のシグネチャを持ちます

    public Boolean check(ServletRequest, Servlet)

    これは、要素がキャッシュされたかどうかを示すブール値を返します。

  • <ias:param name="paramName" value="paramValue" scope="request" /> は、キャッシュ基準を指定する別のメカニズムです。

paramName は属性の名前です。この名前は setAttribute を使ってリクエストオブジェクトまたは URI に渡されます。このパラメータはキャッシュの基準として使われます。

表 3-13 に、paramValue パラメータの値を示します。これは、キャッシュを実行するかどうかを決める値です。


表 3-13    paramValue パラメータの値

制約

説明

x = ""  

x はパラメータまたは属性として存在している必要がある  

x = "v1|...|vk"vi* でもかまわない  

x は任意の文字列 (パラメータ/属性) にマッピングされる。x=* の場合は、x のリクエストパラメータが、キャッシュされたバッファを格納するときに使われた値と同じ値を持つとき、現在のリクエストの制約は true になる  

x = "1-u"1 および u は整数  

x は、[1,u] の範囲内の値にマッピングされる  

この範囲は確認する属性のソースを指定します。範囲に指定できるのは、pagerequest (デフォルト)、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>

Checker は次のように定義されます。

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 日