Java EE 6で復活するエンタープライズJavaの世界

25
© 2010 IBM Corporation ® Java EE 6で復活する エンタープライズJavaの世界 日本IBM株式会社 ソフトウェア事業 WebSphereクライアント・テクニカル・プロフェッショナルズ 田中 孝清 2010/5/18

description

JJUC CCC 2010 Springでの発表資料です。

Transcript of Java EE 6で復活するエンタープライズJavaの世界

Page 1: Java EE 6で復活するエンタープライズJavaの世界

© 2010 IBM Corporation

®

Java EE 6で復活するエンタープライズJavaの世界

日本IBM株式会社 ソフトウェア事業WebSphereクライアント・テクニカル・プロフェッショナルズ田中 孝清

2010/5/18

Page 2: Java EE 6で復活するエンタープライズJavaの世界

IBM Software Group

2

Enterprise Javaのののの歴史歴史歴史歴史

EJB 1.0

Servlet 2.1

1999/12

J2EE 1.2

• EJB 1.1

• Servlet 2.2

• JSP 1.1

• JMS

• JavaMail

J2EE 1.3

• EJB 2.0

ローカルEJBabs. CMP

MDB

• Servlet 2.3

イベントフィルター

• JSP 1.2

XML

• JAXP

• Connectors

• JAAS

2001/9

J2EE 1.4

• EJB 2.1

タイマーEJB-QL拡張

• Servlet 2.4

• JSP 2.0

•WebサービスJAX-RPC

• JMX Mgmt

• J2EE Deployment

• JACC

2003/11BPEL

Portlets

SDO

SCAHibernate

Spring

2006/3

Java EE 5

• EJB 3 / JPA

POJO

• Servlet 2.5

• JSP 2.1

Unified EL

• JSF 1.2

• JSTL 1.2

•WebサービスJAX-WS

POJO

JAXB

StAX

MTOM

•アノテーションIoC(制御の反転)

開発容易性開発容易性開発容易性開発容易性

Seasar2009/12

Java EE 6

• Profile

Web Profile

• EJB 3.1

Interceptors

• JPA 2.0

JPQLの拡張• Web Beans 1.0

• Bean Validation 1.0

• Common Annotation

• Servlet 3.0

• JSP 2.2 / EL 2.2

• JSF 2.0

• JSTL 1.2

• WebサービスJAX-RS

軽量化軽量化軽量化軽量化

拡張性拡張性拡張性拡張性

開発容易性開発容易性開発容易性開発容易性

Struts

Ajax

Page 3: Java EE 6で復活するエンタープライズJavaの世界

IBM Software Group

3

http://jcp.org/en/jsr/results?id=5025

Java EE 6 ついについについについに2009年年年年12月月月月にににに承認承認承認承認

・・・難産でした

Page 4: Java EE 6で復活するエンタープライズJavaの世界

IBM Software Group

4

http://jcp.org/en/jsr/results?id=5025

Java EE 6 ついについについについに2009年年年年12月月月月にににに承認承認承認承認

・・・難産でした

Intel Corp. voted Abstain

We were not satisfied with some of the information

accompanying this ballot and have informed the Spec

Lead. No technical issues. It's a good spec.

Intel Corp. voted Abstain

We were not satisfied with some of the information

accompanying this ballot and have informed the Spec

Lead. No technical issues. It's a good spec.

IBM voted Yes

IBM's vote is based on the technical merits of this JSR and is not a vote on

the licensing terms. IBM supports licensing models that create an open

and level playing field by allowing third parties to create independent

implementations of Java Specifications and that do not allow individuals or

companies to exercise unnecessary control for proprietary advantage. We

support open source as a licensing model for contributions in the JCP, and

would hope others will support this direction.

IBM voted Yes

IBM's vote is based on the technical merits of this JSR and is not a vote on

the licensing terms. IBM supports licensing models that create an open

and level playing field by allowing third parties to create independent

implementations of Java Specifications and that do not allow individuals or

companies to exercise unnecessary control for proprietary advantage. We

support open source as a licensing model for contributions in the JCP, and

