• 検索結果がありません。

Oracle9iAS Containers for J2EE Servlet 開発者ガイドおよびリファレンス

N/A
N/A
Protected

Academic year: 2021

シェア "Oracle9iAS Containers for J2EE Servlet 開発者ガイドおよびリファレンス"

Copied!
79
0
0

読み込み中.... (全文を見る)

全文

(1)

Oracle9iAS Containers for J2EE

Servlet

開発者ガイドおよびリファレンス

(2)

目次

目次

目次

目次

はじめに

はじめに

はじめに

はじめに

... iii 対象読者 ... iii このマニュアルの内容 ... iii 表記規則 ... iv

1

サーブレットの概要

サーブレットの概要

サーブレットの概要

サーブレットの概要

参考情報 参考情報参考情報 参考情報 ... 1-2 サーブレット情報 ... 1-2 サーブレットの概要 サーブレットの概要サーブレットの概要 サーブレットの概要 ... 1-3 サーブレットの利点 ... 1-3 サーブレットおよびサーブレット・コンテナ ... 1-4 リクエスト・オブジェクト、レスポンス・オブジェクトおよびフィルタ ... 1-5 セッション・トラッキング ... 1-6 初めてのサーブレット作成の例 初めてのサーブレット作成の例初めてのサーブレット作成の例 初めてのサーブレット作成の例 ... 1-7 Hello World コード ... 1-7 サーブレットのコンパイルおよびデプロイ ... 1-8 サーブレットの実行 ... 1-9

2

サーブレットの開発

サーブレットの開発

サーブレットの開発

サーブレットの開発

サーブレット開発の概要 サーブレット開発の概要サーブレット開発の概要 サーブレット開発の概要 ... 2-2 サーブレット開発の基礎 サーブレット開発の基礎サーブレット開発の基礎 サーブレット開発の基礎 ... 2-3 コード・テンプレート ... 2-3 サーブレットのライフ・サイクル ... 2-4

(3)

サーブレットの起動 サーブレットの起動サーブレットの起動 サーブレットの起動 ... 2-6 リクエストに対するサーブレット・コンテナのアクション ... 2-6 OC4J における名前によるサーブレットの起動 ... 2-7 デプロイ環境でサーブレットを起動するための構成 ... 2-8 サーブレットのロードおよび初期化 サーブレットのロードおよび初期化サーブレットのロードおよび初期化 サーブレットのロードおよび初期化 ... 2-9 セッションのトラッキング セッションのトラッキングセッションのトラッキング セッションのトラッキング ... 2-10 Cookie ... 2-10 URL リライティング ... 2-11 他のセッション・トラッキング方法 ... 2-11 セッションのキャンセル ... 2-11 セッション・サーブレットの例 ... 2-11 セッションのレプリケーション セッションのレプリケーションセッションのレプリケーション セッションのレプリケーション ... 2-15 サーブレットでの サーブレットでのサーブレットでの サーブレットでの JDBC の使用の使用の使用 ... の使用 2-16 データベース問合せサーブレット ... 2-16 データベース問合せサーブレットのデプロイおよびテスト ... 2-19 サーブレットからの サーブレットからのサーブレットからの サーブレットからの EJB コールコールコールコール ... 2-22 同一アプリケーションの Session Bean ... 2-22 サーブレットと EJB のアプリケーションのデプロイ ... 2-25

3

デプロイおよび構成

デプロイおよび構成

デプロイおよび構成

デプロイおよび構成

Web アプリケーション開発の概要アプリケーション開発の概要アプリケーション開発の概要アプリケーション開発の概要 ... 3-2 Web 構成ファイルの概要構成ファイルの概要構成ファイルの概要構成ファイルの概要 ... 3-3 アプリケーションのアセンブリ アプリケーションのアセンブリアプリケーションのアセンブリ アプリケーションのアセンブリ ... 3-5 アプリケーションのディレクトリ構造 ... 3-5 アプリケーション構築メカニズム ... 3-6 アプリケーションのデプロイ アプリケーションのデプロイアプリケーションのデプロイ アプリケーションのデプロイ ... 3-7 構成ファイルの説明 構成ファイルの説明構成ファイルの説明 構成ファイルの説明 ... 3-10 要素の説明に使用される構文について ... 3-10 global-web-application.xml および orion-web.xml ファイル ... 3-10 default-web-site.xml ファイルおよび他の Web サイトの XML ファイル ... 3-23

索引

索引

索引

索引

(4)

はじめに

はじめに

はじめに

はじめに

対象読者

対象読者

対象読者

対象読者

このマニュアルでは、Oracle9iAS Containers for J2EE(OC4J)用のサーブレット・ベースの Web アプリケーション開発について紹介します。 このマニュアルは、サーブレットおよび(場合によっては)JavaServer Pages(JSP)を使用 した Web アプリケーションを作成する、J2EE 開発者用に作成されています。 このマニュア ルは、OC4J サーブレット・コンテナに関して必要となる基本情報を提供します。

このマニュアルの内容

このマニュアルの内容

このマニュアルの内容

このマニュアルの内容

このマニュアルは、Oracle9iAS Containers for J2EE(OC4J)アプリケーション・サーバーの サーブレット・コンテナについて説明します。 ここには、サーブレットのプログラミングや、 Java Servlet API に関する説明は含まれません。 これらのトピックについて学習する場合は、 Sun 社から入手可能なドキュメント、あるいはサーブレットのプログラミングに関する市販 の書籍を参照してください。 このマニュアルには、次のような章が含まれています。 第 第第 第1章「章「章「章「サーブレットの概要サーブレットの概要サーブレットの概要サーブレットの概要」」」」

OC4J サーブレット・コンテナについて紹介し、単純な "Hello World" の例を使用して、 サーブレット開発に関して全般的に説明します。 第 第第 第2章「章「章「章「サーブレットの開発サーブレットの開発サーブレットの開発サーブレットの開発」」」」 OC4J サーブレット・コンテナで、サーブレット開発がどのようにサポートされているかに ついて説明します。 いくつかの例も示します。 第 第第 第3章「章「章「章「デプロイおよび構成デプロイおよび構成デプロイおよび構成デプロイおよび構成」」」」 OC4J における、Web アプリケーションのデプロイ方法を説明します。

(5)

表記規則

表記規則

表記規則

表記規則

このマニュアルでは、通常、ファイル・パスおよびシェル変数については UNIX の構文を使 用します。 ほとんどの場合、ファイル名とディレクトリ名は、注記がないかぎり Windows NT と同じです。 $J2EE_HOMEと表記されている場合は、OC4J のホーム・ディレクトリのフ ル・パスを示しています。 このマニュアルでは、次のような表記規則を使用します。 表記規則 表記規則表記規則 表記規則 意味意味意味意味 . . . サンプル・コード内の横方向の省略記号は、1 つ以上の文ま たは文の一部が省略されていることを示します。 これは、通 常追加の文またはコードが必要であるけれど、その例に直 接関係しないような文またはコードの場合に使用されます。 コード・テキスト 標準テキスト内のコード・テキスト(固定幅フォント)は、 クラス名、オブジェクト名、メソッド名、変数名、Java 型、 Oracle データ型、ファイル名、URL や URI の一部、および ディレクトリ名を示します。

