Oracle Application Server Containers for J2EE JavaServer Pages 開発者ガイド 10gリリース2(10.1.2) B15632-02 |
|
この章では、JavaServer Pages(JSP)テクノロジの標準機能、およびJSP実行モデルについて説明します。一般的な情報の詳細は、Sun社のJSP仕様を参照してください。
JSPの機能は、サーブレットの機能に基づいています。詳細は、Sun社のJavaサーブレット仕様も参照してください。
Oracle Application Server Containers for J2EE(OC4J)でのJSP実装の概要については、第2章「Oracle JSP実装の概要」を参照してください。また、標準のサーブレットとJSPテクノロジに関連するバックグラウンドについては、付録A「サーブレットとJSPの技術的なバックグラウンド」で説明しています。
この章には、次の各項が含まれます。
JavaServer Pagesは、Sun社が提供するテクノロジで、Webアプリケーション(Webサーバー上で動作するアプリケーション)が出力したページに、動的なコンテンツを生成するための便利な方法です。
Javaサーブレットのテクノロジと密接に関連しているこのテクノロジによって、開発者は、Javaコードおよび外部Javaコンポーネントのコールを、WebページのHTMLコード(またはXMLなどのマークアップ・コード)内に含めることができます。JavaServer Pages(JSP)テクノロジは、JavaBeansおよびEnterprise JavaBeans(EJB)による、ビジネス・ロジックおよび動的な機能のためのフロントエンドとして機能します。
JSPコードは、Webページ内のWebスクリプト・コード(JavaScriptなど)とは異なります。通常のHTMLページに含めることができる内容は、JSPページにも含めることができます。
データベース・アプリケーションの典型的な使用例では、JSPページは、JavaBean、Enterprise JavaBeanなどのコンポーネントをコールし、Beanは通常、JDBCを使用して直接または間接的にデータベースにアクセスします。
JSPページは、実行前にJavaサーブレットに変換され、他のサーブレットと同様に、HTTPリクエストを処理してレスポンスを生成します。JSPテクノロジによって、サーブレットのコード作成がより便利になります。通常、変換は要求に応じて実行されますが、事前に実行される場合もあります。
さらに、JSPページは、サーブレットと完全に相互運用できます。つまり、JSPページは、サーブレットの出力をインクルードしたり、サーブレットに出力を転送できます。一方、サーブレットは、JSPページの出力をインクルードしたり、JSPページに出力を転送できます。
次に、単純なJSPページの例を示します。ここで使用されているJSP構文の要素については、「JSP構文の要素の概要」を参照してください。
<HTML> <HEAD><TITLE>The Welcome User JSP</TITLE></HEAD> <BODY> <% String user=request.getParameter("user"); %> <H3>Welcome <%= (user==null) ? "" : user %>!</H3> <P><B> Today is <%= new java.util.Date() %>. Have a nice day! :-)</B></P> <B>Enter name:</B> <FORM METHOD=get> <INPUT TYPE="text" NAME="user" SIZE=15> <INPUT TYPE="submit" VALUE="Submit name"> </FORM> </BODY> </HTML>
前述の例に示すように、従来のJSPページ内のJavaの要素は、<%
や%>
などのタグで始まります(「JSP XML文書の詳細」で説明されているように、JSP XML構文の場合は異なります)。この例のJavaコードでは、HTTPリクエスト・オブジェクトからユーザー名を取得してユーザー名を出力し、現在の日付を取得します。
ユーザーが「Amy」という名前を入力すると、このJSPページでは、図1-1に示す出力が作成されます。
JavaコードとJavaコールをHTMLページ内で組み合せると、Javaコードをサーブレットで直接使用するより使いやすくなります。JSP構文を使用すると、動的Webページを簡単な方法でコーディングできるため、通常は、Javaサーブレット構文より大幅に少ないコード量で済みます。次に、サーブレット・コードとJSPコードを比較した例を示します。
import javax.servlet.*; import javax.servlet.http.*; import java.io.*; public class Hello extends HttpServlet { public void doGet(HttpServletRequest rq, HttpServletResponse rsp) { rsp.setContentType("text/html"); try { PrintWriter out = rsp.getWriter(); out.println("<HTML>"); out.println("<HEAD><TITLE>Welcome</TITLE></HEAD>"); out.println("<BODY>"); out.println("<H3>Welcome!</H3>"); out.println("<P>Today is "+new java.util.Date()+".</P>"); out.println("</BODY>"); out.println("</HTML>"); } catch (IOException ioe) { // (error processing) } } }
標準のHttpServlet
抽象クラス、HttpServletRequest
インタフェースおよびHttpServletResponse
インタフェースに関する情報は、「サーブレットのインタフェース」を参照してください。
<HTML> <HEAD><TITLE>Welcome</TITLE></HEAD> <BODY> <H3>Welcome!</H3> <P>Today is <%= new java.util.Date() %>.</P> </BODY> </HTML>
JSP構文がより簡略であることがわかります。JSP構文によって、パッケージのインポートやtry...catch
ブロックなど、Javaのオーバーヘッドが軽減されます。
注意: OC4J 9.0.3実装では、JSPページにデフォルトでインポートされるパッケージのリストが変更されました。デフォルトのリストは、JSP仕様に従って削減されました。詳細は、「デフォルト・パッケージのインポート」を参照してください。したがって、Oracle9iASリリース2(9.0.3)以上の場合、前述のJSPの例には java.io パッケージをインポートするための構成設定が必要です。
|
さらに、JSPトランスレータは、.java
出力ファイル内で、大量のサーブレット・コーディングのオーバーヘッドを自動的に処理します。たとえば、標準のjavax.servlet.jsp.HttpJspPage
インタフェースを直接または間接的に実装し(「標準のJSPインタフェースとメソッド」を参照)、コードを追加してHTTPセッションを取得します。
また、JSPページのHTMLは、サーブレット・コードのようにJavaの出力文に埋め込まれていないため、HTMLオーサリング・ツールを使用してJSPページを作成できます。
JSPテクノロジによって、静的なページ・プレゼンテーションを決定するHTMLコードの開発と、ビジネス・ロジックを処理して動的コンテンツを表示するJavaコードの開発を分離できます。したがって、HTMLの知識はあるがJavaには不慣れなプレゼンテーションとレイアウトの担当と、Javaの知識はあるがHTMLには不慣れなコード担当との間で、メンテナンス作業を簡単に分割できます。
典型的なJSPページでは、ほとんどのJavaコードとビジネス・ロジックは、JSPページに埋め込まれているコード内にはありません。かわりに、JSPページから起動するJavaBeansまたはEnterprise JavaBeans内にあります。
JSPテクノロジには、JavaBeansクラスのインスタンスを定義および作成するため、次の構文が用意されています。
<jsp:useBean id="pageBean" class="mybeans.NameBean" scope="page" />
この例では、mybeans.NameBean
クラスのインスタンスpageBean
を作成します。scope
パラメータについては、この章で後述します。
このBeanインスタンスは、このページの後の方で、次の例のように使用できます。
Hello <%= pageBean.getNewName() %> !
この例では、pageBean
のnewName
属性が、たとえば、名前「Julie」(ユーザー入力などで設定)の場合は、「Hello Julie !」が出力されます。
ビジネス・ロジックをページ・プレゼンテーションから分離すると、ビジネス・ロジックと動的コンテンツを担当するJavaのエキスパート(NameBean
クラスのコードを所有およびメンテナンスする担当者)と、アプリケーション・ユーザーが参照するWebページの静的なプレゼンテーションとレイアウトを担当するHTMLのエキスパート(JSPページの.jsp
ファイルのコードを所有およびメンテナンスする担当者)の間で、作業を分担できます。
JavaBeansで使用するタグ(たとえば、JavaBeanインスタンスを宣言するためのuseBean
、BeanプロパティにアクセスするためのgetProperty
とsetProperty
)の詳細は、「標準アクション: JSPタグ」で説明します。
JavaServer Pagesテクノロジは通常、動的HTMLの出力に使用されますが、JSP仕様では、構造化されたテキスト・ベースのドキュメント出力に関する追加の型もサポートしています。JSPトランスレータは、JSP要素の外にあるテキストは処理しないため、Webページに適切なテキストは、通常JSPページにも適切です。
JSPページは、HTTPリクエストから情報を取得し、データベース・サーバーから(たとえば、SQLデータベース問合せを使用して)情報にアクセスします。この情報を、必要に応じて結合および処理し、動的コンテンツを持つHTTPレスポンスに取り込みます。コンテンツは、HTML、DHTML、XHTML、XMLなどにフォーマットできます。
XMLのJSPサポートの詳細は、第5章「JSP XMLサポート」、および『Oracle Application Server Containers for J2EE JSPタグ・ライブラリおよびユーティリティ・リファレンス』を参照してください。
「JSPページの例」では、JSP構文の単純な例を示しました。ここでは、トップレベルの構文カテゴリを説明します。
この項では、基本的な構文とコード例も含めて、各カテゴリについて説明します。Beanプロパティの変換およびカスタム・タグ・ライブラリ(カスタム・アクションに使用されます)の概要についても説明します。詳細は、Sun社のJSP仕様を参照してください。
ディレクティブは、JSPページ全体に関する指示をJSPコンテナに提供します。この情報は、ページの変換または実行で使用されます。基本的な構文は、次のとおりです。
<%@ directive attribute1="value1" attribute2="value2"... %>
JSP仕様では、次のディレクティブをサポートします。
ページに依存する属性を指定します。たとえば、スクリプト言語、コンテンツ・タイプ、文字エンコード、拡張するクラス、インポートするパッケージ、使用するエラー・ページ、JSPページの出力バッファ・サイズ、バッファが満杯になったときにバッファを自動的にフラッシュするかどうかなどがあります。例:
<%@ page language="java" import="packages.mypackage" errorPage="boof.jsp" %>
また、自動フラッシュを有効にし、JSPページの出力バッファ・サイズを20KBに設定する場合は、次のようにします。
<%@ page autoFlush="true" buffer="20kb" %>
次に、ページのバッファを無効にする例を示します。
<%@ page buffer="none" %>
注意:
|
変換時にJSPページに挿入されるテキストまたはコードを含むリソースを指定します。例:
<%@ include file="/jsp/userinfopage.jsp" %>
リソースへのページ相対パスまたはコンテキスト相対パスのいずれかを指定します。ページ相対パスおよびコンテキスト相対パスの詳細は、「JSPページのリクエスト」を参照してください。
注意:
|
このディレクティブを使用して、JSPページで使用するカスタムJSPタグのライブラリを指定します。ベンダーは、独自のタグ・セットを使用して、JSP機能を拡張できます。このディレクティブには、タグ・ライブラリ・ディスクリプタへのポインタ、およびこのライブラリからタグの使用方法を識別するための接頭辞が含まれます。例:
<%@ taglib uri="/oracustomtags" prefix="oracust" %>
ライブラリ内のいずれかのタグをページの後のほうで使用するときは、常にoracust
接頭辞を使用します。このライブラリには、タグのdbaseAccess
が含まれていると仮定します。
<oracust:dbaseAccess ... > ... </oracust:dbaseAccess>
JSPタグ・ライブラリとタグ・ライブラリ・ディスクリプタの概要は、「カスタム・タグ・ライブラリ」で説明します。詳細は、第8章「JSPタグ・ライブラリ」を参照してください。
JSPスクリプト要素には、JSPページに表示可能なJavaコードの次のカテゴリが含まれます。
JSPページで使用するメソッドまたはメンバー変数を宣言する文です。
JSP宣言は、<%!...%>
宣言タグ内で標準のJava構文を使用し、メンバー変数またはメソッドを宣言します。これによって、生成されたサーブレット・コードで、対応する宣言が行われます。例:
<%! double f1=0.0; %>
この例では、メンバー変数のf1
を宣言します。JSPトランスレータで生成されたサーブレット・クラス・コードで、f1
はクラスのトップレベルで宣言されます。
注意: メンバー変数とは対照的に、メソッド変数は、後述するように、JSPスクリプトレット内で宣言されます。メンバー変数とメソッド変数の比較は、「メソッド変数宣言とメンバー変数宣言の比較」を参照してください。 |
評価され、必要に応じて文字列値に変換され、ページ内の検出された場所に表示されるJava式です。
JSP式は、セミコロンで終了せず、<%=...%>
タグ内に含まれます。例:
<P><B> Today is <%= new java.util.Date() %>. Have a nice day! </B></P>
ページのマークアップ言語内に記述される、Javaコードの断片です。
スクリプトレットまたはコードの一部分は、1行または複数行のJavaコードで構成されている場合があります。このスクリプトレットをJSPページのHTMLコード内で使用すると、条件ブランチやループなどを設定できます。
JSPスクリプトレットは<%...%>
スクリプトレット・タグ内に含まれ、通常のJava構文を使用します。
例1:
<% if (pageBean.getNewName().equals("")) { %> I don't know you. <% } else { %> Hello <%= pageBean.getNewName() %>. <% } %>
1行で構成された3つのJSPスクリプトレットが、2行のHTMLコードと交互に記述され、その1行にはセミコロンが不要なJSP式が含まれています。JSP構文によって、HTMLコードは、if
ブランチとelse
ブランチ(スクリプトレットに設定されたJavaの中カッコ内)内で条件付きで実行されるコードになります。
前述の例では、JavaBeanインスタンスのpageBean
を使用しています。
例2:
<% if (pageBean.getNewName().equals("")) { %> I don't know you. <% empmgr.unknownemployee(); } else { %> Hello <%= pageBean.getNewName() %>. <% empmgr.knownemployee(); } %>
この例では、Javaコードがスクリプトレットに追加されています。ここでは、JavaBeanインスタンスのpageBean
を使用し、すでにインスタンス化されているオブジェクトのempmgr
には、既知または未知の従業員に対して適切な機能を実行するメソッドが設定されていることが前提になっています。
注意: メンバー変数とは対照的に、メソッド変数の宣言には、次の例のようにJSPスクリプトレットを使用します。 <% double f2=0.0; %>このスクリプトレットは、メソッド変数の f2 を宣言します。JSPトランスレータで生成されたサーブレット・クラス・コードでは、f2 は、サーブレットのサービス・メソッド内で変数として宣言されます。メンバー変数は、前述のように、JSP宣言で宣言されます。メソッド変数とメンバー変数の比較は、「メソッド変数宣言とメンバー変数宣言の比較」を参照してください。
|
Javaコード内に埋め込まれたコメントと同様に、JSPコード内に埋め込まれた、開発者のコメントです。
コメントは、<%--...--%>
構文内に含まれます。例:
<%-- Execute the following branch if no user name is entered. --%>
HTMLのコメントとは異なり、JSPのコメントは、ユーザーがブラウザでページのソースを表示しても参照できません。
このマニュアルのJSPオブジェクトという用語は、JSPページで宣言されるか、またはJSPページからアクセス可能なJavaクラス・インスタンスを指します。JSPオブジェクトは、次のいずれかです。
または
この項には、次の項目が含まれます。
通常、明示的なオブジェクトとは、jsp:useBean
操作文で宣言および作成されたJavaBeanインスタンスです。jsp:useBean
文などの操作文は、「標準アクション: JSPタグ」で説明しています。ここでは例を示します。
<jsp:useBean id="pageBean" class="mybeans.NameBean" scope="page" />
この文は、mybeans
パッケージにあるNameBean
クラスのpageBean
インスタンスを定義します。scope
パラメータについては、「オブジェクトのスコープ」を参照してください。
Javaクラス・インスタンスをJavaプログラム内で作成するように、オブジェクトは、Javaスクリプトレットまたは宣言内でも作成できます。
JSPテクノロジによって、JSPページで一連の暗黙的なオブジェクトが使用可能になります。これらのオブジェクトは、JSPコンテナによって自動的に作成されるJavaオブジェクトで、基礎となるサーブレット環境との相互作用を可能にします。
次に、使用可能な暗黙的なオブジェクトを示します。これらのオブジェクトで使用可能なメソッドについては、次のサイトにあるSun社の指定クラスとインタフェースに関するJavadocを参照してください。
http://java.sun.com/products/servlet/2.3/javadoc/index.html
page
このオブジェクトはJSPページ実装クラスのインスタンスで、ページの変換時に作成されます。ページ実装クラスは、インタフェースjavax.servlet.jsp.HttpJspPage
を実装します。page
オブジェクトは、JSPページ内ではthis
と同じ意味であることに注意してください。
request
このオブジェクトは、HTTPリクエストを表し、javax.servlet.ServletRequest
インタフェースを拡張するjavax.servlet.http.HttpServletRequest
インタフェースを実装するクラスのインスタンスです。
response
このオブジェクトは、HTTPレスポンスを表し、javax.servlet.ServletResponse
インタフェースを拡張するjavax.servlet.http.HttpServletResponse
インタフェースを実装するクラスのインスタンスです。
特定のリクエストに対するresponse
オブジェクトとrequest
オブジェクトは、相互に関連があります。
pageContext
このオブジェクトは、JSPページのページ・コンテキストを表し、JSPページ・インスタンスのすべてのpage
スコープ・オブジェクトの格納およびアクセスで使用されます。pageContext
オブジェクトは、javax.servlet.jsp.PageContext
クラスのインスタンスです。
pageContext
オブジェクトにはpage
スコープがあり、これによって、関連付けられたJSPページ・インスタンスにのみアクセスできます。
session
このオブジェクトは、HTTPセッションを表す、javax.servlet.http.HttpSession
インタフェースを実装するクラスのインスタンスです。
application
このオブジェクトは、Webアプリケーションのサーブレット・コンテキストを表し、javax.servlet.ServletContext
インタフェースを実装するクラスのインスタンスです。
application
オブジェクトは、単一のJVM内でアプリケーションのインスタンスの一部として実行しているJSPページ・インスタンスからアクセスできます(プログラマは、JVMの使用に関して、サーバーのアーキテクチャの知識が必要です)。
out
コンテンツをJSPページ・インスタンスの出力ストリームに書き込むためのオブジェクトです。このオブジェクトは、java.io.Writer
クラスを拡張するjavax.servlet.jsp.JspWriter
クラスのインスタンスです。
out
オブジェクトは、特定のリクエストについて、response
オブジェクトに関連付けられます。
config
このオブジェクトは、JSPページのサーブレット構成を表し、javax.servlet.ServletConfig
インタフェースを実装するクラスのインスタンスです。一般的に、サーブレット・コンテナは、ServletConfig
インスタンスを使用して、初期化中のサーブレットに情報を提供します。この情報の一部が、適切なServletContext
インスタンスです。
exception
(JSPエラー・ページのみ)
この暗黙的なオブジェクトは、JSPエラー・ページ(別のJSPページから例外がスローされた場合に処理を転送するページ)にのみ適用されます。page
ディレクティブのisErrorPage
属性がtrue
に設定されている必要があります。
暗黙的なexception
オブジェクトは、別のJSPページからスローされ、結果的に現行のエラー・ページを起動したキャッチされなかった例外を表すjava.lang.Exception
インスタンスです。
exception
オブジェクトには、例外の発生時に処理が転送されたJSPエラー・ページ・インスタンスからのみアクセスできます。JSPエラー処理の例とexception
オブジェクトの使用方法は、「実行時エラーの処理」を参照してください。
前項で説明した暗黙的なオブジェクトは、いずれも便利なオブジェクトです。次の例では、request
オブジェクトを使用してHTTPリクエストからusername
パラメータの値を取得し、表示します。
<H3> Welcome <%= request.getParameter("username") %> ! <H3>
request
オブジェクトは、他の暗黙的なオブジェクトと同様に、自動的に使用可能になり、明示的にインスタンス化されません。
JSPページ内のオブジェクトは、明示的か暗黙的かに関係なく、特定のスコープ内でアクセス可能です。明示的なオブジェクト(jsp:useBean
操作で作成されたJavaBeanインタンスなど)の場合は、「明示的なオブジェクト」の例に示すように、次の構文を使用して明示的にスコープを設定できます。
scope="scopevalue"
スコープには、次の4種類があります。
scope="page"
(デフォルトのスコープ): オブジェクトには、そのオブジェクトが作成されたJSPページ内からのみアクセスできます。pageスコープのオブジェクトは、暗黙的なpageContext
オブジェクトに格納されます。page
スコープは、ページの実行が停止すると終了します。
JSPページの実行中に、ユーザーがページをリフレッシュすると、すべてのpageスコープのオブジェクトについて新規インスタンスが作成されます。
scope="request"
: オブジェクトには、そのオブジェクトを作成したJSPページと同じHTTPリクエスト・サービスを提供しているJSPページからアクセスできます。requestスコープのオブジェクトは、暗黙的なrequest
オブジェクトに格納されます。request
スコープは、HTTPリクエストが完了すると終了します。
scope="session"
: オブジェクトには、そのオブジェクトを作成したJSPページと同じHTTPセッションを共有するJSPページからアクセスできます。sessionスコープのオブジェクトは、暗黙的なsession
オブジェクトに格納されます。session
スコープは、HTTPセッションがタイムアウトになるか、または無効になると終了します。
scope="application"
: オブジェクトには、単一のJava Virtual Machine上で、そのオブジェクトを作成したJSPページと同じWebアプリケーションで使用されるJSPページからアクセスできます。これは、Javaの静的変数の概念と同じです。applicationスコープのオブジェクトは、暗黙的なapplication
サーブレット・コンテキスト・オブジェクトに格納されます。application
スコープは、アプリケーション自体が終了するか、JSPコンテナまたはサーブレット・コンテナが停止すると終了します。
次のように、狭いスコープから広いスコープへ4つのスコープに区分けされます。
page
< request
< session
< application
1つのアプリケーション内にある異なるページ間でオブジェクトを共有する場合、たとえば、あるページから別のページに実行を転送したり、あるページのコンテンツを別のページにインクルードする場合は、共有するオブジェクトに対してpage
スコープを使用できません。この場合は、ページごとに関連付けられた個別のオブジェクト・インスタンスを使用します。ページ間でのオブジェクト共有に使用できる最も狭いスコープは、request
です(ページをインクルードおよび転送する方法については、次の「標準アクション: JSPタグ」を参照)。
JSP操作の要素により、JSPページの実行中に発生する操作(Javaオブジェクトをインスタンス化し、ページに対して使用可能にするなど)が行われます。次のような操作が含まれます。
標準アクションについては、JSP仕様に一連のタグが定義されています。JSPページのコードは、この章で前述したディレクティブとスクリプト要素を使用して作成できますが、ここで説明する標準的なタグを使用すると、機能性や利便性が向上します。
JSPの標準アクションに対する一般的なタグの構文は、次のとおりです。
<jsp:tag attr1="value1" attr2="value2" ... attrN="valueN"> ...body... </jsp:tag>
ボディがない場合は、次のとおりです。
<jsp:tag attr1="value1", ..., attrN="valueN" />
JSP仕様には、次の標準アクション・タグが含まれます。次に、各タグについて簡単に説明します。
jsp:useBean
タグは、Java型のインスタンス(通常はJavaBeanクラス)にアクセスし、Java型のインスタンスを作成します。また、インスタンスを指定の名前またはIDに関連付けます。インスタンスは、指定したスコープのスクリプト変数として、そのIDを介して使用できます。スクリプト変数の概要は、「カスタム・タグ・ライブラリ」を参照してください。スコープの詳細は、「JSPオブジェクトとスコープ」を参照してください。
主な属性は、class
、type
、id
およびscope
です(使用頻度は多くありませんが、後述のbeanName
属性もあります)。
id
属性を使用して、インスタンス名を指定します。JSPコンテナは最初に、指定したスコープ内で、指定した型の指定のIDによってオブジェクトを検索します。オブジェクトが見つからない場合、コンテナはそのオブジェクトの作成を試みます。
class
属性は、JSPコンテナが必要に応じてインスタンス化できるクラスを指定するために使用します。クラスは、抽象クラスにはできません。また、引数のないコンストラクタが必要です。type
属性は、JSPコンテナがインスタンス化できない型(インタフェース、抽象クラス、あるいは引数のないコンストラクタを持たないクラスのうちいずれか)を指定するために使用します。インスタンスがすでに存在する場合やインスタンス化可能なクラスのインスタンスが型に割り当てられる場合は、type
を使用します。次に、典型的な3種類の使用例を示します。
type
とid
を使用します。
class
とid
を使用します。インスタンスは、ターゲット・スコープにすでに存在しているインスタンスか、JSPコンテナによって新規作成されるインスタンスのいずれかです。
class
、type
およびid
を使用します。この場合、クラスは、型に対して正式に割当て可能であることが必要です。
scope
属性を使用して、インスタンスのスコープを指定します。ページ・コンテキスト・オブジェクトに関連付けるインスタンスの場合はpage
、HTTPリクエスト・オブジェクトに関連付けるインスタンスの場合はrequest
、HTTPセッション・オブジェクトに関連付けるインスタンスの場合はsession
、サーブレット・コンテキストに関連付けるインスタンスの場合はapplication
です。
class
属性のかわりに、beanName
属性を使用することもできます。この場合は、クラス名のかわりにシリアライズ可能なリソースを指定するオプションがあります。beanName
属性を使用すると、JSPコンテナはjava.beans.Beans
クラスのinstantiate()
メソッドを使用してインスタンスを作成します。
次の例では、型MyIntfc
のrequestスコープ・インスタンスreqobj
を使用しています。MyIntfc
はインタフェースであり、直接インスタンス化できないため、reqobj
がすでに存在している必要があります。
<jsp:useBean id="reqobj" type="mypkg.MyIntfc" scope="request" />
次の例では、クラスPageBean
のpageスコープ・インスタンスpageobj
を使用しています(必要に応じて、このインスタンスを最初に作成します)。
<jsp:useBean id="pageobj" class="mybeans.PageBean" scope="page" />
次の例では、クラスSessionBean
のインスタンスを作成し、そのインスタンスを型MyIntfc
の変数sessobj
に割り当てています。
<jsp:useBean id="sessobj" class="mybeans.SessionBean" type="mypkg.MyIntfc scope="session" />
jsp:setProperty
タグは、1つ以上のBeanプロパティを設定します。Beanは、jsp:useBean
タグにすでに指定されている必要があります。指定のプロパティに値を直接指定したり、指定のプロパティの値を関連のHTTPリクエストのパラメータから取得したり、HTTPリクエストのパラメータから一連のプロパティと値を繰り返し取得できます。
次の例では、pageBean
インスタンス(前述のjsp:useBean
の例で定義済)のuser
プロパティの値を「Smith」に設定します。
<jsp:setProperty name="pageBean" property="user" value="Smith" />
次の例では、HTTPリクエストのusername
というパラメータの値セットに従って、pageBean
インスタンスのuser
プロパティを設定します。
<jsp:setProperty name="pageBean" property="user" param="username" />
Beanのプロパティとリクエスト・パラメータが同じ名前(user
)の場合は、次のようにプロパティを設定できます。
<jsp:setProperty name="pageBean" property="user" />
次の例では、HTTPリクエストのパラメータで、Beanのプロパティ名とリクエストのパラメータ名を繰り返し一致させ、対応するリクエストのパラメータ値に従ってBeanのプロパティ値を設定します。
<jsp:setProperty name="pageBean" property="*" />
jsp:setProperty
タグを使用すると、文字列以外のプロパティの値を指定する場合でも、文字列入力を使用できます。これは、バックグラウンドで変換が行われるためです。「文字列値からBeanプロパティへの変換」を参照してください。
重要: property="*" の場合は、次の点に注意してください。
|
jsp:getProperty
タグは、Beanのプロパティ値を読み取ってJava文字列に変換し、暗黙的なout
オブジェクトに配置します。これによって、文字列値を出力として表示できます。Beanは、jsp:useBean
タグにすでに指定されている必要があります。文字列に変換する場合、プリミティブ型は直接変換され、オブジェクト型は、java.lang.Object
クラスに指定されているtoString()
メソッドを使用して変換されます。
次の例では、pageBean
Beanのuser
プロパティの値を、out
オブジェクトに出力します。
<jsp:getProperty name="pageBean" property="user" />
jsp:param
タグは、jsp:include
タグ、jsp:forward
タグおよびjsp:plugin
タグ(後述)とともに使用できます。
jsp:param
タグをjsp:forward
タグおよびjsp:include
タグとともに使用すると、HTTP request
オブジェクトのパラメータ値に対して名前/値ペアが必要に応じて提供されます。この操作で指定した新規のパラメータと値は、request
オブジェクトに追加され、古い値よりも優先されます。
次の例では、request
オブジェクトのusername
パラメータに、Smith
という値を設定します。
<jsp:param name="username" value="Smith" />
jsp:include
タグは、リクエスト時にページが表示されると、静的または動的な追加リソースをページに挿入します。リソースは、相対URL(ページ相対またはアプリケーション相対)を使用して指定します。例:
<jsp:include page="/templates/userinfopage.jsp" flush="true" />
flush
属性を「true
」に設定すると、jsp:include
操作の実行時に、バッファがブラウザにフラッシュされます。JSP仕様およびOC4J JSPコンテナは、「true
」または「false
」のいずれかの設定をサポートします。デフォルトは「false
」です(JSP仕様1.1でサポートされる設定は「true
」のみで、flush
は必須属性です)。
次の例に示すように、jsp:param
タグを持つ操作ボディも指定できます。
<jsp:include page="/templates/userinfopage.jsp" flush="true" > <jsp:param name="username" value="Smith" /> <jsp:param name="userempno" value="9876" /> </jsp:include>
次の構文は、前述の例の代替として機能します。
<jsp:include page="/templates/userinfopage.jsp?username=Smith&userempno=9876" flush="true" />
注意:
|
jsp:forward
タグは、現行のページの実行を事実上終了し、その出力を破棄し、新規ページ(HTMLページ、JSPページまたはサーブレットのいずれか)をディスパッチします。
jsp:forward
タグを使用するには、JSPページをバッファする必要があります。page
ディレクティブにbuffer="none"
は設定できません。この操作では、バッファがクリアされ、コンテンツはブラウザに出力されません。
jsp:include
の場合と同様、次の2番目の例に示すように、jsp:param
タグを持つ操作ボディも指定できます。
<jsp:forward page="/templates/userinfopage.jsp" />
または
<jsp:forward page="/templates/userinfopage.jsp" > <jsp:param name="username" value="Smith" /> <jsp:param name="userempno" value="9876" /> </jsp:forward>
jsp:plugin
タグによって、指定のアプレットまたはJavaBeanがクライアント・ブラウザで実行されます。必要に応じて、Javaプラグイン・ソフトウェアのダウンロードが先行して実行されます。
jsp:plugin
属性を使用して、実行するアプレットやコード・ベースなどの構成情報を指定します。JSPコンテナは、ダウンロード用のデフォルトURLを提供できますが、nspluginurl="
url
"
属性(Netscapeブラウザの場合)またはiepluginurl="
url
"
属性(Internet Explorerブラウザの場合)を指定することもできます。
jsp:params
の開始タグと終了タグの間にネストされているjsp:param
タグを使用して、アプレットまたはJavaBeanにパラメータを指定します(jsp:params
の開始タグと終了タグは、jsp:include
操作またはjsp:forward
操作でjsp:param
を使用する場合は不要です)。
プラグインが実行できない場合は、jsp:fallback
の開始タグと終了タグを使用して、実行する代替テキストに定めます。
次の例は、Sun社JSP仕様1.2からの抜粋で、アプレットのプラグインの使用方法を示しています。
<jsp:plugin type=applet code="Molecule.class" codebase="/html" > <jsp:params> <jsp:param name="molecule" value="molecules/benzene.mol" /> </jsp:params> <jsp:fallback> <p> Unable to start the plugin. </p> </jsp:fallback> </jsp:plugin>
ARCHIVE
、HEIGHT
、NAME
、TITLE
、WIDTH
など、その他のパラメータもjsp:plugin
タグ内で使用できます。これらのパラメータの使用方法は、一般的なHTML仕様に従います。
JSPページでjsp:useBean
タグを介してJavaBeanを使用し、次にjsp:setProperty
タグを使用してBeanプロパティを設定する場合は、バックグラウンドで変換が行われるため、文字列以外のプロパティの値を指定する場合でも、文字列入力を使用できます。変換には、2つの手順があります。次の各項で説明します。
関連するプロパティ・エディタがないBeanプロパティについて、文字列値を使用してプロパティを設定する場合の変換方法を表1-1に示します。
Beanプロパティには、関連するプロパティ・エディタを指定できます。このエディタは、java.beans.PropertyEditor
インタフェースを実装するクラスです。このようなクラスは、プロパティの編集に使用するGUIをサポートします。一般的に、標準のJava型には標準のプロパティ・エディタがあり、ユーザー定義型にはユーザー定義のプロパティ・エディタがあります。ただし、OC4JのJSP実装で検索されるのは、ユーザー定義のプロパティ・エディタのみです。sun.beans.editors
パッケージのデフォルトのプロパティ・エディタは考慮されません。
プロパティ・エディタの詳細、およびプロパティ・エディタを型に関連付ける方法については、Sun社のJavaBeans API仕様を参照してください。
プロパティ・エディタが関連付けられているプロパティを、JavaBeans仕様で指定されているように設定するには、以前と同様に文字列値を使用できます。この場合は、入力された文字列を適切な型の値に変換する際に、PropertyEditor
インタフェースで指定されているsetAsText(String text)
メソッドが使用されます(setAsText()
メソッドがIllegalArgumentException
をスローした場合、変換は失敗します)。
JSP仕様では、前述の標準的なJSPタグ以外に、ベンダーが独自のタグ・ライブラリを定義できます。また、ベンダーは、顧客が独自のタグ・ライブラリを定義できるフレームワークを実装することもできます。
タグ・ライブラリは、カスタム・タグのコレクションを定義し、JSPのサブ言語とみなすことができます。開発者は、JSPページを手動でコーディングするときにタグ・ライブラリを直接使用できますが、Java開発ツールで自動的に使用することもできます。標準のタグ・ライブラリは、異なるJSPコンテナ実装間で移植可能であることが必要です。
タグ・ライブラリは、「ディレクティブ」で説明したtaglib
ディレクティブを使用して、JSPページにインポートします。
JSPタグ・ライブラリに対する標準的なJavaServer Pagesのサポートに関する主な概念には、次の項目が含まれます。
タグ・ライブラリ・ディスクリプタ(TLD)は、タグ・ライブラリとライブラリの各タグに関する情報が含まれたXML文書です。TLDのファイル名には、拡張子.tld
が付きます。
カスタム・タグの動作を決めるタグ・ハンドラは、標準のjavax.servlet.jsp.tagext
パッケージでTag
、IterationTag
またはBodyTag
のいずれかのインタフェースを実装するJavaクラスのインスタンスです。実装するインタフェースは、タグにボディがあるかどうか、およびタグ・ハンドラがボディ・コンテンツへアクセスする必要があるかどうかによって決まります。
カスタム・タグ操作によって、タグ自体、またはスクリプトレットなどのスクリプト要素で使用できるサーバー・サイド・オブジェクトを作成できます。このためには、スクリプト変数の作成または更新が必要です。
カスタム・タグによって定義されるスクリプト変数の詳細は、TLDまたは(パッケージjavax.servlet.jsp.tagext
内の)TagExtraInfo
抽象クラスのサブクラスで指定されます。このマニュアルでは、TagExtraInfo
のサブクラスをタグ補足情報クラスと呼びます。JSPコンテナは、このクラスのインスタンスを変換時に使用します。
タグ・ライブラリ・バリデータ・クラスには、タグ・ライブラリを使用するJSPページの妥当性チェックを、指定の制約に従って行うためのロジックがあります。
サーブレット2.3のイベント・リスナーは、タグ・ライブラリと併用できます。この機能は、アプリケーションのweb.xml
ファイルでリスナーを宣言する便利な代替方法です。
web.xml
の使用Sun社のJavaサーブレット仕様では、サーブレットの標準デプロイメント・ディスクリプタであるweb.xml
ファイルについて説明しています。JSPアプリケーションは、このファイルを使用して、JSPタグ・ライブラリ・ディスクリプタの場所を指定します。
JSPタグ・ライブラリの場合、web.xml
ファイルには、taglib
要素、およびtaglib-uri
とtaglib-location
の2つのサブ要素を含めることができます。
これらの項目については、第8章「JSPタグ・ライブラリ」を参照してください。詳細は、Sun社のJSP仕様を参照してください。
OC4Jが提供するタグ・ライブラリの詳細は、『Oracle Application Server Containers for J2EE JSPタグ・ライブラリおよびユーティリティ・リファレンス』を参照してください。
この項では、オンデマンド変換(JSPページの初回実行時)、JSPコンテナのロール、サーブレット・コンテナおよびエラー処理など、JSPページの実行方法の概要を説明します。
JSPコンテナは、JSPページの変換、実行および処理を行い、JSPページにリクエストを渡すエンティティです。
JSPコンテナの構成は、厳密には各実装によって異なりますが、サーブレットまたは複数サーブレットの集合で構成されています。したがって、JSPコンテナは、サーブレット・コンテナによって実行されます。サーブレット・コンテナの概要は、「サーブレット・コンテナ」を参照してください。
JSPコンテナは、WebサーバーがJavaで記述されている場合、Webサーバーに取り込むことができます。そうでない場合は、関連付けたWebサーバーで使用できます。
JSPページの実行モデルには、次の2種類があります。
JSPページはオンデマンド変換で実行するのが一般的です。JSPコンテナが取り込まれたWebサーバーからJSPページがリクエストされると、フロントエンド・サーブレットがインスタンス化されて起動します(Webサーバーが正しく構成されていることが前提です)。このサーブレットは、JSPコンテナのフロントエンドとみなすことができます。OC4Jでは、oracle.jsp.runtimev2.JspServlet
です。
JspServlet
は、必要な場合(変換したクラスが存在しない場合、またはJSPページ・ソースが更新されている場合)、JSPページの検索、変換およびコンパイルを行い、そのページの実行をトリガーします。
Webサーバーは、ファイル名の拡張子*.jsp
(URL内)をJspServlet
にマッピングするために、正しく構成されている必要があります。この構成は、OC4Jのインストール時に自動的に処理されます。詳細は、「JSPコンテナの設定」で説明します。
通常のオンデマンド変換とは別の方法として、開発者がJSPページを事前に変換してからデプロイする場合があります。この事前変換には、次のようなメリットがあります。
詳細は、「JSPの事前変換」および「バイナリ・ファイルのみのデプロイ」を参照してください。
Oracleには、JSPページを事前に変換するためのojspc
コマンドライン・ユーティリティが用意されています。このユーティリティには、出力ファイル用の適切なベース・ディレクトリを、アプリケーションのデプロイ方法に応じて設定できるオプションがあります。ojspc
ユーティリティについては、「ojspc事前変換ユーティリティ」で説明します。
典型的なオンデマンド変換では、JSPページは、通常、次の手順で実行されます。
.jsp
で終わるURLにより、JSPページをリクエストします。
.jsp
を認識すると、すぐにJSPコンテナを起動します。
.java
ファイルにサーブレット・コードが作成され、その.java
ファイルがコンパイルされて、サーブレットの.class
ファイルが作成されます。JSPトランスレータによって生成されたサーブレット・クラスは、javax.servlet.jsp.HttpJspPage
インタフェースを実装するクラス(JSPコンテナによって提供されます)を拡張します(「標準のJSPインタフェースとメソッド」で説明します)。このサーブレット・クラスは、「ページ実装クラス」と呼ばれます。このマニュアルでは、ページ実装クラスのインスタンスを「JSPページ・インスタンス」と呼びます。
JSPページをサーブレットに変換すると、標準的なサーブレット・プログラミングのオーバーヘッド(HttpJspPage
インタフェースの実装、サービス・メソッドのコード生成など)が、生成されたサーブレット・コードに自動的に取り込まれます。
次に、JSPページ・インスタンスは、HTTPリクエストを処理してHTTPレスポンスを生成し、そのレスポンスをクライアントに返信します。
JSPページは、URLにアクセスして直接的にリクエストしたり、別のWebページやサーブレットを使用して間接的にリクエストできます。
サーブレットやHTMLページと同様に、ユーザーは、URLによりJSPページを直接リクエストできます。たとえば、次のように、myapp
ディレクトリにHelloWorld
JSPページがあり、myapp
は、Webサーバーのmyapproot
コンテキスト・パスにマッピングされていると仮定します。
myapp/dir1/HelloWorld.jsp
たとえば、次のURLにアクセスしてこのページをリクエストできます。
http://host:port/myapproot/dir1/HelloWorld.jsp
ユーザーが初めてHelloWorld.jsp
をリクエストすると、JSPコンテナは、このページの変換と実行をトリガーします。後続のリクエストでは、JSPコンテナはページの実行のみトリガーし、変換手順は不要となります。
サーブレットと同様に、JSPページも、通常のHTMLページからリンクしたり、別のJSPページやサーブレットから参照して、間接的に実行できます。
あるJSPページを別のJSPページにあるJSP文から起動する場合のパスは、アプリケーション・ルートに対して相対的なパス(コンテキスト相対パスまたはアプリケーション相対パスと呼ばれます)、または起動ページに対して相対的なパス(ページ相対パスと呼ばれます)のいずれかになります。ページ相対パスと異なり、アプリケーション相対パスは、「/
」で始まります。
通常、これらのパスは、URLリンクまたはHTMLリンクで使用するパスと同じではありません。前項の例の場合、次のように、HTMLリンクで使用するパスは、直接的なURLリクエストで使用するパスと同じです。
<a href="/myapp/dir1/HelloWorld.jsp" /a>
次に、JSP文のアプリケーション相対パスを示します。
<jsp:include page="/dir1/HelloWorld.jsp" flush="true" />
次に、同じディレクトリ内のJSPページからHelloWorld.jsp
を起動するページ相対パスを示します。
<jsp:forward page="HelloWorld.jsp" />
(jsp:include
文およびjsp:forward
文については、「標準アクション: JSPタグ」を参照してください。
|
![]() Copyright © 2000, 2005 Oracle. All Rights Reserved. |
|