| Oracle Containers for J2EE JavaServer Pages開発者ガイド 10g(10.1.3.1.0) B31860-01 |
|
この章では、JavaServer Pages(JSP)テクノロジの標準機能、およびJSP実行モデルについて説明します。一般的な情報の詳細は、Sun社のJSP仕様バージョン2.0を参照してください。
この章には、次の各項が含まれます。
次の各項で、JSPの概要を説明します。
単純にいえば、JavaServer Pages(JSP)テクノロジを使用すると、動的に生成されたコンテンツをWebブラウザに表示できるようになります。JSPページは、Oracle Application Server環境で実行されているすべてのWebベース・アプリケーションのプレゼンテーション・レイヤーを構成し、アプリケーションのビジネス・ロジックおよび処理能力に対するインタフェースを提供します。
JSPページは、次の2種類のマークアップ・テキストが含まれているテキスト・ファイルです。
JSPは開発が容易なため、迅速に実装できます。最新のリリースでは、JSPページの作成者には、Javaに関する深い知識すら必要ありません。
JavaServer Pagesは、JSPページの変換と実行をサポートするWebコンテナを必要とします。このWebコンテナは、Oracle Containers for J2EE(OC4J)の一部として提供されています。OC4Jの機能の詳細は、第2章「Oracle JSPの実装」を参照してください。
JSPは、Sun社が指定するJava 2プラットフォーム、Enterprise Edition(J2EE)アーキテクチャの主要なテクノロジです。OC4JのWebコンテナは、Sun社のJSP 2.0およびサーブレット2.4仕様に完全に準拠しています。
ほとんどの場面で、JSPページには、サーブレットと比べて少なくとも3つの利点があります。
JSP構文を使用すると、動的なWebページを簡単な方法でコーディングできるため、通常は、同様のサーブレット・コードより大幅に少ないコード量で済みます。また、標準のJSPまたはサーブレット・インタフェースの実装、およびHTTPセッションの作成など、一部のサーブレット・コーディングのオーバーヘッドが、JSPトランスレータによって自動的に処理されます。
JSPテクノロジは、静的なコンテンツ用のHTMLコードの開発と、ビジネス・ロジックおよび動的なコンテンツ用のJavaコードの開発を、ある程度分離しようとするものです。このため、JSPプログラミングはWeb設計者にとって使用しやすく、魅力あるものになっています。プレゼンテーションやレイアウトの担当者と、Java開発者との間で、メンテナンス作業を単純に分離できるためです。
JSPテクノロジは、JavaBeansやEnterprise JavaBeans(EJB)などの再利用可能なコンポーネントを使用しやすいよう設計されています。通常J2EEアプリケーションとともに提供されているJSPタグ・ライブラリにより、コーディングはさらに容易になります。
JSPページの動的な性質は、WebページのHTML(またはXMLなどその他のマークアップ・コード)に埋め込まれているJSP要素によって実現されます。これらの要素により、外部のJavaコンポーネント(JavaBeansまたはEnterprise JavaBeans(EJB)など)へのアクセスが可能になります。これらのJavaコンポーネントはWebアプリケーションのビジネス・ロジックと処理能力を提供します。同様に、これらのコンポーネントは、データベースまたは他のEISに直接または間接的にアクセスできます。
JSPページは、通常はクライアントからリクエストされた時点で、Javaサーブレットに変換されます。JSPトランスレータは、URL内の.jspファイル名拡張子によってトリガーされます。次に、変換されたページが実行され、普通のサーブレットと同様に、HTTPリクエストの処理やレスポンスの生成を実行します。JSPページのコーディングは、同様のサーブレットをコーディングするよりも、かなり簡単です。
さらに、JSPページは、サーブレットと完全に相互運用できます。つまり、JSPページは、サーブレットの出力をインクルードしたり、サーブレットに出力を転送できます。一方、サーブレットは、JSPページの出力をインクルードしたり、JSPページに出力を転送できます。
次に、単純なJSPページwelcomeuser.jspのコードを示します。
<%@ page import="java.util.*" %> <HTML> <HEAD><TITLE>The Welcome User JSP</TITLE></HEAD> <BODY> <H3>Welcome ${param.user}!</H3> <P><B> Today is ${Date}. Have a fabulous day! :-)</B></P> <B>Enter name:</B> <FORM METHOD=GET> <INPUT TYPE="text" NAME="user" SIZE=5> <INPUT TYPE="submit" VALUE="Submit name"> </FORM> </BODY> </HTML>
ユーザーが「Amy」という名前を入力すると、このJSPページでは、次のような出力が作成されます。
Welcome Amy! Today is Wed Jun 2 3:42:23 PDT 2000. Have a fabulous day! :-)
図1-1に、ユーザーがブラウザでURLを指定してJSPページをコールした場合の、実行フローの概要を概念的に示します。Hello.jspはデータベースにアクセスすると仮定します。
.jspファイル名拡張子により、次の手順が自動的に発生します。
Hello.jspを変換し、ファイルHello.javaを生成します。
Hello.classを作成します。
Hello.classがサーブレットとして実行され、JSP実行時ライブラリを使用します。
Helloクラスが必要に応じてJDBCを介してデータベースにアクセスし、出力をブラウザに送信します。
次の例では、一般的なJSPで、HTMLマークアップとJSP要素の両方を使用し、静的および動的なコンテンツを提供する方法を示します。動的なコンテンツは、OC4JのJSPコンテナが完全にサポートする、JSP 2.0構文で作成されています。
|
注意 JSP 2.0仕様では、従来のJSP構文の代替として、XML互換のJSP構文をサポートしています。これにより、構文的に有効なXML文書であるJSPページを作成できます。XML互換の構文の詳細は、第8章「OC4JにおけるJSP XMLサポート」を参照してください。 |
JSPにより、HTTPリクエストで指定された従業員について、データベースに保存されているすべての電話番号が表示されます。従業員の電話番号をキー/値ペアのマップとして含むJavaBeansオブジェクトが、コードによって作成されます。JSPにより電話番号が反復され、各キーとその値がHTML表に表示されます。
<%@ page contentType="text/html; charset=UTF-8"; import="mypkg.*" %> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <html> <head><title>Phone List</title></head> <body> <jsp:useBean id="employee" scope="application" class="mypkg.Employee"/> <jsp:setProperty name="employee" property="empUserId" param="employeeId"/> <c:set var="empName" value="${employee.fullName}" /> <h2>Current Phone Numbers for ${empName}</h2> <c:if test ="${!empty employee.phoneNumbers}> <table> <tr> <th>Phone Type:</th><th>Number:</th> </tr> <c:forEach var="entry" items="{$employee.phoneNumbers}"> <tr> <td>${entry.key}</td> <td>${entry.value}></td> </tr> </c:forEach> </table> </c:if> <c:if test="${empty employee.phoneNumbers}"> <c:out value="No phone numbers were found for ${empName}"> </c:if> </body> </html>
次に、この例で使用されているJSP要素を説明します。
この例のpageディレクティブ(<%@ page ... %>)は、ページが返すコンテンツ・タイプを指定し、使用するmypkgパッケージをインポートします。taglibディレクティブ(<%@ taglib ... %>)は、ページで使用するカスタム・タグ・ライブラリをインポートします。この例では、JavaServer Pages Standard Tag Library(JSTL)コア・ライブラリです。
この例では、jsp:useBean標準アクションにより、Employee JavaBeansインスタンスが返されます。
jsp:setPropertyタグにより、Beanプロパティの値が設定されます。この例では、empUserIdプロパティに、employeeIdリクエスト・パラメータの値が設定されます。
この例では、c:forEachタグによってユーザーの電話番号が反復され、c:ifタグによってこのユーザーの電話番号が検出されたかどうかがテストされ、検出されなかった場合はメッセージが出力されます。
すべてのカスタム・タグは、タグの接頭辞で示されるタグ・ライブラリに所属します。この例では、接頭辞c:は、使用されているタグがJSTLのcoreタグ・ライブラリに所属することを示しています。カスタム・タグの作成および使用方法の詳細は、第7章「カスタム・タグの使用」を参照してください。
${ ... }構文によって識別されるJSPの式言語(EL)の式を使用すると、JavaBeansやそのプロパティなどのオブジェクトに簡単にアクセスできます。 ELは、従来のJSP構文で使用されるJava式の代替手段です。たとえば、EL式${employee.fullName}は、JSPスクリプトの式<% = employee.getFullName() %>と同等です。
詳細は、「式言語の使用によるJSP作成の単純化」を参照してください。
次の項では、ディレクティブ、スクリプト要素および標準アクション・タグを含むJSPの基本構文を説明し、いくつかの例を示します。また、Beanプロパティの変換についても説明します。JSP 2.0構文の詳細は、Sun社のJSP仕様2.0を参照してください。
ディレクティブは、JSPページ全体に関する指示をWebコンテナに提供します。この情報は、ページの変換に使用されます。基本的な構文は、次のとおりです。
<%@ directive attribute="value" 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タグ・ライブラリとタグ・ライブラリ・ディスクリプタの概要は、「カスタム・タグ・ライブラリ」で説明します。詳細は、第7章「カスタム・タグの使用」を参照してください。
JSPスクリプト要素には、JSPページに表示可能なJavaコードの次のカテゴリが含まれます。
JSPページで使用するメソッドまたはメンバー変数を宣言する文です。
JSP宣言は、<%!...%>宣言タグ内で標準のJava構文を使用し、メンバー変数またはメソッドを宣言します。これによって、生成されたサーブレット・コードで、対応する宣言が行われます。次に例を示します。
<%! double f=0.0; %>
この例では、メンバー変数のfを宣言します。JSPトランスレータで生成されたサーブレット・クラス・コードで、fはクラスのトップレベルで宣言されます。
評価され、必要に応じて文字列値に変換され、ページ内の検出された場所に表示されるJava式です。
JSP式は、セミコロンで終了せず、<%=...%>タグ内に含まれます。次に例を示します。
<P><B> Today is <%= new java.util.Date() %>. Have a nice day! </B></P>
ページのマークアップ言語内に記述される、Javaコードの断片です。
スクリプトレットまたはコードの一部分は、1行または複数行のJavaコードで構成されている場合があります。このスクリプトレットをJSPページのHTMLコード内で使用すると、条件ブランチやループなどを設定できます。
JSPスクリプトレットは<%...%>スクリプトレット・タグ内に含まれ、通常のJava構文を使用します。
次の例では、JavaBeanインスタンスのpageBeanを使用しています。
<% if (pageBean.getNewName().equals("")) { %> I don't know you. <% } else { %> Hello <%= pageBean.getNewName() %>. <% } %>
1行で構成されたJSPスクリプトレットが、2行のHTMLコードと交互に記述され、その1行にはセミコロンが不要なJSP式が含まれています。JSP構文によって、HTMLコードは、ifブランチとelseブランチ(スクリプトレットに設定されたJavaの中カッコ内)内で条件付きで実行されます。
次の例では、Javaコードがスクリプトレットに追加されています。
<% if (pageBean.getNewName().equals("")) { %> I don't know you. <% empmgr.unknownemployee(); } else { %> Hello <%= pageBean.getNewName() %>. <% empmgr.knownemployee(); }%>
ここでは、JavaBeanインスタンスのpageBeanを使用し、すでにインスタンス化されているオブジェクトのempmgrには、既知または未知の従業員に対して適切な機能を実行するメソッドが設定されていることが前提になっています。
|
注意 メンバー変数とは対照的に、メソッド変数の宣言には、次の例のようにJSPスクリプトレットを使用します。 <% double f2=0.0; %>
このスクリプトレットは、メソッド変数の メソッド変数とメンバー変数の比較は、「メソッド変数宣言とメンバー変数宣言の使用の比較」を参照してください。 |
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ページで一連の暗黙的なオブジェクトが使用可能になります。これらのオブジェクトは、Webコンテナによって自動的に作成されるJavaオブジェクトで、基礎となるサーブレット環境との相互作用を可能にします。
次に、使用可能な暗黙的なオブジェクトを示します。これらのオブジェクトで使用可能なメソッドについては、Sun社の指定クラスとインタフェースに関するJavadocを参照してください。
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オブジェクトは、JSP 2.0のjavax.servlet.jsp.JspContextを拡張するjavax.servlet.jsp.PageContextクラスのインスタンスです。
pageContextオブジェクトにはpageスコープがあり、これによって、関連付けられたJSPページ・インスタンスにのみアクセスできます。
sessionこのオブジェクトは、HTTPセッションを表す、javax.servlet.http.HttpSessionインタフェースを実装するクラスのインスタンスです。
applicationこのオブジェクトは、Webアプリケーションのサーブレット・コンテキストを表し、javax.servlet.ServletContextインタフェースを実装するクラスのインスタンスです。
applicationオブジェクトは、単一のJVM内でアプリケーションのインスタンスの一部として実行しているJSPページ・インスタンスからアクセスできます。
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.Throwableインスタンスです。
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スコープは、アプリケーション自体が終了するか、Webコンテナまたはサーブレット・コンテナが停止すると終了します。
次のように、狭いスコープから広いスコープへ4つのスコープに区分けされます。
page < request < session < application
1つのアプリケーション内にある異なるページ間でオブジェクトを共有する場合、たとえば、あるページから別のページに実行を転送したり、あるページのコンテンツを別のページにインクルードする場合は、共有するオブジェクトに対してpageスコープを使用できません。この場合は、ページごとに関連付けられた個別のオブジェクト・インスタンスを使用します。ページ間でのオブジェクト共有に使用できる最も狭いスコープは、requestです。(ページをインクルードおよび転送する方法については、次の「標準のJSPアクション・タグ」を参照。)
JSP操作の要素により、JSPページの実行中に発生する操作(Javaオブジェクトをインスタンス化し、ページに対して使用可能にするなど)が行われます。次のような操作が含まれます。
標準アクションについては、JSP仕様に一連のタグが定義されています。JSPページのコードは、この章で前述したディレクティブとスクリプト要素を使用して作成できますが、ここで説明する標準的なタグを使用すると、機能性や利便性が向上します。
JSPの標準アクションに対する一般的なタグの構文は、次のとおりです。
<jsp:tagattr="value" attr2="value2" ... attrN="valueN"> ...body... </jsp:tag>
ボディがない場合は、次のとおりです。
<jsp:tag attr="value", ..., attrN="valueN" />
次に、一般的に使用されるJSPの標準アクション・タグについて簡単に説明します。
jsp:usebean
jsp:setProperty
jsp:getProperty
jsp:param
jsp:include
jsp:forward
jsp:plugin
次のタグについては、このマニュアルの他の項で説明します。
注意
doBodyタグについては、「タグ・ボディの処理」を参照してください。
body、elementおよびtextタグについては、「テンプレートおよび動的なテンプレート・コンテンツの含有」を参照してください。
jsp:useBeanタグは、Java型のインスタンス(通常はJavaBeanクラス)にアクセスし、Java型のインスタンスを作成します。また、インスタンスを指定の名前またはIDに関連付けます。インスタンスは、指定したスコープのスクリプト変数として、そのIDを介して使用できます。スクリプト変数の概要は、「カスタム・タグ・ライブラリ」を参照してください。スコープの詳細は、「JSPオブジェクトとスコープ」を参照してください。
主な属性は、class、type、idおよびscopeです。(使用頻度は多くありませんが、後述のbeanName属性もあります。)
id属性を使用して、インスタンス名を指定します。Webコンテナは最初に、指定したスコープ内で、指定した型の指定のIDによってオブジェクトを検索します。オブジェクトが見つからない場合、コンテナはそのオブジェクトの作成を試みます。
class属性は、Webコンテナが必要に応じてインスタンス化できるクラスを指定するために使用します。クラスは、抽象クラスにはできません。また、引数のないコンストラクタが必要です。
class属性のかわりに、beanName属性を使用することもできます。この場合は、クラス名のかわりにシリアライズ可能なリソースを指定するオプションがあります。beanName属性を使用すると、Webコンテナはjava.beans.Beansクラスのinstantiate()メソッドを使用してインスタンスを作成します。
type属性は、Webコンテナがインスタンス化できない型(インタフェース、抽象クラス、あるいは引数のないコンストラクタを持たないクラスのうちいずれか)を指定するために使用します。インスタンスがすでに存在する場合やインスタンス化可能なクラスのインスタンスが型に割り当てられる場合は、typeを使用します。次に、典型的な3種類の使用例を示します。
typeとidを使用します。
classとidを使用します。インスタンスは、ターゲット・スコープにすでに存在しているインスタンスか、Webコンテナによって新規作成されるインスタンスのいずれかです。
class、typeおよびidを使用します。この場合、クラスは、型に対して正式に割当て可能であることが必要です。
scope属性を使用して、インスタンスのスコープを指定します。ページ・コンテキスト・オブジェクトに関連付けるインスタンスの場合はpage、HTTPリクエスト・オブジェクトに関連付けるインスタンスの場合はrequest、HTTPセッション・オブジェクトに関連付けるインスタンスの場合はsession、サーブレット・コンテキストに関連付けるインスタンスの場合はapplicationです。
次の例では、型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リクエストのパラメータから一連のプロパティと値を繰り返し取得できます。
次の例では、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プロパティへの変換」を参照してください。
|
重要
|
jsp:getPropertyタグは、Beanのプロパティ値を読み取ってJava文字列に変換し、暗黙的なoutオブジェクトに配置します。これによって、文字列値を出力として表示できます。Beanは、jsp:useBeanタグにすでに指定されている必要があります。文字列に変換する場合、プリミティブ型は直接変換され、オブジェクト型は、java.lang.Objectクラスに指定されているtoString()メソッドを使用して変換されます。
次の例では、pageBean Beanのuserプロパティの値を、outオブジェクトに出力します。
<jsp:getProperty name="pageBean" property="user" />
jsp:paramsタグは、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 Webコンテナは、「true」または「false」のいずれかの設定をサポートします。デフォルトは「false」です。
次の例に示すように、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属性を使用して、実行するアプレットやコード・ベースなどの構成情報を指定します。nspluginurl="url"属性(Netscapeブラウザの場合)またはiepluginurl="url"属性(Internet Explorerブラウザの場合)を指定できます。
jsp:paramsの開始タグと終了タグの間にネストされているjsp:paramタグを使用して、アプレットまたはJavaBeanにパラメータを指定します。(jsp:paramsの開始タグと終了タグは、jsp:include操作またはjsp:forward操作でjsp:paramを使用する場合は含まれません。)
プラグインが実行できない場合は、jsp:fallbackタグを使用して、実行する代替テキストを定めます。
次の例は、アプレット・プラグインの使用方法を示します。
<jsp:plugin type=applet code="Sample.class" codebase="/html" > <jsp:params> <jsp:param name="sample" value="samples/sample01" /> </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開発ツールで自動的に使用することもできます。標準のタグ・ライブラリは、異なるWebコンテナ実装間で移植可能であることが必要です。
JSPタグ・ライブラリに対する標準的なJavaServer Pagesのサポートに関する主な概念には、次の項目が含まれます。
これらの項目については、第7章「カスタム・タグの使用」を参照してください。
OC4Jが提供するタグ・ライブラリの詳細は、『Oracle Containers for J2EE JSPタグ・ライブラリおよびユーティリティ・リファレンス』を参照してください。
JSP式言語(EL)を使用すると、JavaBeansに格納されているリクエスト・パラメータやアプリケーション・データにアクセスする際、埋込みJavaスクリプトレットや式を使用する必要がなく、JSPの作成が非常に簡単になります。
ELは、元はJavaServer Pages標準タグ・ライブラリ(JSTL)バージョン1.0の一部として導入されました。JSP 2.0のリリースに伴い、ELはJSP仕様に統合され、データへのアクセス機能が著しく改善されました。
JSP 2.0準拠のOC4Jコンテナでは、実装されたEL式を次のものとして解釈できます。
jsp:useBeanなど)または実行時の式を使用できるカスタム・タグの属性値。
tagdependentと宣言されている場合、式は評価されません。
次の例では、JSTLのc:ifタグを使用して、企業のリストから製鉄業の企業を選択します。
<c:if test="${company.industry == 'steel'}"> ... </c:if>
この項では、式言語の構文の概要を示し、OC4JのJSPアプリケーションでEL評価を使用する方法を説明します。
ELには独自の構文がありますが、一般的な目的で使用されるプログラミング言語ではありません。むしろ、JSP作成者の作業を簡単にするためのデータ・アクセス・メカニズムです。
式言語には、部分的にJavaScriptの構文に基づいた、独自の構文があります。次に、JSP式言語の主な構文機能の概要を示します。続いて、単純な例をいくつか示します。
式言語は、${expression}構文によって起動されます。最も基本的なセマンティックとしては、指定された変数${foo}を起動すると、メソッド・コールPageContext.findAttribute(foo)と同じ結果が得られます。
JavaBeansや、リスト、マップおよび配列などのコレクション内の指定されたプロパティにアクセスするために、式言語では「.」および「[]」演算子をサポートしています。
「.」演算子を使用すると、名前が標準のJava識別子であるプロパティにアクセスできます。たとえば、employee.phones.cellは、Java構文のemployee.getPhones().getCell()と同等です。
「[]」演算子は、配列またはリストへのアクセスなど、より一般的なアクセスに使用します。ただし、有効なJava識別子に対しては、「.」演算子と同等です。たとえば、式employee.phoneNumbersとemployee["phoneNumbers"]は同じ結果を返します。
式言語では、関係演算子==(またはeq)、!=(またはne)、<(またはlt)、>(またはgt)、<=(またはle)、>=(またはge)をサポートしています。
式言語では、算術演算子+、-、*、/(またはdiv)、%(またはmod、剰余またはモジュロに使用)をサポートしています。
式言語では、論理演算子&&(またはand)、||(またはor)、!(またはnot)、emptyをサポートしています。
次の例では、式言語の基本的な起動を示します。関係演算子<=(以下を示す)が含まれています。
<c:if test="${auto.price <= customer.priceLimit}"> The <c:out value="${auto.makemodel}"/> is in your price range. </c:if>
次の例では、「.」および「[]」演算子の使用方法を示します。catalogueは製品の説明が含まれているMapオブジェクト、preferencesは特定のユーザーの設定が含まれているMapオブジェクトです。
Item: <c:out value="${catalogue[productId]}"/> Delivery preference: <c:out value="${user.preferences['delivery']}"/>
式言語では、次の暗黙的なオブジェクトが用意されています。
pageScope: pageスコープ変数にアクセスできます。
requestScope: requestスコープ変数にアクセスできます。
sessionScope: sessionスコープ変数にアクセスできます。
applicationScope: applicationスコープ変数にアクセスできます。
pageContext: JSPページのページ・コンテキストのすべてのプロパティにアクセスできます。
param: 通常request.getParameter()メソッドによってアクセスされるリクエスト・パラメータを含んでいる、JavaのMapオブジェクト。式${param["foo"]}または同等の${param.foo}は、いずれもリクエスト・パラメータfooに関連付けられた最初の文字列値を返します。
paramValues: たとえば、paramValues["foo"]を使用すると、リクエスト・パラメータfooに関連付けられたすべての文字列値の配列が返されます。
header: paramと同様、このオブジェクトを使用して、リクエスト・ヘッダーに関連付けられた最初の文字列値にアクセスできます。
headerValues: paramValuesを使用する際と同様に、このオブジェクトを使用して、リクエスト・ヘッダーに関連付けられたすべての文字列値にアクセスできます。
initParam: コンテキスト初期化パラメータにアクセスできます。
cookie: リクエスト内で受信したCookieにアクセスできます。
式言語では、次の追加機能も提供されています。
式言語では、EL式内で起動可能な、関数と呼ばれる静的なメソッドを定義できます。
関数の作成または使用は、カスタム・タグの作成または使用と似ています。現に、JSTLには、実際は式言語の関数であるカスタム・タグが6つ含まれています。カスタム・タグの実装の詳細は、第7章「カスタム・タグの使用」を参照してください。
関数は、PUBLICなJavaクラス内のPUBLICな静的なメソッドとして実装する必要があります。次の例では、Jakarta Taglib標準ライブラリから入手可能な、JSTLのfn:length関数の静的なメソッドを説明しています。
public static int length(Object obj) throws JspTagException { ... }
関数メソッドが含まれているクラスは、カスタム・タグと同様、タグ・ライブラリとしてグループ化されます。各関数のシグネチャと、対応するメソッドが含まれているPUBLICクラスへのマッピングが、タグ・ライブラリ・ディスクリプタ(TLD)ファイルに追加されます。次に例を示します。
<function> <description> Returns the number of items in a collection or the number of characters in a string. </description> <name>length</name> <function-class> org.apache.taglibs.standard.functions.Functions </function-class> <function-signature> int length(java.lang.Object) </function-signature> </function>
ELの関数を使用するには、JSPではtaglibディレクティブを使用して適切なタグ・ライブラリをインポートする必要があります。次の例では、fn:length関数を実装するJavaクラスが含まれている、JSTLのfunctionsライブラリをページにインポートします。
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
これで、関数をJSP内のEL式から起動できます。次の例では、スコープ付き変数employeesは、Employeeオブジェクトのコレクションです。
There are ${fn:length(employees)} employees listed in the database.
EL構文で書かれたパターンを、EL式として評価せずにJSPで使用できるよう、式言語を無効化または解除することが可能です。ELは、Webアプリケーションまたは個別のJSPレベルのいずれでも無効化できます。また、EL式を無視するよう、タグ・ファイルに指示することも可能です。
パターン\$は、ELが有効な場合は引用符として認識されますが、ELを無効化すると引用符として認識されないため、注意してください。
アプリケーション内のすべてのJSPでELを無効化するには、アプリケーションのweb.xml Webアプリケーション・ディスクリプタ・ファイルに、次の<jsp-property-group>要素を追加します。
<jsp-property-group> <url-patter>*.jsp</url-pattern> <el-ignored>true</el-ignored> </jsp-property-group>
JSPページでEL式を無効化するには、JSPで、pageディレクティブのisELIgnored属性をtrueに設定します。
タグ・ファイルでEL評価を無効化するには、タグ・ファイルで、tagディレクティブのisELIgnored属性をtrueに設定します。
この項では、オンデマンド変換(JSPページの初回実行時)およびエラー処理など、JSPページの実行方法の概要を説明します。
JSPページの実行モデルには、次の2種類があります。
JSPページはオンデマンド変換で実行するのが一般的です。Webコンテナが取り込まれたWebサーバーからJSPページがリクエストされると、フロントエンド・サーブレットがインスタンス化されて起動します(Webサーバーが正しく構成されていることが前提です)。このサーブレットは、Webコンテナのフロントエンドとみなすことができます。OC4Jでは、oracle.jsp.runtimev2.JspServletです。
JspServletは、必要な場合(変換したクラスが存在しない場合、またはJSPページ・ソースが更新されている場合)、JSPページの検索、変換およびコンパイルを行い、そのページの実行をトリガーします。
Webサーバーは、ファイル名の拡張子*.jsp(URL内)をJspServletにマッピングするために、正しく構成されている必要があります。
通常のオンデマンド変換とは別の方法として、開発者がJSPページを事前に変換してからデプロイする場合があります。この事前変換には、次のようなメリットがあります。
Oracleには、JSPページを事前に変換するためのojspcコマンドライン・ユーティリティが用意されています。このユーティリティには、出力ファイル用の適切なベース・ディレクトリを、アプリケーションのデプロイ方法に応じて設定できるオプションがあります。ojspcユーティリティについては、第4章「ojspcによるJSPページのプリコンパイル」で説明します。
典型的なオンデマンド変換では、JSPページは、通常、次の手順で実行されます。
.jspで終わるURLにより、JSPページをリクエストします。
.jspを認識すると、すぐにWebコンテナを起動します。
.javaファイルにサーブレット・コードが作成され、その.javaファイルがコンパイルされて、サーブレットの.classファイルが作成されます。JSPトランスレータによって生成されたサーブレット・クラスは、javax.servlet.jsp.HttpJspPageインタフェースを実装するクラス(Webコンテナによって提供されます)を拡張します。このサーブレット・クラスは、「ページ実装クラス」と呼ばれます。このマニュアルでは、ページ実装クラスのインスタンスを「JSPページ・インスタンス」と呼びます。
JSPページをサーブレットに変換すると、標準的なサーブレット・プログラミングのオーバーヘッド(HttpJspPageインタフェースの実装、サービス・メソッドのコード生成など)が、生成されたサーブレット・コードに自動的に取り込まれます。
次に、JSPページ・インスタンスは、HTTPリクエストを処理してHTTPレスポンスを生成し、そのレスポンスをクライアントに返信します。
JSPページは、URLにアクセスして直接的にリクエストしたり、別のWebページやサーブレットを使用して間接的にリクエストできます。
サーブレットやHTMLページと同様に、ユーザーは、URLによりJSPページを直接リクエストできます。たとえば、次のように、myappディレクトリにHelloWorld JSPページがあり、myappは、Webサーバーのmyapprootコンテキスト・パスにマッピングされていると仮定します。
myapp/dir/HelloWorld.jsp
たとえば、次のURLにアクセスしてこのページをリクエストできます。
http://host:port/myapproot/dir/HelloWorld.jsp
ユーザーが初めてHelloWorld.jspをリクエストすると、Webコンテナは、このページの変換と実行をトリガーします。後続のリクエストでは、Webコンテナはページの実行のみトリガーし、変換手順は不要となります。
サーブレットと同様に、JSPページも、通常のHTMLページからリンクしたり、別のJSPページやサーブレットから参照して、間接的に実行できます。
あるJSPページを別のJSPページにあるJSP文から起動する場合のパスは、アプリケーション・ルートに対して相対的なパス(コンテキスト相対パスまたはアプリケーション相対パスと呼ばれます)、または起動ページに対して相対的なパス(ページ相対パスと呼ばれます)のいずれかになります。ページ相対パスと異なり、アプリケーション相対パスは、「/」で始まります。
通常、これらのパスは、URLリンクまたはHTMLリンクで使用するパスと同じではありません。前項の例の場合、次のように、HTMLリンクで使用するパスは、直接的なURLリクエストで使用するパスと同じです。
<a href="/myapp/dir/HelloWorld.jsp" /a>
次に、JSP文のアプリケーション相対パスを示します。
<jsp:include page="/dir/HelloWorld.jsp" flush="true" />
次に、同じディレクトリ内のJSPページからHelloWorld.jspを起動するページ相対パスを示します。
<jsp:forward page="HelloWorld.jsp" />
(jsp:include文およびjsp:forward文については、「標準のJSPアクション・タグ」を参照してください。)
|
![]() Copyright © 2007 Oracle Corporation. All Rights Reserved. |
|