ヘッダーをスキップ
Oracle® Fusion Middleware Oracle WebLogic Server Webアプリケーション、サーブレット、JSPの開発
11gリリース1 (10.3.6)
B60993-04
  ドキュメント・ライブラリへ移動
ライブラリ
製品リストヘ移動
製品
目次へ移動
目次

前
 
次
 

4 サーブレットの作成と構成

次の項では、サーブレットを作成および構成する方法について説明します。

サーブレットの構成

Java EEメタデータ・アノテーションの使用により、標準のweb.xmlデプロイメント記述子は省略可能になりました。Servlet 2.5仕様では、サーブレット、フィルタ、リスナー、タグ・ハンドラなどの特定のWebコンポーネントでアノテーションを定義できると規定されています。アノテーションを使用すると、外部リソースに対する依存関係を宣言できます。コンテナはこれらのコンポーネントのアノテーションを検出し、コンポーネントのライフサイクル・メソッドが呼び出される前に必要な依存関係を注入します。第8章「Webコンポーネント用のWebLogicアノテーション」を参照してください。

ただし、サーブレットは、標準のWebアプリケーション・デプロイメント記述子web.xmlの複数のエントリでWebアプリケーションの一部としても定義できます。web.xmlファイルは、WebアプリケーションのWEB-INFディレクトリにあります。

web.xmlのルートservlet要素の下の最初のエントリには、サーブレットの名前が定義され、そのサーブレットを実行するコンパイル済みクラスが指定されます。あるいは、サーブレット・クラスを指定するかわりに、JSPを指定することもできます。servlet要素には、サーブレットの初期化属性とセキュリティ・ロール用の定義も含まれています。

web.xml内のservlet-mapping要素の下の2番目のエントリには、このサーブレットを呼び出すURLパターンが定義されています。

サーブレット・マッピング

サーブレット・マッピングとは、サーブレットへのアクセス方法を制御することです。次の例は、Webアプリケーションでサーブレット・マッピングを使用する方法を示しています。この例には、(web.xmlデプロイメント記述子の)サーブレット構成とマッピングがあり、その後にこれらのサーブレットの起動に使用するURLを示す表(「url-patternと呼び出されるサーブレット」を参照)があります。

一般的なサーブレット・マッピングのルールや規約など、サーブレット・マッピングの詳細は、Servlet 2.5仕様のセクション11を参照してください。

例4-1 サーブレット・マッピングの例

<servlet>
  <servlet-name>watermelon</servlet-name>
  <servlet-class>myservlets.watermelon</servlet-class>
</servlet>
<servlet>
  <servlet-name>garden</servlet-name>
  <servlet-class>myservlets.garden</servlet-class>
</servlet>
<servlet>
  <servlet-name>list</servlet-name>
  <servlet-class>myservlets.list</servlet-class>
</servlet>
<servlet>
  <servlet-name>kiwi</servlet-name>
  <servlet-class>myservlets.kiwi</servlet-class>
</servlet>
<servlet-mapping>
  <servlet-name>watermelon</servlet-name>
  <url-pattern>/fruit/summer/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
  <servlet-name>garden</servlet-name>
  <url-pattern>/seeds/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
  <servlet-name>list</servlet-name>
  <url-pattern>/seedlist</url-pattern>
</servlet-mapping>
<servlet-mapping>
  <servlet-name>kiwi</servlet-name>
  <url-pattern>*.abc</url-pattern>
</servlet-mapping>

表4-1 url-patternと呼び出されるサーブレット

URL 呼び出されるサーブレット
http://host:port/mywebapp/fruit/summer/index.html
watermelon
http://host:port/mywebapp/fruit/summer/index.abc
watermelon
http://host:port/mywebapp/seedlist
list
http://host:port/mywebapp/seedlist/index.html

デフォルト・サーバー(構成されている場合)、またはHTTP 404エラー・メッセージ(「File not found」)。

listサーブレットが/seedlist*にマップされていた場合、listサーブレットが呼び出されます。

http://host:port/mywebapp/seedlist/pear.abc
kiwi

listサーブレットが/seedlist*にマップされていた場合、listサーブレットが呼び出されます。

http://host:port/mywebapp/seeds
garden
http://host:port/mywebapp/seeds/index.html
garden
http://host:port/mywebapp/index.abc
kiwi

