Java EE 6で復活するエンタープライズJavaの世界
-
Upload
takakiyo-tanaka -
Category
Technology
-
view
7.031 -
download
4
description
Transcript of Java EE 6で復活するエンタープライズJavaの世界
© 2010 IBM Corporation
®
Java EE 6で復活するエンタープライズJavaの世界
日本IBM株式会社 ソフトウェア事業WebSphereクライアント・テクニカル・プロフェッショナルズ田中 孝清
2010/5/18
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
IBM Software Group
3
http://jcp.org/en/jsr/results?id=5025
Java EE 6 ついについについについに2009年年年年12月月月月にににに承認承認承認承認
・・・難産でした
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.
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は承認されました
苦労の甲斐あって,いい仕様です
との声も・・・
IBM Software Group
6
Java EE 6仕様仕様仕様仕様のののの全体像全体像全体像全体像
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
機能機能機能機能のののの大幅大幅大幅大幅なななな強化強化強化強化
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
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
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仕様
も含まれている
IBM Software Group
11
"Pruning dead wood"
� 古い仕様を将来のバージョンで削除することを予告
– Deprecate EJB Entity beans
– Deprecate JAX-RPC
– Deprecate JSR-88 J2EE Deployment
– Deprecate JAX-R
� 追加・追加で肥大化してきた仕様をより適切なサイズに
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コード中に初期化コードはかかない
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が
切り開いた分野
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の仕様を
統合
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;
IBM Software Group
16
強化強化強化強化されたされたされたされたServlet仕様仕様仕様仕様
� メジャー・バージョンアップ! (Version 2.5 → 3.0)
� 新機能も盛りだくさん
– 構成のためのアノテーション大量追加
– 非同期処理のサポート
– 複数構成ファイル(web-fragment.xml)の導入
– HTTPServletRequestにログインとログアウト処理を実現する機能
– Servletおよびフィルタを動的に追加するメソッドServletContext#addFilter, ServletContext#addServlet登場
– multipart/form-data形式のリクエストに対応(Partクラスの追加)
IBM Software Group
17
Servletのののの非同期処理非同期処理非同期処理非同期処理サポートサポートサポートサポート
startAsync() + start()doGet()
response
ServletServletServletServlet
別別別別スレッドスレッドスレッドスレッド
時間のかかる処理
doGet()
ServletServletServletServlet
response
時間のかかる処理
従来のServlet Servlet 3.0の非同期処理� Serlvet実行スレッドを
早期に解放して処理のスケーラビリティを維持
� 非同期処理を行うスレッドからもHttpServletRequstやHttpServletResponse
などのオブジェクトにアクセスが可能
� 様々な応用
– Commetアプリ
– 長時間のDBアクセス
– メッセージングの結果を待つアプリケーション
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());
}
サイズの制限も可能
IBM Software Group
19
RESTfullななななWebサービスサービスサービスサービス
�リソースは一意なURIをもつ
–例:http://api.server.example.com/repository/user/E12345
�リソースに対する操作をHTTPのメソッドで表現する
–GET: 読み取り
–PUT/POST:作成/更新
–DELETE: 削除
�Statelessな呼び出しプロトコル
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 などで呼び出し
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
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()
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;……
}
IBM Software Group
24
まとめまとめまとめまとめ
� Java EEはより簡単に,よりスリムになっていきます
� Java EE 5が,「今までと同じ事がより簡単にできる」更新だったのに対しJava EE 6は,「今まで出来なかったことができる」という更新です
� Servlet/JSP/JSFといった,変化が少なかったAPIにも大幅な機能追加が
� RESTfullアプリケーション,Ajaxアプリケーションなど技術に対応
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