【コラム】

Java API、使ってますか?

49 やっぱり基本はServlet - Servlet 3.0のEarly Draftを読む

49/60

JSR 315: Java Servlet 3.0 Specification

現在、Javaで構築するWebアプリケーションのためにはさまざまなフレームワークが用意されているが、基本となるのはServletにほかならない。次期Java EEプラットフォームとなるJava EE 6ではServlet仕様の大幅なアップデートが予定されており、その仕様がJSR 315として策定されている。本コラムでも第17回でその概要を紹介しているが、去る5月5日にEarly Draftが公開されたので、さっそく目を通してみたいと思う。

アノテーションの追加

Servlet 3.0ではEoDをさらに促進するため、ServletやFilterなどを定義するためのアノテーションが用意される予定となっている。これによってコードの記述量の削減やweb.xmlなどに対する設定の簡略化を実現する。具体的には次のようなアノテーションが挙げられている。

  • @Servlet……Servletを定義する
  • @ServletFilter……ServletFilterを定義する
  • @FilterMapping……Filterのマッピングを指定する
  • @InitParam……ServletやFilerにおける初期パラメータを指定する
  • @ServletContextListener……ContextListenerを定義する

また、上記以外にJAX-RS(The Java API for RESTful Web Services)に用意されるHTTPメソッドのためのアノテーション(@HttpMethod/@GET/@POST/@PUT/@HEAD/@DELETE)も利用可能となる。

たとえば@ServletはServlerのコンポーネントとなるクラスに対して指定し、属性によってマッピングや初期パラメータなどのメタデータを定義することが可能になる。リスト1は@Servletを用いたServlet定義の例。urlMapping属性は必須で、その他はオプションとのこと。

リスト1 アノテーションを用いたServletの定義

@Servlet(urlMapping="/foo")
public class SimpleServlet {
    //...
}

リスト2のようにメソッドに@GETや@POSTなどを指定すれば、GETやPOSTを処理するためのメソッドとすることができる。

リスト2 HTTPメソッドを指定

@Servlet(urlMappings={"/foo", "/bar"})
public class SampleUsingAnnotationAttributes {
    @GET
    public void handleGet(HttpServletRequest req, HttpServletResponse res) {
    }
}

なお、従来通り上記の設定をweb.xmlに記述した場合には、web.xmlの内容の方が優先されるとのこと。また3.0からはweb.xmlは必須ではなくなり、JSPや静的リソースしか利用しない場合には省略できるようになるそうだ。

プラガビリティの強化

Webフレームワークを使用する場合、従来だとweb.xmlに指定されたFilterなどの設定を記述しなければならなかった。Servlet 3.0では大元のweb.xmlに対する追加の設定を、各フレームワークのJARファイルに含められるようにすることで、フレームワークの柔軟な追加/削除を実現するという。具体的には各JARファイルにMETA-INF/web.xmlを用意し、ここにそれぞれの設定を記述する。

記述方法は通常のweb.xmlと同様だが、リスト3全体を<web-fragment>というタグで囲む。

リスト3 META-INF/web.xmlの記述例

<web-fragment>
    <servlet>
        <servlet-name>welcome</servlet-name>
        <servlet-class>WelcomeServlet</servlet-class>
    </servlet>
    <listener>
        <listener-class>RequestListener</listener-class>
    </listener>
</web-fragment>

また、ServletContextにweb.xmlにアクセスするためのメソッドが追加されるとのことで、これを使えば初期化時にフレームワーク側から設定を追加することができるようになる。用意されるメソッドはServletとそのマッピングを追加するaddServlet()およびaddServletMapping()、Filterとそのマッピングを追加するaddFilter()、addFilterMapping()の4種類。例えば任意のServletをロードしたい場合には、前述の@ServletContextListenerを利用してリスト4のようにContextListenerを定義する。

リスト4 初期化時にServletをロードする

