exteNd Workbench 4.1
コアヘルプ

 

    First Previous Next Last 開発ガイド  05/16/03 09:21:28 

第4章    サーブレットの作成

この章では、J2EEアプリケーションにおけるサーブレットの使用方法について説明します。この章には、次のトピックが含まれています。

この章では、HTTPプロトコルについて理解しており、HTTPリクエストヘッダおよびHTTP応答ヘッダのコンテンツを熟知していることを前提としています。詳細については、 http://java.sun.comでSunにより提供されているJDKのドキュメントまたはサーブレットのホームページを参照してください。

 
Top of page

サーブレットについて

サーブレット」は、サーバで実行されるJ2EEコンポーネントで、サーバの機能を拡張できるようにします。サーブレットは、1つまたは複数のURLに関連付けられます。(ブラウザなどの)クライアントによって、このようなURLの1つにHTTPリクエストが行われると、サーブレットが実行されます。

サーブレットは、次に対して使用できます。

 
Top of section

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

サーブレットに関連付けられている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()メソッドは、サーブレットコンテナで通常の処理の一部としてサーブレットが削除される場合にのみ呼び出されます。コンテナが不正に停止された場合(サーバがクラッシュした場合など)、このメソッドのコードは、そのサーブレットが削除されるまで実行されないことがあります。

 
Top of section

サーブレットおよびJSPページ

J2EEでは、サーブレットおよびJavaServer Pages (通常はJSPページと呼ばれます)の両方で、動的に生成されたコンテンツを配信できます。

サーブレットは、HTTP応答(HTML、XML、またはその他の形式)がJava Printステートメント内でコード化されなければならない、プログラム的なツールです。サーブレットは、ブラウザからリクエストを受け付け、リクエストに含まれる情報を場合によっては処理し、企業データを取得して、データ上でアプリケーション論理を実行し、HTTP応答を作成するように設計されています。

JSPページは表示中心のツールで、HTMLのようなページにコード化されています。JSPページでは、JavaBeansコンポーネント、カスタムタグ、および埋め込まれたJavaスクリプトレットと式を使用するアプリケーション論理をサポートしています。JSPページは、アプリケーション論理をサポートし、モジュラーで再使用可能な表示コンポーネントになるようにHTMLページを拡張するために設計されています。

For more information    JSP技術の詳細については、 を参照してください。

 
Top of section

サーブレットおよびJ2EEアーカイブ構造

J2EEでは、サーブレットは、Web Archive (WAR)モジュールに通常はパッケージ化されています。WARにはサーブレット、JSPページ、およびHTMLファイル、画像、音声、ムービーなど静的なWebコンテンツを含めることができます。

Workbenchの場合

Workbenchは、主要なアーカイブまたはJ2EEアーカイブに対するプロジェクトを作成します。プロジェクトを作成する場合、Workbenchでは、EAR (Enterprise Archive)、WAR (Web Archive)、Application Client JAR、Enterprise JavaBean JARなど、プロジェクトによって実装されるアーカイブの種類を指定するように要求されます。

Workbenchでサーブレットを作成する場合、サーブレットと既存のWARプロジェクトを関連付けるか、サーブレットに対して新しいWARプロジェクトを作成するか、またはプロジェクトを指定せずにサーブレットを作成できます。

 
Top of page

サーブレットの開発

J2EEでは、一般的にサーブレットは標準JavaクラスHttpServletの拡張Javaクラスです。

サーブレットにより、次のパッケージがインポートされます。

サーブレットをコード化するには、通常リクエストの処理時にservice()メソッドにより呼び出されるさまざまなメソッドを上書きします。ほとんどの場合、これは、HTTP GETおよびHTTP POSTリクエストを処理するコードを提供するために、少なくともdoGet()およびdoPost()メソッドを上書きすることを意味します。

場合によっては、init()およびdestroy()メソッドを上書きすることによって、初期化およびクリーンアップの機能を指定することもできます。

 
Top of section

Workbenchにおけるサーブレットクラスの作成

Workbenchには、Javaサーブレットクラスの作成に便利なServletウィザードがあります。このウィザードを使用すると、入力した情報に基づきWorkbenchによりサーブレットのJavaソースファイルが作成されます。プロジェクトまたはパッケージの指定から、任意のディレクトリ構造も作成されます。

Servletウィザードの実行

