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の
getFilterRegistration()とgetServletRegistration()は、FilterとServletの登録状況を取得できるメソッドなっています。
web.xmlの定義と、プログラマブルに追加したFilter/Servletがどういうマッピングになっているかを取得できます。
起動時にマッピングをログに出すとか、そういう用途には使えそうです。
getSessionCookieConfig()は、セッションキープに利用するCookieの細かい情報(クッキー名とか、パスとか)を取得出来ます。
setInitParameter()は、初期パラメータの追加メソッドです。このメソッドは、戻り値がbooleanになっており、セットに失敗するとfalseが返って来ます。
「既に同名のパラメータがセットしてあった場合は失敗する」とJavaDocに書いてあるので、どうやらパラメータの上書きは出来ないようです。