Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 1 Yoshio Terada Java Evangelist http://yoshio3.com , Twitter : @yoshioterada Java EE 6 かか Java EE 7 かかかかか 【 H-1 】
Copyright © 2013, Oracle and/or its affiliates. All rights reserved.1
Yoshio TeradaJava Evangelist
http://yoshio3.com,
Twitter : @yoshioterada
Java EE 6 からJava EE 7 に向かって
【 H-1】
Copyright © 2013, Oracle and/or its affiliates. All rights reserved.2
以下の事項は、弊社の一般的な製品の方向性に関する概要を説明するものです。また、情報提供を唯一の目的とするものであり、いかなる契約にも組み込むことはできません。以下の事項は、マテリアルやコード、機能を提供することをコミットメント(確約)するものではないため、購買決定を行う際の判断材料になさらないで下さい。オラクル製品に関して記載されている機能の開発、リリースおよび時期については、弊社の裁量により決定されます。
Oracle は、米国オラクルコーポレーション及びその子会社、関連会社の米国及びその他の国における登録商標です。文中の社名、商品名等は各社の商標または登録商標である場合があります。
Copyright © 2013, Oracle and/or its affiliates. All rights reserved.3
はじめに
Copyright © 2013, Oracle and/or its affiliates. All rights reserved.4
2009 年 12 月 9 日
Java EE 6 リリース
Copyright © 2013, Oracle and/or its affiliates. All rights reserved.5
1998 年 5 月
エンタープライズアプリケーション
1999 年 12 月10 specs
堅牢スケーラブル
2001 年 9 月13 specs
Web サービス
2003 年 11 月20 specs
かんたん開発
2006 年 5 月23 specs
軽量化
2009 年 12 月28 specs
Project JPE
J2EE 1.3
CMP,ConnectorArchitecture
Java EE 5
Ease of Development,Annotations,EJB 3.0, JPA, JSF, UpdatedWeb Services
J2EE 1.4Web Services Mgmt, Deployment,AsyncConnector
Java EE 6
Pruning,ExtensibilityEase of Dev,CDI, JAX-RS
Web Profile
Servlet 3.0, EJB 3.1 Lite
J2EE 1.2Servlet, JSP,EJB, JMSRMI/IIOP
Java EE の歴史
Copyright © 2013, Oracle and/or its affiliates. All rights reserved.6
Connector1.6
JPA 2.1 JTA 1.2 JMS
Managed Bean 1.0 EJB 3.1
Common Annotations
1.1
Interceptors 1.1
CDI 1.0
PortableExtensio
ns Servlet 3.1
JSPJSF 2.0
JAX-RS ELB
ean
Valid
atio
n
Java EE 6 に含まれる技術
Copyright © 2013, Oracle and/or its affiliates. All rights reserved.7
2010 年 1 月 27 日
Copyright © 2013, Oracle and/or its affiliates. All rights reserved.8
Copyright © 2013, Oracle and/or its affiliates. All rights reserved.9
拡張性プロファイル仕様の削減かんたん開発
Java EE 6 のテーマ
開発生産性の大幅向上
Copyright © 2013, Oracle and/or its affiliates. All rights reserved.10
web.xml<web-app> フレームワーク A フレームワーク B フレームワーク C フレームワーク D</web-app>
外部フレームワークの設定が容易
フレームワーク A<web-fragment> ….</web-fragment>
フレームワーク B<web-fragment> ….</web-fragment>
web.xml<web-app> <absolute-ordering> <name>B</name> <name>A</name> <absolute-ordering> </web-app>
拡張性
Copyright © 2013, Oracle and/or its affiliates. All rights reserved.11
プロファイル
Full Java EE 6 (Enterprise Platform)
Web Profile
Java EE のサブセットを提供Web 開発に特化 & 軽量
Copyright © 2013, Oracle and/or its affiliates. All rights reserved.12
Pruning ( 枝きり、剪定 ) → 仕様の削減
古く使われなくなって仕様の整理
次期バージョンで削除JAX-RPCEJB Entity BeanJAX-Rなど
→ JAX-WS→ JPA
Copyright © 2013, Oracle and/or its affiliates. All rights reserved.13
Java EE 対応統合開発環境
Copyright © 2013, Oracle and/or its affiliates. All rights reserved.14
開発効率が悪いテストも大変
J2EE の全技術は不要複雑なパッケージング
XML 設定地獄実行環境も重量
Copyright © 2013, Oracle and/or its affiliates. All rights reserved.15
JSF 2.0 : コンポーネント・ベース開発
Copyright © 2013, Oracle and/or its affiliates. All rights reserved.16
Web ページ作成者( デザイナー )
アプリケーション開発者
コンポーネント開発者
DB
BackEnd処理
JSF 2.0 : 役割に応じて疎で開発が可能
Copyright © 2013, Oracle and/or its affiliates. All rights reserved.17
EJB 3.1
• パッケージの簡略化• EJB 3.1 “Lite” の提供• ローカルビジネスインタフェースのオプション化• 標準化された Global JNDI 名• Java SE に組み込み可能な EJB コンテナ• その他の新機能
Copyright © 2013, Oracle and/or its affiliates. All rights reserved.18
JPA 2.0
• パッケージの簡略化 JPA 2.0 = JPA 1.0 + α• モデリングの強化• JPQL 新しい構文の追加• Criteria API の提供• メタモデル API の提供• 悲観的ロックの追加• バリデーションのサポート• 設定オプションの標準化
Copyright © 2013, Oracle and/or its affiliates. All rights reserved.19
テストも大変 開発効率が悪い
J2EE の全技術は不要複雑なパッケージング
XML 設定地獄実行環境も重量
Copyright © 2013, Oracle and/or its affiliates. All rights reserved.20
Java EE
Application Server
Web Container
EJB テストリモート・ lookup
JSP Servlet JSF
EJB Container
EJB EJB EJBDB
Java SE
EJB 3.0 までの単体テストは困難
アプリケーション・サーバへのデプロイが必要
Copyright © 2013, Oracle and/or its affiliates. All rights reserved.21
EJBテスト
EJB Container
EJB EJB EJB
Java SE
DB
EJB 3.1 組み込み可能コンテナ
アプリケーション・サーバへのデプロイは不要
EJBContainer container = EJBContainer.createEJBContainer();
Java SE のアプリケーションから EJB コンテナを起動
Copyright © 2013, Oracle and/or its affiliates. All rights reserved.22
組み込み可能コンテナを利用したテスト
public void testSayHello() { EJBContainer container = EJBContainer.createEJBContainer(); try{ Hello hello = (Hello)container.getContext().lookup ("java:global/classes/Hello"); System.out.println(hello.sayHello()); }catch(Exception e){ e.printStackTrace(); }}
Copyright © 2013, Oracle and/or its affiliates. All rights reserved.23
J2EE の全技術は不要
開発効率が悪いテストも大変
複雑なパッケージング XML 設定地獄
実行環境も重量
Copyright © 2013, Oracle and/or its affiliates. All rights reserved.24
Java EE 5 まではフル・スペックを提供
Java EE 5 Specification
JSP Servlet JSF EJB JMS
JTA Java Mail JAXP JAX-WSJPA
JAXB JAXR JDBC JAAS
JNDI
・・・
頻繁に使用しない機能もフル・セットで提供 不要モジュールもロードしメモリ消費 実行環境の起動、再起動も遅い
Copyright © 2013, Oracle and/or its affiliates. All rights reserved.25
Java EE 6 : プロファイル
Full Java EE 6 (Enterprise Platform)
Web Profile
全機能のサブセット版を提供 Web の開発に特化 ( これさえあれば Web 開発は十分 ) 軽量
Copyright © 2013, Oracle and/or its affiliates. All rights reserved.26
Web プロファイルに含まれる仕様
Servlet 3.0 JPA 2.0
JSP 2.2/EL JTA 1.1
JSTL DI 1.0/CDI 1.0
JSF 2.0 Managed Bean 1.0
Bean Validation 1.0 Interceptors 1.1
EJB 3.1 Lite Common Annotations
Java EE 6 Web Profile
これさえあれば Web 開発は十分
Copyright © 2013, Oracle and/or its affiliates. All rights reserved.27
複雑なパッケージング
開発効率が悪いテストも大変
J2EE の全技術は不要
XML 設定地獄実行環境も重量
Copyright © 2013, Oracle and/or its affiliates. All rights reserved.28
WEB-INF/web.xml
WEB-INF/resources
WEB-INF/classes/FooServlet.class
com/oracle/FooBean.class
com/oracle/Foo.class
foo_web.war
foo_ejb.jar
foo.ear
com/oracle/Foo.class
lib/foo_common.jar
foo.ear
WEB-INF/web.xml
WEB-INF/classes/FooServlet.class
foo_web.war
com/oracle/FooBean.class
foo_ejb.jar
Java EE 5 までのパッケージの手間
適切なアーカイブファイル(ear, jar, war)
へのパッケージングが必要
Copyright © 2013, Oracle and/or its affiliates. All rights reserved.29
Java EE 6 のパッケージング
WEB-INF/web.xmlWEB-INF/resourcesWEB-INF/classes/FooServlet.class
WEB-INF/classes/com/oracle/FooBean.class
(EJB)WEB-INF/classes/com/oracle/Foo.class
foo.war
EJB も war ファイルへ !!配備記述子は不要 !!
Copyright © 2013, Oracle and/or its affiliates. All rights reserved.30
XML 設定地獄
開発効率が悪いテストも大変
J2EE の全技術は不要複雑なパッケージング
実行環境も重量
Copyright © 2013, Oracle and/or its affiliates. All rights reserved.31
Java EE 5 以降の設定
Configuration by Exception
必要に応じてデフォルト設定値を上書きする設定手法
アノテーションによる設定
Copyright © 2013, Oracle and/or its affiliates. All rights reserved.32
import javax.servlet.annotation.InitParam;
import javax.servlet.annotation.WebServlet;
@WebServlet( name = "SimpleServlet",
urlPatterns = {"/simple"},
initParams = {
@InitParam(name = "param1", value = "value1"),
@InitParam(name = "param2", value = "value2")
} )
public class SimpleServlet { }
Servlet 3.0 のアノテーション
Copyright © 2013, Oracle and/or its affiliates. All rights reserved.33
JSF 2.0 のアノテーション
import javax.faces.bean.ManagedBean;
@ManagedBean(name="user")
@SessionScoped
public class UserBean {
private String name="";
private String password;
}
Copyright © 2013, Oracle and/or its affiliates. All rights reserved.34
EJB 3.1 のアノテーション
@Stateless
public class HelloBean {
public String sayHello(){
return “Hello”;
}
}
ローカル・ビジネス・インタフェースの実装も不要
Copyright © 2013, Oracle and/or its affiliates. All rights reserved.35
実行環境も重量
開発効率が悪いテストも大変
J2EE の全技術は不要複雑なパッケージング
XML 設定地獄
Copyright © 2013, Oracle and/or its affiliates. All rights reserved.36
アプリケーション・サーバも軽量化
Web Profile 版の起動時間: 3〜 4秒
不要サービスの未初期化
再起動時間の大幅短縮
小メモリで稼働
開発効率・運用管理コストの大幅向上
Copyright © 2013, Oracle and/or its affiliates. All rights reserved.37
シンプル化
HTML 5 対応
Java EE 7 のテーマ
Java EE 6 のプラス α
Copyright © 2013, Oracle and/or its affiliates. All rights reserved.38
Java EE 7 へ含まれる予定の JSR 一覧
Connector1.6
JPA 2.1 JTA 1.2 JMS 2.0
Managed Bean 1.0 EJB 3.2
Common Annotations
1.1
Interceptors 1.1
CDI 1.1
PortableExtensio
ns Servlet 3.1
JSP 2.2JSF 2.2
JAX-RS 2.0
EL 3.0
Bean
Valid
atio
n1
.1
Concurrency Utilities for
EE
Batch Application(JSR-352)
Java API forJSON
(JSR-353)
Java API forWebSocket(JSR-356)
新規追加 大幅な更新 通常の更新
Copyright © 2013, Oracle and/or its affiliates. All rights reserved.39
Java EE 7 の新機能詳細は火曜日に
Java API forWebSocket(JSR-356)
BatchApplication(JSR-352)
ConcurrencyUtilities for EE
(JSR-236)
Copyright © 2013, Oracle and/or its affiliates. All rights reserved.40
JSR 353 : Java API for Processing JSON
Java API forJSON
(JSR-353)
Copyright © 2013, Oracle and/or its affiliates. All rights reserved.41
RFC 4627 The application/json Media Type forJavaScript Object Notation
軽量、テキストベース、プログラミング言語に非依存移植性が高く、構造化されたデータ交換フォーマット
{“name”:”Bob”,”age”:20,”phone”:[“276 1234”,”124 4567”]}
JSON とは
Copyright © 2013, Oracle and/or its affiliates. All rights reserved.42
JSR 353 : Java API for Processing JSON
Streaming API– 低レベル– JSON の解析や生成の効率的な方法
Object Model API– 高レベル– Streaming よりもかんたんに実装可能– Streaming API 上に実装
Streaming & Object Model
Copyright © 2013, Oracle and/or its affiliates. All rights reserved.43
JSON API のアーキテクチャ
JSON プロバイダ
SPI
Streaming API
Object ModelAPI
APP1 APP2 APP n・・・
便利な機能
低レベル API
Copyright © 2013, Oracle and/or its affiliates. All rights reserved.44
{
"firstName": "John", "lastName": "Smith", "age": 25,
"phoneNumber": [
{ "type": "home", "number": "212 555-1234" },
{ "type": "fax", "number": "646 555-4567" }
]
}
JSON データのサンプル
Copyright © 2013, Oracle and/or its affiliates. All rights reserved.45
Streaming API (低レベル : StAX ライクな実装 )
Copyright © 2013, Oracle and/or its affiliates. All rights reserved.46
JsonParser インスタンスの生成方法 (読み込み 2通り )
JsonParser parser = javax.json.Json#createParser()
JsonParser parser = Json#createParserFactory()#createParser()
Copyright © 2013, Oracle and/or its affiliates. All rights reserved.47
{
"firstName": ”Taro", "lastName": ”Yamada", "age": 25,
"phoneNumber": [
{ "type": "home", "number": "212 555-1234" },
{ "type": "fax", "number": "646 555-4567" }
]
}
START_OBJECT
Streaming API – JsonParser (低レベル操作 )
Copyright © 2013, Oracle and/or its affiliates. All rights reserved.48
{
"firstName": ”Taro", "lastName": ”Yamada", "age": 25,
"phoneNumber": [
{ "type": "home", "number": "212 555-1234" },
{ "type": "fax", "number": "646 555-4567" }
]
}
KEY_NAME
Streaming API – JsonParser (低レベル操作 )
Copyright © 2013, Oracle and/or its affiliates. All rights reserved.49
{
"firstName": ”Taro", "lastName": ”Yamada", "age": 25,
"phoneNumber": [
{ "type": "home", "number": "212 555-1234" },
{ "type": "fax", "number": "646 555-4567" }
]
}
VALUE_STRING
Streaming API – JsonParser (低レベル操作 )
Copyright © 2013, Oracle and/or its affiliates. All rights reserved.50
{
"firstName": ”Taro", "lastName": ”Yamada", "age": 25,
"phoneNumber": [
{ "type": "home", "number": "212 555-1234" },
{ "type": "fax", "number": "646 555-4567" }
]
}
VALUE_NUMBER
Streaming API – JsonParser (低レベル操作 )
Copyright © 2013, Oracle and/or its affiliates. All rights reserved.51
{
"firstName": ”Taro", "lastName": ”Yamada", "age": 25,
"phoneNumber": [
{ "type": "home", "number": "212 555-1234" },
{ "type": "fax", "number": "646 555-4567" }
]
}
START_ARRAY
Streaming API – JsonParser (低レベル操作 )
Copyright © 2013, Oracle and/or its affiliates. All rights reserved.52
{
"firstName": ”Taro", "lastName": ”Yamada", "age": 25,
"phoneNumber": [
{ "type": "home", "number": "212 555-1234" },
{ "type": "fax", "number": "646 555-4567" }
]
}END_ARRAY
Streaming API – JsonParser (低レベル操作 )
Copyright © 2013, Oracle and/or its affiliates. All rights reserved.53
{
"firstName": ”Taro", "lastName": ”Yamada", "age": 25,
"phoneNumber": [
{ "type": "home", "number": "212 555-1234" },
{ "type": "fax", "number": "646 555-4567" }
]
} END_OBJECT
Streaming API – JsonParser (低レベル操作 )
Copyright © 2013, Oracle and/or its affiliates. All rights reserved.54
{
"firstName": ”Taro", "lastName": ”Yamada", "age": 25,
"phoneNumber": [
{ "type": "home", "number": "212 555-1234" },
{ "type": "fax", "number": "646 555-4567" }
]
}
例 – 値 “ John” の取得方法 (低レベル )
Copyright © 2013, Oracle and/or its affiliates. All rights reserved.55Copyright © 2013, Oracle and/or its affiliates. All rights reserved.55
try (Reader reader =
new FileReader(”~/json.dat");) {
JsonParser parser = Json.createParser(reader);
JsonParser.Event event = null;
event = parser.next(); //START_OBJECT の取得
event = parser.next(); //KEY_NAME “firstName” の取得 System.out.println(parser.getString());
} catch (IOException ioe) {
logger.log(Level.SEVERE, null ,ioe);
} {"firstName": ”Taro"
Copyright © 2013, Oracle and/or its affiliates. All rights reserved.56
Object Model API (扱い易い : DOM ライクな実装 )
Copyright © 2013, Oracle and/or its affiliates. All rights reserved.57
try (JsonReader jsonReader = Json.createReader(reader)) {
JsonObject jObj = jsonReader.readObject();
if(jObj.containsKey("firstName")){
String value = jObj.getString("firstName");
System.out.println(value); // Taro
}
}
JSonObject から特定 Key の Value を取得Key と Value の型が分かっている場合に有効
{ "firstName": ”Taro", ……}
Copyright © 2013, Oracle and/or its affiliates. All rights reserved.58
if(jObj.containsKey("phoneNumber")){
JsonArray array = jObj.getJsonArray("phoneNumber");
for(JsonValue phoneValue : array){
if(phoneValue.getValueType() ==
JsonValue.ValueType.OBJECT){
JsonObject arrayElem =
array.getJsonObject(array.indexOf(phoneValue));
if(arrayElem.containsKey("type")){ }
"phoneNumber": [ { "type": "home”, ..}, { "type": "home”, ..} …… ]
JSonObject から特定 Array を取得
Copyright © 2013, Oracle and/or its affiliates. All rights reserved.59
Builder から JsonObject の生成
JsonObject jsonObject = Json.createObjectBuilder(). // {
add(”KEY1", ”VALUE1"). //”KEY1": ”VALUE1”
add(”KEY2", //”KEY2":
Json.createArrayBuilder(). // [
add(Json.createObjectBuilder(). //{
add(”KEY3", ”VALUE3"))). //”KEY3": ”VALUE3" }
build();
{"KEY1":"VALUE1","KEY2":[{"KEY3","VALUE3”}]}
Copyright © 2013, Oracle and/or its affiliates. All rights reserved.60
try (BufferedReader br =
new BufferedReader(new FileReader(”~/json.dat"));
JsonReader jsonReader = Json.createReader(br)) {
JsonObject jObj = jsonReader.readObject();
...
} catch (IOException ex) {
logger.log(Level.SEVERE, null, ex);
}
I/O から JSonObject の読み込み
Copyright © 2013, Oracle and/or its affiliates. All rights reserved.61
JSR 341:
Expression Language 3.0
EL 3.0
Copyright © 2013, Oracle and/or its affiliates. All rights reserved.62
Lambda 式対応– Array, List, Map の構成
コレクションに対するクエリ演算子 (LINQ式 ) Java SE 環境で利用するための API を提供 デフォルトの EL 実行環境マネージャの追加 クラス (static) 変数、クラス (static) メソッド、 enum 定数対応 クラス、パッケージのインポート
新機能の一覧
EL 3.0
Copyright © 2013, Oracle and/or its affiliates. All rights reserved.63
名前空間を持つ Name– reference, import
関数定義 コンストラクタ 新しい演算子
– 文字列連結演算子、変数割当用演算子型変換表記の評価用のリスナー
新機能の一覧
EL 3.0
Copyright © 2013, Oracle and/or its affiliates. All rights reserved.64
<h:dataTable id="tabledata" value=”#{
afilter =indexManagedBean.ageFileter ;
indexManagedBean.data.stream().
filter(p-> p.age >= afilter).
toList()}" var="person" border="1"> <h:column>
<f:facet name="header">
<h:outputText value=" 名前 "/>
</f:facet>
<h:outputText value="#{person.name}"/>
</h:column>
EL 式内で Lambda 式を記述 ( コレクション操作 )
Copyright © 2013, Oracle and/or its affiliates. All rights reserved.65
JSR 343: Java™ Message Service 2.0
JMS 2.0
Copyright © 2013, Oracle and/or its affiliates. All rights reserved.66
かんたんに実装できるようになった API– JMSContext, JMSProducer, JMSConsumer の追加
例外の実装方法の変更既存 API に対する改善 CDI を利用した冗長コードの排除
クラウド機能は Java EE 8 へ
新機能の一覧
JMS 2.0
Copyright © 2013, Oracle and/or its affiliates. All rights reserved.67Copyright © 2013, Oracle and/or its affiliates. All rights reserved.67
@Stateless
public class MailRegJMSSendQueueEJB {
@Resource(mappedName = "java:comp/
DefaultJMSConnectionFactory")
ConnectionFactory conn;
@Resource(mappedName = "jms/mailRegistQueue")
Queue queue;
public void registEmailAddress(String emailAddress) {
try (JMSContext context = conn.createContext()) {
context.createProducer().
send(queue,emailAddress);
}}}
送信コード (Java EE 7)
Copyright © 2013, Oracle and/or its affiliates. All rights reserved.68Copyright © 2013, Oracle and/or its affiliates. All rights reserved.68
@MessageDriven(mappedName = "jms/mailRegistQueue")
public class SendMessageMDB implements MessageListener {
@Inject
MailSender mailSender;
@Override
public void onMessage(Message message) {
try {
TextMessage msg = (TextMessage) message;
mailSender.sendMessage(msg.getText());
} catch (JMSException jmse) {
logger.log(Level.SEVERE, …);
}}}受信コード MDB(Java EE 7)
Copyright © 2013, Oracle and/or its affiliates. All rights reserved.69
Java EE 7 の新機能詳細は火曜日に
Java API forWebSocket(JSR-356)
BatchApplication(JSR-352)
ConcurrencyUtilities for EE
(JSR-236)
Copyright © 2013, Oracle and/or its affiliates. All rights reserved.70
Copyright © 2013, Oracle and/or its affiliates. All rights reserved.71