would hope others will support this direction.

Page 5: Java EE 6で復活するエンタープライズJavaの世界

IBM Software Group

5

他他他他にもいろいろありましたにもいろいろありましたにもいろいろありましたにもいろいろありました

� POJOをベースとした新しいServlet APIの提出と揺り戻し

� 「JSR 299 Web Beans」に対抗してGoogle/Springから出された「JSR 330 Dependency Injection for Java」

「Java EE終了のお知らせ」(2009-05-09)ひがやすを氏

「Java EE終了のお知らせ」(2009-05-09)ひがやすを氏

� しかし,様々な困難を乗り越え,新しいJava EEは承認されました

苦労の甲斐あって,いい仕様です

との声も・・・

Page 6: Java EE 6で復活するエンタープライズJavaの世界

IBM Software Group

6

Java EE 6仕様仕様仕様仕様のののの全体像全体像全体像全体像

Page 7: Java EE 6で復活するエンタープライズJavaの世界

IBM Software Group

7

Java EE 6 のののの主要主要主要主要ななななゴールゴールゴールゴール

� 軽量化:Right Sizing

– 柔軟なテクノロジースタック/Webプロファイル

– "Pruning dead wood"

� 拡張性

� さらなる開発容易性:Ease of Development

– EJBにつづきServletもアノテーションベースに

– CDI (Contexts and Dependency Injection)

�プレゼンテーション層の強化

–Web 2.0への対応 / Servlet 3.0,JSF 2.0,JAX-RS

�永続化の機能強化

–JPA 2.0,Bean Validation

機能機能機能機能のののの大幅大幅大幅大幅なななな強化強化強化強化

Page 8: Java EE 6で復活するエンタープライズJavaの世界

IBM Software Group

8

柔軟柔軟柔軟柔軟ななななテクノロジースタックテクノロジースタックテクノロジースタックテクノロジースタック

� 「Profile」の導入

– Java EEのサブセットをProfileとして定義

• Java EEの仕様群の全部もしくは一部だけをふくむ

– Java EEコンテナを提供するプロバイダーは,

特定のプロファイルを選択して実装することが可能

• Java EEの全ての仕様を実装しなくてもJava EE認定が受けられる

– ユーザーは,必要な機能だけを実装したコンテナを選択することが可能

� Java EE 6の策定時点で定義されているプロファイル

– Java EE Profile

• 定義されている,ほぼ全ての仕様を実装

– Web Profile

• Webアプリケーションの実行に必要な仕様だけを実装

Java EE

Web

Page 9: Java EE 6で復活するエンタープライズJavaの世界

IBM Software Group

9

プロファイルプロファイルプロファイルプロファイル登場登場登場登場のののの背景背景背景背景

� 肥大化したJava EE仕様

� EJB 3.1� Servlet 3.0� JSP 2.2� EL 1.2� JMS 1.1� JTA 1.1� JavaMail 1.4� Connector 1.6� Web Services 1.3� JAX-RPC 1.1� JAX-RS 1.1� JAXR 1.0� Java EE Management 1.1� Java EE Deployment 1.2c

� JACC 1.3� JASPIC 1.0� JSP Debugging 1.0� JSTL 1.2� Web Services Metadata 2.0� JSF 2.0� Common Annotations 1.1� Java Persistence 2.0� Bean Validation 1.0� Managed Beans 1.0� Interceptors 1.1� DI(JSR-299) 1.0� CDI(JSR-330) 1.0

� Java IDL� JDBC� RMI-IIOP� JNDI� JAXP� StAX 1.0� JAAS� JMX� JAX-WS 2.2� JAXB 2.2� JAF� SAAJ 1.3� Common Annotations 1.1

Java EE 6 Java SE

Page 10: Java EE 6で復活するエンタープライズJavaの世界

IBM Software Group

10

Web Profileにににに含含含含まれるまれるまれるまれる仕様仕様仕様仕様

Web Services TechnologiesWeb Services TechnologiesWeb Services TechnologiesWeb Services TechnologiesJSR 311: JAX-RS: The Java API

