Servlet API 3.0

JSR315のJava Servlet3.0 Specificationがようやくファイナルリリースされ、昨年末から少しづつ仕様を読んでいます。
仕様書API実装は以下のURLにあります。
http://jcp.org/aboutJava/communityprocess/final/jsr315/index.html
アノテーション対応、非同期処理対応、プログラマブルServlet/Listener/Filterの追加、あとはweb.xmlのフラグメント辺りが特徴的ですね。

まず気になるのは追加分

ServletAPI3.0では、新しいクラスやインターフェース、アノテーションが追加されているのは当然ながら、従来からあるクラス/インターフェースにもメソッドの追加があります。
どれが新しいのかぱっとわからなかったので、上記URLから実装を落として、SDLoaderに入れてコンパイラーに教えてもらいました。


ServletAPI2.5のJarファイルを3.0に差し替えたところ、HttpServletRequest,HttpServletResponse,ServletContextあたりが、メソッド不足のエラーになりました。
不足分=3.0での追加分、ということで、Eclipseを使用して不足分を生成したときにキャプチャを取ったので、順に見ていきます。

ServletRequest/HttpServletRequestの追加分


authenticateやlogin,logoutあたりは、コンテナの認証メカニズム用ですね。
authenticateは引数はHttpServletResponseになっていて、微妙な感じもします。


getPartは、マルチパートの取扱いですね。getPartの戻り値はPartというインターフェースになっています。
これには「getSize()」「getName()」「getInputStream()」などが定義されていて、簡単にマルチパートデータを取得できます。


Asyncとついているのは、非同期用のAPIですね。
非同期については、別途みていきたいと思います。


あと細かいところだと、getServletContext()が追加になってますね。

HttpServletResponseの追加分


あまり変更はないですね。レスポンスヘッダーとステータスコードのgetterの追加だけです。
そろそろsetCompression()とかを追加してもいい気がするんですけどね。

ServletContextの追加分


かなり追加されています。add系はプログラマブルな追加用APIですね。
createFilteやcreateServletというのがありますが、これはJSR299のJava Contexts and Dependency Injection(CDI)に対応するためのメソッドのようです。
このメソッド経由でListenerやServletを生成すると、DI済みのインスタンスが手に入るようです。


もちろんadd系でClassクラスやクラス名を渡しても、それらのインスタンスにDIをしてくれますが、DI済みのインスタンスに何か設定をしてからaddしたい場合は、これを使ってインスタンスを取得してねとJavaDocには書いてあります。

add系のメソッドにはクラス名、文字列、インスタンスのいずれかを渡すだけしかできず、初期パラメータやパスなどの定義は渡せません。
これらは、add系のメソッドを呼び出した戻り値として取得できる、Registrationインターフェースのインスタンスに対してセットします。
例えばaddServletを呼ぶと、戻り値としてServletRegistration.Dynamicが返ってきます。
このインターフェースには「addMapping()」や「setInitParameter()」などが定義されており、これらを使って定義を行います。


declareRoles()は、ロールの定義ですね。


SessionTracking系として、getDefaultSessionTrackingModes(),getEffectiveSessionTrackingModes(),setSessionTrackingModes()が追加されています。
SessionTrackingModeは「COOKIE」「SSL」「URL」の3種類があり、これはSessionTrackingModeというEnumに定義されています。
SessionTrackingModeを途中でセットするケースがちょっと分からなので、使いどころが難しいと思います。


getEffectiveMajorVersion()とgetEffectiveMinorVersion()は、それぞれServletAPIのメジャーバージョンとマイナーバージョンを返します。
以前よりあるgetMajorVersion()とgetMinorVersion()と何が違うのかと言うと、前者がアプリケーションが動作前提としているServletAPIのバージョン(つまりweb.xmlがどのバージョンで書かれているか)を返すのに対して、後者はServletコンテナ自体がサポートしているServletAPIのバージョンを返す、ということのようです。
フレームワークを作るときには使える、のかもしれません。


getJspConfigDescriptor()は、web.xmlの要素の取得です。どうせならgetWebXml()とか潔いのをつけても良かった気がします。


getFilterRegistration()とgetServletRegistration()は、FilterとServletの登録状況を取得できるメソッドなっています。
web.xmlの定義と、プログラマブルに追加したFilter/Servletがどういうマッピングになっているかを取得できます。
起動時にマッピングをログに出すとか、そういう用途には使えそうです。


getSessionCookieConfig()は、セッションキープに利用するCookieの細かい情報(クッキー名とか、パスとか)を取得出来ます。


setInitParameter()は、初期パラメータの追加メソッドです。このメソッドは、戻り値がbooleanになっており、セットに失敗するとfalseが返って来ます。
「既に同名のパラメータがセットしてあった場合は失敗する」とJavaDocに書いてあるので、どうやらパラメータの上書きは出来ないようです。

所感

やっと仕様もFixし、順次3.0対応のコンテナが出てくると思います。今回は特にアノテーションの処理が増えているので、コンテナの作者は皆さん大変だと思います。
SDLoaderも、まあぼちぼちやります。少なくともここに出ているメソッドぐらいは対応したいですね。