ヘッダーをスキップ

Oracle Application Server Containers for J2EE JavaServer Pages 開発者ガイド
10gリリース2(10.1.2)
B15632-02
目次
目次
索引
索引

戻る 次へ

1
JSP全体の概要

この章では、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の概要

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構文の要素については、「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に示す出力が作成されます。

図1-1    「ようこそ」ページのサンプル


画像の説明

JSPコーディングとサーブレット・コーディングの使いやすさの比較

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インタフェースに関する情報は、「サーブレットのインタフェース」を参照してください。

JSPコード

<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ページを作成できます。

ビジネス・ロジックとページ・プレゼンテーションの分離: JavaBeansのコール

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() %> !

この例では、pageBeannewName属性が、たとえば、名前「Julie」(ユーザー入力などで設定)の場合は、「Hello Julie !」が出力されます。

ビジネス・ロジックをページ・プレゼンテーションから分離すると、ビジネス・ロジックと動的コンテンツを担当するJavaのエキスパート(NameBeanクラスのコードを所有およびメンテナンスする担当者)と、アプリケーション・ユーザーが参照するWebページの静的なプレゼンテーションとレイアウトを担当するHTMLのエキスパート(JSPページの.jspファイルのコードを所有およびメンテナンスする担当者)の間で、作業を分担できます。

JavaBeansで使用するタグ(たとえば、JavaBeanインスタンスを宣言するためのuseBean、BeanプロパティにアクセスするためのgetPropertysetProperty)の詳細は、「標準アクション: JSPタグ」で説明します。

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ページの例」では、JSP構文の単純な例を示しました。ここでは、トップレベルの構文カテゴリを説明します。

この項では、基本的な構文とコード例も含めて、各カテゴリについて説明します。Beanプロパティの変換およびカスタム・タグ・ライブラリ(カスタム・アクションに使用されます)の概要についても説明します。詳細は、Sun社のJSP仕様を参照してください。


注意: この項では、従来のJSP構文について説明します。JSP XML構文およびJSP XML文書の詳細は、第5章「JSP XMLサポート」を参照してください。 

ディレクティブ

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

<%@ directive attribute1="value1" attribute2="value2"... %>

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

pageディレクティブ

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

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

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

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

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

<%@ page buffer="none" %>


注意:
  • デフォルトのバッファ・サイズは8KBです。

  • buffer="none"の場合、autoFlush="true"の設定は無効です。

  • エラー・ページを使用するJSPページでは、バッファを有効にする必要があります。エラー・ページへの転送が行われる(ブラウザには出力されません)と、バッファはクリアされます。

  • Oracle JSPの実装では、デフォルト言語は「java」に設定されています。ただし、デフォルト言語は、明示的に設定することをお薦めします。

  • pageディレクティブの属性を使用して、JSPページおよびレスポンス・オブジェクトのコンテンツ・タイプとキャラクタ・セットを設定する方法は、「pageディレクティブでのコンテンツ・タイプの設定」を参照してください。

 

includeディレクティブ

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

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

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


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

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

  • インクルード・ファイルのネーミング規則の詳細は、「JSPファイルのネーミング規則」を参照してください。

 

taglibディレクティブ

このディレクティブを使用して、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>


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

スクリプトレット

ページのマークアップ言語内に記述される、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ページで宣言されるか、または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

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

前項で説明した暗黙的なオブジェクトは、いずれも便利なオブジェクトです。次の例では、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:tag attr1="value1" attr2="value2" ... attrN="valueN">
...body...
</jsp:tag>

ボディがない場合は、次のとおりです。

<jsp:tag attr1="value1", ..., attrN="valueN" />

JSP仕様には、次の標準アクション・タグが含まれます。次に、各タグについて簡単に説明します。

jsp:useBeanタグ

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

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

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

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

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

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="*"の場合は、次の点に注意してください。
  • エラーが発生した場合に反復を継続するように指定するには、setproperty_onerr_continue構成パラメータをtrueに設定します。このパラメータの詳細は、「JSP構成パラメータ」を参照してください。

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

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

  • 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属性を使用して、実行するアプレットやコード・ベースなどの構成情報を指定します。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>

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開発ツールで自動的に使用することもできます。標準のタグ・ライブラリは、異なるJSPコンテナ実装間で移植可能であることが必要です。

タグ・ライブラリは、「ディレクティブ」で説明したtaglibディレクティブを使用して、JSPページにインポートします。

JSPタグ・ライブラリに対する標準的なJavaServer Pagesのサポートに関する主な概念には、次の項目が含まれます。

これらの項目については、第8章「JSPタグ・ライブラリ」を参照してください。詳細は、Sun社のJSP仕様を参照してください。

OC4Jが提供するタグ・ライブラリの詳細は、『Oracle Application Server Containers for J2EE JSPタグ・ライブラリおよびユーティリティ・リファレンス』を参照してください。

JSPの実行

この項では、オンデマンド変換(JSPページの初回実行時)、JSPコンテナのロール、サーブレット・コンテナおよびエラー処理など、JSPページの実行方法の概要を説明します。


注意: JSPコンテナという用語は、Sun社のJSP仕様1.1で最初に使用されたもので、1.1より前の仕様ではJSPエンジンと呼ばれていました。したがって、この2つの用語は同じ意味です。 

JSPコンテナの概要

JSPコンテナは、JSPページの変換、実行および処理を行い、JSPページにリクエストを渡すエンティティです。

JSPコンテナの構成は、厳密には各実装によって異なりますが、サーブレットまたは複数サーブレットの集合で構成されています。したがって、JSPコンテナは、サーブレット・コンテナによって実行されます。サーブレット・コンテナの概要は、「サーブレット・コンテナ」を参照してください。

JSPコンテナは、WebサーバーがJavaで記述されている場合、Webサーバーに取り込むことができます。そうでない場合は、関連付けたWebサーバーで使用できます。

JSPの実行モデル

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ページは、通常、次の手順で実行されます。

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

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

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

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

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

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

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


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

JSPページのリクエスト

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

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

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

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


戻る 次へ
Oracle
Copyright © 2000, 2005 Oracle.

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