% コマンドの先頭に付いている場合、オペレーティング・シ

(6)

1

サーブレットの概要

サーブレットの概要

サーブレットの概要

サーブレットの概要

OC4J を使用すると、標準 J2EE 準拠のアプリケーション開発が可能になります。 アプリケー ションは、標準 EAR(Enterprise ARchive)デプロイメント・ファイルにパッケージされま す。これには、Web モジュールをデプロイするための標準 WAR(Web ARchive)ファイル と、アプリケーション内の EJB およびアプリケーション・クライアント・モジュール用の JAR ファイルが含まれます。 Web アプリケーションの構築およびデプロイ方法は OC4J におけるサーブレット開発を理解 する上で、最も重要です。 OC4J の開発環境を初めて使用する方は、第 2 章「サーブレットの 開発」および第 3 章「デプロイおよび構成」を参照して、OC4J におけるアプリケーション のデプロイ方法を理解してください。 この章では、Java サーブレットの概要を説明し、基本サーブレットの例を示します。 また、 サーバー・サイドのプログラミングに関する様々な課題に対処するために J2EE アプリケー ションでサーブレットを使用する方法を、簡単に説明します。 この章には、次のトピックが含まれます。 ■ 参考情報 ■ サーブレットの概要 ■ 初めてのサーブレット作成の例

(7)

参考情報

参考情報

参考情報

参考情報

参考情報

この項では、サーブレットと OC4J に関する参考情報について説明します。

サーブレット情報

サーブレット情報

サーブレット情報

サーブレット情報

Sun 社の Java(TM) Servlet 仕様、バージョン 2.3 に関する一般的な知識が必要です。特に、2 つ以上の Java 仮想マシン(JVM)の下で稼動している複数のサーバーにセッションをレプ リケート可能な分散 Web アプリケーションを開発する場合には、これらの知識が必要です。 この仕様は、このマニュアルの作成時点ではまだ最終ではありませんが、かなり安定してお り、今後大幅に変更される可能性は低いと思われます。 Servlet 2.3 仕様は、次の場所から入手可能です。 http://jcp.org/aboutJava/communityprocess/first/jsr053/index.html このマニュアルは、サーブレット開発用の完全なリファレンスではありません。 たとえば、 標準のサーブレット API については、ここではカバーされていません。 サーブレットの API に関するドキュメントは、次の場所から入手可能な Sun 社の Javadoc を参照してください。 http://java.sun.com/products/servlet/2.3/javadoc/index.html サーブレットの開発方法およびサーブレットを J2EE 互換アプリケーションでデプロイする 方法が説明されている市販の書籍もいくつか存在します。 特に、O'Reilly & Associates (http://www.oreilly.com)および Wrox(http://www.wrox.com)から出版されて

(8)

サーブレットの概要

サーブレットの概要

サーブレットの概要

サーブレットの概要

サーブレットの概要

サーブレットは、OC4J などの J2EE アプリケーション・サーバーで稼動する Java プログラ ムです。サーブレットは、サーバー・サイドでの Java アプレットに相当するものです。 サーブレットは、J2EE アプリケーションの 4 つのアプリケーション・コンポーネント・タイ プの 1 つです。他に、クライアント・サイドにはアプレットやアプリケーション・クライア ント・プログラム、サーバー・サイドには EJB などがあります。 サーブレットは、OC4J サーブレット・コンテナにより管理され、EJB は OC4J EJB コンテナにより管理されます。 こ れらのコンテナは、OC4J のコアとなっています。 JavaServer Pages(JSP)は、もう 1 つのサーバー・サイドのコンポーネント・タイプです。 JSP は、実行前に JSP コンテナ(これ自体がサーブレット)の変換機能によってサーブレッ トに変換されるため、JSP ページはサーブレット・コンテナからも管理されます。 ほとんどのサーブレットは HTML テキストを生成し、それをクライアントに返信して Web ブラウザで表示したり、アプリケーションの他のコンポーネントに送信します。サーブレッ トは XML も生成可能で、データをカプセル化し、これをクライアントや他のコンポーネン トに送信できます。 この項の残りの部分では、次のトピックを説明します。 ■ サーブレットの利点 ■ サーブレットおよびサーブレット・コンテナ ■ リクエスト・オブジェクト、レスポンス・オブジェクトおよびフィルタ ■ セッション・トラッキング

サーブレットの利点

サーブレットの利点

サーブレットの利点

サーブレットの利点

サーブレットのプログラミングには、サーバー・サイドの Web アプリケーション開発にお ける初期のモデルと比べると、次のような点を含め、多くの利点があります。 ■ サーブレットのプログラミングは、動的 HTML を生成するための成熟した一般的な標準 であり、CGI スクリプトなどの初期のテクニックに置き換わるものです。 ■ サーブレットは、同時リクエストを処理します。各サーブレットにはシングル・インス タンスのみ存在し、どのサーブレットにも明確なライフ・サイクルが存在します。パ フォーマンスを向上させるため、OC4J の起動時にサーブレットをロードできます。 ■ サーブレットは、J2EE フレームワークに完全に統合されています。 ■ サーブレットのリクエストおよびレスポンス・オブジェクトを使用すると、HTTP リク エストの処理や、テキストとデータのクライアントへの返信が容易に行えます。

■ サーブレットは、Java 言語および Java の標準 API と完全に統合されています。 J2EE フ

レームワークには、JNDI、JMS、RMI およびセキュリティなど、作成する Web アプリ ケーションに使用可能なサービスの拡張セットが用意されています。

(9)

サーブレットの概要 サーブレットは、Java プログラミング言語で記述されているため、Java 仮想マシンを持つす べてのプラットフォーム、およびサーブレットをサポートしているすべての Web サーバー でサポートされます。サーブレットは、再コンパイルせずに別のプラットフォーム上で使用 できます。サーブレットをグラフィックス、サウンドおよび他のデータなどの関連するファ イルとともにパッケージ化して、完全な Web アプリケーションを作成することができます。 これにより、アプリケーションの開発およびデプロイが大変簡単になります。 また、これにより、他の Web サーバーで実行するように開発されたサーブレット・ベース のアプリケーションを、容易に OC4J に移植できます。J2EE 準拠の Web ブラウザ用に開発 されたアプリケーションの場合、移植の手間は最小限ですみます。 サーブレットは、サーバーサイド・インクルードや CGI スクリプトなど、動的 HTML 生成 を行うための初期の技術より優れています。CGI スクリプトは、すべてのリクエストごとに 別のプロセスにロードする必要があるのに対して、サーブレットは一度メモリーにロードさ れると、軽量なシングル・スレッド上で実行できます。

サーブレットおよびサーブレット・コンテナ

サーブレットおよびサーブレット・コンテナ

サーブレットおよびサーブレット・コンテナ

サーブレットおよびサーブレット・コンテナ

