非同期リクエストの正式サポート
前回紹介したチャットサンプルのようなプッシュ型アプリケーションや、サーブレットから別プロセスでスレッドを起動でき、またサーブレットから参照することができるExecuteAndWaitデザインの、2つの機能を提供します。この機能で起動したスレッドは1クライアントごとに保持する仕組みを用意することがなく、Javaコンテナがすべて管理するのでサーブレット側は特にスレッド管理を意識する必要がありません。
利用する場合には、@WebServletのアノテーション内で定義することで利用できます。
@WebServlet(asyncSupported=true)
プッシュ型アプリケーションの例は、前回紹介したJava EE 6 環境の構築内で取りあげたサンプルプロジェクトにありますので、コードや設定例などを参考にしてください。
動的なサーブレット設定
サーブレットやサーブレットフィルタを、サーブレットの初期化時に設定することができます。動的な設定方法は以下の2つになります。
- アノテーションによる設定
- ServletContextによる設定
(1.)については先程のアノテーション定義で行ったサーブレットの定義のことですが、さらにより高度な設定を使うライブラリなどに対応できるよう、(2.)で紹介されている、サーブレットコンテキストに対して動的に設定できるようになりました。
従来のサーブレットには動的生成に対応する機能は持ち合わせておらず、しかし昨今提供されるフレームワーク内では対応している機能でした。この機能が正式に仕様として採用されることでサーブレットが柔軟に拡張できるため、実装面での拡張や対応ライブラリの登場が期待されています。
設定ファイルの分割
従来のサーブレット仕様ではweb.xmlは1つしか持てませんでした。これはアプリケーションの設定ファイルが1つしか持てないことになります。また、フレームワークや複数のライブラリにもweb.xmlに対して設定する内容も多く、現在ではフレームワークを複数組み合わせて使うアプリケーションが多いこともあって、web.xmlへの追記は多くなります。当然、アプリケーションの規模が大きくなると、比例してweb.xmlも肥大化します。
設定ファイルの分割は、これらの外部ライブラリの設定を個別に設定できるようにする目的で新設されました。ファイル名はweb-fragment.xmlで設定し、この設定ファイルはフレームワークやライブラリの中に含めるように、jarファイルの中に含めて利用することになります。
以下に利用方法を示します。まずはweb-fragment.xmlを有効化させるため、web.xmlの記述を変更します。
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" metadata-complete="false"> <absolute-ordering> <name>fragment</name> </absolute-ordering> …(中略) </web-app>
ルート要素である <web-app>に対してmetadata-complete="false"を記述することで、web-fragment.xmlが有効になります。<absolute-ordering>で作成するweb-fragment.xmlの名称と順番を定義します。
続いてはweb-fragment.xmlの設定例です。ルート要素がweb-fragmentであること以外はほとんど変更はありません。
<?xml version="1.0″ encoding="UTF-8″?> <web-fragment xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-fragment_3_0.xsd" version="3.0″> <servlet> <servlet-name>OtherServlet</servlet-name> <servlet-class>sample.webapp.OtherServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>OtherServlet</servlet-name> <url-pattern>/other/*</url-pattern> </servlet-mapping> <session-config> <session-timeout>15</session-timeout> </session-config> <welcome-file-list> <welcome-file>index.xhtml</welcome-file> </welcome-file-list> </web-fragment>
これでweb-fragment.xmlの受け入れが可能になります。web.xmlへはweb-fragment.xmlの登録は必要なく、jarファイルの中に、META-INF/web-fragment.xmlの構成で組み込まれていれば問題ありません。