ヘッダーをスキップ

Oracle Containers for J2EE JavaServer Pages開発者ガイド
10g(10.1.3.1.0)

B31860-01
目次
目次
索引
索引

戻る 次へ

1 JSPスタート・ガイド

この章では、JavaServer Pages(JSP)テクノロジの標準機能、およびJSP実行モデルについて説明します。一般的な情報の詳細は、Sun社のJSP仕様バージョン2.0を参照してください。

この章には、次の各項が含まれます。

JavaServer Pagesテクノロジの概要

次の各項で、JSPの概要を説明します。

JavaServer Pagesテクノロジの概要

単純にいえば、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の主な利点

ほとんどの場面で、JSPページには、サーブレットと比べて少なくとも3つの利点があります。

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! :-) 

JSPの変換および実行時フロー

図1-1に、ユーザーがブラウザでURLを指定してJSPページをコールした場合の、実行フローの概要を概念的に示します。Hello.jspはデータベースにアクセスすると仮定します。

.jspファイル名拡張子により、次の手順が自動的に発生します。

  1. JSPトランスレータが起動され、Hello.jspを変換し、ファイルHello.javaを生成します。

  2. Javaコンパイラが起動され、Hello.classを作成します。

  3. Hello.classがサーブレットとして実行され、JSP実行時ライブラリを使用します。

  4. Helloクラスが必要に応じてJDBCを介してデータベースにアクセスし、出力をブラウザに送信します。

    図1-1    JSPの変換および実行時フロー


JSP構文の要素の概要

次の例では、一般的な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要素を説明します。

次の項では、ディレクティブ、スクリプト要素および標準アクション・タグを含むJSPの基本構文を説明し、いくつかの例を示します。また、Beanプロパティの変換についても説明します。JSP 2.0構文の詳細は、Sun社のJSP仕様2.0を参照してください。


注意

この項では、標準のJSP構文について説明します。JSP XML構文およびJSP XML文書の詳細は、第8章「OC4JにおけるJSP XMLサポート」を参照してください。 


ディレクティブ

ディレクティブは、JSPページ全体に関する指示をWebコンテナに提供します。この情報は、ページの変換に使用されます。基本的な構文は、次のとおりです。

<%@ directive attribute="value" attribute2="value2"... %>

JSP仕様では、次のディレクティブをサポートします。

pageディレクティブ

ページに依存する属性を指定します。たとえば、スクリプト言語、コンテンツ・タイプ、文字エンコード、拡張するクラス、インポートするパッケージ、使用するエラー・ページ、JSPページの出力バッファ・サイズ、バッファが満杯になったときにバッファを自動的にフラッシュするかどうかなどがあります。次に例を示します。

<%@ page language="java" import="packages.mypackage" errorPage="boof.jsp" %>

また、自動フラッシュを有効にし、JSPページの出力バッファ・サイズを20KBに設定する場合は、次のようにします。

<%@ page autoFlush="true" buffer="20kb" %>

次に、ページのバッファを無効にする例を示します。

<%@ page buffer="none" %>

includeディレクティブ

変換時にJSPページに挿入されるテキストまたはコードを含むリソースを指定します。次に例を示します。

<%@ include file="/jsp/userinfopage.jsp" %>

リソースへのページ相対パスまたはコンテキスト相対パスのいずれかを指定します。ページ相対パスおよびコンテキスト相対パスの詳細は、「JSPページのリクエスト」を参照してください。


注意

  • includeディレクティブは「静的なインクルード」と呼ばれ、この章で後述するjsp:include操作に本質は類似していますが、jsp:includeは変換時ではなくリクエスト時に効果があります。

  • includeディレクティブは、同じサーブレット・コンテキスト(アプリケーション)内のファイル間でのみ使用できます。

 

taglibディレクティブ

このディレクティブを使用して、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はクラスのトップレベルで宣言されます。


注意

メンバー変数とは対照的に、メソッド変数は、後述するように、JSPスクリプトレット内で宣言されます。この2つの比較は、「静的なインクルードと動的なインクルードの使用の比較」を参照してください。 


評価され、必要に応じて文字列値に変換され、ページ内の検出された場所に表示されるJava式です。

JSP式は、セミコロンで終了せず、<%=...%>タグ内に含まれます。次に例を示します。

<P><B> Today is <%= new java.util.Date() %>. Have a nice day! </B></P>


注意

