初期化パラメータを使用する場合でも、従来なら以下のように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についても従来は、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も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ファイルを配置するだけで実行できてしまいます。
上記で紹介したアノテーション以外にもいろいろと用意されています。
このように、Servlet 3.0では「Annotation based configuration」の導入によって、今までweb.xmlに定義していたServletやFilterなどの設定をアノテーションで定義できるようになり、EoDがぐっと向上しました。
次は、Pluggability and Extendibilityを紹介します。Servlet 3.0では、Pluggability and Extendibilityとして以下の3つの仕様を新しく定義しました。
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アプリケーションを構築します。
各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.