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