Personal tools
You are here: Home 原稿・資料 ワークス、アリエル共同勉強会 Java EE 6の話 -ありえるえりあ勉強会-
Document Actions

Java EE 6の話 -ありえるえりあ勉強会-

「ありえるえりあ勉強会@溜池山王 -第1回ディープすぎるJava・・・-」(http://atnd.org/events/4261)での講演資料です。 HTML化したプレゼン資料は添付のjavaee6.tgzです(内容は同じです)。

今日、話せたらいいこと

  • Java EEはどんな問題を解こうとしているのか?
  • Java EEは問題をどう解こうとしているのか?

  • Java EE 6の各規格の関係性の整理

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

目次

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

0. 自己紹介

井上誠一郎

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

1. Java EE概論

そもそもJava EEとは

  • Java Enterprise Editionの略

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 SEのバージョンと同期

Java EEは各種規格の集合

  • 有名どころではサーブレットAPIやJSP (Webアプリ系)
  • データベースまわりのJPAやJTA
  • Web独立のEJBやJMS

など

  • 規格それぞれは独立にバージョン番号(Servlet3.0など)
  • 総体としてJava EE自体も規格とバージョン番号(2009年12月にバージョン6)

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

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

Java EE 6の規格一覧

大きく4カテゴリ

  • Webアプリ系
  • Webサービス系
  • エンタープライズアプリ系
  • 管理系

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のアーキテクチャ整理図(最後に改めて再掲)

図の見方

  • 上下がレイヤー(高レベルAPI-低レベルAPI)での整理
  • 左右がフロー(処理)での整理
  • 管理系(Management)とセキュリティ系は外しています
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コンテナ)

  • GlassFish (Sun/Oracle)
  • JBoss (RedHat)
  • WebSphere (IBM)
  • WebLogic (Oracle)
  • Apache Geronimo (ASFによる実装寄せ集め)

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

  • Tomcat
  • Jetty
  • Resin

他色々

  • Apache MyFaces: JSF
  • Apache Axis: JAX-WS
  • Google Guice: DI

Java EE規格書読みの指針

  • ひとつ30秒以内でざっと紹介
  • 後でトピックとして一部の各論を取り上げるので雰囲気を掴むのが目的
  • 偏見で断言するので注意してください

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

  • 200ページ強
  • 目を通す価値あり(何が書かれているかを知るために)

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

  • 3部構成500ページ以上
  • 読むのは推奨しません
  • 標準アクションのリファレンスぐらいには使える(かもしれない)

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

  • 250ページ弱
  • 目次は目を通して損はない(リファレンスとして使える)
  • EL(Expression Language)の仕様も含んでいます
  • ELの仕様は読む価値あり(ELは独立した規格書もあります。またJSPの中にも章があります)

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

  • 500ページ弱
  • 頑張れば読めるかもしれません

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

  • ORM(Object Relational Mapping) API
  • 500ページ弱
  • 規格書よりHibernateチュートリアルを読む方がお勧め

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

  • トランザクション管理API(古典)
  • 70ページ弱
  • 読む価値なし
  • これ単体で読んでも役に立たない

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

  • DIのAPI(アノテーション定義)
  • 参照実装: Google Guice
  • JavaDocのみ
  • Google Guiceチュートリアルを読むことを勧めます

fyi, スペックリード

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

  • 30ページ(たぶん一番短い)
  • 目次だけ目を通す価値あり(アノテーション再発明を防ぐため)

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

  • RESTfulアプリのためのAPI
  • JavaEE6一押しのひとつ(のはず)
  • 40ページ
  • チュートリアルを読んだ方がよい

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

  • SOAP用API
  • かつてのJavaEE一押しのひとつだった(はず)
  • 130ページ強
  • 推奨しませんが、SOAP/WSDLが好きなら読んでもいいかも

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

  • XML<=>Javaオブジェクト変換
  • SOAP用マーシャリング

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

  • a.k.a. Web Beans
  • JavaEE6一押しのひとつ(のはず)
  • 90ページ強
  • @Modelや@SessionScopedなどのアノテーション定義で、MVCアーキテクチャの役割を宣言
  • 発想も技術も正しそうですが、アーキテクチャをここまで規定するのが正しいのか不明
  • 新しいスコープの提案: web conversation context
  • http://jcp.org/en/jsr/results?id=5017 ...IBMが反対票

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

  • 130ページ強
  • 非同期メッセージングAPI(one-wayのpush。publish/subscribeモデルも)。
  • JMSサーバがキューサーバ
  • メッセージングの重要性はこれからも上がるはずですが、相互運用性が重要なので、JavaレベルのAPIより言語独立なプロトコル寄りな共通化の方向性だと思います
  • 読まなくてもいいかも

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

  • 140ページ弱
  • 読む価値なし
参照実装
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)

  • 600ページ強
  • 目次を見て何を解決しようとしているかを見ておく価値はある(かも)

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

  • Java EEシステムと他の業務システムをつなぐための色々
  • IBM臭がする
  • 読む価値なし
  • javax.resource.spiパッケージ

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

  • メール用API(SMTP、POP3、IMAP4)
  • JavaDocを読めば充分

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が反対票
  • ProfilesとPruning
  • Servlet 3.0
  • EJB 3.1
  • JSF 2.0
  • CDI(Web Beans)
  • JAX-RS

ASFが反対票

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

(ライセンス問題)

ProfilesとPruning

  • Profiles: Java EEフルセットと別に公式サブセットを作れる仕組み
  • とりあえず Webプロファイル(次ページ)
  • Pruning: いわゆるdeprecated。公式に時代遅れ認定をできる仕組み

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候補の規格

  • Java APIs for XML-Based RPC (JAX-RPC)
  • Java API for XML Registries 1.0 (JAXR)
  • EJB Entity Beans (in EJB2.0)
  • Java EE Application Deployment

Servlet3.0のハイライト

  • アノテーション拡充 ...アノテーション自体の追加は2.5から
  • ファイルアップロードAPI(いわゆるマルチパート) ...今頃追加
  • 非同期API
  • webフラグメント(web.xmlを分割可能。web-fragment.xml)
  • 実行時にサーブレットクラスおよびフィルタクラスを追加可能 ...web.xml以外での手段
  • 認証API ...存在理由が不明

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

  • アノテーションでURLパターンとサーブレットクラスの対応づけなどを記述可能
  • 従来のweb.xmlの多くを記述可能
// コード例
@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

  • Comet: リクエストに対してすぐにレスポンスを返さない。サーバ側の都合でレスポンスを返すタイミングを決める

    => (一応)サーバからのプッシュを実現

  • 従来のサーブレットでの問題: レスポンスを返すまで、リクエスト処理用スレッドを占有してしまう

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]

  • Java EE 6のモデルはどの独自実装とも違うが、Tomcat/JBossに近いプログラミングモデル(Jettyが特殊過ぎる)
  • ちゃんと使うにはスレッド通知などの同期処理が必要
  • @WebServletのasyncSupported=true属性
  • javax.servlet.AsyncContextインターフェース
  • doGetメソッド内などから明示的にAsyncContextオブジェクト取得
  • リスナオブジェクトを渡して、リスナでイベントハンドラを実装
  • @see http://blogs.sun.com/enterprisetechtips/entry/asynchronous_support_in_servlet_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
  • Tomcat7は開発中
  • Servlet3.0の実装はだいたい入っている雰囲気

EJB 3.1

  • 前回のEJB 3.0からはマイナーチェンジ

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

  • 分散オブジェクト(RPC) => EJBの領域のまま
  • beanコンテナ(オブジェクトライフサイクル管理) => DIに地位を奪われつつある
  • パーシステンス(DB) => JPAで置き換わった(EJB3.0); Entity Beansは公式に死にました(Pruning候補)
  • トランザクション管理 => 微妙。色々な技術が取り合っている(後述)
  • セキュリティ、管理 => EJBの領域のまま? (JMXもあるので微妙)

JSF 2.0

  • Struts進化版 + イベントドリブンのUI
  • 解こうとしているのは「データバインディング問題」(直感的にはHTMLフォームの表示/編集と内部オブジェクトのマッピング)
  • JSFが解きたい問題は理解しますが、別の進化(HTML5)についていけない懸念
  • 規格書は順調に成長中(Facelets, AJAX対応)

Facelets

  • JSP置換狙い
  • ELを使うHTMLスタイルテンプレート言語
  • JSPのようにサーブレットクラスにコンパイルされない(独自の内部表現)
  • 独自タグが多すぎて、HTMLスタイルテンプレート言語の利点を生かせていない

CDI(Web Beans)

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

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

JAX-RS: RESTful API

  • RailsのActionControllerっぽいことをアノテーションで実現(URL=>コントローラクラスのマッピング)
  • リソースクラスはRailsのコントローラクラス相当
  • リソースクラスはリクエストごとにインスタンス化(シングルトンも可能らしい)
  • リソースクラスにサーブレットAPIのオブジェクト(HttpRequestとHttpResponse)は渡ってこない。@ContextアノテーションでDI可能
  • 独自にリクエストとレスポンス用のクラスを定義
  • データバインディングは微妙にスコープ外? (JAXB利用)
  • MVCのVはスコープ外(JAXBでオブジェクト=>XML変換してレスポンス or オブジェクト=>JSONを自力で提供)

fyi,

  • Roy Fielding(RESTの神)がeditorのひとり
  • 実装: Sun Jersey、Apache CXF

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

  • DIが解決する問題
  • Beanをめぐる混乱
  • データバインディング問題(データ変換問題)
  • ビュー技術をめぐる混乱
  • トランザクション管理の本質的な複雑さ
  • JPA vs. JDO ?
  • アーキテクチャの未来

DIが解決する問題

本質的な起源:

  • ファクトリ(オブジェクト作成の役割を分離)
  • Beanコンテナ(オブジェクトのライフサイクル管理の役割を分離)
  • アノテーションとAOP(宣言的プログラミング)

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

  • インターフェースに対するプログラミング
  • フレームワークプログラミング(IoC)

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

DIの標準(Google Guiceベース)

  • Inject対象の指示 => @Inject
  • 具象クラス(実装)の選択 => @Qualifierのついたアノテーションを定義して、具象クラスにアノテーションする or @Named(文字列ベース)
  • オブジェクト生成(インスタンス化) => DIコンテナの実装依存

Beanをめぐる混乱

  • Java Beansの規格(今でも有効。VBやSmalltalk志向。プロパティ、イベント、イントロスペクション)
  • EJB(session bean, entity bean)
  • backing bean
  • managed bean(JSF)
  • Web Beans

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

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

フォーム入力 <=> 内部バリューオブジェクト <=> データベース(RDB)
  • 疎結合原理主義と結びつくと、DTO(data transfer object)変換地獄
  • かと言って、MapをDTO代わりにするのはJava文化では受け入れられない

Web方面からのアプローチ

  • かつてのStruts(actionform)
  • JSF(managed bean)
  • JAXB(Webサービス。XML<=>オブジェクト)
  • JSON(JSON<=>オブジェクト)

RDB方面からのアプローチ

  • ORM

ビュー技術をめぐる混乱

  • テンプレート言語が主流(PHPから大きな進化はない)
  • JSP vs. Facelets
  • 非テンプレート言語: XSLT、全部Java(GWT etc.)...
  • HTML5で、ロジックがクライアント寄りにシフト?

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

  • トランザクション管理: ACID
  • WebサービスからCloudまで引き継がれる本質的に難しい問題

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

  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

  • JDBCトランザクションAPI
  • JTAトランザクションAPI(javax.transaction.UserTransactionなど)
  • JPAトランザクションAPI(javax.persistence.EntityTransactionなど。JTA-APIをラップすることも想定)
  • EJBトランザクション用アノテーション(JTA利用) Spring Framework の @Transactional アノテーションが、EJB 3.0仕様では @TransactionAttribute アノテーション

結局、

  • API使うならJPA (Hibernate由来)
  • アノテーション使うならEJB (Spring由来)

JPA vs. JDO ?

  • JPA(Java Persistence API)
  • JDO(Java Data Objects)

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

  • ORM(one-to-oneからmany-to-many)
  • トランザクション管理
  • 独自query言語(SQL-like)

JPA vs. JDO ? (cont.)

  • アノテーションも似ている
アノテーションの違いで微妙な立ち位置の違いも垣間見える
JPA: @Id, @OneToOne, @OneToMany
JDO: @Key, @ForeignKey, @Join
  • JavaEEにあるのはJPA
  • JDOはJPAのラップもできる(JDOはJPAのアノテーションもサポート)
  • GAE(Google App Engine)は両方サポートしているが、JDO推し?

アーキテクチャの未来

  • Java EEの保守本流は、JSF + CDI + EJB based on DI + Annotaion
  • 対抗は、HTML5 + (WebAPI) + JAX-RS + JPA based on DI + Annotaion

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

図の見方

  • 上下がレイヤー(高レベルAPI-低レベルAPI)での整理
  • 左右がフロー(処理)での整理
  • 管理系(Management)とセキュリティ系は外しています
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
Attachments

Copyright(C) 2001 - 2006 Ariel Networks, Inc. All rights reserved.