5月8日(3日目)の午後に開催されたセッション「Java Servlet 3.0 API: What's new and exciting(Rajiv Mordani, Sun Microsystems)」の報告を行う。
Java Servlet 3.0は、JSR-315でEarly Draftを公開し、6月4日までフィードバックを受け付けている。
3.0へのバージョンアップで、大きく改変、追加されるのは次の4点である。
- プラグインの容易性(Pluggability)
- 開発の容易性(Ease of development)
- 非同期Servletのサポート(Async servlet support)
- セキュリティのエンハンス(Security enhancements)
それぞれについて、以降説明する。
プラグインの容易性(Pluggability)
プラグインの容易性としては、次の項目が説明された。
web.xmlのモジュール化(Modularization of web.xml)
web.xmlは現在1つしかなく、そのためフレームワーク毎の情報などを記述する事で、複雑化する。しかし3.0では、フレームワーク毎にweb.xmlを定義し、jarファイルのMETA-INFディレクトリに含める事ができる。その分割されたweb.xmlは、web-fragmentタグを持ち、servlets、filter、listenerタグが含まれる。
コードの例)
<web-fragment> <servlet> <servlet-name>welcome</servlet-name> <servlet-class> WelcomeServlet </servlet-class> </servlet> <servlet-mapping> <servlet-name>welcome</servlet-name> <url-pattern>/Welcome</url-pattern> </servlet-mapping> ... </web-fragment>
ServletContextにコンフィギュレーションメソッド(Configuration methods in ServletContext)
ServletContextにServletとFilterの宣言とマッピングを定義するメソッドが追加される。これらのメソッドは、Contextの初期化時にのみ実行する事ができる。これによりアプリケーションは、実行時に必要に応じてServletをロードする事ができる。
コードの例)
@ServletContextListener
public class MyListener {
public void contextInitialized(ServletContextEvent sce) {
ServletContext sc = sce.getServletContext();
sc.addServlet("myServlet",
"Sample servlet",
"foo.bar.MyServlet",
null, -1);
sc.addServletMapping("myServlet",
new String[]{"/urlpattern/*"});
}
}
開発の容易性(Ease of Development)
開発の容易性としては、アノテーションの利用が説明された。
まず、Servletは、@Servletにより定義できる。これにより大幅に記述量を減らす事ができる。また、@GET、@PUTを指定する事で、任意のメソッドをhttpのGETやPUT時のメソッドに指定する事ができる。
コードの例)
@Servlet(urlMapping={"/foo", "/bar"},name="MyServlet")
public class SampleUsingAnnotationAttributes {
@GET
public void handleGet(HttpServletRequest req,HttpServletResponse res){
}
}
FilterとFilterのマッピングについても、@ServletFilterと@FilterMappingのアノテーションで宣言する事ができる。
コードの例)
@ServletFilter
@FilterMapping(urlPattern="/foo")
public class SampleFilter {
public void doFilter(HttpServletRequest req,HttpServletResponse res){
}
}
Context Listnerについても、@ServletContextListnerアノテーションで宣言する事ができる。この例は前述のコンフィギュレーションメソッドの例を参照。
非同期Servletのサポート(Async servlet support)
非同期Servletは、Cometスタイルのアプリケーションや、非同期Webプロキシー、非同期Webサービスでの利用が想定されており、requestのsuspendやresumeを可能にする。
具体的には、次の通りである。
ServletRequestへのメソッドの追加
- void suspend(long timeOutMs);
- void resume();
- void complete();
- boolean isSuspended();
- boolean isResumed();
- boolean isTimeout();
RequestListnerへのイベント発生時に実行されるメソッドの追加
- void requestSuspended(ServletRequestEvent rre);
- void requestResumed(ServletRequestEvent rre);
- void requestCompleted(ServletRequestEvent rre);
ServletResponseへのメソッドの追加
- void disable();
- void isDisabled();
- void enable();
セキュリティのエンハンス(Security enhancements)
セキュリティとして、ログイン、ログアウトを可能にするため、loginとlogoutのメソッドを次のクラスに追加する。
- HttpServletRequest
- HttpServletRequestWrapper
- HttpSession (logout only)
しかし、これについては、まだエキスパートグループで議論されている状況である。
その他
HttpOnlyCookieのサポート
HttpOnlyCookieとは、クライアントサイドスクリプティングからのcookieへのアクセスを防ぎ、また、クロスサイトスクリプティング攻撃を防ぐものである。
session tracking cookieの設定を可能
session tracking cookieの設定を可能にする。また、多数のsession trackingのサポートも行う。
検討が保留中の項目
- File upload
- Container wide init-params
- Clarifications from previous releases
- Enablement of JAX-RS / JSF 2.0 (if any changes needed)
以上が、Java Servlet 3.0の変更、追加内容である。
これからのステータスは、次の通りである。
- 現在はEarly Draftのレビュー期間(6月4日まで)
- 今年の夏にはPublic Reviewを行う予定。
- Final DraftとFinal ReleaseはJavaEE 6と合わせて行う。
- GlassFishにて一部の実装については早期に利用できる。
以上がセッションの報告であるが、セッションの最後のSummaryにて、
「Lot of exciting things happening in the Java Servlet 3.0 API(Java Servlet 3.0 APIで多くのエキサイティングな事が起こる。)」
とあった通り、エキサイティングな内容でバージョンアップが期待される。