jsp:setProperty文などに含まれるリクエスト時属性のJSP式は、文字列値に変換する必要はありません。 


スクリプトレット

ページのマークアップ言語内に記述される、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; %>

このスクリプトレットは、メソッド変数のf2を宣言します。JSPトランスレータで生成されたサーブレット・クラス・コードでは、f2は、サーブレットのサービス・メソッド内で変数として宣言されます。

メンバー変数は、前述のように、JSP宣言で宣言されます。

メソッド変数とメンバー変数の比較は、「メソッド変数宣言とメンバー変数宣言の使用の比較」を参照してください。 


コメント

Javaコード内に埋め込まれたコメントと同様に、JSPコード内に埋め込まれた、開発者のコメントです。

コメントは、<%--...--%>構文内に含まれます。次に例を示します。

<%-- Execute the following branch if no user name is entered. --%>

HTMLのコメントとは異なり、JSPのコメントは、ユーザーがブラウザでページのソースを表示しても参照できません。

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を参照してください。

暗黙的なオブジェクトの使用

前項で説明した暗黙的なオブジェクトは、いずれも便利なオブジェクトです。次の例では、requestオブジェクトを使用してHTTPリクエストからusernameパラメータの値を取得し、表示します。

<H3> Welcome <%= request.getParameter("username") %> ! <H3>

requestオブジェクトは、他の暗黙的なオブジェクトと同様に、自動的に使用可能になり、明示的にインスタンス化されません。

オブジェクトのスコープ

JSPページ内のオブジェクトは、明示的か暗黙的かに関係なく、特定のスコープ内でアクセス可能です。明示的なオブジェクト(jsp:useBean操作で作成されたJavaBeanインタンスなど)の場合は、「明示的なオブジェクト」の例に示すように、次の構文を使用して明示的にスコープを設定できます。

scope="scopeValue"

スコープには、次の4種類があります。

次のように、狭いスコープから広いスコープへ4つのスコープに区分けされます。

page < request < session < application

1つのアプリケーション内にある異なるページ間でオブジェクトを共有する場合、たとえば、あるページから別のページに実行を転送したり、あるページのコンテンツを別のページにインクルードする場合は、共有するオブジェクトに対してpageスコープを使用できません。この場合は、ページごとに関連付けられた個別のオブジェクト・インスタンスを使用します。ページ間でのオブジェクト共有に使用できる最も狭いスコープは、requestです。(ページをインクルードおよび転送する方法については、次の「標準のJSPアクション・タグ」を参照。)


注意

requestsessionおよびapplicationスコープはサーブレットにも適用されます。 


標準の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:useBeanタグは、Java型のインスタンス(通常はJavaBeanクラス)にアクセスし、Java型のインスタンスを作成します。また、インスタンスを指定の名前またはIDに関連付けます。インスタンスは、指定したスコープのスクリプト変数として、そのIDを介して使用できます。スクリプト変数の概要は、「カスタム・タグ・ライブラリ」を参照してください。スコープの詳細は、「JSPオブジェクトとスコープ」を参照してください。

主な属性は、classtypeidおよびscopeです。(使用頻度は多くありませんが、後述のbeanName属性もあります。)

id属性を使用して、インスタンス名を指定します。Webコンテナは最初に、指定したスコープ内で、指定した型の指定のIDによってオブジェクトを検索します。オブジェクトが見つからない場合、コンテナはそのオブジェクトの作成を試みます。

class属性は、Webコンテナが必要に応じてインスタンス化できるクラスを指定するために使用します。クラスは、抽象クラスにはできません。また、引数のないコンストラクタが必要です。

class属性のかわりに、beanName属性を使用することもできます。この場合は、クラス名のかわりにシリアライズ可能なリソースを指定するオプションがあります。beanName属性を使用すると、Webコンテナはjava.beans.Beansクラスのinstantiate()メソッドを使用してインスタンスを作成します。

type属性は、Webコンテナがインスタンス化できない型(インタフェース、抽象クラス、あるいは引数のないコンストラクタを持たないクラスのうちいずれか)を指定するために使用します。インスタンスがすでに存在する場合やインスタンス化可能なクラスのインスタンスが型に割り当てられる場合は、typeを使用します。次に、典型的な3種類の使用例を示します。

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タグ

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プロパティへの変換」を参照してください。


重要

