Servlet 6.0(Jakarta EE 10)の変更点まとめ

Jakarta EE 10でServletのバージョンが6.0になりました。 Java EE 8ではServletのバージョンは4.0で、そのあとの5.0はパッケージ名の変換のみだったので、 久しぶりの意味のある仕様変更になります。

ということでまとめ。 ソースを読んで差分をざっくり眺めてるだけなので、間違い、抜け漏れは当然あります。あれ?と思った場所があったら教えてください。

github.com

全般

全般的にHTTP1.1準拠のRFCRFC 2616からRFC 7231に変更されました。

RFC 2616 - Hypertext Transfer Protocol -- HTTP/1.1

RFC 7231 - Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content

それ以外も枝葉のRFCが全般的に変更されています。

また、過去のServlet APIで非推奨とされていたメソッド類、クラス類が削除されています。 以下のクラス類は削除されました。

  • HttpSessionContext
  • HttpUtils
  • SingleThreadModel

非推奨とされていたメソッドは、例えば以下のようなものです。

  • HttpSession#setValue()
  • HttpSession#getValue()

これらは属性のスコープの概念が取り入れられたときにattributeという名前でメソッドが置き換えられていて誰も使ってなかったはずなので、特に問題はないと思われます。 J2EE 1.3以前から生き残ってるシステムは知らね。

消されたであろうメソッドの一覧は以下に。

非推奨のリスト (Java Servlet 4.0)

いくつかのメソッドで例外的な操作が明文化されています。

例えば、nullが渡された時の挙動が明文化されているものがあります。一度値を渡してしまった後に元に戻すためにはどうすればいいの?みたいなのに答えてるのかもしれません。

APサーバーによっては挙動が変更されている(例外が発生する、何も起こらない等)かもしれないので、実際に使うときは必ずjavadocを確認するようにしてください。

HttpServletRequest

getRequestId()メソッドが追加されました。サーブレットコンテナ内で実装依存の一意の識別子を返します。マイクロサービスでリクエストの遷移を追いたいときに使えるのかもしれません。

getProtocolRequestId()が追加されました。HTTP1.X/2/3 OR AJPその他を識別するのに使用できます。

ServletConnection getServletConnection()メソッドが追加されました。ServletConnectionについては後述。(とはいっても有用なものではない)

Cookie

クッキー準拠のRFCRFC 2109からRFC 6265に変更されました。

クッキーにコメント、バージョンが入れられなくなったり、新しいRFCで追加された属性のアクセサーが生えたりしました。

また、自由な属性名でクッキーに値を入れられるようにsetAttribute(String name, String value)メソッドが追加されました。*1

セキュリティの都合等でクッキーには属性が追加されることが多々あり、 新しい属性を使わないといけない場合はCookieクラスを使えずに直接HttpServletResponse#setHeader(String name, String value)を呼び出さなければいけなかったことがこれで解消されそうです。

HttpServlet

doHeadメソッドの挙動が変更され、デフォルトでdoGetメソッドと同じ動作をするようになりました。

これが問題である場合はServletConfigの初期化パラメーターを操作して、jakarta.servlet.http.legacyDoHeadをtrueにする必要があります。

なお、今まではdoGetを実行しながらレスポンスボディを返さないという挙動をしていました。

jsp-property-groupにErrorOnELNotFound属性が追加。

EL式の挙動を変更します。詳しくは以下。

https://github.com/eclipse-ee4j/jsp-api/issues/40

ServletConnection

今回増えた唯一のクラスです。

javadocによると、デバッグ用途で使われることを想定しており、サーブレットコンテナから見た生の接続情報を提供してくれるそうです。

しかしながら現時点で取得できるのはあまり多くはないため、今後増えていくのかもしれません。

まとめ

ということで、駆け足ながら差分をざっとまとめてみました。 他にこういう差分があるよというのを見つけたら教えてください。

*1:たぶん今回の変更の中で一番うれしい