はじめに
本稿では、Java Enterprise Edition 6の基本となるサーブレットの基本、新しくなったサーブレット3.0の仕様を紹介します。
対象読者
- Java EE 6開発に興味ある方
- これからJavaのWebアプリケーション開発をはじめる方
必要な環境
動作環境は以下のとおりです。
- Java SE 6
- NetBeans 6.9.1
サーブレット(Servlet)とは
サーブレットとは、JavaでWeb用のHTMLやテキストを出力する機能のことです。サーブレットはGlassFish、Tomcat、JBossなどのサーブレットコンテナで動作し、動的にHTMLを出力できます。
サーブレットそのものはJavaで記述するクラスの一つであり、利用するにはサーブレット用のインターフェースを実装して、さらに設定を記述して使うことになります。サーブレットを作るまでにはいくつかお作法が必要になってしまいますが、NetBeansやEclipseなどの統合開発環境では、自動的に必要なクラスや設定を出力してくれる機能を備えており、開発効率を高めてくれます。
サーブレット 3.0とは
サーブレットは10年以上前から実用化されている仕様ですが、オープンソースの拡張ライブラリ、フレームワークの登場により、より一層の共通化がなされ、それに合わせてサーブレット仕様も拡張を繰り返してきました。そして最新仕様であるサーブレット3.0では、下位互換を保ちつつ、既存のJavaフレームワークにあった仕様を改良して取り込んだものも含めながら、時代に合わせた仕様へと大幅に改良されました。
ちなみに、サーブレット3.0はJava EE 6仕様の一つとして扱われており、Java EE 6の提唱する「仕様の軽量化」「拡張性の重視」「開発のしやすさ」の中でも「拡張性の重視」「開発のしやすさ」をサポートします。
ではサーブレット3.0で追加された新機能を紹介していきます。新機能の一覧を以下に示します。
機能名 | 概要 |
サーブレット用アノテーション | 設定ファイル(web.xml)で設定していた内容をクラスへ直接記載可能。設定ファイルとアノテーションの併用も可能にしている。サーブレット単位で設定する内容はすべてアノテーションで記載可能。 |
非同期リクエストの正式サポート | プッシュ型アプリケーションへの対応、非同期プロセスを別スレッドで起動、監視する機能を提供。 |
動的なサーブレット設定のサポート | サーブレットやサーブレットフィルタ(※1)を、初期化時にも設定可能。 |
設定ファイルの分割 | web.xmlの分割が可能。設定を分割することにより設定ファイルの可読性を上げることと、ライブラリやフレームワークの読み込み順序や定義を分割可能。 |
認証処理の実装 | サーブレットのみで認証機能、ログイン、ログアウト機能を提供 |
JARファイルからの静的コンテンツ読み込み | JARで圧縮されたライブラリ内にHTMLやJSPを定義することが可能 |
ファイルアップロード | アップロード機能の正式サポート |
サーブレットの前後に動作するクラス。フィルタ自身もサーブレットの一つであり、ログインチェック処理やリクエストパラメータの事前加工処理など、共通処理を組み込まれることが行うことが多い。
NetBeansを使ったサーブレットの作成
NetBeansを使って、サーブレットを1つ作成してみましょう。NetBeansはサーブレット3.0用の設定やサーブレットを作成する機能も提供しており、とても手軽に作ることができます。
まずはサーブレットを作成したいプロジェクトを選択し、[新規]→[サーブレット]を選択します。
次にサーブレットの名称とパッケージを決めます。もし、まだ存在していないパッケージを指定した場合は自動的に作成されます。
最後に設定ファイルへの出力と、実際にブラウザからリクエストされるURLのパスを指定します。従来のサーブレットのように、web.xmlへ設定を出力する場合は、[配備記述子(web.xml)に情報を追加]のチェックボックスにチェックをします。サーブレット3.0ではweb.xmlへの定義は必須ではありませんので、選択式になっています。web.xmlに定義しない場合、@WebServletアノテーションを使った定義が自動的に生成されます。
以上でサーブレットの雛形が生成されます。次に示すコードは、NetBeansによって自動生成されるサーブレットです。動作に必要なHttpServletクラスを継承し、実際に行う処理を記述するprocessRequestメソッドが準備されます。
@WebServlet(name="SampleServlet", urlPatterns={"/SampleServlet"}) public class SampleServlet extends HttpServlet { protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { …(中略)… } }
この雛形は先ほどにもあるように、処理内容が記述されていない、空のメソッドを複数含んだクラスになります。あとは実装したい処理に合わせて、機能をメソッドに実装するだけで動作しますし、新しく追加されたアノテーションでサーブレットの振る舞いを追加設定することも可能です。