アプレットと同様に、また Java クライアント・プログラムとは異なり、サーブレットには 静的なmain() メソッドが存在しません。 このため、サーブレットはサーブレット・コンテ ナの制御下で実行する必要があります。サーブレット・コンテナは、サーブレット・メソッ ドをコールし、サーブレットが実行時に必要とするサービスを提供するコンテナであるため です。 サーブレット自身が、リクエストを処理してレスポンスを返すために必要となるアクセス・ メソッド(javax.servlet.GenericServletまたは javax.servlet.http.HttpServletクラスに実装されている)をオーバーライドしま す。 たとえば、ほとんどのサーブレットは、HTTPGETおよびPOSTリクエストを処理する

ために、HttpServletのdoGet()とdoPost()メソッド(あるいはその両方)をオー

バーライドします。

サーブレット・コンテナにより、サーブレットは、ヘッダーやパラメータなど HTTP リクエ ストのプロパティに容易にアクセスできます。 また、サーブレットでは、データベースへの アクセスには JDBC、リモート・オブジェクトのコールには RMI、非同期メッセージ機能に は JMS というように、他の Java API を使用可能で、他の多くの Java および J2EE サービス も使用可能です。

図 1-1に、サーブレットが(オプションのサーブレット・フィルタとともに)、サーブレッ ト・コンテナ、および Web ブラウザなどのクライアントとどのように関連するかを示しま

す。 Web リスナーが Oracle HTTP Server(powered by Apache)の場合、OC4J サーブレッ

(10)

サーブレットの概要 図 図図 図1-1 サーブレットおよびサーブレット・コンテナサーブレットおよびサーブレット・コンテナサーブレットおよびサーブレット・コンテナサーブレットおよびサーブレット・コンテナ

リクエスト・オブジェクト、レスポンス・オブジェクトおよびフィルタ

リクエスト・オブジェクト、レスポンス・オブジェクトおよびフィルタ

リクエスト・オブジェクト、レスポンス・オブジェクトおよびフィルタ

リクエスト・オブジェクト、レスポンス・オブジェクトおよびフィルタ

doGet()およびdoPost()などのHttpServletメソッドは、 javax.servlet.http.HttpServletRequestオブジェクトおよび javax.servlet.http.HttpServletResponseオブジェクトという、2 つのパラメータ を使用します。サーブレット・コンテナは、これらのオブジェクトをサーブレットに渡した り、フィルタ・チェーンが存在する場合には次のフィルタに渡します。 Servlet 2.3 仕様では、サーブレット・フィルタを使用可能です。このフィルタはサーバーで 実行され、クライアントと、サーブレットまたはサーブレットの全クラスの中間に位置する Java プログラムです。 リクエスト・オブジェクトおよびレスポンス・オブジェクトは、効率的なサーブレット・ コードの作成を可能にするメソッドをサポートしています。 1-7 ページの 「初めてのサーブ

(11)

サーブレットの概要 レット作成の例」では、レスポンスからストリーム書込みオブジェクトを取得し、これを使 用してレスポンス・ストリームに文を書き込む方法を示します。

セッション・トラッキング

セッション・トラッキング

セッション・トラッキング

セッション・トラッキング

サーブレットは、クライアント・セッションとサーバー・セッションの同期を維持する便利 な方法を備えています。これにより、ステートフルなサーブレットは、クライアントによる ブラウズ・セッションの間中、サーバー上のセッションの状態を維持できます。 このようなテクニックには、Cookie または URL リライティング、および javax.servlet.http.HttpSessionオブジェクトがあります。 詳細は、2-10 ページの 「セッションのトラッキング」 を参照してください。

(12)

初めてのサーブレット作成の例

初めてのサーブレット作成の例

初めてのサーブレット作成の例

初めてのサーブレット作成の例

初めてのサーブレット作成の例

サーブレットのコーディング方法とサーブレットで何ができるかを理解するには、基本的な 例を参照するのが一番効率的です。この項では、単純なサーブレットのコードを示します (ただし、グローバリゼーションのために一工夫されています)。コードには、サーブレット 開発の基本を説明するコメントが付いています。

Hello World コード

コード

コード

コード

サーブレットについて記述されている書籍には、ほとんどの場合、"Hello World" の例が 載っています。これは、サーブレットの作成に使用する基本フレームワークを示すには最適 な例です。 このサーブレットは、日付とクライアントに返す挨拶文を出力するだけですが、 スウェーデン語で出力するために一工夫されています。 コードは次のとおりです。 import java.io.*; import java.text.*; import java.util.*;

// The first three package imports support I/O, and the locale info and date // formatting. The next two imports include the packages that support // servlet development.

import javax.servlet.*; import javax.servlet.http.*;

// HTTP servlets extend the javax.servlet.http.HttpServlet class. public class HelloWorldServlet extends HttpServlet {

public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { // doGet() overrides the HttpServlet method. Each method of this class // has request and/or response parameters.

// Set the content type of the response. res.setContentType("text/plain");

// Get a print writer stream to write output to the response. You // could also get s ServletOutputStream object to do this. PrintWriter out = res.getWriter();

// This statement tells the client the language of the content--Swedish. // However, many Web browsers will ignore this info.

res.setHeader("Content-Language", "sv");

// Set the locale information, so the date will be formatted in a // friendly way, and the right words are used for months and so on.

(13)

初めてのサーブレット作成の例

// Get the date format.

DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale);

// Also set the local time zone.

dateFormat.setTimeZone(TimeZone.getDefault());

// Now use the printer object to send some HTML header info to the // output stream.

out.println("<HTML><HEAD><TITLE>Hej V¥u00e4rlden!</TITLE></HEAD>"); out.println("<BODY>");

// Send the date to the output.

out.println(dateFormat.format(new Date())); // And then, greet the

out.println("<p>In Swedish (p¥u00E5 Svenska):"); out.println("<H2>Hej V¥u00E4rlden!</H2>"); // Don't forget to close the HTML tags. out.println("</BODY></HTML>"); } }

サーブレットのコンパイルおよびデプロイ

サーブレットのコンパイルおよびデプロイ

サーブレットのコンパイルおよびデプロイ

サーブレットのコンパイルおよびデプロイ

このサーブレットを、ご使用の OC4J サーバーで使用する場合は、テキスト・エディタで コードを入力し、$J2EE_HOME/default-web-apps/WEB-INF/classesディレクトリ内 にHelloWorldServlet.javaとして保存してください。これは、コンテナが、デフォル トのアプリケーション用にサーブレット・クラスを検索する場所です。次に、Java 1.3.x 準 拠のコンパイラを使用してサーブレットをコンパイルします。 より容易にテスト開発を行えるよう、 $J2EE_HOME/default-web-apps/WEB-INF/classesディレクトリに入っているサーブ レット・コードの OC4J 自動コンパイル機能を使用することができます。 global-web-application.xml構成ファイルの<orion-web-app>タグの値を、 development="true"に設定してください。 このファイルは、$J2EE_HOMEディレクトリ のconfigディレクトリに入っています。 これにより、サーブレット・ソースを変更してそ れを特定のディレクトリに保存するたびに、OC4J サーバーが、サーブレットを自動的にコ ンパイルし、再度デプロイします。 また、development="true"になっていて、web.xml ファイルを変更および保存した場合も、サーバーはアプリケーションを再度デプロイしま す。 3-10 ページの「global-web-application.xml および orion-web.xml ファイル」の 「development要素」も参照してください。

(14)

初めてのサーブレット作成の例

サーブレットの実行

