![]() ![]() ![]() ![]() ![]() |
開発ガイド 05/16/03 09:21:28 |
この章では、J2EEアプリケーションにおけるサーブレットの使用方法について説明します。この章には、次のトピックが含まれています。
この章では、HTTPプロトコルについて理解しており、HTTPリクエストヘッダおよびHTTP応答ヘッダのコンテンツを熟知していることを前提としています。詳細については、 http://java.sun.comでSunにより提供されているJDKのドキュメントまたはサーブレットのホームページを参照してください。
「サーブレット」は、サーバで実行されるJ2EEコンポーネントで、サーバの機能を拡張できるようにします。サーブレットは、1つまたは複数のURLに関連付けられます。(ブラウザなどの)クライアントによって、このようなURLの1つにHTTPリクエストが行われると、サーブレットが実行されます。
サーブレットに関連付けられているURLにクライアントアプリケーション(通常はWebブラウザ)からHTTPリクエストが送信されると、J2EEサーバでは、このリクエストをサーブレットコンテナに渡すことによって処理します。このコンテナでは、ロードして初期化することから、リクエストの処理とサーブレットの削除まで、サーブレットのライフサイクルを管理します。
サーブレットによってクライアントからのHTTPリクエストが処理される前に、コンテナでは、次の操作を実行しなければなりません。
サーブレットクラスのロードおよびインスタンス化は、コンテナが開始するか、またはサーブレットでリクエストを処理することが必要であるとコンテナによって判断された場合に実行できます。
コンテナでは、初めてサーブレットを作成する場合にのみinit()メソッドを呼び出します。つまり、ユーザによって要求されるたびにinit()が再び呼び出されるわけではありません。
サーブレットが初期化されると、コンテナでは、サーブレットを使用してHTTPリクエストを処理します。
サーバでサーブレットに対するHTTPリクエストが受信されるたびに、コンテナでは、リクエストを表すHttpServletRequestタイプのオブジェクト、およびサーブレットで応答を作成できるようにするためのHttpServletResponseタイプのオブジェクトを作成します。その後、コンテナにより、サーブレットインタフェースのservice()メソッドが呼び出され、これらの2つのオブジェクトが渡されます。
service()メソッドでは、HTTPリクエストタイプ(GET、POST、PUT、DELETEなど)をチェックし、サーブレットインタフェースで適切なメソッド(doGet()、doPost()、doPut()、DoDelete()など)を適宜呼び出します。論理を処理するサーブレットリクエストのほとんどは、これらのメソッドに表示されます。
サーブレットでは、HttpServletRequestオブジェクトを使用して、リモートユーザ、送信された可能性のあるHTMLフォームパラメータ、およびHTTPリクエストに関するその他のデータを判断できます。また、HttpServletResponseオブジェクトを使用して、クライアントに送信し直すHTTP応答を作成することもできます。
サーブレットコンテナでは、特定のサーブレットインスタンスを削除することができます(たとえば、特定のサーバ管理コマンドの結果としてや、コンテナでメモリのリソースを節約する必要があるためなど)。サービスからあるサーブレットを削除しなければならないことがコンテナによって判断された場合、サーブレットインタフェースのdestroy()メソッドが呼び出されます。
destroy()メソッドは、サーブレットコンテナで通常の処理の一部としてサーブレットが削除される場合にのみ呼び出されます。コンテナが不正に停止された場合(サーバがクラッシュした場合など)、このメソッドのコードは、そのサーブレットが削除されるまで実行されないことがあります。
J2EEでは、サーブレットおよびJavaServer Pages (通常はJSPページと呼ばれます)の両方で、動的に生成されたコンテンツを配信できます。
サーブレットは、HTTP応答(HTML、XML、またはその他の形式)がJava Printステートメント内でコード化されなければならない、プログラム的なツールです。サーブレットは、ブラウザからリクエストを受け付け、リクエストに含まれる情報を場合によっては処理し、企業データを取得して、データ上でアプリケーション論理を実行し、HTTP応答を作成するように設計されています。
JSPページは表示中心のツールで、HTMLのようなページにコード化されています。JSPページでは、JavaBeansコンポーネント、カスタムタグ、および埋め込まれたJavaスクリプトレットと式を使用するアプリケーション論理をサポートしています。JSPページは、アプリケーション論理をサポートし、モジュラーで再使用可能な表示コンポーネントになるようにHTMLページを拡張するために設計されています。
J2EEでは、サーブレットは、Web Archive (WAR)モジュールに通常はパッケージ化されています。WARにはサーブレット、JSPページ、およびHTMLファイル、画像、音声、ムービーなど静的なWebコンテンツを含めることができます。
Workbenchは、主要なアーカイブまたはJ2EEアーカイブに対するプロジェクトを作成します。プロジェクトを作成する場合、Workbenchでは、EAR (Enterprise Archive)、WAR (Web Archive)、Application Client JAR、Enterprise JavaBean JARなど、プロジェクトによって実装されるアーカイブの種類を指定するように要求されます。
Workbenchでサーブレットを作成する場合、サーブレットと既存のWARプロジェクトを関連付けるか、サーブレットに対して新しいWARプロジェクトを作成するか、またはプロジェクトを指定せずにサーブレットを作成できます。
J2EEでは、一般的にサーブレットは標準JavaクラスHttpServletの拡張Javaクラスです。
サーブレットをコード化するには、通常リクエストの処理時にservice()メソッドにより呼び出されるさまざまなメソッドを上書きします。ほとんどの場合、これは、HTTP GETおよびHTTP POSTリクエストを処理するコードを提供するために、少なくともdoGet()およびdoPost()メソッドを上書きすることを意味します。
場合によっては、init()およびdestroy()メソッドを上書きすることによって、初期化およびクリーンアップの機能を指定することもできます。
Workbenchには、Javaサーブレットクラスの作成に便利なServletウィザードがあります。このウィザードを使用すると、入力した情報に基づきWorkbenchによりサーブレットのJavaソースファイルが作成されます。プロジェクトまたはパッケージの指定から、任意のディレクトリ構造も作成されます。
ウィザードを開始するには、[File]、[New]の順に選択して、[New File]ダイアログボックスから[Servlet]をクリックします。
Servletウィザードで、次のようなサーブレットの特徴を指定します。
サーブレットについて、新しいWARまたは既存のWARの一部にするか、パッケージに含めるかどうか指定すると、その選択を実装するために必要なファイルシステムディレクトリがウィザードにより作成されます。たとえば、ウィザードの実行時に次の条件を指定します。
これらの条件に基づき、ウィザードにより次のJavaソースファイルが作成されます。
d:\warProjects\welcomeUser\com\mwbi\welcome\MwbiWelcomeUser.java
ウィザードで指定した任意のディレクトリ(たとえば、パッケージの指定によるもの、サーブレットのベースディレクトリなど)が作成されますが、ファイルシステムにはまだ存在しません。
次に、ウィザードで作成したサーブレットファイルの例を示します。このサーブレットファイルのJavaコードには、Servletウィザードの実行時に指定した次のような特徴が反映されています。
package com.mwbi.welcome; import javax.servlet.*; import javax.servlet.http.*; import java.io.*; import java.util.*; public class MwbiWelcomeUser extends HttpServlet { static final String CONTENT_TYPE = "text/html"; // Handle the HTTP GET request public void doGet( HttpServletRequest request, HttpServletResponse response ) throws ServletException, IOException { response.setContentType( CONTENT_TYPE ); PrintWriter out = response.getWriter(); /** @todo Process the HTTP "GET" request here, and write the proper response to the PrintWriter "out". */ out.println( "<html><head><title>MwbiWelcomeUser</title></head><body>" ); out.println( "<p>Servlet MwbiWelcomeUser has received an HTTP GET.</p>" ); out.println( "<p>The servlet generated this page in response to the request.</p>"); out.println( "</body></html>" ); } // Handle the HTTP POST request public void doPost( HttpServletRequest request, HttpServletResponse response ) throws ServletException, IOException { response.setContentType( CONTENT_TYPE ); PrintWriter out = response.getWriter(); /** @todo Process the HTTP "POST" request here, and write the proper response to the PrintWriter "out". */ out.println( "<html><head><title>MwbiWelcomeUser</title></head><body>" ); out.println( "<p>Servlet MwbiWelcomeUser has received an HTTP POST.</p>" ); out.println( "<p>The servlet generated this page in response to the request.</p>" ); out.println( "</body></html>" ); } }
サーブレットの主な機能の1つは、クライアントからのHTTPリクエストを処理することです。通常、この動作にはプログラミング論理を実行し、リクエストに含まれているデータに基づいてコンテンツを生成することも含まれます。
一般的に、サーブレットは、サーブレットクラスのdoGet()およびdoPost()メソッドを上書きすることによって、HTTP GETおよびHTTP POSTリクエストを処理します。これらのメソッドでは、2つの引数が使用されます。
サーブレットでは、PUT、DELETE、TRACEなどその他のHTTPリクエストタイプのメソッドも使用できます。サーブレットでGETおよびPOST以外のHTTPリクエストタイプを処理する場合の詳細については、ご使用のJava関連ドキュメントを参照してください。
この節では、HTTPリクエストから情報を読み込むサーブレットの機能性について説明します。HTTP応答を作成するサーブレットの機能性の詳細については、 HTTP応答の生成を参照してください。
自動化されたWebコンテンツを生成する大きな理由の1つは、そのコンテンツがユーザ入力に基づくようにできるためです。通常、ユーザのデータは、ユーザが入力したHTMLフォームのデータを読み込むことによって取得します。
サーブレットは、HttpServletRequestインタフェースのgetParameter()メソッドを使用して、HTTPリクエストのHTMLフォームパラメータを読み込むことができます。たとえば、login_userid HTMLフォームパラメータに対して指定された値をサーブレットの変数に読み込む場合は、次のようにコード化します。
userIDfromHtmlForm = request.getParameter( "login_userid" );
この例では、サーブレットでクライアントからのデータを読み込んで保存する簡単な方法を示しています。J2EEでは、JavaServer Pages、カスタムタグ、Enterprise JavaBeansなど、この機能をサポートするさまざまな技術があります。詳細については、J2EE関連ドキュメントおよびJavaプログラミング用リソースを参照してください。
HTTPリクエストヘッダには、アプリケーションに有用な次のような情報を多数含めることができます。
HttpServletRequestインタフェースでは、指定した任意のヘッダを読み込むことができるgetHeader()メソッドをサポートしています。たとえば、リクエストを送信したクライアントブラウザが使用できる文字セットを検索する場合、次のようにメソッドを使用できます。
request.getHeader( "Accept-Charset" );
より一般的なヘッダには、getCookies()、getAuthType()、getRemoteUser()、getContentLength()などHttpServletRequestインタフェースの特定のメソッドが含まれる場合があります。
HTTPヘッダ、およびサーブレットにこの情報を読み込む方法の詳細については、HTTPの仕様およびJavaのドキュメントを参照してください。
HTTPリクエストの処理で説明したように、サーブレットによりHTTPリクエスト情報が読み込まれた場合、通常は、HttpServletResponseタイプのオブジェクトの形式で何らかの応答が生成されます。
応答オブジェクトには通常ステータス行、1つまたは複数の応答ヘッダ、および実際のドキュメントが含まれます。
HTTPのステータス行には、HTTPのバージョン、ステータスコード、およびステータスコードに対応する非常に短いメッセージが含まれます。たとえば、正常な応答に関する簡単なHTTPのステータス行は次のようになります。
HTTP/1.1 200 OK
doGet()、doPost()などのメソッドに対する処理の一部として、サーバでHTTP応答のデフォルトのステータス行(ステータスコード200)を指定する必要があります。
HttpServletResponseインタフェースのsetStatus()メソッドを使用すると、HttpServletResponseステータスコードを明示的に指定できます。
注意: ステータスコードを明示的に指定する場合、ドキュメントコンテンツを記述する前に実行する必要があります(詳細については、 ドキュメントコンテンツの指定を参照してください)。
このメソッドでは、引数として整数を使用します。ただし、明示的な数字を使用する代わりに、HttpServletReponseインタフェースで定義された定数を使用する必要があります。一般的なステータスの定数の例は、次のとおりです。
たとえば、応答のステータスコードを403に設定するには、次のようにメソッドを使用できます。
response.setStatus( response.SC_FORBIDDEN );
HTTP応答のステータスコードの詳細については、HttpServletResponseおよびHTTPの仕様に該当するJavaのドキュメントを参照してください。
HttpServletResponseインタフェースでは、指定した任意のヘッダを定義できるsetHeader()メソッドを使用できます。HttpServletResponseには、次のような特別な機能を持つ便利なメソッドもあります。
たとえば、ユーザを別のページにリダイレクトするには、次のようにメソッドを使用できます。
response.sendRedirect( url );
ここで、「url」はユーザをリダイレクトする先のURLを含む変数です。
注意: HTTPリクエストヘッダを指定する場合、ドキュメントコンテンツを送信する前に実行する必要があります(詳細については、 ドキュメントコンテンツの指定を参照してください)。
HTTPヘッダおよびサーブレットにその情報を読み込む方法の詳細については、HTTPの仕様およびJavaのドキュメントを参照してください。
サーブレットで生成されるHTTP応答においてドキュメントコンテンツを記述する場合、次の項目を指定する必要があります。
コンテンツタイプを指定するには、ServletResponseインタフェースのsetContentType()メソッドを使用します。一般的な応答コンテンツタイプは、次のとおりです。
たとえば、コンテンツタイプをHTMLに設定するには、次のようにメソッドを使用できます。
response.setContentType( "text/html" );
Workbenchの場合 Servletウィザードで、ウィザードの起動時に指定したコンテンツタイプを含むString型の変数が作成されます。たとえば、HTML応答を生成するサーブレットのコードには、次のような変数の宣言が含まれます。
static final String CONTENT_TYPE = "text/html" ;
リクエスト処理メソッド(doGet()やdoPost()など)では、次のようなメソッド呼び出しが含まれます。
response.setContentType( CONTENT_TYPE );
ドキュメントコンテンツを記述するには、PrintWriterオブジェクトを設定し、print()およびprintln()メソッドを使用してそのオブジェクトにコンテンツを記述します。
たとえば、応答として「Hello, world」という単純なHTMLメッセージを送信するには、次のようなコードを使用します。
PrintWriter out = response.getWriter(); out.println( "<HTML><HEAD></HEAD><BODY>" ); out.println( "<P>Hello, world</P>" ); out.println( "</BODY></HTML>" );
注意: 応答に対してステータスコードまたはHTTPヘッダを指定する場合、PrintWriterオブジェクトに何かを記述する前にこの指定を行わなければなりません(HTTPステータス行およびヘッダの詳細については、 ステータス行の指定または HTTP応答ヘッダの指定を参照してください)。
Servletウィザードでは、入力に基づいてコンテンツタイプを設定するコードを挿入し、HTTP応答に含めるPrintWriterオブジェクトを定義して、ドキュメントコンテンツを記述するためのテンプレートをHttpServletResponseオブジェクトに提供します。
たとえば、Servletウィザードで[Content Type]に対しHTMLを指定した場合、このウィザードによって、HTTPリクエストを処理して応答を提供する次のコードが任意のメソッドで作成されます。
response.setContentType( CONTENT_TYPE ); PrintWriter out = response.getWriter(); /** @todo Process the HTTP "GET" request here, and write the proper response to the PrintWriter "out". */ out.println( "<html><head><title>MwbiWelcomeCustomer</title></head><body>" ); out.println( "<p>Servlet MwbiWelcomeCustomer has received an HTTP GET.</p>" ); out.println( "<p>The servlet generated this page in response to the request.</p>" ); out.println( "</body></html>" );
コンテンツタイプの指定で説明したように、「CONTENT_TYPE」はテキスト/htmlに設定された静的な変数として定義されます。
out.println()ステートメントを置換して、HTTP応答のドキュメントコンテンツを反映する必要があります。
注意: 応答に対してステータスコードまたはHTTPヘッダを指定する場合、PrintWriterオブジェクトに何かを記述する前にこの指定を行わなければなりません(HTTPステータス行およびヘッダの詳細については、 ステータス行の指定または HTTP応答ヘッダの指定を参照してください)。
サーブレットに対して初期化およびクリーンアップコードを定義する場合は、サーブレットクラスでinit()およびdestroy()メソッドを上書きできます(init()およびdestroy()メソッドの詳細については、 サーブレットのライフサイクルを参照してください)。
サーブレットを作成する際、init()およびdestroy()メソッドを上書きするかどうかを尋ねるメッセージがウィザードによって表示されます。1つまたは両方のメソッドが上書きされるように指定した場合、Workbenchでは、スケルトンメソッドコードをサーブレットに挿入します。
Servletウィザードでは、init()メソッドを上書きすることを設定すると、次のコードがサーブレットに挿入されます。
/** This method is called once per instance of the servlet class. Use this method to allocate any needed resources that should be preserved for the life of the servlet instance. */ public void init( ServletConfig config ) throws ServletException { super.init( config ); /** @todo Initialize any instance variables here. */ }
サーブレットはinit()メソッドでServletConfigタイプの引数を指定しますが、このメソッドは引数なしでも指定できます。サーブレットで、サーバごとに異なる設定を読み込む必要がない場合は、通常は、init()を引数を使用せずに指定します。
init()でServletConfig引数を使用するように指定した場合、super.init()メソッドがメソッドで最初のステートメントになる必要があります。
Servletウィザードでは、destroy()メソッドを上書きすることを設定すると、次のコードがサーブレットに挿入されます。
/** This method is called once per instance of the servlet class, after the application server is done with that instance. Use this method to free any resources owned by the servlet instance. */ public void destroy() { }
この章では、サーブレットをプログラミングする際に発生する問題の一部について、その概要を説明しています。ここで説明されている範囲外の主なトピックとして、次のようなトピックがあります。
これらのトピックの詳細については、J2EEのドキュメント、Java言語のドキュメント、サーブレットのプログラミングに関する書籍などを参照してください。
Webアプリケーション(サーブレット、JSPページ、およびその他サポートしているコンポーネントを含む)のコンポーネントを作成した後、アプリケーションをWAR (Web Archive)ファイルにパッケージ化します。
この処理は、次のような点で における アプリケーションのパッケージ化の説明と類似しています。
主な違いは、ServletContext初期化パラメータ、サーブレットマッピング、サーブレット/JSPマッピングなど、配備記述子で指定する内容です。
配備記述子におけるサーブレット情報の指定の詳細については、サーブレットおよびJ2EEのドキュメントを参照してください。
Workbenchの場合 配備記述子にサーブレット情報を記述するには、配備記述子エディタを使用します。WARファイルを作成するには、Workbenchの[Project]メニューで適切なアーカイブコマンドを使用します。
Workbenchにおける配備記述子の作成の詳細については、『ツールガイド』の「
配備記述子エディタ」を参照してください。
アプリケーションをユーザが使用できるようにするには、Novell exteNd Application ServerなどのJ2EEサーバに配備します。この配備の処理は、次のような点で アプリケーションの配備の説明と類似しています。
Workbenchの場合 J2EEサーバにアプリケーションを配備するには、 アプリケーションの配備の説明に従って[Project]、[Deploy Archive]の順に選択します。
アプリケーションが配備されると、適切なURLを指定してブラウザで実行できます。
![]() ![]() ![]() ![]() ![]() |
開発ガイド 05/16/03 09:21:28 |
Copyright © 1997, 1998, 1999, 2000, 2001, 2002, 2003 SilverStream Software, LLC, a wholly owned subsidiary of Novell, Inc. All rights reserved.