property="*"の場合は、次の点に注意してください。

  • エラーが発生した場合に反復を継続するように指定するには、setproperty_onerr_continue構成パラメータをtrueに設定します。このパラメータの詳細は、「OC4J JSPコンテナの構成」を参照してください。(以前のリリースでは、デフォルトの動作は継続でした。ただし、OC4J 9.0.4実装から、デフォルトの動作はエラー発生時に停止となっています。)

    setproperty_onerr_continueパラメータはOracle Containers for J2EE 10g(10.1.3.1.0)では推奨されていません。

  • JSP仕様では、プロパティの設定順序を規定していません。順序を指定し、JSPページを移植可能にする場合は、各プロパティに対して異なるjsp:setProperty文を使用する必要があります。また、jsp:setProperty文を個別に使用する場合、JSPトランスレータは、対応するsetXXX()メソッドを直接生成できます。この場合は、変換中にのみイントロスペクションが発生します。実行時は、Beanのイントロスペクションが発生しないので、コストがかかりません。

 

jsp:getPropertyタグ

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: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タグ

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:includeタグは、この章で前述したincludeディレクティブと特性は類似していますが、変換時ではなくリクエスト時に効果があります。この2つの比較は、「静的なインクルードと動的なインクルードの使用の比較」を参照してください。

  • jsp:includeタグは、同じサーブレット・コンテキスト(アプリケーション)内のページ間でのみ使用できます。

 

jsp:forwardタグ

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:forwardの例と前述のjsp:includeの例の違いは、jsp:includeの例では、現行のページの出力内にuserinfopage.jspを挿入したのに対して、jsp:forwardの例では、現行のページの実行を停止してuserinfopage.jspを表示していることです。

  • jsp:forwardタグは、同じサーブレット・コンテキスト内のページ間でのみ使用できます。

  • jsp:forwardタグによって、元のrequestオブジェクトは、ターゲット・ページに転送されます。requestオブジェクトを転送しない場合は、標準のjavax.servlet.http.HttpServletResponseインタフェースに指定されているsendRedirect(String)メソッドを使用できます。これによって、一時的なリダイレクト・レスポンスが、指定したリダイレクト場所のURLを使用して、クライアントに送信されます。相対URLは開発者が指定できます。この相対URLは、サーブレット・コンテナによって絶対URLに変換されます。

 

jsp:pluginタグ

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>

ARCHIVEHEIGHTNAMETITLEWIDTHなど、その他のパラメータもjsp:pluginタグ内で使用できます。これらのパラメータの使用方法は、一般的なHTML仕様に従います。

文字列値からBeanプロパティへの変換

JSPページでjsp:useBeanタグを介してJavaBeanを使用し、次にjsp:setPropertyタグを使用してBeanプロパティを設定する場合は、バックグラウンドで変換が行われるため、文字列以外のプロパティの値を指定する場合でも、文字列入力を使用できます。変換には、2つの手順があります。次の各項で説明します。

一般的なプロパティ変換

関連するプロパティ・エディタがないBeanプロパティについて、文字列値を使用してプロパティを設定する場合の変換方法を表1-1に示します。

表1-1    属性の変換方法 
プロパティの型  変換 

Booleanまたはboolean 

BooleanクラスのvalueOf(String)メソッドに基づきます。 

Byteまたはbyte 

ByteクラスのvalueOf(String)メソッドに基づきます。 

Characterまたはchar 

StringクラスのcharAt(0)メソッド(索引値として0を入力)に基づきます。 

Doubleまたはdouble 

DoubleクラスのvalueOf(String)メソッドに基づきます。 

Integerまたはint 

IntegerクラスのvalueOf(String)メソッドに基づきます。 

Floatまたはfloat 

FloatクラスのvalueOf(String)メソッドに基づきます。 

Longまたはlong 

LongクラスのvalueOf(String)メソッドに基づきます。 

Shortまたはshort 

ShortクラスのvalueOf(String)メソッドに基づきます。 

Object 

Stringのコンストラクタがコールされる場合と同じように、リテラルの文字列を入力します。

ObjectインスタンスとしてStringインスタンスが戻されます。 

プロパティ・エディタによるプロパティの型変換

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作成の単純化

JSP式言語(EL)を使用すると、JavaBeansに格納されているリクエスト・パラメータやアプリケーション・データにアクセスする際、埋込みJavaスクリプトレットや式を使用する必要がなく、JSPの作成が非常に簡単になります。