ウィザードを開始するには、[File]、[New]の順に選択して、[New File]ダイアログボックスから[Servlet]をクリックします。

Servletウィザードで、次のようなサーブレットの特徴を指定します。

ソースファイルディレクトリ構造の例

サーブレットについて、新しいWARまたは既存のWARの一部にするか、パッケージに含めるかどうか指定すると、その選択を実装するために必要なファイルシステムディレクトリがウィザードにより作成されます。たとえば、ウィザードの実行時に次の条件を指定します。

これらの条件に基づき、ウィザードにより次のJavaソースファイルが作成されます。

  d:\warProjects\welcomeUser\com\mwbi\welcome\MwbiWelcomeUser.java

ウィザードで指定した任意のディレクトリ(たとえば、パッケージの指定によるもの、サーブレットのベースディレクトリなど)が作成されますが、ファイルシステムにはまだ存在しません。

サーブレットファイルのソースコード例

次に、ウィザードで作成したサーブレットファイルの例を示します。このサーブレットファイルのJavaコードには、Servletウィザードの実行時に指定した次のような特徴が反映されています。

 
Top of section

HTTPリクエストの処理

サーブレットの主な機能の1つは、クライアントからのHTTPリクエストを処理することです。通常、この動作にはプログラミング論理を実行し、リクエストに含まれているデータに基づいてコンテンツを生成することも含まれます。

一般的に、サーブレットは、サーブレットクラスのdoGet()およびdoPost()メソッドを上書きすることによって、HTTP GETおよびHTTP POSTリクエストを処理します。これらのメソッドでは、2つの引数が使用されます。

サーブレットでは、PUT、DELETE、TRACEなどその他のHTTPリクエストタイプのメソッドも使用できます。サーブレットでGETおよびPOST以外のHTTPリクエストタイプを処理する場合の詳細については、ご使用のJava関連ドキュメントを参照してください。

この節では、HTTPリクエストから情報を読み込むサーブレットの機能性について説明します。HTTP応答を作成するサーブレットの機能性の詳細については、 HTTP応答の生成を参照してください。

HTMLフォームデータの読み込み

自動化されたWebコンテンツを生成する大きな理由の1つは、そのコンテンツがユーザ入力に基づくようにできるためです。通常、ユーザのデータは、ユーザが入力したHTMLフォームのデータを読み込むことによって取得します。

getParameter()メソッドの使用

サーブレットは、HttpServletRequestインタフェースのgetParameter()メソッドを使用して、HTTPリクエストのHTMLフォームパラメータを読み込むことができます。たとえば、login_userid HTMLフォームパラメータに対して指定された値をサーブレットの変数に読み込む場合は、次のようにコード化します。

  userIDfromHtmlForm = request.getParameter( "login_userid" );

ここで、

この例では、サーブレットでクライアントからのデータを読み込んで保存する簡単な方法を示しています。J2EEでは、JavaServer Pages、カスタムタグ、Enterprise JavaBeansなど、この機能をサポートするさまざまな技術があります。詳細については、J2EE関連ドキュメントおよびJavaプログラミング用リソースを参照してください。

HTTPリクエストヘッダ情報の読み込み

HTTPリクエストヘッダには、アプリケーションに有用な次のような情報を多数含めることができます。

HttpServletRequestインタフェースでは、指定した任意のヘッダを読み込むことができるgetHeader()メソッドをサポートしています。たとえば、リクエストを送信したクライアントブラウザが使用できる文字セットを検索する場合、次のようにメソッドを使用できます。

  request.getHeader( "Accept-Charset" );

より一般的なヘッダには、getCookies()、getAuthType()、getRemoteUser()、getContentLength()などHttpServletRequestインタフェースの特定のメソッドが含まれる場合があります。

HTTPヘッダ、およびサーブレットにこの情報を読み込む方法の詳細については、HTTPの仕様およびJavaのドキュメントを参照してください。

 
Top of section

HTTP応答の生成

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 );

For more information    HTTP応答のステータスコードの詳細については、HttpServletResponseおよびHTTPの仕様に該当するJavaのドキュメントを参照してください。

HTTP応答ヘッダの指定

HTTP応答ヘッダには、次のような情報が含まれます。

HttpServletResponseインタフェースでは、指定した任意のヘッダを定義できるsetHeader()メソッドを使用できます。HttpServletResponseには、次のような特別な機能を持つ便利なメソッドもあります。