サーブレットの実行

サーブレットの実行

サーブレットの実行

OC4J サーバーが起動されて稼動中の場合には、デフォルトで、次のようにしてサーブレッ

トを起動し、その出力を Web ブラウザで表示できます。<hostname>は、OC4J サーバー

が実行されているホストの名前、<port>は、Web リスナーのポートです。

http://<hostname>:<port>/servlet/HelloWorldServlet

この例では、サーブレットが、特定のポートに関連付けられた Web サイトの、デフォルト のコンテキストで実行されていることを前提としています。 さらに、

global-web-application.xmlファイルまたはorion-web.xmlファイルの

<orion-web-app>要素のservlet-webdir属性に、デフォルトの "/servlet" が設定さ

れていることを前提としています。 この設定により、/servlet/の後に続くものが、サー ブレットのクラス名(場合によってはパッケージを含む)であると見なされます。 このメカ ニズムは、本番デプロイではなく、開発およびテスト目的でのみ使用してください。 ポートを指定しない場合は、ポート 80 が使用されます。 関連情報は、2-6 ページの「サーブレットの起動」 、および 3-10 ページの 「global-web-application.xml および orion-web.xml ファイル」を参照してください。

(15)
(16)

2

サーブレットの開発

サーブレットの開発

サーブレットの開発

サーブレットの開発

この章では、OC4J アプリケーション・サーバーのサーブレット開発に関する基本情報を説 明します。次のトピックが含まれます。 ■ サーブレット開発の概要 ■ サーブレット開発の基礎 ■ サーブレットの起動 ■ サーブレットのロードおよび初期化 ■ セッションのトラッキング ■ セッションのレプリケーション ■ サーブレットでの JDBC の使用 ■ サーブレットからの EJB コール

(17)

サーブレット開発の概要

サーブレット開発の概要

サーブレット開発の概要

サーブレット開発の概要

サーブレット開発の概要

この章では、1-7 ページの「初めてのサーブレット作成の例」のHelloWorldServletより も高度なサンプル・サーブレットについて説明します。OC4J のデフォルトの Web アプリ ケーションを使用して、これらの各サーブレットをテストできます。 そのためには、Java ソース・ファイルを次のディレクトリに保存してください。 $J2EE_HOME/default-web-app/WEB-INF/classes 次に、サーバー構成ファイル$J2EE_HOME/config/global-web-application.xml内

で、<orion-web-app>要素のdevelopment属性が"true"に設定されていることを確

認します。 これにより、.../classesディレクトリの Java ソース・ファイルを変更すると OC4J により自動的にソースが再コンパイルされ、デフォルトのアプリケーションが再度デ プロイされます。 複数のサーブレットをテストするには、前述のように $J2EE_HOME/default-web-app/WEB-INF内のweb.xmlファイルを変更してください。 web.xmlファイルを変更して保存すると、OC4J は、変更内容の反映されたデフォルトの Web アプリケーションを再起動します。 この章では、サーブレット・コードに重点をおきます。そのため、内容をわかりやすくする ために、開発はデフォルトの Web アプリケーションに対して行います。 第 3 章「デプロイ および構成」では、Web アプリケーション開発、デプロイ、および本番アプリケーションに 使用する J2EE パラダイム下でのテストについて説明します。

(18)

サーブレット開発の基礎

サーブレット開発の基礎

サーブレット開発の基礎

サーブレット開発の基礎

サーブレット開発の基礎

ほとんどの HTTP サーブレットは、標準の形式に従って作成されます。 HTTP サーブレット は、HttpServletクラスを拡張するパブリック・クラスとして記述されます。 コンテナが サーブレットをロードする際に初期化作業を行うコードが必要な場合や、コンテナがサーブ レットをシャットダウンする際にファイナライズを行うコードが必要な場合、サーブレット は、init()およびdestroy()メソッドをオーバーライドします。 ほとんどのサーブレッ

トは、HTTP の GETまたはPOSTリクエストを処理するため、HttpServletのdoGet()

またはdoPost()メソッドをオーバーライドします。これら 2 つのメソッドは、リクエス ト・パラメータとレスポンス・パラメータを使用します。

コード・テンプレート

コード・テンプレート

コード・テンプレート

コード・テンプレート