ELは、元はJavaServer Pages標準タグ・ライブラリ(JSTL)バージョン1.0の一部として導入されました。JSP 2.0のリリースに伴い、ELはJSP仕様に統合され、データへのアクセス機能が著しく改善されました。

JSP 2.0準拠のOC4Jコンテナでは、実装されたEL式を次のものとして解釈できます。

次の例では、JSTLのc:ifタグを使用して、企業のリストから製鉄業の企業を選択します。

<c:if test="${company.industry == 'steel'}">
   ...
</c:if>

式言語の構文の概要

この項では、式言語の構文の概要を示し、OC4JのJSPアプリケーションでEL評価を使用する方法を説明します。

ELには独自の構文がありますが、一般的な目的で使用されるプログラミング言語ではありません。むしろ、JSP作成者の作業を簡単にするためのデータ・アクセス・メカニズムです。

JSP式言語の構文

式言語には、部分的にJavaScriptの構文に基づいた、独自の構文があります。次に、JSP式言語の主な構文機能の概要を示します。続いて、単純な例をいくつか示します。

基本的な例

次の例では、式言語の基本的な起動を示します。関係演算子<=(以下を示す)が含まれています。

<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']}"/>

式言語の暗黙的なオブジェクト

式言語では、次の暗黙的なオブジェクトが用意されています。

式言語の追加機能

式言語では、次の追加機能も提供されています。

式言語の関数の作成および使用

式言語では、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を無効化すると引用符として認識されないため、注意してください。

Webアプリケーション内のすべてのJSPでの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ページでEL式を無効化するには、JSPで、pageディレクティブのisELIgnored属性をtrueに設定します。

タグ・ファイルでのELの無効化

タグ・ファイルでEL評価を無効化するには、タグ・ファイルで、tagディレクティブのisELIgnored属性をtrueに設定します。

JSPの実行モデル

この項では、オンデマンド変換(JSPページの初回実行時)およびエラー処理など、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ページは、通常、次の手順で実行されます。

  1. ユーザーは、ファイル名が.jspで終わるURLにより、JSPページをリクエストします。

  2. Webサーバーのサーブレット・コンテナは、URL内のファイル名の拡張子.jspを認識すると、すぐにWebコンテナを起動します。

  3. Webコンテナは、JSPページが初めてリクエストされると、そのJSPページを検索して変換します。変換処理では、.javaファイルにサーブレット・コードが作成され、その.javaファイルがコンパイルされて、サーブレットの.classファイルが作成されます。

    JSPトランスレータによって生成されたサーブレット・クラスは、javax.servlet.jsp.HttpJspPageインタフェースを実装するクラス(Webコンテナによって提供されます)を拡張します。このサーブレット・クラスは、「ページ実装クラス」と呼ばれます。このマニュアルでは、ページ実装クラスのインスタンスを「JSPページ・インスタンス」と呼びます。

    JSPページをサーブレットに変換すると、標準的なサーブレット・プログラミングのオーバーヘッド(HttpJspPageインタフェースの実装、サービス・メソッドのコード生成など)が、生成されたサーブレット・コードに自動的に取り込まれます。

  4. Webコンテナは、ページ実装クラスのインスタンス化と実行をトリガーします。

次に、JSPページ・インスタンスは、HTTPリクエストを処理してHTTPレスポンスを生成し、そのレスポンスをクライアントに返信します。


注意

前述の手順では、概略を説明しています。前述のように、各ベンダーはWebコンテナの実装方法を決定しますが、Webコンテナはサーブレットまたは複数サーブレットの集合で構成されます。たとえば、サーブレットには、JSPページを検索するフロントエンド・サーブレット、変換とコンパイルを処理する変換サーブレット、各ページ実装クラスによって拡張されるラッパー・サーブレット・クラス(変換されたページは実際には純粋なサーブレットではなく、サーブレット・コンテナで直接実行できないため)などがあります。サーブレット・コンテナは、これらのコンポーネントを実行するために必要です。  


JSPページのリクエスト

JSPページは、URLにアクセスして直接的にリクエストしたり、別のWebページやサーブレットを使用して間接的にリクエストできます。

JSPページの直接的なリクエスト

サーブレットや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の起動の詳細は、『Oracle Containers for J2EEサーブレット開発者ガイド』を参照してください。 


JSPページの間接的なリクエスト

サーブレットと同様に、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アクション・タグ」を参照してください。)


戻る 次へ
Oracle
Copyright © 2007 Oracle Corporation.

All Rights Reserved.
目次
目次
索引
索引