サーブレット3.0の新機能
では順に、それぞれの機能を追っていきましょう。
サーブレット用アノテーション
サーブレット3.0になって新設されたサーブレット用のアノテーションです。アノテーションとはクラスへ追記する情報のことです。アノテーションもJavaのクラスですが、アノテーション単体では動作するものではありません。実際には、JavaランタイムやJavaコンテナがアノテーションを読み取って動作するようになります。
この内容は本来xmlファイルなどで定義していた設定内容なので、アノテーションで定義した場合はweb.xmlに記載しなくて済むことになりますし、web.xmlにはアプリケーション共通の設定を記述し、アノテーションでクラス独自の振る舞いを定義するといった使い分けも可能になります。
では以下にサーブレット用アノテーションの一覧と概要を記します。
アノテーション名 | 概要 |
@WebServlet | サーブレットの定義。urlPatterns属性でリクエストパスを指定し、asyncSupported属性で非同期処理の可否を指定する |
@WebFilter | サーブレットフィルタ定義。フィルタクラスで宣言する。servletNames={}で複数クラスに対してフィルタ定義を行う |
@WebListener | サーブレットリスナー(※2) |
@WebInitParam | サーブレットごとの初期パラメータ。nameでパラメータ名、valueで値を設定する |
@ServletSecurity | セキュリティ制約。ログイン処理に関連する |
@MultipartConfig | マルチパート定義(アップロード)。新機能。従来のweb.xmlには存在しない |
サーブレットのリクエスト属性、セッション属性などに変化があった場合に自動的に起動するクラスのこと。イベントリスナーと呼ばれる、値の変更や削除を検知して起動するものと一緒。リスナー用に実装するインターフェースが存在する。
以上のアノテーションは、すべてweb.xmlでも記述可能で、また、web.xmlで記述した設定をアノテーションで定義した内容で上書きすることも可能です。ちなみにNetBeansの最新版では自動補完機能でアノテーションも生成可能になっています。
以下に、よく使われる設定である@WebServlet、@WebFilter、@WebListenerの利用方法を挙げていきます。
(1)サーブレット @WebServlet
サーブレットのクラス定義を行います。コード例は先程に紹介したリスト1です。サーブレットを作成するためには、自動生成される name と urlPatterns の内容を定義します。
- name : サーブレットの名称を定義します。アプリケーションで一意の名前にします。
- urlPatterns : 実際に呼び出されるURLを定義します。複数指定できますが、通常は1つ定義します。
サーブレットはWebアプリケーションの出入口として実装する箇所です。後述する非同期処理やアップロードの処理もサーブレットで行います。
(2)サーブレットフィルタ @WebFilter
サーブレットフィルタは、サーブレットが動く前後に処理を挟み込むことができるクラスです。フィルタ対象のクラスを変更することなく処理を後付けで追加できるようになります。@WebFilterアノテーションの登場により、設定ファイルへの変更も不要になります。
なお、NetBeansでは、前処理と後処理を実装しやすいよう、以下のサンプルのように前処理用 doBeforeProcessing と後処理用 doAfterProcessingの2つのメソッドも自動的に生成してくれます。
@WebFilter(filterName="SampleFilter", urlPatterns={"/AuthServlet"}) public class SampleFilter implements Filter { private FilterConfig filterConfig = null; public SampleFilter() { } private void doBeforeProcessing(ServletRequest request, ServletResponse response) throws IOException, ServletException { // フィルタ対象サーブレットの前処理をここに実装 } private void doAfterProcessing(ServletRequest request, ServletResponse response) throws IOException, ServletException { // フィルタ対象サーブレットの後処理をここに実装 } // 自動生成されるdoFilterメソッド。 public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { if (debug) log("SampleFilter:doFilter()"); doBeforeProcessing(request, response); Throwable problem = null; try { chain.doFilter(request, response); } catch(Throwable t) { problem = t; t.printStackTrace(); } doAfterProcessing(request, response); if (problem != null) { if (problem instanceof ServletException) throw (ServletException)problem; if (problem instanceof IOException) throw (IOException)problem; sendProcessingError(problem, response); } …(省略)… }
(3)サーブレットリスナー @WebListener
リスナークラスを作成します。サーブレットリスナーに対しては特に他の属性を設定する必要はなく、アノテーションで定義するだけで設定が完了します。また、NetBeansではリスナー作成時に利用するリスナーの種類を選択できるようになっています。
この図の左下にあるチェックボックスで、利用するリスナーの種類を選択します。
それぞれ、コンテキスト属性、セッション属性、リクエスト属性の追加と変更を別々に定義することができます。次のサンプルではセッション属性の追加と変更を選択して自動生成したコードになります。
@WebListener() public class SampleServletListener implements HttpSessionListener, HttpSessionAttributeListener { public void sessionCreated(HttpSessionEvent se) { // セッション作成時に起動する throw new UnsupportedOperationException("Not supported yet."); } public void sessionDestroyed(HttpSessionEvent se) { // セッションが破棄された時に起動する throw new UnsupportedOperationException("Not supported yet."); } public void attributeAdded(HttpSessionBindingEvent event) { // セッション属性に値を追加した時に起動する throw new UnsupportedOperationException("Not supported yet."); } public void attributeRemoved(HttpSessionBindingEvent event) { // セッション属性から値が削除された時に起動する throw new UnsupportedOperationException("Not supported yet."); } public void attributeReplaced(HttpSessionBindingEvent event) { // セッション属性の値が変更された時に起動する throw new UnsupportedOperationException("Not supported yet."); } }
なお、リスナーの自動生成後に注意しなければならない点は、すべてのメソッドでは UnsupportedOperationException 例外が生成されるようになっていますので、実際に使う場合はこの行を削除し、処理を実装するか、空実装にする必要があります。