| Oracle® Fusion Middleware Oracle WebLogic Server Webアプリケーション、サーブレット、JSPの開発 11g リリース1 (10.3.6) B60993-05 |
|
![]() 前 |
![]() 次 |
次の項では、サーブレットを作成および構成する方法について説明します。
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」)。
|
http://host:port/mywebapp/seedlist/pear.abc |
kiwi 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ファイル、イメージ・ファイルなど)を提供するために使用されるので、デフォルト・サーブレットの設定は注意深く行う必要があります。デフォルト・サーブレットでこれらのファイルを提供するには、その機能をデフォルト・サーブレットに記述する必要があります。
ユーザー定義のデフォルト・サーブレットを設定するには:
「クライアントによるWebアプリケーションへのアクセス方法の構成」の説明に従い、サーブレットを定義します。
次のように、servlet-mappingにurl-pattern = "/"を付けて追加します。
<servlet-mapping> <servlet-name>MyOwnDefaultServlet</servlet-name> <url-pattern>/myservlet/*(</url-pattern> </servlet-mapping>
FileServletで他の拡張子付きのファイルを提供する場合は、次の手順に従います。
サーブレットを定義し、myFileServletなどの<servlet-name>を指定します。
<servlet-class>をweblogic.servlet.FileServletと定義します。
<servlet-mapping>要素を使ってファイル拡張子をmyFileServletにマップします(デフォルト・サーブレット用のマッピングに追加して)。たとえば、myFileServletで.gifファイルを提供するには、*.gifをmyFileServletにマップします。
|
注意:
|
サーブレットの初期化属性は、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>
この項では、Hello Worldというメッセージを出力する単純なHTTPサーブレットを記述する手順について説明します。これらの手順を示すサンプル・コード(HelloWorldServlet)の全文がこの項の最後にあります。JDBC、RMI、JMSなど各種のJava EEおよびWebLogic Serverサービスをサーブレットで使用する方法の詳細は、このドキュメントで後述します。
以下の適切なパッケージおよびクラスをインポートします。
import javax.servlet.*; import javax.servlet.http.*; import java.io.*;
javax.servlet.http.HttpServletを拡張します。例:
public class HelloWorldServlet extends HttpServlet{
service()メソッドを実装します。
サーブレットの主要な機能は、WebブラウザからのHTTPリクエストを受け取って、HTTPレスポンスを戻すことです。この処理は、サーブレットのservice()メソッドによって行われます。サービス・メソッドには、出力を生成するレスポンス・オブジェクトと、クライアントからのデータを受け取るリクエスト・オブジェクトがあります。
ほかにも、doPost()メソッドまたはdoGet()メソッドを実装したサーブレットのサンプルを見たことがあるかもしれません。これらのメソッドは、POSTまたはGETリクエストにのみ応答するものです。service()メソッドを実装しておけば、1つのメソッドですべてのリクエスト・タイプを処理できます。(ただし、service()メソッドを実装する場合、service()メソッドの最初でsuper.service()を呼び出さない限り、doPost()メソッドまたはdoGet()メソッドを実装することはできません。)HTTPサーブレットの仕様には、他のリクエスト・タイプの処理に使用される他のメソッドも記述されていますが、これらのメソッドは全部まとめてserviceメソッドと総称されています。
サービス・メソッドはすべて、同じパラメータ引数を取ります。HttpServletRequestは、リクエストの情報を提供し、HttpServletResponseはHTTPクライアントに応答する際にサーブレットによって使用されます。サービス・メソッドは次のようになります。
public void service(HttpServletRequest req,
HttpServletResponse res) throws IOException
{
次のように、コンテンツ・タイプを設定します。
res.setContentType("text/html");
次のように、出力に使用するjava.io.PrintWriterオブジェクトへの参照を取得します。
PrintWriter out = res.getWriter();
次の例に示すように、PrintWriterオブジェクトに対しprintln()メソッドを使用して、HTMLを生成します。
out.println("<html><head><title>Hello World!</title></head>");
out.println("<body><h1>Hello World!</h1></body></html>");
}
}
サーブレットを次のようにコンパイルします。
開発環境シェルの設定を、クラスパスとパスを正しく指定して行います。
サーブレットのJavaソース・コードが格納されているディレクトリから、サーブレットが格納されているWebアプリケーションのWEB-INF/classesディレクトリに、サーブレットをコンパイルします。例:
javac -d /myWebApplication/WEB-INF/classes myServlet.java
WebLogic ServerにホストされるWebアプリケーションの一部として、サーブレットをデプロイします。
ブラウザからサーブレットを呼び出します。
サーブレットの呼出しに使用する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名に置き換えることもできます。
上記の手順で、基本的なサーブレットが作成できます。サーブレットでは、さらに高度な機能を使用することもできます。
HTML形式のデータ処理 - HTTPサーブレットでは、ブラウザ・クライアントからのHTMLフォームによるデータを受け取り、処理できます。
アプリケーションの設計 - HTTPサーブレットでは、様々な方法でアプリケーションを設計できます。サーブレットの記述に関する詳細は、次の項を参照してください。
サーブレットの初期化 - サーブレットの初期化時に、データを初期化する、初期化引数を受け取るなどのアクションを実行する必要がある場合は、init()メソッドをオーバーライドできます。
サーブレットにおけるセッションおよび永続性の使用 - セッションと永続性により、HTTPセッション中、およびHTTPセッション間でユーザーを追跡できます。セッション管理には、Cookieの使用も含まれます。詳細は、次の項を参照してください。
サーブレットにおけるWebLogicサービスの使用 - WebLogic Serverが提供する様々なサービスやAPIをWebアプリケーションで使用できます。サービスには、Java Database Connectivity (JDBC)ドライバ、JDBCデータベース接続プール、Java Messaging Service (JMS)、Enterprise JavaBeans (EJB)、Remote Method Invocation (RMI)などがあります。詳細は、次の項を参照してください。
この項では、前述の手順で使用したサンプル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.xmlのcontainer-descriptorで指定可能なaccess-logging-disabledプロパティは、基底のWebアプリケーションのアクセス・ロギングを無効化するかどうか指定する際に使用することができます。
このプロパティをtrueに設定すると、アプリケーション・アクセスはロギングされません。
このプロパティを指定しないか、falseに設定すると、アプリケーション・アクセスがロギングされます。
|
注意:
|
次に、アクセス・ロギングを無効化する方法の例を示します。
<?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属性を削除します。
|
注意: この機能は開発モードでのみ使用できます。デバッグ・メッセージの重大度は、 |