@ServletContextListener
public class MyContextListener {
    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/*" });
    }
}

非同期サーブレット

Servler 3.0ではリクエストのサスペンドやレジューム、レスポンスの無効化を可能にすることで、Cometなど非同期のサービス呼び出しをサポートするとのこと。具体的には、ServletRequestおよびServletResponseに以下のようなメソッドが追加される。ただし、現時点ではレジューム時にどうやって別スレッドへ処理をディスパッチするかなどについては明記されてはいない。

ServletRequestに追加されるメソッド

void suspend() コンテナの指定するタイムアウト時間でリクエストの処理をサスペンドする
void suspend(long timeOutMs) 指定されたタイムアウト時間でリクエストの処理をサスペンドする
void resume() サスペンドされているリクエストを再開する
void complete() サスペンドされたリクエストの処理を完了させる
boolean isSuspended() リクエストがサスペンドされ、再開される前かどうかを返す
boolean isResumed() サスペンドされたリクエストが再開されたかどうか返す
boolean isTimeout() サスペンドがタイムアウトを迎えたかどうかを返す
boolean isInitial() リクエストが一度も再ディスパッチされていない場合にtrueを返す

ServletResponseに追加されるメソッド

void disable() レスポンスを無効にする
void enable() レスポンスを有効にする
boolean isDisabled() レスポンスが無効にされたかどうかを返す

また、ServletRequestListenerに以下のメソッドが追加され、リクエストがサスペンドされたり再開されたりした場合にイベントを受け取ることができるようになる。

  • void requestSuspended(ServletRequestEvent rre)
  • void requestResumed(ServletRequestEvent rre)
  • void requestCompleted(ServletRequestEvent rre)

その他の拡張

その他、次のような機能が追加される予定だ。

HTTP-Only Cookieのサポート

HTTP-Only CookieはクライアントサイドのスクリプトからアクセスできないようなCookieのことで、クロスサイトスクリプティング攻撃を防ぐ有効な手段になるとのこと。

Session Tracking Cookieが設定可能に

Session Tracking Cookieを利用すればCookieによるセッショントラッキングが可能となるが、従来はサーバ依存の設定項目だった。3.0からはこれが標準でサポートされるようになる。

セキュリティ関連

ログインおよびログアウトの機構を実現するために、HttpServletRequestやHttpSessionにlogin()/logout()メソッドを追加する予定とのこと。ただし、この部分の詳細は現在もExpertGroupにおいて調整中で、現時点のドラフトには含まれていない。

また、先日行われたJavaOneの際のテクニカルセッションでは、上記以外に検討中の内容として次のようなものが挙げられていた。

  • ファイルのアップロード機構
  • コンテナ共通の初期パラメータの設定
  • JAX-RSJSF 2.0との互換性

現在のEarly Draftは6月4日までの間にレビューが行われ、その結果を反映させて今年の夏ごろにPublic Reviewを行うとのことだ。

49/60

インデックス

連載目次
第60回 どうなる? 今後のJavaプラットフォーム(Java SE編)
第59回 どうなる? 今後のJavaプラットフォーム(Java EE編)
第58回 Java SE 7の要注目機能"クロージャ"はどうなるのか その6
第57回 Java SE 7の要注目機能"クロージャ"はどうなるのか その5
第56回 Java SE 7の要注目機能"クロージャ"はどうなるのか その4
第55回 Java SE 7の要注目機能"クロージャ"はどうなるのか その3
第54回 Java SE 7の要注目機能"クロージャ"はどうなるのか その2
第53回 Java SE 7の要注目機能"クロージャ"はどうなるのか
第52回 Early Draftが公開されたJSF 2.0
第51回 EJBから独立したJava Persistence 2.0
第50回 モバイルJavaの新しい潮流となるか - MSA 2.0のドラフト公開
第49回 やっぱり基本はServlet - Servlet 3.0のEarly Draftを読む
第48回 JOGLで3Dプログラミング その4
第47回 JOGLで3Dプログラミング その3
第46回 JOGLで3Dプログラミング その2
第45回 JOGLで3Dプログラミング
第44回 JARファイルを効率的にネットワーク転送するためのPack200形式
第43回 Early Draftで把握するEJB 3.1の新機能
第42回 次世代の携帯端末向けJava仕様"MIDP 3.0"はどうなるか その2
第41回 次世代の携帯端末向けJava仕様"MIDP 3.0"はどうなるか その1
第40回 リソースアダプタによる接続の仕組み
第39回 JCAを利用したシステム間接続
第38回 Java EEと外部システムの接続性を支えるJCAがバージョンアップ
第37回 Javaのモジュラリティ強化を担う"スーパーパッケージ"とは
第36回 JSR 308対応のコンパイラを試す
第35回 公開されたJSR 308のEarly Draftを検証する
第34回 スクリプト言語とJavaを結びつけるJSR 223
第33回 Java EE環境に統一されたコンポーネントモデルを提供するJSR 299 その2
第32回 Java EE環境に統一されたコンポーネントモデルを提供するJSR 299 その1
第31回 Javaの文法がそのまま使えるスクリプト言語"BeanShell"
第30回 Javaアプリケーションにオブジェクトのキャッシュ機構を提供するJCache API
第29回 Javaアプリケーションからのリソース管理を可能にするJSR 284
第28回 XMLデータソースへの問い合わせはJSR 225で
第27回 Portlet Specification 2.0をもっと手軽に利用する
第26回 次期Javaポートレット仕様となるJSR 286
第25回 JSFとポートレットをつなげるJSR 301
第24回 Webサービス向けのポートレット仕様「WSRP」
第23回 高い相互運用性を実現するポートレットAPI - JSR 168
第22回 Java EE環境でタスクのスケジューリングを可能にするJSR 236
第21回 Java EE環境でのスレッドプログラミングを可能にするJSR 237
第20回 音声認識/合成のためのAPI - Java Speech APIとJSR 113
第19回 JSR 291でJavaプラットフォームにダイナミックコンポーネントモデルを導入
第18回 JAX-RSで簡単RESTful - JSR 311
第17回 待望のServlet 3.0がJSRに登場 - JSR 315
第16回 アノテーションを使ってバグ退治 - JSR 305
第15回 アノテーションをさらに広い範囲で利用可能にするJSR 308
第14回 Webアプリケーション開発の要となるか - JSF 2.0がJSRに登場
第13回 Webサービス経由でのJMX Agentへの接続を可能にするJSR 262
第12回 Javaアプリケーションのモジュール化をサポートするJava Module System
第11回 "NIO.2"がやってきた - JSR 203: More New I/O APIs for the Java Platform
第10回 JSR 295: Beans Bindingの参照実装を試す
第9回 けっこう便利! 単位を扱うAPI -- JSR 275: Units Specification
第8回 アノテーションでバリデーション - JSR 303: Bean Validator
第7回 Swing開発の救世主となるか - Swing Application Framework
第6回 JavaBeansのプロパティを同期させるバインディングAPI
第5回 誰よりも早く"Java SE 7"を睨む
第4回 日時情報の取り扱いを改善する JSR 310: Date and Time API
第3回 古いAPIも進化している!? - JSR 919: JavaMail 1.4
第2回 JSR 1 リアルタイムJava仕様
第1回 JCPによって進められるJava関連技術の標準化

もっと見る

提供:マイナビ

会員登録はこちら

大学・大学院・短大・専門学生向けの就職情報サイト「マイナビ2010」「マイナビ2009」に今すぐ登録しよう!  大手企業からベンチャー企業までの約13,000社の企業情報を公開、エントリーが可能です。2010年卒予定の方は「マイナビ2010」に、2009年卒予定の方は「マイナビ2009」に登録してください。

毎日コミュニケーションズはプライバシーマークを取得しています。

関連キーワード


人気記事

一覧

イチオシ記事

新着記事