次に、サーブレット開発のコード・テンプレートを示します。 public class myServlet extends HttpServlet {

public void init(ServletConfig config) { }

public void destroy() { }

public void doGet(HttpServletRequest request, HttpServletResponse) throws ServletException, IOException {

}

public void doGet(HttpServletRequest request, HttpServletResponse) throws ServletException, IOException {

}

public String getServletInfo() {

return "Some information about the servlet."; }

init()、destroy()およびgetServletInfo()メソッドのオーバーライドはオプション

です。 最も単純なサーブレットでは、doGet()またはdoPost()のいずれかのみオーバー

(19)

サーブレット開発の基礎

サーブレットのライフ・サイクル

サーブレットのライフ・サイクル

サーブレットのライフ・サイクル

サーブレットのライフ・サイクル

サーブレットには、予測可能で管理可能なライフ・サイクルが存在します。 ■ クライアントからサーブレットが初めて起動されたとき、または OC4J が起動されたと きに、コンテナは、サーブレットの新規インスタンスを作成します。 これは、web.xml ファイル内で、そのサーブレットに対して<load-on-startup>要素が宣言されてい るかどうかに依存します。 ■ サーブレットのロード時に、そのサーブレットの構成の詳細はweb.xmlから読み込ま れます。これには初期化パラメータを含めることができます。 ■ サーブレットのインスタンスは 1 つしか存在しません。クライアント・リクエストは、 サーブレット・インスタンスを共有します。 ■ クライアント・リクエストは、汎用サーブレットのservice()メソッドを起動し、次 に、リクエスト・ヘッダーの情報に応じて、リクエストをdoGet()またはdoPost() (あるいは、他のオーバーライドされたリクエスト処理メソッド)に委任します。 ■ フィルタは、サーブレットの動作を変更するために、コンテナとサーブレットの間に置 くことが可能です。 ■ サーブレットは、他のサーブレットにリクエストを転送できます。 ■ サーブレットはレスポンス・オブジェクトを作成し、コンテナはこれを HTTP レスポン ス・ヘッダーでクライアントに返します。 サーブレットは、java.io.PrintWriter またはjavax.servlet.ServletOutputStreamオブジェクトを使用して、レスポン スを書き込みます。 ■ コンテナは、サーブレットがアンロードされる前にdestroy()をコールします。

サーブレットの動作

サーブレットの動作

サーブレットの動作

サーブレットの動作

サーブレットは、通常、次のような 1 つ以上のソースから情報を受け取ります。 ■ リクエスト・オブジェクトからのパラメータ ■ HttpSessionオブジェクト ■ ServletContextオブジェクト ■ サーブレット外部のデータ・ソースからの情報(データベース、ファイル・システム、 外部センサーなど) サーブレットは、レスポンス・オブジェクトに情報を追加し、コンテナは、そのレスポンス をクライアントに返信します。

スレッド・セーフティ

スレッド・セーフティ

スレッド・セーフティ

スレッド・セーフティ

サーブレットは 2 つ以上のスレッドから起動可能なため、サーブレット・コードがスレッ ド・セーフであることを確認してください。コード内の重要なセクションは同期化する必要

(20)

サーブレット開発の基礎 がありますが、これはパフォーマンスに影響する可能性があるため、慎重に選別して行う必 要があります。サーブレットの仕様により、サーブレットでSingleThreadModelを実装 して、サーブレット全体へのアクセスを確実に同期化することも可能ですが、この方法は OC4J アプリケーションでは推奨されていません。

セッションのメンテナンス

セッションのメンテナンス

セッションのメンテナンス

セッションのメンテナンス

サーブレットの仕様により、Cookie およびjavax.servlet.http.HttpSessionオブ ジェクトを使用して、ステートフルなサーブレット・セッションを使用可能にする便利な方 法が提供されています。 詳細は、2-10 ページの「Cookie」を参照してください。

サーブレット・コンテキスト

サーブレット・コンテキスト

サーブレット・コンテキスト

サーブレット・コンテキスト

各 Web アプリケーションごとに、単一のサーブレット・コンテキストが存在します。 javax.servlet.ServletContextオブジェクトは、javax.servlet.ServletConfig オブジェクトに含まれています。javax.servlet.ServletConfigは、Web サーバーか らサーブレットに提供され、サーブレット・コンテナが初期化中にサーブレットに情報を渡 すために使用します。

(21)

サーブレットの起動

サーブレットの起動

サーブレットの起動

サーブレットの起動

サーブレットの起動

サーブレットまたは JSP ページは、クライアントからサーブレットにリクエストが届くと、 コンテナにより起動されます。クライアント・リクエストは、Web ブラウザまたは Java ク ライアント・アプリケーションから、リクエスト転送メカニズムを使用してアプリケーショ ンの別のサーブレットから、あるいはサーバーのリモート・オブジェクトから送信されま す。 サーブレットは、URL マッピングを通じてリクエストされます。 サーブレットの URL マッ ピングは、コンテキスト・パスおよびサーブレット・パスの 2 つの部分で構成されていま す。コンテキスト・パスは、ホスト名またはポート番号の後の最初のスラッシュ(/)から 始まる URL の一部で、サーブレット・パスより前に置かれます。サーブレット・パスは、 コンテキスト・パス(存在する場合)の最後のスラッシュ(/)から、URL 文字列の最後ま で、あるいは '?' や ';' まで続きます。この '?' や ';' は、サーブレット・パスと追加部分(問合 せ文字列や URI のリライト部分)との間を区切ります。 一般的なデプロイでは、コンテキス ト・パスとサーブレット・パスは、標準のweb.xmlファイルの設定から判別されます。 この項の残りの部分では、開発環境またはテスト環境でサーブレットを起動するための OC4J のいくつかの特別な機能を含め、次のようなトピックを説明します。 ■ リクエストに対するサーブレット・コンテナのアクション ■ OC4J における名前によるサーブレットの起動 ■ デプロイ環境でサーブレットを起動するための構成

リクエストに対するサーブレット・コンテナのアクション

リクエストに対するサーブレット・コンテナのアクション

リクエストに対するサーブレット・コンテナのアクション

リクエストに対するサーブレット・コンテナのアクション

サーブレット・コンテナは、サーブレットに対するリクエストを受信すると、次の処理を実 行します。 ■ サーブレットをロードして初期化する(まだ行われていない場合)。2-9 ページの「サー ブレットのロードおよび初期化」を参照してください。 ■ リクエスト・オブジェクトを作成して、サーブレットに渡す。リクエストには、特に次 のものが含まれます。 クライアントからの任意の HTTP ヘッダー クライアントから渡されたパラメータと値(URL 内の問合せ文字列の、名前と値な ど) サーブレット・リクエストの完全な URI リクエスト・オブジェクトに渡される使用可能な情報については、すべて次の URL の Javadoc でHttpServletRequestインタフェースを参照してください。 http://java.sun.com/j2ee/tutorial/api/index.html ■ サーブレットのレスポンス・オブジェクトを作成する。

(22)

サーブレットの起動

■ サーブレットのservice()メソッドを起動する。 HTTP サーブレットの場合、汎用サー

ビス・メソッドは、通常HttpServletクラス内でオーバーライドされ、リクエスト内

の HTTP ヘッダーに応じて(GETまたはPOST)、サーブレットのdoGet()または

doPost()メソッドにリクエストを送ります。 サーブレットより先に起動するフィルタまたは一連のフィルタがある場合、これらのフィル タは、リクエスト・オブジェクトとレスポンス・オブジェクトをパラメータとして使用する コンテナからコールされます。 フィルタは、doChain()メソッドを使用して、これらのオ ブジェクト(変更されている場合もある)、またはかわりに新規オブジェクトを作成してそ れを、一連のフィルタ内の次のオブジェクトに渡します。

OC4J における名前によるサーブレットの起動

における名前によるサーブレットの起動

における名前によるサーブレットの起動

における名前によるサーブレットの起動

OC4J の開発環境またはテスト環境では、名前によってサーブレットを起動するメカニズム があります。 これにより、起動用の URL が簡単になります。 global-web-application.xmlファイル、またはorion-web.xmlファイルの <orion-web-app>要素内のservlet-webdir属性を設定すると、特別な URL コンポー

ネントが定義されます。 この URL コンポーネントに続くものは、適切なサーブレット・コン テキスト内のサーブレット・クラス名(該当するパッケージ情報も含め)と見なされます。 OC4J のデフォルトでは、この設定は"/servlet"です。 2-10 ページの「セッションのトラッキング」に示すSessionServletの起動は、次の URL (URL の下は説明)により行います。 この例では、SessionServletがパッケージ foo.barに存在し、デフォルトのサーブレット・コンテキストで実行されることを前提と しています。 http://<hostname><:port>/servlet/foo.bar.SessionServlet http:// ネットワーク・プロトコル。 他に、ormi、ftp、 httpsなどのプロトコルがあります。 <hostname> Web アプリケーションが稼動しているサーバーのネッ トワーク名。 Web クライアントがアプリケーション・ サーバーと同じシステム上に存在する場合は、 localhostを使用可能です。 それ以外の場合は、ホス ト名を使用します。たとえば UNIX システムの場合、 /etc/hostsに定義されています。 <:port> Web サーバーがリスニングしているポート。 ポートを 指定しない場合、ポート 80 が使用されます。 サー バー・ポートは、次のファイルの<web-site>要素の port属性で定義されます。 $J2EE_HOME/config/default-web-site.xml

(23)

サーブレットの起動

デプロイ環境でサーブレットを起動するための構成

デプロイ環境でサーブレットを起動するための構成

デプロイ環境でサーブレットを起動するための構成

デプロイ環境でサーブレットを起動するための構成

デプロイ環境では、global-web-application.xmlまたはorion-web.xmlの servlet-webdir属性を使用することは、セキュリティ上の理由からお薦めできません。 かわりに、アプリケーションのweb.xmlファイルの標準のサーブレット設定およびマッピ ングを使用して、コンテキスト・パスとサーブレット・パスを指定してください。

web.xmlでは、<servlet>要素の<servlet-name>サブ要素でサーブレットの名前を定

義し、それをサーブレット・クラスに関連付けます。 <servlet-mapping>サブ要素は、 サーブレット名をパス・マッピングに関連付けます。 サーブレット名とマッピング名は任意 です。これは、<servlet-name>または<servlet-mapping>設定のいずれについても、 同一または類似のベース名を持つように起動されたクラスにおいては、必須ではありませ ん。 デフォルトの OC4J のマウント・ポイントのため、サーブレットを OC4J にルーティングす るには、各コンテキスト・パスの先頭が "/j2ee/" で始まる必要がある点に注意してくださ い。 (それ以外の場合は、サーブレットは JServ にルーティングされます。) "/j2ee/" 以外を 使用する場合、mod_oc4j.confファイルで新規のOc4jMountディレクティブを作成でき ます。 デフォルトのマウント・ディレクティブをコピーして、必要に応じて "j2ee" を置換し てください。 次に、デフォルトのディレクティブを示します。

Oc4jMount /j2ee/* OC4Jworker

詳細は、『Oracle9iAS Containers for J2EE ユーザーズ・ガイド』を参照してください。

/servlet/ デフォルトのサーブレット・コンテキストのコンテキ

スト・パス。これは、デフォルトのservlet-webdir

設定に依存します。

foo.bar.SessionServlet servlet-webdir設定があるため、URL のこの部分

は、単にサーブレット・パッケージおよびクラス名で す。

注意 注意注意

注意: 定義済みのポート、それがマッピングされているリスナー、およ

びこれらの設定の変更方法については、『Oracle9iAS Containers for J2EE

ユーザーズ・ガイド』を参照してください。 指定するポートに応じて、専 用のリスナー経由(開発環境ではこちらが便利)、または Oracle HTTP Server 経由(デプロイ環境ではこちらを推奨)で OC4J ディレクトリにア クセスできます。 注意 注意注意 注意: マウント・ポイントは、コンテキスト・パスと同じにすると便利 です。

(24)

サーブレットのロードおよび初期化

サーブレットのロードおよび初期化

サーブレットのロードおよび初期化

サーブレットのロードおよび初期化

サーブレットのロードおよび初期化

コンテナは、最初にリクエストされたときにサーブレット・クラスを初期化し、ロードしま す(OC4J サーバーの起動時にクラスをロードおよび初期化するように指定していない場 合)。アプリケーションのweb.xmlファイル内で、<servlet>要素の <load-on-startup>サブ要素を指定して、サーバーの起動時にサーブレットをロードお よび初期化するようにできます。たとえば、次の要素では、PrimeSearcher.classファ イルで表されるサーブレットにPSearcherという名前を付け、これがサーバー起動時に ロードされるように指定しています。 <servlet> <servlet-name>PSearcher</servlet-name> <servlet-class>PrimeSearcher</servlet-class> <load-on-startup/> </servlet> サーバーが起動またはリクエストされたときにサーブレットがロードされると、コンテナ は、サーブレットのinit()メソッドを間接的にコールします。 サーブレットは、 HttpServletinit()メソッドをオーバーライドして、サーブレットの存続期間中に 1 回 だけ必要となる処理を実行できます。次に、このような処理の例を示します。 ■ データ・ソース接続を確立する ■ 構成から初期化パラメータを取得し、ローカル変数にその値を格納する ■ サーブレットが必要とする永続データをリカバリする ■ ハッシュテーブルなどの重要なセッション・オブジェクトを作成する ■ ServletContextオブジェクトのlog()メソッドでサーブレットのバージョンを記録 する 起動時にデータ・ソース・オブジェクトを取得するためにinit()メソッドを使用するサー ブレットの例については、2-16 ページの「データベース問合せサーブレット」を参照してく ださい。

(25)

セッションのトラッキング

セッションのトラッキング

セッションのトラッキング

セッションのトラッキング

セッションのトラッキング

HTTP プロトコルは、設計上ステートレスです。これは、単にリクエストを取得し、簡単な 計算を行って結果を出力してから消滅するような、ステートレスなサーブレットについては 問題ありません。 しかし、すべてではありませんが、多くのサーバー・サイド・アプリケー ションでは、何らかの状態を維持し、クライアントとの対話を続ける必要があります。この ような場合の最も一般的な例は、ショッピング・カートのアプリケーションです。クライア ント・ユーザーは、同じブラウザから何度かサーバーにアクセスして、いくつかの Web ページを表示します。ユーザーは、Web サイトで販売されているいくつかのアイテムの購入 を決め、「製品の購入」ボックスをクリックします。各トランザクションがステートレスな サーバー・サイド・オブジェクトで処理されており、各リクエストに対してクライアントか ら識別情報が提供されない場合、クライアントからの複数の HTTP リクエストに渡って ショッピング・カートの中身を維持することはできません。 このケースでは、クライアント をサーバー・セッションに関連付ける手段がないため、ステートレスなトランザクション・ データを永続性のある記憶域に書き込んでも問題は解決されません。

Cookie

HTTP プロトコルでステートフルを実現するためのアプローチは多数あります。 現在、最も 広く使用されている方法は、Cookie を使用してクライアントからサーバーに識別子を送信 する方法、およびステートフル・サーブレットを使用してセッション・オブジェクトを維持 する方法です。 セッション・オブジェクトは、キー(Java 文字列)とともに値(Java オブ ジェクト)を格納するディクショナリにすぎません。 クライアントが初めてステートフル・サーブレットに接続したときに、サーバー(コンテ ナ)は、セッションの識別子と、多くの場合は他の少量の情報(すべて 4K バイト未満)と が入った Cookie をクライアントに返信します。その後、同じ Web クライアント・セッショ ンから後続のリクエストを受信するたびに、クライアントはサーバーにその Cookie を返信 します。 Cookie は、レスポンス・ヘッダーのコンテナにより送信および更新されます。サー ブレット・コードは Cookie の送信に関与する必要がありません。同様に、Web ブラウザに よりサーバーに Cookie が返信されます。ブラウザのユーザーは、Cookie を機能させるに は、ブラウザ上で Cookie を使用可能にする必要があります。 コンテナは、Cookie をセッションの維持に使用します。 サーブレットは、

HttpServletRequestオブジェクトのgetCookies()メソッドを使用して Cookie を取

り出し、javax.servlet.http.CookieオブジェクトのgetXXX()メソッドを使用して、 Cookie 属性を調べることができます。 注意 注意注意 注意: セッションの通常の存続期間より長く存続する必要がある永続情 報の格納には、HttpSessionオブジェクトを使用しないでください。 保 護、トランザクションの安全性、およびデータベースによるバックアップ が必要な場合には、永続データをデータベースに格納できます。かわり に、永続情報をファイル・システムやリモート・オブジェクトに保存する こともできます。

(26)

セッションのトラッキング

URL リライティング

リライティング

リライティング

リライティング

ほとんどの Web ユーザーは、自分のブラウザで Cookie を使用可能にしておくことを知って います(知らないユーザーもいます)。Cookie の使用にかわるものとして、URL リライティ ングがあります。 URL リライティングの例は、2-11 ページの「セッション・サーブレットの 例」を参照してください。

他のセッション・トラッキング方法

他のセッション・トラッキング方法

他のセッション・トラッキング方法

他のセッション・トラッキング方法

従来は、クライアントとサーバー・セッションを関連付けるために、他のテクニックが使用 されてきました。 たとえば、サーバーの隠しフォーム・フィールドや、追加情報を格納する ためのユーザー認証メカニズムなどがあります。 このような方法には、パフォーマンスが悪 化したり機密性が失れるなど多くの欠点があるため、オラクル社では、OC4J アプリケー ションでこうしたテクニックを使用することはお薦めしません。

セッションのキャンセル

セッションのキャンセル

セッションのキャンセル

セッションのキャンセル

HttpSessionオブジェクトは、サーバー・サイド・セッションが存続する間、継続しま す。 セッションは、サーブレットにより明示的に終了されるか、あるいは一定期間後にタイ ムアウトになり、コンテナによりキャンセルされます。

タイムアウトによるキャンセル

タイムアウトによるキャンセル

タイムアウトによるキャンセル

タイムアウトによるキャンセル

OC4J サーバーのデフォルトのセッション・タイムアウトは、20 分です。 web.xmlの <session-config>要素の<session-timeout>サブ要素を設定することにより、特定 のアプリケーション用に、この期間を変更することができます。 たとえば、セッションのタ イムアウトを 5 分に短縮するには、アプリケーションのweb.xmlに次の行を追加します。 <session-config> <session-timeout>5</session-timeout> </session-config>

サーブレットによるキャンセル

サーブレットによるキャンセル

サーブレットによるキャンセル

サーブレットによるキャンセル

サーブレットでは、セッション・オブジェクト上でinvalidate()を起動することにより、 明示的にセッションをキャンセルできます。 HttpServletRequestオブジェクトの getSession()メソッドを起動して、新規セッション・オブジェクトを取得する必要があ ります。

セッション・サーブレットの例

セッション・サーブレットの例

セッション・サーブレットの例

セッション・サーブレットの例

次のSessionServletコードで実装されるサーブレットは、HttpSessionオブジェクト を確立して、リクエスト・オブジェクトとセッション・オブジェクトによって維持されてい る、必要なデータを出力します。

(27)

セッションのトラッキング

SessionServlet コード

コード

コード

コード

import java.io.*; import javax.servlet.*; import javax.servlet.http.*; import java.util.Date;

public class SessionServlet extends HttpServlet {

public void doGet (HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {

// Get the session object. Create a new one if it doesn't exist. HttpSession session = req.getSession(true);

res.setContentType("text/html"); PrintWriter out = res.getWriter();

out.println("<head><title> " + "SessionServlet Output " + "</title></head><body>");

out.println("<h1> SessionServlet Output </h1>");

// Set up a session hit counter. "sessionservlet.counter" is just the // conventional way to create a key for the value to be stored in the // session object "dictionary".

Integer ival =

(Integer) session.getAttribute("sessionservlet.counter"); if (ival == null) {

ival = new Integer(1); }

else {

ival = new Integer(ival.intValue() + 1); }

// Save the counter value.

session.setAttribute("sessionservlet.counter", ival); // Report the counter value.

out.println(" You have hit this page <b>" + ival + "</b> times.<p>");

// This statement provides a target that the user can click on // to activate URL rewriting. It is not done by default. out.println("Click <a href=" +

res.encodeURL(HttpUtils.getRequestURL(req).toString()) + ">here</a>");

out.println(" to ensure that session tracking is working even " + "if cookies aren't supported.<br>");

(28)

セッションのトラッキング

out.println("Note that by default URL rewriting is not enabled" + " due to its large overhead.");

// Report data from request.

out.println("<h3>Request and Session Data</h3>"); out.println("Session ID in Request: " +

req.getRequestedSessionId());

out.println("<br>Session ID in Request is from a Cookie: " + req.isRequestedSessionIdFromCookie());

out.println("<br>Session ID in Request is from the URL: " + req.isRequestedSessionIdFromURL());

out.println("<br>Valid Session ID: " + req.isRequestedSessionIdValid()); // Report data from the session object. out.println("<h3>Session Data</h3>");

out.println("New Session: " + session.isNew()); out.println("<br> Session ID: " + session.getId());

out.println("<br> Creation Time: " + new Date(session.getCreationTime())); out.println("<br>Last Accessed Time: " +

new Date(session.getLastAccessedTime())); out.println("</body>");

out.close(); }

public String getServletInfo() { return "A simple session servlet"; } }

デプロイおよびテスト

デプロイおよびテスト

デプロイおよびテスト

デプロイおよびテスト

テキスト・エディタに前述のコードを入力し、 $J2EE_HOME/default-web-app/WEB-INF/classes/SessionServlet.javaファイルに保 存します。 global-web-application.xml内で属性がdevelopment="true"に設定さ れている場合、サーブレットの起動時に、サーブレット・コードが自動的に再コンパイルさ れます。 図 2-1は、Cookie がオンになっている Web ブラウザにより、サーブレットがセッション内 で 2 回目に起動されたときの、このサーブレットの出力を示しています。 ブラウザの Cookie をオフにしてから URL リライティングを行うリンクをクリックするなど、Web ブラウザの 設定を変更して、違いを試してみてください。

(29)

セッションのトラッキング

図 図図

(30)

セッションのレプリケーション

セッションのレプリケーション

セッションのレプリケーション

セッションのレプリケーション

セッションのレプリケーション

ステートフルなサーブレットが、ロード・バランスされているクラスタ・アイランド内の他 の OC4J サーバーにレプリケートされると、セッションの状態も他のサーバーにブロード キャストされます。サーブレットへのリクエストを処理中のサーバーがエラーになると、そ のリクエストは、同一クラスタ内の別のサーバー上の他の JVM にフェイルオーバーします。 セッションの状態も使用可能です。web.xmlファイル内で <distributable>要素を使用 して、Web アプリケーションが分散可能であることを指定しておく必要があります。 サーブレットによりHttpSessionオブジェクトに格納されたすべてのオブジェクトは、レ プリケーションを行うためにシリアライズ可能である必要があります。 通常、ServletContextオブジェクトは、ロード・バランシングにおいてレプリケートさ れません。 しかし、アプリケーション構成ファイルorion-web.xmlの

replicate-servlet-context属性の値を"true"に設定すると、ServletContextは

レプリケートされます。 ただし、J2EE の仕様では、セッションのクライアント間で共有され る永続データを、ServletContextを使用して格納することを推奨していません。オラク ル社でも、OC4J アプリケーションでこの方法を使用することは推奨しません。 ロード・バランスされているクラスタ・アイランド内の他のサーバーにアプリケーションが レプリケートされる際には、若干ですが認識可能な遅延が生じる点に注意してください。こ のため、元のサーバーで障害が発生するまでにサーブレットのレプリケートが完了できた場 合でも、セッション情報はまだレプリケートされていない可能性があります。

(31)

サーブレットでの JDBC の使用

サーブレットでの

サーブレットでの

サーブレットでの

サーブレットでの JDBC の使用

の使用

の使用

の使用

サーブレットは、JDBC ドライバを使用してデータベースにアクセス可能です。JDBC の使 用方法としては、OC4J データ・ソースを使用してデータベース接続を取得する方法を推奨 します。 この章の例では、デフォルトの Oracle データ・ソースを使用して接続を取得してい ます。

データベース問合せサーブレット

データベース問合せサーブレット

データベース問合せサーブレット

データベース問合せサーブレット

サーブレットの利点の 1 つに、データベースからデータを取得できる点があげられます。 サーブレットは、データベースから情報を取得して動的 HTML を生成し、それをクライア ントに返すことが可能です。また、HTTP リクエスト内でサーブレットに渡された情報に基 づき、データベースを更新することも可能です。 この例では、ユーザーから HTML フォーム経由で情報を取得し、その情報をサーブレット に渡すサーブレットを示します。このサーブレットは、SQL 文を完成させて実行し、サンプ ルの HR スキーマに問合せを行って、そのリクエスト・データに基づき情報を取得します。 サーブレットは、様々な方法でクライアントから情報を取得できます。この例では、HTTP リクエストから問合せ文字列を読込むという、よく使用される方法を使用します。

HTML フォーム

フォーム

フォーム

フォーム

Web ブラウザは、Web リスナー経由で提供されるページ内のフォームにアクセスします。 ま ず、次のテキストをファイルに入力し、そのファイルにEmpInfo.htmlという名前を付け ます。 <HTML> <HEAD>

<TITLE>Get Employee Information</TITLE> </HEAD>

<BODY>

<FORM METHOD=GET ACTION="/servlet/GetEmpInfo"> The query is<br>

SELECT LAST_NAME, EMPLOYEE_ID FROM EMPLOYEES WHERE LAST NAME LIKE ?.<p> Enter the WHERE clause ? parameter (use % for wildcards).<br>

Example: 'S%':<br>

<INPUT TYPE=TEXT NAME="queryVal"> <P>

<INPUT TYPE=SUBMIT VALUE="Send Info"> </FORM>

</BODY> </HTML>

(32)

サーブレットでの JDBC の使用 次に、このファイルを$J2EE_HOME/default-web-appディレクトリに保存します。

サーブレット・コード

サーブレット・コード

サーブレット・コード

サーブレット・コード : GetEmpInfo

前述の HTML ページによってコールされるサーブレットは、問合せ文字列から入力を取得 します。入力は、SELECT 文の WHERE 句により完了します。次に、サーブレットは、デー タベースへの問合せを完了するために、この入力を追加します。このサーブレットのコード の大半は、データ・サーバーに接続して問合せ行を取得するために必要な JDBC 文から取り 上げられています。 このサーブレットは、JNDI を使用して、データ・ソースを 1 回だけルックアップするため にinit()メソッドを使用します。 init()をオーバーライドすると、コンテナが初めて サーブレットをロードしたときに、GenericServletオブジェクトのinit()メソッドに より、init()がコールされるようになります。 次に、サーブレット・コードを示します。 import java.io.*; import java.sql.*; import javax.servlet.*; import javax.servlet.http.*;

// These packages are needed for the JNDI lookup. import javax.naming.*;

// These packages support SQL operations and Oracle JDBC drivers. import javax.sql.*;

import oracle.jdbc.*;

public class GetEmpInfo extends HttpServlet { DataSource ds = null;

public void init() throws ServletException { try {

InitialContext ic = new InitialContext();

ds = (DataSource) ic.lookup("java:comp/env/jdbc/OracleDS1"); }

catch (NamingException ne) { throw new ServletException(ne); }

}

public void doGet (HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

(33)

サーブレットでの JDBC の使用

"select last_name, employee_id from employees " + "where last_name like " + queryVal;

resp.setContentType("text/html"); PrintWriter out = resp.getWriter(); out.println("<html>");

out.println("<head><title>GetEmpInfo</title></head>"); out.println("<body>");

try {

Connection conn = ds.getConnection(); Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery(query); out.println("<table border=1 width=50%>"); out.println("<tr><th width=75%>Last Name</th>" + "<th width=25%>Employee ID</th></tr>"); for (int count = 0; ; count++ ) {

if (rs.next()) {

out.println("<tr><td>" + rs.getString(1) + "</td><td>" + rs.getInt(2) + "</td></tr>");

} else {

out.println("</table><h3>" + count + " rows retrieved</h3>"); break; } } conn.close(); rs.close(); stmt.close(); }

catch (SQLException se) { se.printStackTrace(out); }

out.println("</body></html>"); }

public void destroy() { }

(34)

サーブレットでの JDBC の使用

データベース問合せサーブレットのデプロイおよびテスト

データベース問合せサーブレットのデプロイおよびテスト

データベース問合せサーブレットのデプロイおよびテスト

データベース問合せサーブレットのデプロイおよびテスト

この例をデプロイするには、HTML ファイルを$J2EE_HOME/default-web-app/(デ フォルトのアプリケーションの有効なドキュメント・ルート)に保存し、Java サーブレット を$J2EE_HOME/default-web-app/WEB-INF/classes/に保存してください。 GetEmpInfo.javaファイルは、フォームがサーブレットを起動したときに、自動的にコン パイルされます。 この例をテストするには、次のようにして、Web ブラウザからEmpInfo.htmlページを起 動します。 http://<hostname><:port>/EmpInfo.html フォームを完成させて、「Submit Query」をクリックします。 EmpInfo.htmlを起動すると、図 2-2のようなブラウザ・ウィンドウが表示されます。 注意 注意注意 注意: この例では、ポート 8888 が OC4J Web リスナーを直接使用するよ うに構成されています。 開発時には、OC4J リスナーを使用すると便利な場 合があります。 OC4J ポートの設定およびデフォルトの設定については、

『Oracle9iAS Containers for J2EE ユーザーズ・ガイド』を参照してくださ い。本番アプリケーションの場合、オラクル社では、Web ページの処理に Oracle HTTP Server(powered by Apache)を使用することをお薦めしま

(35)

サーブレットでの JDBC の使用

図 図図

2-2 社員情報の問合せ社員情報の問合せ社員情報の問合せ社員情報の問合せ

フォームに'S%'と入力して「Submit Query」をクリックすると、GetEmpInfoサーブ

(36)

サーブレットでの JDBC の使用

図 図図

図 2-1 セッション・サーブレットの表示 セッション・サーブレットの表示 セッション・サーブレットの表示 セッション・サーブレットの表示
図 図 図
図 2-4 HelloServlet からの出力 からの出力 からの出力 からの出力

参照

関連したドキュメント

うのも、それは現物を直接に示すことによってしか説明できないタイプの概念である上に、その現物というのが、

この見方とは異なり,飯田隆は,「絵とその絵

ともわからず,この世のものともあの世のものとも鼠り知れないwitchesの出

関係委員会のお力で次第に盛り上がりを見せ ているが,その時だけのお祭りで終わらせて

 「訂正発明の上記課題及び解決手段とその効果に照らすと、訂正発明の本

口腔の持つ,種々の働き ( 機能)が障害された場 合,これらの働きがより健全に機能するよう手当

それでは資料 2 ご覧いただきまして、1 の要旨でございます。前回皆様にお集まりいただ きました、昨年 11

このアプリケーションノートは、降圧スイッチングレギュレータ IC 回路に必要なインダクタの選択と値の計算について説明し