SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Java EE 6 開発入門

サーブレット3.0の新機能

Java EE 6 開発入門(2)

  • X ポスト
  • このエントリーをはてなブックマークに追加

サーブレット3.0の新機能

 では順に、それぞれの機能を追っていきましょう。

サーブレット用アノテーション

 サーブレット3.0になって新設されたサーブレット用のアノテーションです。アノテーションとはクラスへ追記する情報のことです。アノテーションもJavaのクラスですが、アノテーション単体では動作するものではありません。実際には、JavaランタイムやJavaコンテナがアノテーションを読み取って動作するようになります。

 この内容は本来xmlファイルなどで定義していた設定内容なので、アノテーションで定義した場合はweb.xmlに記載しなくて済むことになりますし、web.xmlにはアプリケーション共通の設定を記述し、アノテーションでクラス独自の振る舞いを定義するといった使い分けも可能になります。

 では以下にサーブレット用アノテーションの一覧と概要を記します。

表2 サーブレット3.0のアノテーション
アノテーション名 概要
@WebServlet サーブレットの定義。urlPatterns属性でリクエストパスを指定し、asyncSupported属性で非同期処理の可否を指定する
@WebFilter サーブレットフィルタ定義。フィルタクラスで宣言する。servletNames={}で複数クラスに対してフィルタ定義を行う
@WebListener サーブレットリスナー(※2)
@WebInitParam サーブレットごとの初期パラメータ。nameでパラメータ名、valueで値を設定する
@ServletSecurity セキュリティ制約。ログイン処理に関連する
@MultipartConfig マルチパート定義(アップロード)。新機能。従来のweb.xmlには存在しない
※2

 サーブレットのリクエスト属性、セッション属性などに変化があった場合に自動的に起動するクラスのこと。イベントリスナーと呼ばれる、値の変更や削除を検知して起動するものと一緒。リスナー用に実装するインターフェースが存在する。

 以上のアノテーションは、すべて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つのメソッドも自動的に生成してくれます。

リスト2 NetBeansで自動生成されるサーブレットフィルタ SampleFilter.java
@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ではリスナー作成時に利用するリスナーの種類を選択できるようになっています。

図4 サーブレットリスナー選択画面
図4 サーブレットリスナー選択画面

 この図の左下にあるチェックボックスで、利用するリスナーの種類を選択します。

 それぞれ、コンテキスト属性、セッション属性、リクエスト属性の追加と変更を別々に定義することができます。次のサンプルではセッション属性の追加と変更を選択して自動生成したコードになります。

リスト3 NetBeansで自動生成されるサーブレットリスナ SampleServletFilter.java
@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 例外が生成されるようになっていますので、実際に使う場合はこの行を削除し、処理を実装するか、空実装にする必要があります。

次のページ
非同期リクエストの正式サポート

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
Java EE 6 開発入門連載記事一覧

もっと読む

この記事の著者

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

WINGSプロジェクト 東 浩二(アズマ コウジ)

WINGSプロジェクトについて> 有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS Twitter: @yyamada(公式)、@yyamada/wings(メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/5920 2011/06/01 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング