この章では、WebSphereからOracle Application Server OC4JにJavaServer Pages(JSP)を移行する方法について説明します。JSP APIおよびそれがサポートするWebSphereの拡張機能と各種JSPエンジンの詳細を取り上げます。WebSphereからOracle Application ServerにJSPを移行するプロセスの概要については、この章の最後で説明します。この章の内容は次のとおりです。
JavaServer Pagesは、Webサーバーで実行されているアプリケーションから動的なコンテンツを生成する方法として、Sun社によって規定されたテクノロジです。このテクノロジは、Javaサーブレット・テクノロジと密接に結びついています。このテクノロジを使用することで、ユーザーは、Javaコード・スニペットおよび外部JavaコンポーネントへのコールをWebページのHTMLコード(またはXMLなどのその他のマークアップ・コード)内に記述できます。
JSPページは、Javaサーブレットに変換されてから実行されます(通常はオンデマンドで変換されますが、事前に変換される場合もあります)。JSPページは、サーブレットとして、HTTPリクエストを処理し、レスポンスを生成します。JSPテクノロジによって、HTMLタグをサーブレットに埋め込まずに、サーブレットを簡単に記述する方法が提供されます。また、JSPページとサーブレットは完全に相互運用できます。つまり、JSPページにサーブレットの出力を含めたり、JSPページの出力をサーブレットに転送すること、およびサーブレットにJSPページの出力を含めたり、サーブレットの出力をJSPページに転送することができます。
通常、JSPページは次のもので構成されています。
ディレクティブ: インポートおよびインタフェース
宣言: クラス全体の変数およびメソッド
式: 戻り値の置換
スクリプトレット: インラインJavaコード
次に、それぞれについて説明します。
ディレクティブは、コンパイル時の制御タグです。これによって、JSPページをJavaサーブレットにコンパイルする方法をカスタマイズできます。ディレクティブには、次の3つのタイプがあります。
pageディレクティブは、JSPページの最上位に配置されます。このディレクティブの属性は、ページ全体に適用されます。
例:
<%@ page language="java" import="com.mycom.*" buffer="16k" %>
taglibディレクティブは、JSPプロセッサで認識されるタグ・セットを拡張します。このディレクティブには、uriおよびprefixの2つの属性が必要です。
例:
<%@ taglib uri="tag-lib-uri" prefix="tag-prefix" %>
uri属性には、タグ・ライブラリTLD(タグ・ライブラリ・ディスクリプタ)ファイルの場所を指定します。
prefix属性には、独自のカスタム・タグで使用するタグ接頭辞を指定します。
例:
<%@ taglib uri="/WEB-INF/tlds/myapp.tld" prefix="custom" %>
JSPコンテナは、JSPファイルとサーブレットの保存、JSPファイルからサーブレットへの変換、サーブレットのコンパイル、およびサーブレットの実行(HTMLの作成)を実行するソフトウェアです。JSPコンテナは、厳密には実装ごとに構成が異なりますが、1つのサーブレットまたはサーブレットの集合で構成されています。JSPコンテナは、サーブレット・コンテナによって実行されます。
JSPコンテナによって、各JSPファイルからサーブレットが作成され、コンパイルされます。また、JSPファイルごとに次の2つのファイルが生成されます。
.java
ファイル: サーブレットのJava言語コードが含まれています。
.class
ファイル: コンパイルされたサーブレットです。
.java
および.class
ファイルは、JSPコンテナによってコンテナ固有のパスに格納されます。.java
と.class
ファイルのファイル名は同じです。各コンテナで、生成される.java
および.class
ファイルに対してネーミング規則が使用されます。たとえば、WebSphereの場合、simple.jsp
というJSPファイルからは、_simple_xjsp.java
および_simple_xjsp.class
という名前のファイルが生成されます。
ユーザーが、.jsp
ファイル名で終わるURLを使用してJSPページをリクエストします。
URL内の.jsp
ファイル名拡張子が認識されると、Webサーバーのサーブレット・コンテナによってJSPコンテナが起動されます。
JSPコンテナによってJSPページが検索されます。JSPページに対するリクエストが初めての場合は、そのページが変換されます。
この変換では、.java
ファイル内にサーブレット・コードが生成された後、その.java
ファイルがコンパイルされてサーブレットの.class
ファイルが生成されます。
JSPトランスレータによって生成されたサーブレット・クラスによって、javax.servlet.jsp.HttpJspPage
インタフェースを実装するクラス(このクラスは、JSPコンテナによって提供される)がサブクラス化されます。
このサーブレット・クラスは、ページ実装クラスと呼ばれます。このドキュメントでは、ページ実装クラスのインスタンスをJSPページ・インスタンスと呼びます。
WebSphere Advanced Edition 3.5.3は、JSP 0.91、JSP 1.0をサポートし、さらに最新のサービス・パックではJSP 1.1もサポートします。ただし、このサポートには下位互換性がありません。
WebSphereでは、JSPの操作モードとして、互換モードと準拠モードの2つを規定しています。互換モードでは、JSP 1.0またはJSP 0.91との互換性を選択できます。たとえば、JSP 0.91との互換モードを選択すると、JSP 1.0やJSP 1.1の機能は使用できません。準拠モードでは、アプリケーションがJSP 1.1に準拠します。
JSPにこれらのモードが必要となるのは、WebSphereが、サポートしているJSP仕様のレベルごとにJSPプロセッサを用意しているためです。各JSPプロセッサはサーブレットであり、Webアプリケーションに追加されることで、そのWebアプリケーションに固有のJSPリクエストをすべて処理できます。使用されるJSPプロセッサは、Webアプリケーションによって異なります。Webアプリケーションにバージョン1.0のJSPが含まれている場合、WebSphereはJSP 1.0用のJSPプロセッサをロードします。これらは、Webアプリケーションの一部として指定されます。
表4-1 JSPプロセッサ
JSPプロセッサ | プロセッサ・サーブレット名 | クラス名 |
---|---|---|
JSP 1.0 |
|
|
JSP 0.91 |
|
|
WebSphereのJSP機能には、WebSphereでのみ利用可能なものがいくつかあります。その内容は次のとおりです。
WebSphereに用意されたバッチJSPコンパイラにより、JSPファイルに対するリクエストへのレスポンスが迅速になります。バッチ・コンパイルのプロセスは、JSP 0.91とJSP 1.0で異なります。
WebSphereには、可変データ用にHTMLテンプレートと呼ばれるJSPの拡張機能が組み込まれています。この拡張機能は、WebSphereのJSPエンジンでサポートされており、表形式のデータを生成する場合に便利です。このテンプレート拡張機能は、次の3つの追加タグで構成されます。
<INSERT>
- 開発者はこのタグを使用すると、プロパティ名とオブジェクト指定子に基づいて値を挿入できます。このオブジェクトは、Bean名、またはリクエスト・オブジェクト内のオブジェクトへの参照です。
<REPEAT>
- 開発者はこのタグを使用すると、Javaコードを埋め込まずに、JSPページにfor
ループをHTML要素として記述することができます。たとえば、可変の結果セットを返すデータベース問合せを繰り返す場合、Javaのfor
ループを埋め込むかわりに、<REPEAT>
タグを使用できます。<REPEAT>
タグには、HTMLタグ付けのブロックが含まれ、さらにそのブロックには<INSERT>
タグおよびコンテンツの書式を設定するHTMLタグが含まれます。<REPEAT>
タグは、開始値から終了値まで反復を行い、終了値に達するか、ArrayIndexOutofBoundsException
がスローされた時点で反復を終了します。<REPEAT>
ブロックの出力は、ブロックが完了するまでバッファリングされます。ブロックが完了する前に例外がスローされた場合、そのブロックには出力が書き込まれません。
<BEAN>
- 開発者はこのタグを使用すると、JSP内のBeanを参照できます。
JSPには、データベースの接続、問合せおよび変更に使用するタグ(それぞれ<DBCONNECT>
、<DBQUERY>
および<DBMODIFY>
)もあります。JSP 1.0では、これらのタグの機能は変更されていませんが、その場所が新しいタグ・ライブラリtsx
に移され、名前もそれぞれ<tsx:dbconnect>
、<tsx:dbquery>
、<tsx:dbmodify>
に変更されました。
WebSphere Advanced Edition 3.5.3には、基本のAPIに対する拡張機能がいくつか用意されています。これらの拡張機能は、可変データ用のタグおよびデータベース・アクセス用のタグとして分類されています。
可変データ用のタグは次のとおりです。
<tsx:repeat>
- これは、前述の<REPEAT>
に類似したタグで、HTML表の作成に便利です。
<tsx:getProperty>
- このタグは、Sun社のJSPタグ<jsp:getProperty>
の拡張機能です。これは<jsp:getProperty>
に類似しており、拡張機能である<tsx:dbquery>
または<tsx:dbmodify>
を使用して作成されたデータベースBeanをイントロスペクトする機能が追加されました。
データベース・アクセス用のタグは次のとおりです。
(これらのタグは、JSPからデータベース接続に接続し、その接続を使用してデータベースの問合せや更新を行う場合に便利です。データベース接続に使用するユーザーIDとパスワードは、ユーザーが要求時に入力するか、JSPファイルにハードコーディングされます。)
<tsx:dbconnect>
- このタグは、JSPページをJDBC経由でデータベースに接続できるようにします。データベース接続を確立する際に、dbconnect
タグを直接使用することはありません。そのかわり、<tsx:dbquery>
タグと<tsx:dbmodify>
タグを使用して、同じJSPファイル内の<tsx:dbconnect>
が参照され、データベースへの接続が確立されます。これは、一連のデータソースの設定を行うアプリケーション・サーバー・レベルでの処理とは異なります。
<tsx:userid>
および<tsx:passwd>
- これらのタグによって、JSPページはユーザーが入力した値を受け付けて、そのデータをリクエスト・オブジェクトに追加できます。このリクエスト・オブジェクトは、Account.jsp
など、データベース接続を要求するJSPファイルからアクセスされます。この2つのタグは、<tsx:dbconnect>
タグ内で使用する必要があります。
<tsx:dbquery>
- このタグは、同じJSPファイル内の<tsx:dbconnect>
タグで指定された情報を使用してデータベースへの接続を確立し、データベースに問い合せて結果セットを返すために使用します。この結果セットは、結果オブジェクトにキャッシュされます。操作の最後に接続が切断されます。
<tsx:dbmodify>:<tsx:dbconnect>
- このタグは、データベースと新たに接続し、データベース表を更新するために使用します。また、このタグは、データベース接続情報を取得し、操作の最後に接続を切断するという点で、<tsx:dbquery>
に類似しています。
Oracle Application Serverには、業界で最速のJSPエンジンの1つが搭載されています。また、Oracle Application Serverでは、グローバリゼーション、SQLJなどの付加価値の高い機能および拡張機能も提供されています。Oracle9iAS 1.0.2.2(Oracle Application ServerのOC4Jを導入した最初のリリース)には、2つのJSPコンテナがありました。オラクル社が開発したコンテナ(旧称OracleJSP)およびIronflare ABからライセンスを付与されたコンテナ(旧称Orion JSPコンテナ)です。
Oracle Application Server 10g では、これらのコンテナがOC4J JSPコンテナと呼ばれる単一のJSPコンテナに統合されています。この新しいコンテナには、両方の旧バージョンの主要機能が継承されています。このコンテナは、OC4Jサーブレット・コンテナ内でサーブレットとして効率的に動作し、他のOC4Jコンテナと密接に統合されています。この統合されたコンテナは、OracleJSPトランスレータ、および簡略化された新しいディスパッチャとOC4J 1.0.2.2のコア・ランタイム・クラスとともに実行されるOrionコンテナ・ランタイムで主に構成されています。その結果、標準のJSP仕様を超える機能を備えた、業界でも最速のJSPエンジンの1つとなりました。
OC4J JSPでは、他のJSP環境に通常は移植可能なカスタム・タグ・ライブラリ、カスタムJavaBeansおよびカスタム・クラスによって、次の拡張機能が提供されています。
有効範囲を指定可能なJavaBeansとして実装される拡張タイプ。
イベント処理用のJspScopeListener
。
カスタム・タグを使用したXMLおよびXSLとの統合。
データ・アクセスJavaBeans。
Oracle JSP Markup Language(JML)カスタム・タグ・ライブラリ。これによって、JSPの開発に必要なJavaについての高度な知識は要求されなくなります。
OC4J JSPには、接続プーリング・タグ、XMLタグ、EJBタグ、ファイル・アクセス・タグ、電子メール・タグ、キャッシュ・タグ、OracleAS Personalizationタグ、OracleAS Ultrasearchタグ、およびSQL機能用のカスタム・タグ・ライブラリが含まれています。
コンテンツ配信ネットワークのエッジ・サーバーで動作し、Webコンテンツに最適のキャッシュ・ソリューションを提供するJESI(Edge Side Includes for Java)タグ、Web Object CacheタグおよびAPI(後続の各項を参照)。
関連項目: JSPカスタム・タグ・ライブラリの詳細は、『Oracle Containers for J2EE JSPタグ・ライブラリおよびユーティリティ・リファレンス』を参照してください。 |
OC4J JSPコンテナでは、自動ページ再コンパイルとクラス再ロードのモード切替え機能、JSPインスタンスのプーリング、タグ・ハンドラ・インスタンスのプーリングなどの重要な機能も提供されています。
OC4Jのファイングレイン制御によって、開発者は、JSPページの断片を個々のタグにキャッシュできます。これらの断片は、Oracle Web Cacheにキャッシュ可能で、JSPが変更されると自動的に無効化およびリフレッシュされます。この機能を支えるテクノロジは、Edge Side Includes(ESI)というW3C標準のXMLスキーマ(マークアップ言語)です。このテクノロジによって、動的コンテンツをWeb Cacheにキャッシュしたり、エッジ・ネットワーク上でアセンブルすることが可能になります。この動的コンテンツをキャッシュすることによって、JSPまたはサーブレットを実行する必要性が低くなるため、パフォーマンスが向上し、アプリケーション・サーバーの負荷が軽減され、待機時間が短縮されます。JESI(JSP用のESI)タグは、Edge Side Includes(ESI)フレームワークの最上位レイヤーに位置し、JSPアプリケーションにESIのキャッシュ機能を提供します。JESIタグを使用すると、JSPページの動的コンテンツをキャッシュ可能なコンポーネントまたは断片に分割できます。
Web Object Cacheは、Oracle Application Serverの機能の1つです。この機能によって、JSPまたはサーブレットによって生成された部分的な中間結果を、Javaで記述されたWebアプリケーションで取得、保存、再利用、後処理および維持することが可能になります。Web Object Cacheでは、プログラミング・インタフェース用としてタグ・ライブラリ(JSPページで使用)およびJava API(サーブレットで使用)が提供されています。キャッシュされたオブジェクトは、HTMLの断片、XMLの断片、XML DOMオブジェクト、またはJavaのシリアライズ可能オブジェクトで構成されます。これらのオブジェクトをメモリー内にキャッシュしておくことで、キャッシュされたオブジェクトに対して次のような様々な操作を実行できます。
ユーザー・プロファイルまたはデバイス特性に基づく異なるXSLTを、格納済のXMLに適用する操作
HTTP以外(クライアントに電子メールを送信するためのSMTPなど)でキャッシュ・オブジェクトを再利用する操作
Oracle JDeveloperは、JSPアプリケーションの開発サイクル全体(編集、ソース・レベル・デバッグおよびJSPページの実行)をサポートするためにOC4J JSPコンテナと統合されています。Oracle JDeveloperでは、広範なデータ対応およびWeb対応のJavaBeans(JDeveloper Web Beans)、および事前定義済のWeb Beansをページに簡単に追加できるJSPエレメント・ウィザードも提供されています。また、開発者にとって非常に有効な独自の機能も提供されています。JDeveloperでは、JSPページ・ソース内にブレーク・ポイントを設定して、JSPページからJavaBeansに対するコールを追跡できます。この方法は、JSPページ内にprint文を追加し、状態をレスポンス・ストリームに出力してブラウザに表示したり、サーバー・ログに記録する方法などの手動によるデバッグ方法よりはるかに有効です。
この項では、WebSphere JSP 0.91ファイルをOC4Jに移行する方法について説明します。
<REPEATGROUP>
タグ<REPEATGROUP>
タグを含んだJSP 0.91ファイルを移行する場合は、このタグを変更する必要があります。このタグは、データベースで論理的にグループ化されているデータに対して、HTMLのブロックを繰り返す場合に使用します。
<SERVLET>
タグを<jsp:include>
タグに置き換えます。
たとえば、次のタグを変更します。
<SERVLET CODE="com.samples.test.TestServlet"></SERVLET>
これを次のように変更します。
<jsp:include page="/servlet/com.samples.test.TestServlet" />
WebSphere <BEAN>
タグを<jsp:useBean>
タグに置き換えます。
次の例で示すのは、JSPの標準タグに移行する<BEAN>
タグです。
<BEAN NAME="AccountDBBean" TYPE="com.test.AccountDBBean" CREATE="YES" INTROSPECT="YES" SCOPE="request"> <PARAM NAME="userID" VALUE="wsdemo"> </BEAN>
OC4Jに移行すると、このタグが次のタグに置換されます。
<jsp:useBean id="AccountDBBean" type="com.test.AccountDBBean" class="com.test.AccountDBBea" scope="request"/> <jsp:setProperty name="AccountDBBean" property="userID" value="wasdemo" />
CREATE="YES"
という明示的な属性が削除されることに注意してください。これは、id属性で指定された名前を持つBeanが指定の有効範囲内で見つからなかった場合に、class属性に従ってBeanのインスタンスが作成されるためです。JSPのNAME
属性は、JSP 1.0のid属性に対応します。INTROSPECT
属性はなくなりました(JSP 0.91のリクエストとセッションの有効範囲は、JSP 1.0に引き継がれます)。
指定された有効範囲内にBeanがすでに存在する場合、class
属性は不要です。ただし、指定された有効範囲内にBeanが存在しない場合にclass属性を指定しないと、Beanの新しいインスタンスを作成する際にエラーが発生します。
Beanのプロパティを設定します。
JSP 0.91では、<BEAN>
タグ内で<PARAM>
タグを使用することで、Beanのプロパティを指定します。JSP 1.0では、<jsp:useBean>
タグの外側で<jsp:setProperty>
タグを使用する必要があります。<jsp:setProperty>
内でname属性を使用し、<jsp:useBean>
内のid属性で特定されるBeanを指定することで、既存のBeanのプロパティ設定にリンクできます。同様に、<jsp:getProperty>
タグを使用することで、Beanのプロパティ値を取得できます。
tsx
タグ・ライブラリに定義されたWebSphere固有のカスタム・タグを使用するJSPをOC4Jに移行するには、2つの方法があります。
ページ数が多く、すべてのJSPファイルを変更する作業が煩雑である場合は、WebSphereのタグ・ライブラリを使用し、それをOC4Jにデプロイできます。
可能なかぎり、OCJ JSPタグ・ライブラリを使用して、JSPソース・ファイルを編集します。
次のコード例は、Oracle JSP Markup Language(JML)タグ・ライブラリを使用してWebSphereのJSP拡張機能をOC4Jに移行する方法を示しています。
<REPEAT>
タグまたは<tsx:repeat>
タグWebSphereが提供するこれらのタグは、HTMLブロックを指定の回数だけループするためのもので、JSPページ内にJavaのfor
ループを記述するかわりに使用します。Oracle JMLタグ・ライブラリには、同じ機能を持つ<jml:for>
タグがあります。このタグの構文は次のとおりです。
<jml:for id = " loopVariable" from = "<%= jspExpression %>" to = "<%= jspExpression %>" > ... body of for tag (executed once at each value of range, inclusive)... </jml:for>
これは、WebSphereの<tsx:repeat>
に類似しています。
<tsx:repeat index=name start=start_index end=end_index > </tsx:repeat>
両者の相違点は次のとおりです。
<jml:for>
タグのid
変数は、範囲内の現在値を保持する、タグ内でローカルな変数です。一方、index変数はJSPページ内でグローバルな変数です。
<jml:for>
内のfrom
およびto
は、OC4J JSPでは必須です。WebSphereでは、start
およびend
は省略可能です。
関連項目: 『Oracle Containers for J2EE JavaServer Pages開発者ガイド』 『Oracle Containers for J2EE JSPタグ・ライブラリおよびユーティリティ・リファレンス』 |