ServletServletは、サーブレットのデフォルト・マッピングの作成に使用できます。たとえば、http://host:port/web-app-name/myservlet/com/foo/FooServletを使用してサーブレットを呼び出せるように/myservlet/*に対するすべてのサーブレットにマップするデフォルト・マッピングを作成するには、web.xmlファイルに以下の部分を追記します。(web.xmlファイルは、WebアプリケーションのWEB-INFディレクトリにあります)。

<servlet>
  <servlet-name>ServletServlet</servlet-name>
  <servlet-class>weblogic.servlet.ServletServlet</servlet-class>
</servlet>
<servlet-mapping> 
<servlet-name>ServletServlet</servlet-name>
  <url-pattern>/myservlet/*</url-pattern>
</servlet-mapping>

デフォルト・サーブレットの設定

各Webアプリケーションには、デフォルト・サーブレットがあります。このデフォルト・サーブレットは管理者が指定できますが、指定しない場合、WebLogic ServerではFileServletという内部サーブレットがデフォルト・サーブレットとして使用されます。

どのサーブレットでも、デフォルト・サーブレットとして登録できます。独自のデフォルト・サーブレットを作成すれば、独自のロジックを使用して、デフォルト・サーブレットに送られるリクエストの処理方法を定義できます。

設定したデフォルト・サーブレットは、FileServletに取って代わります。FileServletはほとんどのファイル(テキスト・ファイル、HTMLファイル、イメージ・ファイルなど)を提供するために使用されるので、デフォルト・サーブレットの設定は注意深く行う必要があります。デフォルト・サーブレットでこれらのファイルを提供するには、その機能をデフォルト・サーブレットに記述する必要があります。

ユーザー定義のデフォルト・サーブレットを設定するには:

  1. 「クライアントによるWebアプリケーションへのアクセス方法の構成」の説明に従い、サーブレットを定義します。

  2. 次のように、servlet-mappingにurl-pattern = "/"を付けて追加します。

    <servlet-mapping> 
    <servlet-name>MyOwnDefaultServlet</servlet-name>
    <url-pattern>/myservlet/*(</url-pattern>
    </servlet-mapping>
    
  3. FileServletで他の拡張子付きのファイルを提供する場合は、次の手順に従います。

    1. サーブレットを定義し、myFileServletなどの<servlet-name>を指定します。

    2. <servlet-class>weblogic.servlet.FileServletと定義します。

    3. <servlet-mapping>要素を使ってファイル拡張子をmyFileServletにマップします(デフォルト・サーブレット用のマッピングに追加して)。たとえば、myFileServletで.gifファイルを提供するには、*.gifmyFileServletにマップします。


      注意:

      docHomeパラメータ(このリリースで非推奨になった)が指定されていない場合、ソース・ファイル名決定時のFileServletには、SERVLET_PATHが含まれています。そのため、FileServletを/dir/*などにマップすることで、特定のディレクトリからのファイルのみを明示的に提供できます。

サーブレット初期化属性

サーブレットの初期化属性は、Webアプリケーションのデプロイメント記述子web.xmlの中のservlet要素のinit-param要素に、param-nameタグとparam-valueタグを使って定義します。web.xmlファイルは、WebアプリケーションのWEB-INFディレクトリにあります。例:

例4-2 web.xml内のサーブレット初期化属性の構成例

<servlet>
  <servlet-name>HelloWorld2</servlet-name> 
  <servlet-class>examples.servlets.HelloWorld2</servlet-class>
  <init-param>
    <param-name>greeting</param-name> 
    <param-value>Welcome</param-value> 
  </init-param>
  <init-param>
    <param-name>person</param-name> 
    <param-value>WebLogic Developer</param-value> 
  </init-param>
</servlet>

単純なHTTPサーブレットの記述

この項では、Hello Worldというメッセージを出力する単純なHTTPサーブレットを記述する手順について説明します。これらの手順を示すサンプル・コード(HelloWorldServlet)の全文がこの項の最後にあります。JDBC、RMI、JMSなど各種のJava EEおよびWebLogic Serverサービスをサーブレットで使用する方法の詳細は、このドキュメントで後述します。

  1. 以下の適切なパッケージおよびクラスをインポートします。

    import javax.servlet.*;
    import javax.servlet.http.*;
    import java.io.*;
    
  2. javax.servlet.http.HttpServletを拡張します。例:

    public class HelloWorldServlet extends HttpServlet{
    
  3. service()メソッドを実装します。

    サーブレットの主要な機能は、WebブラウザからのHTTPリクエストを受け取って、HTTPレスポンスを戻すことです。この処理は、サーブレットのservice()メソッドによって行われます。サービス・メソッドには、出力を生成するレスポンス・オブジェクトと、クライアントからのデータを受け取るリクエスト・オブジェクトがあります。

    ほかにも、doPost()メソッドまたはdoGet()メソッドを実装したサーブレットのサンプルを見たことがあるかもしれません。これらのメソッドは、POSTまたはGETリクエストにのみ応答するものです。service()メソッドを実装しておけば、1つのメソッドですべてのリクエスト・タイプを処理できます。service()メソッドを実装しておけば、1つのメソッドですべてのリクエスト・タイプを処理できます(ただし、service()メソッドを実装した場合、このメソッドの最初でsuper.service()を呼び出さない限り、doPost()メソッドやdoGet()メソッドを実装することはできません)。HTTPサーブレットの仕様には、他のリクエスト・タイプの処理に使用される他のメソッドも記述されていますが、これらのメソッドは全部まとめてserviceメソッドと総称されています。

    サービス・メソッドはすべて、同じパラメータ引数を取ります。HttpServletRequestは、リクエストの情報を提供し、HttpServletResponseはHTTPクライアントに応答する際にサーブレットによって使用されます。サービス・メソッドは次のようになります。

    public void service(HttpServletRequest req,
           HttpServletResponse res) throws IOException
    {
    
  4. 次のように、コンテンツ・タイプを設定します。

    res.setContentType("text/html");
    
  5. 次のように、出力に使用するjava.io.PrintWriterオブジェクトへの参照を取得します。

    PrintWriter out = res.getWriter();
    
  6. 次の例に示すように、PrintWriterオブジェクトに対しprintln()メソッドを使用して、HTMLを生成します。

    out.println("<html><head><title>Hello World!</title></head>");
    out.println("<body><h1>Hello World!</h1></body></html>");
      }
    }
    
  7. サーブレットを次のようにコンパイルします。

    1. 開発環境シェルの設定を、クラス・パスとパスを正しく指定して行います。

    2. サーブレットのJavaソース・コードが格納されているディレクトリから、サーブレットが格納されているWebアプリケーションのWEB-INF/classesディレクトリに、サーブレットをコンパイルします。例:

      javac -d /myWebApplication/WEB-INF/classes myServlet.java
      
  8. WebLogic ServerにホストされるWebアプリケーションの一部として、サーブレットをデプロイします。

  9. ブラウザからサーブレットを呼び出します。

    サーブレットの呼出しに使用するURLは、以下によって決まります。

    • そのサーブレットが含まれるWebアプリケーションの名前。

    • Webアプリケーションのデプロイメント記述子にマップされるサーブレットの名前。リクエスト・パラメータも、サーブレットを呼び出すURLに含まれます。

    一般的には、サーブレットのURLは以下のパターンに従います。

    http://host:port/webApplicationName/mappedServletName?parameter
    

    URLの各要素は次のように定義します。

    • hostは、WebLogic Serverが稼動しているマシンの名前。

    • portは、上記マシンがHTTPリクエストをリスニングしているポート。

    • webApplicationNameは、サーブレットが含まれるWebアプリケーションの名前。

    • parameterは、サーブレットで使用できるブラウザから送信された情報が含まれる、1つまたは複数の名前と値の組み合わせ。

    たとえば、examplesWebAppにデプロイされ、使用中のマシンで稼動しているWebLogic Serverから提供されるHelloWorldServlet (このドキュメントで使われているサンプル)をWebブラウザで呼び出す場合、次のようなURLを入力します。

    http://localhost:7001/examplesWebApp/HelloWorldServlet
    

    URLのhost:port部分は、WebLogic ServerにマップされているDNS名に置き換えることもできます。

高度な機能

上記の手順で、基本的なサーブレットが作成できます。サーブレットでは、さらに高度な機能を使用することもできます。

HelloWorldServletサンプルの全文

この項では、前述の手順で使用したサンプルJavaソース・コードの全文を示します。このサンプルはHTTPリクエストにレスポンスする簡単なサーブレットです。このドキュメントの後半では、このサンプルを拡張することにより、HTTPパラメータ、Cookie、およびセッション・トラッキングの使用方法を説明します。

例4-3 HelloWorldServlet.java

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
public class HelloWorldServlet extends HttpServlet {
  public void service(HttpServletRequest req, 
                      HttpServletResponse res)
       throws IOException
  {
    // Must set the content type first
    res.setContentType("text/html");
    // Now obtain a PrintWriter to insert HTML into
    PrintWriter out = res.getWriter();
    out.println("<html><head><title>" +
                "Hello World!</title></head>");
    out.println("<body><h1>Hello World!</h1></body></html>");
  }
}

WebLogic Server配布キットのsamples/examples/servletsディレクトリに、このソース・コードと、サンプルをコンパイルして実行するための手順説明があります。

サーブレット・コンテナのデバッグ

次の項では、WebLogic Serverサーブレット・コンテナで利用可能なデバッグ・オプションについて説明します。

アクセス・ロギングの無効化

サーブレットのアクセスのロギングは、サーバーのパフォーマンスに関してはコスト高となる場合があります。したがって、アクセス・ロギングが不要な場合は、アクセス・ログ・ファイルへのロギングを無効化することによりパフォーマンスを向上できます。

使用方法

weblogic.xmlcontainer-descriptorで指定可能なaccess-logging-disabledプロパティは、基底のWebアプリケーションのアクセス・ロギングを無効化するかどうか指定する際に使用することができます。

  • このプロパティをtrueに設定すると、アプリケーション・アクセスはロギングされません。

  • このプロパティを指定しないか、falseに設定すると、アプリケーション・アクセスがロギングされます。


    注意:

    disable-access-loggingプロパティは、Webアプリケーション・レベルで機能します。したがって、このプロパティを1つのWebアプリケーションで定義しても、他のWebアプリケーションには影響しません。このプロパティは、開発モードと本番モードの両方で機能します。

次に、アクセス・ロギングを無効化する方法の例を示します。

<?xml version="1.0" encoding="ISO-8859-1"?>
<weblogic-web-app xmlns="http://xmlns.oracle.com/weblogic/weblogic-web-app">
<container-descriptor>
<access-logging-disabled>true</access-logging-disabled>
</container-descriptor>
</weblogic-web-app>

特定セッションのデバッグ

セッション変化の追跡は、特にレプリケートされるセッションに関して、アプリケーションの開発時に大いに役立ちます。HttpSessionAttributeListenerを利用すると、セッションの変化をWebアプリケーション・レベルで追跡できますが、開発者は、特定のリクエスト時にセッション変化を追跡するため、より詳細なデバッグ・オプションを指定する必要があります。

使用方法

wl_debug_sessionリクエスト属性または同じ名前のセッション属性は、現在のセッションにおける属性の変化をロギングすることができます。いずれかのフラグを使用すると、基底のセッションの変更がコンテナによってサーバー・ログに記録されます。

以下のいずれかの方法で特定セッションのデバッグを有効化することができます。

  • 次に示すように、wl_debug_session属性を現在のセッションに設定します。

  • session.setAttribute('wl_debug_session', Boolean.TRUE);

  • wl_debug_session属性を、リクエスト問合せ文字列でインジケータとして使用します。wl_debug_sessionセッション属性は、コンテナにより現在のセッションに追加されます。次の例を参照してください。

    http://localhost/foocontext/foo?wl_debug_session 
    

セッションのデバッグを停止するには、単にwl_debug_session属性を削除します。


注意:

この機能は開発モードでのみ使用できます。デバッグ・メッセージの重大度は、debugレベルです。システム・ロガーがデバッグ・メッセージをサーバー・ログ・ファイルに出力できるように、ロガーの重大度はdebug以下に調整する必要があります。

リクエスト・ハンドルの処理内容の追跡

リクエスト・ハンドルの処理内容の追跡は、アプリケーション開発モードの場合に大いに役立ちます。たとえば、アプリケーションのデバッグ時には多くの情報が必要になります。これには、どのようなリクエストを受信したか、そのリクエストがどのようにディスパッチされたか、どのセッションにバインドされたか、サーブレットがいつ関与したか、どのようなレスポンスが送信されたかなどの情報が含まれます。最後に、ServletExceptionが発生したら、エラーの原因を探るため、その例外を対応するリクエストに結び付ける方法が必要となります。

使用方法

WebLogic Serverサーブレット・コンテナでは、より詳細なログ・メッセージがリクエストの処理時に提供されるため、リクエスト・フロー内の各マイルストンがより詳細に表現されます。DebugHttpロガーを有効化する以外、構成を変更する必要はありません。

このようにすると、リクエスト・ハンドルの処理内容をサーバー・ログで見つけることができます。本番モードに移行したら、DebugHttpロガーを無効化し、サーバーのパフォーマンスを最大化する必要があります。