for RESTful Web Services 1.1JSR 109: Implementing Enterprise Web Services 1.3JSR 224: Java API for XML-Based

Web Services (JAX-WS) 2.2

JSR 222: Java Architecturefor XML Binding (JAXB) 2.2

JSR 181: Web Services Metadatafor the Java Platform

JSR 101: Java APIs for XML based RPC 1.1JSR 67: Java APIs for XML Messaging 1.3JSR 93: Java API for

XML Registries 1.0 (JAXR) 1.0

Management and Security TechnologiesManagement and Security TechnologiesManagement and Security TechnologiesManagement and Security TechnologiesJSR 196: Java Authentication Service Provider

Interface for Containers 1.0JSR 115: Java Authorization

Contract for Containers 1.3JSR 88: Java EE Application Deployment 1.2JSR 77: J2EE Management 1.1

Web ProfileWeb ProfileWeb ProfileWeb Profile

Web Application TechnologiesWeb Application TechnologiesWeb Application TechnologiesWeb Application TechnologiesJSR 315: Java Servlet 3.0JSR 314: JavaServer Faces (JSF) 2.0JSR 245: JavaServer Pages 2.2

and Expression Language (EL) 1.2JSR 52: A Standard Tag Library for JavaServer Pages 1.2JSR-45: Debugging Support for Other Languages 1.0

Enterprise Application TechnologiesEnterprise Application TechnologiesEnterprise Application TechnologiesEnterprise Application TechnologiesJSR 299: Contexts and Dependency Injection

for the Java EE Platform 1.0JSR 330: Dependency Injection for JavaJSR 318: Enterprise JavaBeans 3.1 (EJB Lite)JSR 317: Java Persistence API 2.0JSR 250: Common Annotations for the Java Platform 1.1JSR 907: Java Transaction API (JTA) 1.1JSR 303: Bean Validation 1.0

JSR 318: Enterprise JavaBeans 3.1JSR 322: Java EE Connector Architecture 1.6JSR 914: Java Message Service (JMS) API 1.1JSR 919: JavaMail 1.4

Java EE Profile

サーブレット/JSP基本機能だけでなく

・トランザクション・サービス・(リモート呼び出しのない)EJB・DBへの永続化を行うJPA仕様

も含まれている

Page 11: Java EE 6で復活するエンタープライズJavaの世界

IBM Software Group

11

"Pruning dead wood"

� 古い仕様を将来のバージョンで削除することを予告

– Deprecate EJB Entity beans

– Deprecate JAX-RPC

– Deprecate JSR-88 J2EE Deployment

– Deprecate JAX-R

� 追加・追加で肥大化してきた仕様をより適切なサイズに

Page 12: Java EE 6で復活するエンタープライズJavaの世界

IBM Software Group

12

さらなるさらなるさらなるさらなるEase of Development

� EJBに続きServletもアノテーションアノテーションアノテーションアノテーションに

– web.xml (構成ファイル)はオプション

� Dependency Injectionのためのアノテーション仕様も標準化

– JSR 299: Contexts and Dependency Injectionfor the Java EE Platform 1.0

– JSR 330: Dependency Injection for Java