メソッド

機能性

setDateHeader()

Java日付をGMT(グリニッジ標準時)の時刻文字列に変換します。

setIntHeader()

ヘッダに挿入する前に、整数をString型に変換します。

setContentType()

Content-Typeヘッダを設定します。

setContentLength()

Content-Lengthヘッダを設定します。

addCookie()

CookieをSet-Cookieヘッダに挿入します。

sendRedirect()

Locationヘッダを設定し、ステータスコードを302に設定します。

たとえば、ユーザを別のページにリダイレクトするには、次のようにメソッドを使用できます。

  response.sendRedirect( url );

ここで、「url」はユーザをリダイレクトする先のURLを含む変数です。

注意:   HTTPリクエストヘッダを指定する場合、ドキュメントコンテンツを送信する前に実行する必要があります(詳細については、 ドキュメントコンテンツの指定を参照してください)。

For more information    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応答ヘッダの指定を参照してください)。

Workbenchの場合

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応答ヘッダの指定を参照してください)。

 
Top of section

初期化およびクリーンアップメソッドの指定

サーブレットに対して初期化およびクリーンアップコードを定義する場合は、サーブレットクラスでinit()およびdestroy()メソッドを上書きできます(init()およびdestroy()メソッドの詳細については、 サーブレットのライフサイクルを参照してください)。

Workbenchの場合

サーブレットを作成する際、init()およびdestroy()メソッドを上書きするかどうかを尋ねるメッセージがウィザードによって表示されます。1つまたは両方のメソッドが上書きされるように指定した場合、Workbenchでは、スケルトンメソッドコードをサーブレットに挿入します。

ウィザードにより生成されるinit()コード

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()メソッドがメソッドで最初のステートメントになる必要があります。

ウィザードにより生成されるdestroy()コード

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()
      {
      }

 
Top of section

サーブレットのコーディングに関するその他の問題

この章では、サーブレットをプログラミングする際に発生する問題の一部について、その概要を説明しています。ここで説明されている範囲外の主なトピックとして、次のようなトピックがあります。

For more information    これらのトピックの詳細については、J2EEのドキュメント、Java言語のドキュメント、サーブレットのプログラミングに関する書籍などを参照してください。

 
Top of page

アプリケーションのパッケージ化

Webアプリケーション(サーブレット、JSPページ、およびその他サポートしているコンポーネントを含む)のコンポーネントを作成した後、アプリケーションをWAR (Web Archive)ファイルにパッケージ化します。

この処理は、次のような点で における アプリケーションのパッケージ化の説明と類似しています。

  1. Webアプリケーションの配備記述子を作成し、サーブレットに関する情報を指定します。

  2. サーブレット、およびJSPページまたはサポートしているクラスなどサーブレットをサポートするために必要な任意のコンポーネントを含むWAR (Web Archive)ファイルを作成します。

主な違いは、ServletContext初期化パラメータ、サーブレットマッピング、サーブレット/JSPマッピングなど、配備記述子で指定する内容です。

For more information    配備記述子におけるサーブレット情報の指定の詳細については、サーブレットおよびJ2EEのドキュメントを参照してください。

Workbenchの場合   配備記述子にサーブレット情報を記述するには、配備記述子エディタを使用します。WARファイルを作成するには、Workbenchの[Project]メニューで適切なアーカイブコマンドを使用します。

For more information    Workbenchにおける配備記述子の作成の詳細については、『ツールガイド』の「 配備記述子エディタ」を参照してください。

 
Top of page

アプリケーションの配備

アプリケーションをユーザが使用できるようにするには、Novell exteNd Application ServerなどのJ2EEサーバに配備します。この配備の処理は、次のような点で アプリケーションの配備の説明と類似しています。

  1. アプリケーションサーバに対するWorkbenchサーバプロファイルが存在しない場合は作成します。

  2. J2EEサーバによって必要とされるアプリケーションのランタイム配備情報を指定します。

  3. アプリケーションを配備します。

Workbenchの場合   J2EEサーバにアプリケーションを配備するには、 アプリケーションの配備の説明に従って[Project]、[Deploy Archive]の順に選択します。

 
Top of page

サーブレットの実行

アプリケーションが配備されると、適切なURLを指定してブラウザで実行できます。

    First Previous Next Last 開発ガイド  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.