Java EE 6の話

今日、話せたらいいこと

今日のプレゼン資料は、ありえるえりあ(http://dev.ariel-networks.com)で公開します。

目次

  1. 自己紹介
  2. Java EE概論
  3. Java EE 6ハイライト
  4. Webアプリの課題と未来

0. 自己紹介

井上誠一郎

  • 「P2P教科書」
  • 「パーフェクトJava」
  • 雑誌「Software Design」「Emacsのトラノマキ」連載中
  • 執筆中(今年秋出版予定)

1. Java EE概論

そもそもJava EEとは

JavaのEdition3つのうちのひとつ

  • Java SE(Standard Edition) ...普通にJavaと言った場合はこれを指しています
  • Java EE(Enterprise Edition)
  • Java ME(Micro Edition)

Java EEの歴史

名称:          マーケティングメッセージ
J2EE 1.2:      ?
J2EE 1.3:      ?
J2EE 1.4:      Webサービス
Java EE 5:     EoD(Ease of Development)。アノテーション + DI
Java EE 6:     Further EoD。ネタ切れ?

Java EEは各種規格の集合

など

Java EEのアーキテクチャ整理のための用語整理

  • cf. アプリケーション層 / ドメイン層(ビジネス層)
  • API: アプリケーションが使うinterface定義
  • SPI: プラグインが使うinterface定義

Java EE 6の規格一覧

大きく4カテゴリ

Java EE 6の規格一覧: Webアプリ系

名称                                             バージョン
Java Servlet                                           3.0(from 2.5)
JavaServer Pages(JSP)                                  2.2(from 2.1)
JavaServer Faces(JSF)                                  2.0(from 1.2)
JavaServer Pages Standard Tag Library(JSTL)            1.2(from 1.0)
Debugging Support for Other Languages                  1.0(1999年のJSRが新登場?)

Java EE 6の規格一覧: Webサービス系

名称                                     バージョン
Java API for RESTful Web Services(JAX-RS)      1.1(新登場)
Java API for XML-Based Web Services (JAX-WS)   2.2(from 2.0)
Java Architecture for XML Binding (JAXB)       2.2(from 2.0)
Implementing Enterprise Web Services           1.3(?)
Web Services Metadata for the Java Platform    ?
Java API for XML-Based RPC (JAX-RPC)           1.1(Pruning候補)
Java APIs for XML Messaging(JAXM)              1.3(死にかけ)
Java API for XML Registries (JAXR)             1.0(Pruning候補)

Java EE 6の規格一覧: エンタープライズアプリ系

名称                                             バージョン
Enterprise JavaBeans 3.1(EJB)                          3.1(from 3.0)
Contexts and Dependency Injection for Java(Web Beans)  1.0(新登場)
Dependency Injection for Java                          1.0(新登場)
Bean Validation                                        1.0(新登場)
Java Persistence(JPA)                                  2.0(from 1.0)
Common Annotations for the Java Platform               1.1(from 1.0)
Java Message Service API(JMS)                          1.1(from 1.0)
Java Transaction API(JTA)                              1.1(from 1.0)
JavaMail                                               1.4(from 1.0)
Java EE Connector Architecture                         1.6(from 1.5)

Java EE 6の規格一覧: 管理系

名称                                                     バージョン
Java Authentication Service Provider Interface for Containers  1.0(新登場)
Java Authorization Contract for Containers                     1.3(from 1.0)
J2EE Management                                                1.1(from 1.0)
Java EE Application Deployment                                 1.2(Pruning候補)

Java EEのアーキテクチャ整理図(最後に改めて再掲)

図の見方

Webブラウザ     Webサーバ                          ドメイン層                                   外部
                JAX-RS, JAX-WS
                                 CDI(Web Beans)    EJB                Connector, JMS, JavaMail
                JSF, JSP
                JSTL
                (EL)
                    [base]                         [base]
                    Servlet                        JPA, JTA

                                [base]
                                DI, Common Annotation
                          [JavaSE] JAXP, StAX, JDBC, JMX, JAF, JNDI

Java EEの実装

全部入り(Java EEコンテナ)

サーブレットコンテナ(サーブレットAPI、JSP)

他色々

Java EE規格書読みの指針

Java EE規格書読みの指針: Servlet

Java EE規格書読みの指針: JSP(JavaServer Pages)

Java EE規格書読みの指針: JSTL(JavaServer Pages Standard Tag Library)

Java EE規格書読みの指針: JSF(JavaServer Faces)

Java EE規格書読みの指針: JPA(Java Persistence API)

Java EE規格書読みの指針: JTA(Java Transaction API)

Java EE規格書読みの指針: Dependency Injection for Java

fyi, スペックリード

Java EE規格書読みの指針: Common Annotations for the Java Platform

Java EE規格書読みの指針: JAX-RS(Java API for RESTful Web Services)

Java EE規格書読みの指針: JAX-WS(Java API for XML Web Services)

Java EE規格書読みの指針: JAXB(Java Architecture for XML Binding)

Java EE規格書読みの指針: CDI(Contexts and Dependency Injection for Java)

Java EE規格書読みの指針: JMS(Java Message Service API)

Java EE規格書読みの指針: Bean Validation

参照実装
Hibernate Validator (http://www.hibernate.org/hib_docs/annotations/reference/en/html/validator.html)
XWork Validation Framework (http://wiki.opensymphony.com/display/XW/Validation+Framework)
Commons-Validator (http://jakarta.apache.org/commons/validator/)

Java EE規格書読みの指針: EJB(Enterprise JavaBeans)

Java EE規格書読みの指針: Java EE Connector Architecture

Java EE規格書読みの指針: JavaMail

Java EE規格書読みの指針: 認証系

JAAS(Java Authentication and Authorization Service)
JACC(Java Authorization Service Provider Contract for Containers)

Java EE規格書読みの指針: その他

消えつつある規格たち

JAXM(Java APIs for XML Messaging): SOAPを扱う低レベルAPI。仲間のJAX-RPCがPruning対象で、事実上、JAX-WSで置換
JAX-RPC(Java API for XML-based RPC): JAX-WSへ融合
SAAJ(SOAP with Attachments API for Java): 消えた。JAXMの一部?
JAXR(Java API for XML Registries): Pruning対象

Java EE規格書読みの指針: Java SEの規格

JDBC(Java Database Connectivity): RDB用API(ORMでラップされて存在は見えにくくなる方向)
JNDI(Java Naming and Directory Interface): LDAPなどにも使うが、Webアプリの場合、DataSourceの指定などリソース指定(DIとアノテーションで存在は見えにくくなる方向)
JMX(Java Management Extensions): 管理API(実行時の状態監視など)
JAF(JavaBeans Activation Framework): MIMEタイプハンドラ
JAXP(Java API for XML Processing): DOMとSAX。XSLT
StAX(Streaming API for XML): SAXと異なるXMLパースAPI(イテレータ型API)

Java EE規格書読みの指針: 先送り(Java EE 7?)

JSR-289 SIP Servlet v1.1
JSR-286 Portlet Specification 2.0
JSR-301 Portlet Bridge Specification for JavaServer Faces
JSR-236 Timer for Application Servers
JSR-237 Work Manager for Application Servers
JSR-170 Content Repository for Java technology API
JSR-207 Process Definition for Java
JSR-208 Java Business Integration (JBI)
JSR-225 XQuery API for Java (XQJ)
JSR-235 Service Data Objects

2. Java EE 6ハイライト

ASFが反対票

JCP(Java Commnunity Process): 投票による採択

(ライセンス問題)

ProfilesとPruning

  • とりあえず Webプロファイル(次ページ)

Webプロファイル

Java Servlet
JSF
JSP & EL
JSTL
Debugging Support for Other Languages

CDI(Web Beans)
Dependency Injection for Java
Enterprise JavaBeans (EJB Lite)
Common Annotations for the Java Platform
JPA
JTA
Bean Validation

Pruning候補の規格

Servlet3.0のハイライト

Servlet3.0のハイライト; アノテーション拡充

// コード例
@WebServlet(urlPatterns={"/foo", "/bar"})
public class MyServlet extends HttpServlet {
    public void doGet(HttpServletRequest req, HttpServletResponse res) {
    }
    省略
}

Servlet3.0のハイライト; ファイルアップロードAPI

// APIの例
javax.servlet.http.Partインターフェース
Part HttpServletRequest.getPart(String name)
Collection<Part> HttpServletRequest.getParts()

Servlet3.0のハイライト; 非同期API

Servlet3.0のハイライト; 非同期API (cont.)

Java EE 6以前の独自実装

Tomcat
サーブレットクラスがorg.apache.catalina.comet.CometProcessorインターフェースを実装
サーブレットクラス実装者が、自力でイベントハンドラを実装

JBoss
サーブレットクラスがorg.jboss.servlet.http.HttpEventServletインターフェースを実装
サーブレットクラス実装者が、自力でイベントハンドラを実装
プログラミングモデルはTomcatと同じ

Jetty
org.mortbay.util.ajax.Continuationインターフェース
Continuationオブジェクトを取得
Continuationオブジェクトのsuspendメソッド呼び出しで、実行スレッドをスレッドプールに返す

Servlet3.0のハイライト; 非同期API [3]

Servlet3.0とTomcat7

嫌がらせのようなバージョン対応表

Tomcatバージョン   Servletバージョン    JSPバージョン  JavaEE
7.0.x              3.0                  2.2            6
6.0.x              2.5                  2.1            5
5.0.x/5.5.x        2.4                  2.0            1.4
4.1.x              2.3                  1.2            1.3
3.x                2.2                  1.2            1.2

EJB 3.1

EJBが解こうとしている問題と対応技術

JSF 2.0

Facelets

CDI(Web Beans)

JSF: Web-tierのアノテーション
EJB: Enterprise-tierのアノテーション
CDI: ふたつを補完するアノテーション

理想はこのコンボでWebエンタープライズアプリケーションの宣言的プログラミングを目指す

JAX-RS: RESTful API

fyi,

3. Webアプリの課題と未来

DIが解決する問題

本質的な起源:

以下を組み合わせると更に強力

=> 必要なオブジェクトを宣言的に記述すると、DIコンテナが必要なオブジェクトを生成(かつライフサイクル管理もお任せ)してセットしてくれる => DIとは: オブジェクト組み立て(assemble)の役割の分離

DIの標準(Google Guiceベース)

Beanをめぐる混乱

=> 「Beanとは?」に対する現実的な回答: Beanコンテナがライフサイクル管理するオブジェクト => Webアプリの文脈では「スコープ」がオブジェクトの寿命を決定

データバインディング問題(データ変換問題)

フォーム入力 <=> 内部バリューオブジェクト <=> データベース(RDB)

Web方面からのアプローチ

RDB方面からのアプローチ

ビュー技術をめぐる混乱

トランザクション管理の本質的な複雑さ

トランザクション管理プログラミングの歴史

  1. トランザクション管理の役割を分離(後ろのシステムは色々)
  2. RDB時代 => RDBにトランザクション管理をお任せ
  3. ORM時代 => オンメモリ(キャッシュ)の状態も含めて一貫性維持の役割を分離
  4. Web(Cloud)時代 => ロングトランザクション(WS)、メッセージドリブン、eventually consistency

トランザクション管理プログラミングモデル

  • RDB任せ(autocommit=true)
  • 必要に応じてメソッド化(明示的にcommit/rollback呼び出し)
  • トランザクション・マネージャーとして役割を分離(ORMを使う場合、事実上、objectのキャッシュ同期機能を内包する)
  • テンプレートメソッドパターンでトランザクション範囲内をオーバーライドしたメソッド内に記述
  • トランザクションをXML設定ファイルで指定(古いSpring。AspectJっぽい指定(メソッド名のパターンマッチ))
  • アノテーションで指定(SpringやEJB3.0)

トランザクション管理API

結局、

JPA vs. JDO ?

ほとんど同じ問題を解こうとしている

JPA vs. JDO ? (cont.)

アノテーションの違いで微妙な立ち位置の違いも垣間見える
JPA: @Id, @OneToOne, @OneToMany
JDO: @Key, @ForeignKey, @Join

アーキテクチャの未来

Java EEのアーキテクチャ整理図(再掲)

図の見方

Webブラウザ     Webサーバ                          ドメイン層                                   外部
                JAX-RS, JAX-WS
                                 CDI(Web Beans)    EJB                Connector, JMS, JavaMail
                JSF, JSP
                JSTL
                (EL)
                    [base]                         [base]
                    Servlet                        JPA, JTA

                                [base]
                                DI, Common Annotation
                          [JavaSE] JAXP, StAX, JDBC, JMX, JAF, JNDI