@@@@WebServletWebServletWebServletWebServlet(name=”MyServlet”, urlPatterns={"/foo", "/bar"})publicpublicpublicpublic classclassclassclass SampleUsingAnnotationAttributes extendsextendsextendsextends HttpServlet{

publicpublicpublicpublic voidvoidvoidvoid doGet(HttpServletRequest req, HttpServletResponse res) {

@@@@WebServletWebServletWebServletWebServlet(name=”MyServlet”, urlPatterns={"/foo", "/bar"})publicpublicpublicpublic classclassclassclass SampleUsingAnnotationAttributes extendsextendsextendsextends HttpServlet{

publicpublicpublicpublic voidvoidvoidvoid doGet(HttpServletRequest req, HttpServletResponse res) {

二つの大きな流れ• 設定情報はデプロイメントディスクリプタではなくJavaソースに• Javaコード中に初期化コードはかかない

Page 13: Java EE 6で復活するエンタープライズJavaの世界

IBM Software Group

13

privateprivateprivateprivate DataSource ds;

InitialContext ic = new InitialContext();ds = (DataSource)ic.lookup("java:comp/env/jdbc/MyDS");Connection con = ds.getConnection();

privateprivateprivateprivate DataSource ds;

InitialContext ic = new InitialContext();ds = (DataSource)ic.lookup("java:comp/env/jdbc/MyDS");Connection con = ds.getConnection();

@@@@ResourceResourceResourceResource(name = "jdbc/MyDS")privateprivateprivateprivate DataSource ds;

@@@@ResourceResourceResourceResource(name = "jdbc/MyDS")privateprivateprivateprivate DataSource ds;

Dependency InjectionDependency InjectionDependency InjectionDependency Injection

「初期化コード」から「DI」へ

オープンソース・フレームワークであるSpring FrameworkやSeasar2が

切り開いた分野

Page 14: Java EE 6で復活するエンタープライズJavaの世界

IBM Software Group

14

CDI CDI CDI CDI ((((Contexts and Dependency InjectionContexts and Dependency InjectionContexts and Dependency InjectionContexts and Dependency Injection))))

ServletServletServletServletでのでのでのでのDIDIDIDI

EJBEJBEJBEJBでのでのでのでのDIDIDIDI

WebWebWebWebサービスサービスサービスサービスでのでのでのでのDIDIDIDI

ユーザーユーザーユーザーユーザー定義定義定義定義ののののDIDIDIDI

� DIの機能をコンテナから分離 → Java SEでも使用可能

� ビジネスロジック層とプレゼンテーション層の連携が容易に

CDICDICDICDIContextContextContextContext

andandandandDependencyDependencyDependencyDependency

InjectionInjectionInjectionInjection

DIの仕様を

統合

Page 15: Java EE 6で復活するエンタープライズJavaの世界

IBM Software Group

15

CDIのののの使用例使用例使用例使用例

packagepackagepackagepackage org.example; importimportimportimport javax.inject.Named;

@Named@Named@Named@Namedpublic classpublic classpublic classpublic class HelloService {

public voidpublic voidpublic voidpublic void sayHello() {System.out.println("Hello!");

} }

packagepackagepackagepackage org.example; importimportimportimport javax.inject.Named;

@Named@Named@Named@Namedpublic classpublic classpublic classpublic class HelloService {

public voidpublic voidpublic voidpublic void sayHello() {System.out.println("Hello!");

} }

importimportimportimport org.example.HelloService;

@@@@WebServletWebServletWebServletWebServlet(name = "HelloWorld", urlPatterns = { "/HelloWorld" }) public classpublic classpublic classpublic class HelloWorld extends extends extends extends HttpServlet {

@Inject@Inject@Inject@Inject HelloService helloService;

importimportimportimport org.example.HelloService;

@@@@WebServletWebServletWebServletWebServlet(name = "HelloWorld", urlPatterns = { "/HelloWorld" }) public classpublic classpublic classpublic class HelloWorld extends extends extends extends HttpServlet {

@Inject@Inject@Inject@Inject HelloService helloService;

Page 16: Java EE 6で復活するエンタープライズJavaの世界

IBM Software Group

16

強化強化強化強化されたされたされたされたServlet仕様仕様仕様仕様

� メジャー・バージョンアップ! (Version 2.5 → 3.0)

� 新機能も盛りだくさん

– 構成のためのアノテーション大量追加

– 非同期処理のサポート

– 複数構成ファイル(web-fragment.xml)の導入

– HTTPServletRequestにログインとログアウト処理を実現する機能

– Servletおよびフィルタを動的に追加するメソッドServletContext#addFilter, ServletContext#addServlet登場

– multipart/form-data形式のリクエストに対応(Partクラスの追加)

Page 17: Java EE 6で復活するエンタープライズJavaの世界

IBM Software Group

17

Servletのののの非同期処理非同期処理非同期処理非同期処理サポートサポートサポートサポート

startAsync() + start()doGet()

response

ServletServletServletServlet

別別別別スレッドスレッドスレッドスレッド

時間のかかる処理

doGet()

ServletServletServletServlet

response

時間のかかる処理

従来のServlet Servlet 3.0の非同期処理� Serlvet実行スレッドを

早期に解放して処理のスケーラビリティを維持

� 非同期処理を行うスレッドからもHttpServletRequstやHttpServletResponse

などのオブジェクトにアクセスが可能

� 様々な応用

– Commetアプリ

– 長時間のDBアクセス

– メッセージングの結果を待つアプリケーション

Page 18: Java EE 6で復活するエンタープライズJavaの世界

IBM Software Group

18

multipart/form-dataののののサポートサポートサポートサポート� FileUploadサーブレットも簡単に!

@WebServlet("/upload")@MultipartConfig(maxFileSize=1000000)publicpublicpublicpublic classclassclassclass MyUploadServlet extendsextendsextendsextends HttpServlet {@Overrideprotectedprotectedprotectedprotected voidvoidvoidvoid doPost(HttpServletRequest request,HttpServletResponse response) throwsthrowsthrowsthrows ServletException, IOException {

response.setContentType("text/plain; charset=UTF-8");PrintWriter out = response.getWriter();forforforfor (Part p : Part p : Part p : Part p : request.getPartsrequest.getPartsrequest.getPartsrequest.getParts()()()()) {out.write("Part name: " + p.getName());out.write("Size: " + p.getSize());out.write("Content Type: " + p.getContentType());

}

@WebServlet("/upload")@MultipartConfig(maxFileSize=1000000)publicpublicpublicpublic classclassclassclass MyUploadServlet extendsextendsextendsextends HttpServlet {@Overrideprotectedprotectedprotectedprotected voidvoidvoidvoid doPost(HttpServletRequest request,HttpServletResponse response) throwsthrowsthrowsthrows ServletException, IOException {

response.setContentType("text/plain; charset=UTF-8");PrintWriter out = response.getWriter();forforforfor (Part p : Part p : Part p : Part p : request.getPartsrequest.getPartsrequest.getPartsrequest.getParts()()()()) {out.write("Part name: " + p.getName());out.write("Size: " + p.getSize());out.write("Content Type: " + p.getContentType());

}

サイズの制限も可能

Page 19: Java EE 6で復活するエンタープライズJavaの世界

IBM Software Group

19

RESTfullななななWebサービスサービスサービスサービス

�リソースは一意なURIをもつ

–例:http://api.server.example.com/repository/user/E12345

�リソースに対する操作をHTTPのメソッドで表現する

–GET: 読み取り

–PUT/POST:作成/更新

–DELETE: 削除

�Statelessな呼び出しプロトコル

Page 20: Java EE 6で復活するエンタープライズJavaの世界

IBM Software Group

20

JAX-RS

� RESTfull Webサービスを実現するAPIの標準化(JAX-RS)

–サーブレットを使わないWebアプリケーションも可能

@Path("repository")publicpublicpublicpublic classclassclassclass TestRepositoryService {@Path("version")@GET@Produces("text/plain; charset=UTF-8")publicpublicpublicpublic String getVersion() {return "Test Service version 1.0";

}

@Path("user/{userID}")@GET@Produces("text/plain; charset=UTF-8")publicpublicpublicpublic String getUserName(@PathParam("userID") String id) {

returnreturnreturnreturn UserRepository.getUserName(id);}

@Path("repository")publicpublicpublicpublic classclassclassclass TestRepositoryService {@Path("version")@GET@Produces("text/plain; charset=UTF-8")publicpublicpublicpublic String getVersion() {return "Test Service version 1.0";

}

@Path("user/{userID}")@GET@Produces("text/plain; charset=UTF-8")publicpublicpublicpublic String getUserName(@PathParam("userID") String id) {

returnreturnreturnreturn UserRepository.getUserName(id);}

/repository/version で呼び出し

/repository/user/E12345 などで呼び出し

Page 21: Java EE 6で復活するエンタープライズJavaの世界

IBM Software Group

21

JSF 2.0

� Facelets

� AJAX support

� Skins

<h:panelGrid columns="2">#{cc.attrs.namePrompt}<h:panelGroup><h:inputText id="name" value="#{cc.attrs.managedBean.name}"

valueChangeListener="#{cc.attrs.managedBean.validateName}">

<f:ajaxf:ajaxf:ajaxf:ajax event="blur" render="nameError"/></h:inputText><h:outputText id="nameError"

value="#{cc.attrs.managedBean.nameError}" style="color: red;font-style: italic;"/></h:panelGroup>...

</h:panelGrid>

<h:panelGrid columns="2">#{cc.attrs.namePrompt}<h:panelGroup><h:inputText id="name" value="#{cc.attrs.managedBean.name}"

valueChangeListener="#{cc.attrs.managedBean.validateName}">

<f:ajaxf:ajaxf:ajaxf:ajax event="blur" render="nameError"/></h:inputText><h:outputText id="nameError"

value="#{cc.attrs.managedBean.nameError}" style="color: red;font-style: italic;"/></h:panelGroup>...

</h:panelGrid>

� Annotations support

� Widget library (extension)

� Bean Validation

Page 22: Java EE 6で復活するエンタープライズJavaの世界

IBM Software Group

22

永続化永続化永続化永続化のののの機能強化機能強化機能強化機能強化

� JPA 2.0

– クエリー言語であるJPQL(Java Persistence Query Language)が強化

– アノテーションを使用した入力値の検証が可能なBean Validationの追加

– 悲観的ロックのサポート

– レベル2キャッシュの仕様追加

1804-2222Hirabayashi222222

1084-1111Nakajima111111

1803-3333Yamaguchi333333

NAME PHONEEMP_ID

EMPLOYEE表

EntityManager

emp_Id

name

phone

@Entity

Employee

@IdgetEmp_Id()

getName()

getPhone()

setEmp_Id()

setName()

setPhone()

emp_Id=111111

name=Nakajima

phone=1804-1111

getEmp_Id()

getName()

getPhone()

setEmp_Id()

setName()

setPhone()

Page 23: Java EE 6で復活するエンタープライズJavaの世界

IBM Software Group

23

Bean Validation 1.0

� JPAやJSF,JCAで使用できるValidatation機能

– Beanに対する制約を統一的に扱うことができる

� @Min/@Max/@Size/@NotNull/@Pattern等のアノテーションで制約をかける

– ユーザー定義の制約も実装できる

@entitypublicpublicpublicpublic classclassclassclass Customer {@Idprivateprivateprivateprivate int id;privateprivateprivateprivate String name;@Pattern(regexp="((¥d¥d¥d¥-)?¥d¥d¥d¥-d¥d¥d¥d)?")privateprivateprivateprivate String phoneNumber;……

}

@entitypublicpublicpublicpublic classclassclassclass Customer {@Idprivateprivateprivateprivate int id;privateprivateprivateprivate String name;@Pattern(regexp="((¥d¥d¥d¥-)?¥d¥d¥d¥-d¥d¥d¥d)?")privateprivateprivateprivate String phoneNumber;……

}

Page 24: Java EE 6で復活するエンタープライズJavaの世界

IBM Software Group

24

まとめまとめまとめまとめ

� Java EEはより簡単に,よりスリムになっていきます

� Java EE 5が,「今までと同じ事がより簡単にできる」更新だったのに対しJava EE 6は,「今まで出来なかったことができる」という更新です

� Servlet/JSP/JSFといった,変化が少なかったAPIにも大幅な機能追加が

� RESTfullアプリケーション,Ajaxアプリケーションなど技術に対応

Page 25: Java EE 6で復活するエンタープライズJavaの世界

IBM Software Group

25

最後最後最後最後にににに

� Java EE 6対応となるWebSphere Application Server V8.0Alphaバージョンが公開中ですhttps://www14.software.ibm.com/iwm/web/cc/earlyprograms/websphere/wsasoa/index.shtml