Tomcat 7も対応したServlet 3.0の6つの主な変更点Tomcat 7の新機能で何ができるようになるのか?(1)(2/3 ページ)

» 2011年04月12日 00時00分 公開
[藤野圭一NTT OSSセンタ]

初期化パラメータを使用する場合は「@WebInitParam」

 初期化パラメータを使用する場合でも、従来なら以下のようにweb.xmlのServletマッピングに設定を追加していました。

<servlet>
<servlet-name>WebServletTest</servlet-name>
<servlet-class>test.annotation.WebServletTest</servlet-class>
<init-param>
<param-name>name</param-name>
<param-value>HELLO!!</param-value>
</init-param>
</servlet>

<servlet-mapping>
<servlet-name>WebServletTest</servlet-name>
<url-pattern>/test</url-pattern>
</servlet-mapping>

 これが、「@WebInitParam」というアノテーションを追加するだけでOKになります。

@WebServlet(name="WebServletTest",urlPatterns={"/test"},
        initParams={@WebInitParam(name="name",value="HELLO!!")})
public class WebServletTest extends HttpServlet {
 
    private static final long serialVersionUID = 1L;
 
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        resp.getWriter().print(getInitParameter("name"));
        
    }
}

Filterを使用する場合は「@WebFilter」

 Filterについても従来は、web.xmlにマッピングしていました。

<filter>
<filter-name>WebFilterTest</filter-name>
<filter-class>test.annotation.WebFilterTest</filter-class>
</filter>

<filter-mapping>
<filter-name>WebFilterTest</filter-name>
<url-pattern>/test</url-pattern>
</filter-mapping>

 これには、「@WebFilter」を利用するだけでOKです。

@WebFilter(filterName="WebFilterTest", urlPatterns="/test")
public class WebFilterTest implements Filter {
 
    @Override
    public void destroy() {
        //TODO
    }
 
    @Override
    public void doFilter(ServletRequest req, ServletResponse res,
            FilterChain chain) throws IOException, ServletException {
        // TODO
        chain.doFilter(req, res);
        // TODO
    }
 
    @Override
    public void init(FilterConfig config) throws ServletException {
        //TODO
    }
}

Listenerを使用する場合は「@WebListener」

 Listenerもweb.xmlにマッピングしなくても、@WebListenerを以下のServlet仕様で定義されたListenerのインターフェイスを実装したクラスにアノテーションするだけで利用できます。

javax.servlet.http.HttpSessionAttributeListener 
javax.servlet.http.HttpSessionListener 
javax.servlet.ServletContextAttributeListener 
javax.servlet.ServletContextListener 
javax.servlet.ServletRequestAttributeListener 
javax.servlet.ServletRequestListener 

@WebListener()
public class TestServletContextListener implements ServletContextListener {
 
    @Override
    public void contextDestroyed(ServletContextEvent event) {
        // TODO
    }
 
    @Override
    public void contextInitialized(ServletContextEvent event) {
        // TODO
    }
}

 つまり、簡単なアプリケーションならweb.xmlなしでjarファイルやclassファイルを配置するだけで実行できてしまいます。

他にも使えるアノテーション

 上記で紹介したアノテーション以外にもいろいろと用意されています。

  • @MultipartConfig
    ファイルアップロードを使用する際のアノテーション
  • @ServletSecurity
    セキュリティ制約を設けるアノテーション
  • @HandlesTypes
    ServletContainerInitializerで使用するアノテーション

 このように、Servlet 3.0では「Annotation based configuration」の導入によって、今までweb.xmlに定義していたServletやFilterなどの設定をアノテーションで定義できるようになり、EoDがぐっと向上しました。

「モジュール化と拡張性」における3つの仕様

 次は、Pluggability and Extendibilityを紹介します。Servlet 3.0では、Pluggability and Extendibilityとして以下の3つの仕様を新しく定義しました。

  1. Web-Fragmentサポート
  2. プログラムによるWebアプリケーションの拡張
  3. JSPのモジュール化

【1】Web-Fragmentでweb.xmlをモジュール化

 Webアプリケーション開発では、SpringやStrutsのようなWebアプリケーションフレームワークを利用することが多いと思います。これらフレームワークを使用するために、開発者は、アプリケーションのweb.xmlにServletやFilter、Listenerなどのようなフレームワーク特有の設定を行う必要があります。

 このため、web.xmlはファイルの肥大化やアプリケーション特有の設定とフレームワーク特有の設定が混ざり合った煩雑なWeb設定になってしまいます。

 利用するフレームワークが増えていくと、事態はより深刻になってしまいます。Servlet 3.0では、上記のような問題を解決するため、「web-fragment」という新しい概念を導入しました。

 web-fragmentは、web.xmlをモジュール化して、フレームワークや外部モジュールが自らのjarファイルの中にそれを含めることを可能にします。モジュール化されたweb.xmlは「web-fragment.xml」と呼ばれ、Servletコンテナはすべてのweb-fragment.xmlをマージしてWebアプリケーションを構築します。

図2 Web-Fragment 図2 Web-Fragment

 各JAR内のweb-fragment.xmlは、デプロイ中にTomcatによって処理され、最終的にWEB-INF内のweb.xmlとマージして1つのWebアプリケーションとして構築します。

 また、web-fragment.xmlを読み込む順番を絶対的順序と相対的順序の2種類の方法で提供しているので、フレームワーク間でServletやFilterが特別な順番で呼び出される必要がある場合にも対応できます。

 JARごとにweb-fragment.xmlが記述できるようになったので、フレームワークやリソースをモジュール化して、JARファイルをアプリケーションの「WEB-INF/lib」フォルダに単に配置するだけで、自動的にWeb設定できるようになります。

 また、フレームワーク特有の設定などをアプリケーションのweb.xmlから分離できるため、本来のアプリケーションの設定以外によるweb.xmlの肥大化を抑制でき、非常にすっきりします。

 次ページで、残りの2つを説明します。

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。