278
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 1 Yoshio Terada Java Evangelist http://yoshio3.com , Twitter : @yoshioterada

Java EE 6 & Java EE 7 features

Embed Size (px)

DESCRIPTION

This explains Java EE 6 & Java EE 7 features.

Citation preview

Page 1: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 1

Yoshio Terada Java Evangelist http://yoshio3.com, Twitter : @yoshioterada

Page 2: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 2

以下の事項は、弊社の一般的な製品の方向性に関する概要を説明するものです。また、情報提供を唯一の目的とするものであり、いかなる契約にも組み込むことはできません。以下の事項は、マテリアルやコード、機能を提供することをコミットメント(確約)するものではないため、購買決定を行う際の判断材料になさらないで下さい。オラクル製品に関して記載されている機能の開発、リリースおよび時期については、弊社の裁量により決定されます。

Oracleは、米国オラクルコーポレーション及びその子会社、関連会社の米国及びその他の国における登録商標です。文中の社名、商品名等は各社の商標または登録商標である場合があります。

Page 3: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 3

Java EE の 歴史と今後について

Page 4: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 4

1998年5 月

エンタープライズ アプリケーション

1999年12月 10 specs

堅牢 スケーラブル

2001年9月 13 specs

Web サービス

2003年11月 20 specs

Project JPE

J2EE 1.3 CMP, Connector Architecture

J2EE 1.4 Web Services Mgmt, Deployment, Async Connector

J2EE 1.2 Servlet, JSP, EJB, JMS RMI/IIOP

Java EE の歴史

Page 5: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 5

独自フレームワークの組み合わせ (今まで) 運用・保守性の低下

JSP Servlet EL

+ Struts spring HIBERNATE

AXIS

OpenEJB

Jersey

Webコンテナ (Tomcat等)

Page 6: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 6

Page 7: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 7

Struts 1.x : 1.3 % Struts 2.x : 1.3 %

Results of Eclipse Community Survey 2012 http://www.eclipse.org/org/press-release/20120608_eclipsesurvey2012.php

Struts 1 は 2013 年 4 月 製品ライフサイクル終了

フレームワーク活用のトレンド:世界

Page 8: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 8

以前と状況は 変わっている

Page 9: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 9

Rod は会社を去り 今はプロプラ技術

Page 10: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 10

Paul Maritz 曰く(EMC World)

30歳以下はJavaを使わない

Rubyをはじめとする新たな開発 フレームワークとの親和性を高め、新世代のプログラマもターゲット

Page 11: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 11

Pivotal 社の将来的な業績予測 も必要

Page 12: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 12

OSS だから安心

Page 13: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 13

OSS で安心できる場合

各OSS ライセンスに従い ソースコード・レベルで治す人、治せる人

OSS をベースとした製品の サポート契約を締結されている場合

Page 14: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 14

独自フレームワーク利用時のリスク セキュリティの脆弱性の対処 ライブラリ間の相性問題 バージョン・アップ

Page 15: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 15

メンテナンス・コストの増大

納品物の構成 Struts

提供サービス

struts.apache.org/ www.springsource.org/ www.hibernate.org/

実行環境 OSS はソースコードが公開 メンテナンスは利用者の負担が必要

Spring Hibernate

Page 16: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 16

納品後に発注者のコスト負担が大 ●フレームワーク毎に脆弱性情報の随時  チェックが必要 ●1つに脆弱性が発生した場合、他との  互換性は誰が保証するか不明 ●フレームワーク互換性に対するテスト工数 ●セキュリティ専任技術者の確保が必要

実行環境が Tomcat ならば、さらに負担が大

Struts

提供サービス

Spring Hibernate

Page 17: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 17

2013 年 7 月 18 日

Page 18: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 18 WebLogic/GlassFish に標準で含まれる技術を利用

Java EE で発注者の負担が大幅軽減

●Java EE 準拠サーバより脆弱性情報・   パッチ提供が通知 ●各技術間の互換性は、膨大なテストを  実施後正式リリース ●上記より無駄なテスト工数を排除 ●サーバ管理者による管理が可能

Java EE

(オール・イン・ワン)

提供サービス

Page 19: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 19

軽量化のメリット

Page 20: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 20

WEB-INF/lib/aopalliance-1.0.jar WEB-INF/lib/hibernate-validator-4.1.0.Final.jar WEB-INF/lib/jcl-over-slf4j-1.6.1.jar WEB-INF/lib/joda-time-1.6.2.jar WEB-INF/lib/joda-time-jsptags-1.0.2.jar WEB-INF/lib/jstl-1.2.jar WEB-INF/lib/log4j-1.2.16.jar WEB-INF/lib/slf4j-api-1.6.1.jar WEB-INF/lib/slf4j-log4j12-1.6.1.jar WEB-INF/lib/spring-aop-3.0.5.RELEASE.jar ……

実装コード以外も必要 ?

ファイルサイズ 4.43 MB

Page 21: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 21

war ファイル・サイズ比較

Page 22: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 22

サーバ側のリソースを開発時から利用

開発者

参照

ライブラリは サーバ側で保持

Page 23: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 23

アプリケーション起動時間 配備時間の大幅短縮

運用・保守性の向上

Page 24: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 24

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, Connector Architecture

Java EE 5 Ease of Development, Annotations, EJB 3.0, JPA, JSF, Updated Web Services

J2EE 1.4 Web Services Mgmt, Deployment, Async Connector

Java EE 6 Pruning, Extensibility Ease of Dev, CDI, JAX-RS

Web Profile

Servlet 3.0, EJB 3.1 Lite

J2EE 1.2 Servlet, JSP, EJB, JMS RMI/IIOP

Java EE 5以降 かんたん・軽量

Page 25: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 25

コード行数 XML設定 クラス数

* JavaOne向けに構築されたPOJO/JPA/RESTベースのサンプル・アプリケーション

開発効率の大幅な改善

Page 26: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 26

Java: 世界中の広範囲な適用

9,000,000 JAVA DEVELOPERS

DEPLOYING TO 18 COMPLIANT APPLICATION SERVERS

Page 27: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 27

NTTドコモが顧客情報管理システムのアプリケーション 実行基盤として 「Oracle WebLogic Server」を導入し稼働開始

「ALADIN」 は、 従来よりエンタープライズ Java の標準仕様である Java Platform, Enterprise Edition (EE) に準拠したシステム構築を行っていたため、アプリケーション・サーバー製品の移行に起因する追加開発や修整作業を必要最小限におさえ、順調に稼動させることができました。

※ 2013 年 4 月 18 日 ORACLE ニュース・リリースより http://japanmediacentre.oracle.com/content/detail.aspx?ReleaseID=2889&NewsAreaId=2#downloads

Page 28: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 28

Java EE 利用者の声

三菱UFJインフォメーション テクノロジー ITプロデュース部 斉藤賢哉氏

ロックインが懸念される ベンダー固有の技術ではなく、 オープンな仕様であり、 長く安心して取り組める技術

Page 29: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 29

Java EE 6に移行することで、構築したアプリケーションのライフサイクルを延長でき、技術トレンドに沿った機能を容易に導入できるようになる。また、サードパーティ製ライブラリへの依存を減らすことで、管理性や安定性が向上し、コードの修正が容易な環境を実現できるだろう

Java EE 利用者の声

楽天株式会社 岩崎浩文氏

Page 30: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 30

アリエルネットワーク株式会社CTO 井上 誠一郎氏

Java EE 利用者の声

Java EEが使える標準技術になったことで、Java EEの選択が長期開発におけるリスクを大きく軽減できると期待しています。

Page 31: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 31

Java EE 利用者の声

NTTデータビジネスブレインズ ビジネスソリューション事業部伊賀敏樹氏

これまでのJava EEに対する印象を、一度リセットする必要があると感じた。特にJSFは今では大好きな技術の1つ。小規模な案件でJava EE 6とFaceletsの組み合わせを採用するケースも出てきている

Page 32: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 32

builder ‒ WebLogic Channel

Java EE に関する情報の宝庫 •  .Net 開発者の Java EE 移行経験談 •  Java EE の新機能のご紹介 •  Struts から JSF への移行ポイント

•  など

Page 33: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 33

独自技術から標準技術への移行

DB

画面デザイン 依存性注入

・ ビジネス ロジック

DB連携 O/Rマップ

利用者

Struts

JSF

spring

DI/CDI/ EJB

HIBER NATE

JPA

独自技術の 組み合わせ

Java EE 標準

Page 34: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 34

Java EE 6 プラットフォーム 2009年12月10日

Page 35: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 35

拡張性 プロファイル 仕様の削減 かんたん開発

Java EE 6 のテーマ

開発生産性の大幅向上

Page 36: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 36

wweebb..xxmmll <web-app> フレームワーク AA フレームワーク BB フレームワーク CC フレームワーク DD </web-app>

§ 外部フレームワークの設定が容易 フレームワークAA <web-fragment> …. </web-fragment>

フレームワークBB <web-fragment> …. </web-fragment>

wweebb..xxmmll <web-app> <absolute-ordering> <name>BB</name> <name>AA</name> <absolute-ordering> </web-app>

拡張性

Page 37: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 37

プロファイル

Full Java EE 6 (Enterprise Platform)

Web Profile

Java EE のサブセットを提供 Web 開発に特化 & 軽量

Page 38: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 38

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 開発は十分

Page 39: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 39

Pruning (枝きり、剪定) → 仕様の削減

古く使われなくなって仕様の整理 次期バージョンで削除 JAX-RPC EJB Entity Bean JAX-R など

→ JAX-WS → JPA

Page 40: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 40

かんたん開発

•  全てのWeb API でアノテーションを利用可能

•  web.xmlはオプション化

•  RESTful Webサービス対応

Page 41: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 41

Connector 1.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

Portable Extensions

Servlet 3.1

JSP JSF 2.0 JAX-RS EL Bean Validation

Java EE 6 に含まれる技術

Page 42: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 42

Page 43: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 43

Java EE 6 の基本構成

DB

画面デザイン 依存性注入

・ ビジネス ロジック

DB連携 O/Rマップ

利用者

JSF/ JAX-RS

DI/CDI/ EJB

JPA JMS/MDB

Java EE 標準

Page 44: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 44

HTML 5 対応のフレームワーク選定

従来型 アプリ View

Model

HTTP/JS

View

Service

アプリ HTTP/JS

JSON

View

Model 次世代型

Page 45: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 45 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 16

JavaServer Faces

Page 46: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 46

Java EE の一般的なアプリケーション構成

DB

JSF CDI

EJB

クライアント Web アプリケーション

Web コンテナ

JPA (O/R Mapping)

Page 47: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 47

豊富なコンポーネント

JSF : コンポーネント・ベース開発

Page 48: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 48

JSFフレームワークと開発の概要

JavaServer Faces

DB

Web サービス

プレゼン テーション

•  アプリケーションロジック •  コンバート (変換) •  バリデーション (検証) •  ナビゲーション (画面遷移) •  イベント処理

ビジネスロジック クライアント Web アプリケーション

Web コンテナ

Page 49: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 49

JSF における MVC

ビュー (XHTML)

コントローラ (Faces Servlet)

モデル (マネージド Bean)

操作・ リダイレクト

生成・管理

アクセス

HTTP リクエスト

HTTP レスポンス

Page 50: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 50

コンバータ

ブラウザ HTML JavaScript CSS

バリデータ

JSF の内部アーキテクチャ

レンダラ

XUL JSP

XHTML

faces-config.xml (省略可能)

Faces Servlet (コントローラ)

マネージド Bean

コンポーネント コンポーネント

HTTP リクエスト

HTTP レスポンス

Page 51: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 51

Webページ作成者 (デザイナー)

アプリケーション開発者

コンポーネント開発者

JSF 開発者の役割(役割毎に疎で開発可能)

DB

BackEnd 処理

Page 52: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 52

Webページ作成者 (デザイナー)

アプリケーション開発者

コンポーネント開発者

Web ページ作成者 (プレゼンテーション)

DB

BackEnd 処理

Page 53: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 53

Web ページの基本

テキストフィールド

ラジオボタン コンボボックス

テキストフィールド

ボタン

Page 54: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 54

HTML タグ JSF タグ <INPUT TYPE=“TEXT” value=“”> <h:inputText id="username" value=""/>

HTMLと対応するJSFタグ

HTML タグ JSF タグ <input type=“radio” name=“sex” ! value=“1”> 男性 !<input type=“radio” name=“sex” ! value=“2”> 女性

<h:selectOneRadio id=”sex” value="sex">! <f:selectItem itemValue="1" itemLabel="男性" />! <f:selectItem itemValue="2" itemLabel="女性" />!</h:selectOneRadio>

<h:inputText> タグ

<h:selectOneRadio> タグ

テキストフィールド

ラジオボタン

Page 55: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 55

HTML タグ JSF タグ <select size="1"> ! <option value=”1">北海道</option> ! <option value=”2">青森</option> ! <option value=”3">岩手</option>! …!</select>

<h:selectOneMenu>! <f:selectItem itemValue="1" itemLabel="北海道" />! <f:selectItem itemValue="2" itemLabel="青森" />! <f:selectItem itemValue="3" itemLabel="岩手" />! …!</h:selectOneMenu>

HTMLと対応するJSFタグ

HTML タグ JSF タグ <input type="submit" value="確認画面へ進む" /> <h:commandButton value="確認画面へ進む" />

<h:selectOneMenu> タグ

<h:commandButton> タグ

コンボボックス

ボタン

Page 56: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 56

http://javaserverfaces.java.net/nonav/docs/2.0/pdldocs/facelets/

標準仕様で用意されている JSF タグ

Page 57: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 57

HTML 4.0 & DHTML 属性利用可

onblur onchange

onclick ondblclick onfocus

onkeydown

onkeypress

onmousem

ove

onkeyup

onload

onmousedown

onfocus onmouseout

onmouseup

onmouseover

onreset

onselect

onsubmit

onunload

accesskey

accept

acceptcharset

alt

border

charset

coords

dir

disabled

hreflang lang

maxlength

readonly

rel

rev rows

shape

size

style

styleClass

tabindex

target title

type

width

Page 58: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 58

スタイルシートの適用

<HTML>! <h:head>! <h:outputStylesheet" library="css" ! name="commonpage.css”/>! </h:head>! <h:body>! ……(省略)!! <h:inputText class="intext" ! id="username" value=""/>

※ 全外部リソースは /resources ディレクトリ配下に配置   libraryで指定した css/ よりファイルを取得  

.intext {! width: 300px;! border: solid 1px #000099;! background-color: #9999ff;! }

Page 59: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 59

JavaScript の読み込み (h:outputScript) <h:head>! <h:outputScript library="javascript" ! name="checkPassword.js"/> !</h:head>!<h:body>! <h:form>! ログイン名: <h:inputText/>!! パスワード:

<h:inputSecret id="password"/> ! パスワード(確認): <h:inputSecret id="passwordConfirm"/>!! <h:commandButton type="button" ! value="Submit Form"! onclick="checkPassword(this.form)"/>! </h:form> !</h:body>

function checkPassword(form) {! var password = form[form.id + ! ":password"].value;! var passwordConfirm = form[form.id + ! ":passwordConfirm"].value;! if (password == passwordConfirm)! form.submit();! else! alert(”! パスワードと確認用パスワードの内容が違います”! );!}

JavaScriptのコード JSF (Facelets) のコード

/resources/javascript/checkPassword.js!

Page 60: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 60

表示メッセージの国際化対応

ロケール:ja_JP ロケール:en_US

<h:outputText value="#{msgs.userName1}"/>

表示用の文字列をプロパティより取得 対応ロケールに応じた適切な文字列を取得

Page 61: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 61

properties ファイルの作成と利用方法 <h:outputText value="#{msgs.userName1}"/>

<faces-config …!<application>! <resource-bundle>! <base-name>! jp.co.oracle.msgs.msgproperties! </base-name>! <var>msgs</var>! </resource-bundle>!</application>!</faces-config> faces-config.xml

/WEB-INF/classes 配下に作成

userName1=名前

userName1=Name _en_US.properties

_ja_JP.properties

Page 62: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 62

1 ヘッダ部作成

2 左ペイン作成

4 フッダ部作成

3 右ペイン作成

共通部分の作成

5 テンプレート作成

テンプレートの作成

コンテンツ

各種ページの作成

コンテンツ

コンテンツ

コンテンツ

コンテンツ

コンテンツ

ご参考: http://yoshio3.com/2011/01/14/jsf20-new-with-facelets-template/

強力なテンプレート機能

Page 63: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 63

デザイナーと開発者の共同作業が可能に (jsfc=“”)

§  デザイナーはテキスト&ブラウザで確認 §  プログラマーはJSP&Webコンテナで確認 §  プログラム後のデザイン修正は困難

§  デザイナーはテキスト&ブラウザで確認 §  プログラマーはXHTMLに要素を挿入 §  同一ファイルの為デザイン修正も容易

デザイナー (HTML)

プログラマー (JSP)

コード変換 が必要

今までの開発スタイル

デザイナー プログラマー

(XHTML)

同一ファイルを参照編集可能

JSF 2.0 の開発スタイル

Page 64: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 64

XHTMLに対する JSF 要素の埋め込み (jsfc=“”) <BODY>! <FORM>! <input type="submit" value="OK"/>! </FORM>!</BODY>

<BODY             >! <FORM             >! <input type=“submit“ value="OK“ !                                                  />!</FORM>!</BODY>

※ブラウザは理解できない要素を無視するためブラウザで直接確認可能

デザイナー

プログラマー jsfc="h:body”!  jsfc="h:form“!                           jsfc="h:commandButton“!class="button1" action="#{action.button1Action()}“!

※ <h:body> , <h:form> 等 JSF タグと同一タグを指定

Page 65: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 65

Webページ作成者 (デザイナー)

アプリケーション開発者

コンポーネント開発者

JSF 利用者の役割

DB

BackEnd 処理

Page 66: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 66

View の復元 リクエスト値の 適用 入力値の検証

レスポンスの レンダリング

App ロジックの呼び出し

モデル値の 更新

イベント 処理

イベント 処理

イベント 処理

イベント 処理

JSFのリクエスト処理のライフサイクル

Page 67: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 67

リクエスト値の 適用 入力値の検証

レスポンスの レンダリング

App ロジックの呼び出し

モデル値の 更新

イベント 処理

イベント 処理

イベント 処理

イベント 処理

JSFのリクエスト処理のライフサイクル

View の復元

Page 68: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 68

<HTML>! <h:head>! <title>タイトル</title>! </h:head>! <h:body>! <h:form>! <h:inputText/>! <h:commandButton/>! </h:form>! </h:body>!</HTML>

XHTML (Facelets) UIComponent ツリー

View の復元 (UIコンポーネント・ツリーの作成・復元)

デコード

Page 69: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 69

View の復元 入力値の検証

レスポンスの レンダリング

App ロジックの呼び出し

モデル値の 更新

イベント 処理

イベント 処理

イベント 処理

イベント 処理

JSFのリクエスト処理のライフサイクル

リクエスト値の 適用

Page 70: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 70

リクエスト値の適用

<h:inputText value=“#{someData}”/>!

<HtmlInputText ! disabled="false" ! id="username" ! immediate="false" ! inView="true" ! localValueSet="true" ! maxlength="-2147483648" ! readonly="false" ! rendered="true" ! required="false" ! size="-2147483648" ! styleClass="intext" ! transient="false" ! valid="false" ! value="hogehoge”! />

コンポーネントツリー

リクエスト値の適用

UIVewRoot# processDecodes()

Page 71: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 71

View の復元 リクエスト値の 適用

レスポンスの レンダリング

App ロジックの呼び出し

モデル値の 更新

イベント 処理

イベント 処理

イベント 処理

イベント 処理

JSFのリクエスト処理のライフサイクル

入力値の検証

Page 72: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 72

バリデーション (Bean Validation)

public class Customer implements Serializable {! … (省略)! @NotNull! @Size(max = 40)! @Pattern(regexp = "[a-zA-Z0-9]+@[a-zA-Z0-9]+\\.[a-zA-Z0-9]+", !                 message = "メールアドレスの書式が不正です")! private String email;!!}

<h:inputText class="intext" id="e-mail" value="#{person.mail}"/> <h:message for="e-mail" style="color:red"/>

Page 73: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 73

@FacesValidator("jp.co.oracle.validate.EmailValidator")!

public class EmailValidator implements Validator{!

private static final String EMAIL_PATTERN = !

! ! "[a-zA-Z0-9]+@[a-zA-Z0-9]+\\.[a-zA-Z0-9]+"; !

private Pattern pattern;!

private Matcher matcher;!

public EmailValidator(){!

pattern = Pattern.compile(EMAIL_PATTERN);!

}!

バリデーション ( JSFカスタム バリデータ)

Page 74: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 74

バリデーション ( JSFカスタム バリデータ)

続き!

@Override!

public void validate(FacesContext context, UIComponent component,!

! ! !Object value) throws ValidatorException {!

matcher = pattern.matcher(value.toString());!

if(!matcher.matches()){!

FacesMessage msg = !

new FacesMessage("E-mail validation failed.", !

"Invalid E-mail format.");!

msg.setSeverity(FacesMessage.SEVERITY_ERROR);!

throw new ValidatorException(msg);!

}}}

Page 75: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 75

<h:inputText id="cal" value="#{person.date}" ! required=“true” requiredMessage=”日付を入力してください”! converterMessage="日付の書式が違います。例:12/26/2011">! <f:convertDateTime pattern="MM/dd/yyyy”/> ! </h:inputText>! <h:message for="cal" style="color:red"/>

public class Person{! Date date;!! }

コンバージョン ‒ (入力データの変換)

Page 76: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 76

View の復元 リクエスト値の 適用 入力値の検証

レスポンスの レンダリング

App ロジックの呼び出し

イベント 処理

イベント 処理

イベント 処理

イベント 処理

JSFのリクエスト処理のライフサイクル

モデル値の 更新

Page 77: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 77

@ManagedBean(name=“person”)!//@Named(value=“person”)!public class Person implements ! Serializable {! private String name;! private String addressline1;! private String addressline2;! private String city;! private String phone;! private String email;!} //別途 Setter,Getter メソッドを用意!!<h:inputText class="intext" id="username" value="#{person.name}"/>!

<h:inputText class="intext" id="e-mail" value="#{person.email}"/>

XHTML 側でバックエンド値にバインド

Value バインディング (通常はこちらを使用)

Page 78: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 78

@ManagedBean(name=“person”)!//@Named(value=“person”)!public class Person implements ! Serializable {! private HtmlInputText name;! private HtmlInputText addressline1;! private HtmlInputText addressline2;! private HtmlInputText city;! private HtmlInputText phone;! private HtmlInputText email;!} //別途 Setter,Getter メソッドを用意!!<h:inputText class="intext" id="username” binding="#{person.name}"/>!

<h:inputText class="intext" id="e-mail" binding="#{person.email}"/>

※ Component バインディングは”モデル値の更新”フェーズより前から利用可能

Component バインディング (必要に応じ使用)

Page 79: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 79

View の復元 リクエスト値の 適用 入力値の検証

レスポンスの レンダリング

モデル値の 更新

イベント 処理

イベント 処理

イベント 処理

イベント 処理

JSFのリクエスト処理のライフサイクル

App ロジックの呼び出し

Page 80: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 80

§ ボタンが押下された際の実装処理にバインディング

<h:commandButton ! value="DBへ登録”! action="#{customerManage.savePerson}”/>

XHTML 側でバックエンド処理にバインド

@ManagedBean(name = ! "customerManage")!//@Named(value =“customerManage”)!@RequestScoped!public class CustomerManage { !! public String savePerson() {! //バックエンド処理の実装 return "success";! }!}

実際の処理にバインディング

Page 81: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 81

<navigation-rule> <from-view-id>page1.xhtml</from-view-id> <navigation-case> <from-outcome>next</from-outcome> <to-view-id>/page2.xhtml</to-view-id> </navigation-case> </navigation-rule>

JSF 1.2 までのナビゲーションの設定

ページ 1

ページ 2 ページ 3

ページ 4

画面遷移 (ナビゲーション)

Page 82: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 82

<h:commandButton action="page2" value="Submit" />!

ボタンが押下された場合 page2.xhtml へ画面遷移

<h:commandButton action="page2.xhtml" value="Submit" />!<h:commandButton action=“page2.jsf” value=“Submit” />

拡張子付きのファイル名で指定可能

画面遷移 (JSF 2.0 暗黙的ナビゲーション)

Page 83: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 83

<h:commandButton action=“#{customerManage.savePerson}" value="Submit" />!

@ManagedBean(name ="customerManage")!@RequestScoped!public class CustomerManage { !! public String savePerson() {! //何らかの処理 return ”page2“; // page2.xhtml へ遷移! }!}

メソッドの戻り値(String)が 画面遷移先のページを示す

画面遷移 (JSF 2.0 暗黙的ナビゲーション)

Page 84: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 84

<h:commandButton action="page2?faces-redirect=true" value="Submit" />!

?faces-redirect=true を指定しリダイレクト操作

@ManagedBean(name ="customerManage")!@RequestScoped!public class CustomerManage { !! public String savePerson() {! //何らかの処理 return ”page2.xhtml?faces-redirect=true“;! }!}

リダイレクト (JSF 2.0 暗黙的ナビゲーション)

Page 85: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 85

View の復元 リクエスト値の 適用 入力値の検証

App ロジックの呼び出し

モデル値の 更新

イベント 処理

イベント 処理

イベント 処理

イベント 処理

JSFのリクエスト処理のライフサイクル

レスポンスの レンダリング

Page 86: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 86

UIComponent ツリーから レンダリングコンポーネントの状態保存

HTML

エンコード

HTML HTML

レスポンスのレンダリング

Page 87: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 87 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 16

EJB 3.1

Page 88: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 88

§ 特徴 – パッケージの簡略化 – EJB 3.1 “Lite” の提供 – ローカルビジネスインタフェースのオプション化 – 標準化された Global JNDI名 –  Java SEに組み込み可能なEJBコンテナ – その他の新機能

EJB 3.1 ‒ JSR -318

Page 89: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 89

適切なアーカイブファイル (ear,war,jar)へパッケージ化が必要 面倒なパッケージング/作業負担が大

foo.ear foo.ear foo.ear WEB-INF/web.xml WEB-INF/classes/ com/acme/FooServlet.class WEB-INF/classes

foo.jar com/acme/FooBean.class com/acme/Foo.class

lib/foo_common.jar com/acme/Foo.class

foo_web.war WEB-INF/web.xml WEB-INF/classes/ com/acme/FooServlet.class

com/acme/FooBean.class

foo_ejb.jar

EJB 3.1 ‒ Java EE 5 時代のパッケージング

Page 90: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 90

•  かんたんなパッケージング •  EJBをwarファイルへ含める事が可能 •  WEB-INF/classes:ファイルとして •  WEB-INF/lib: 分割jarファイルとして

•  今まで同様のパッケージ化も可能 •  ejb-jarファイル

•  配備記述子はオプション •  記載する必要がある場合別途     WEB-INF/ejb-jar.xmlへ記述可能

WEB-INF/classes/com/acme/ FooServlet.class FooBean.class (EJB)

EJB 3.1 ‒ Java EE 6 のパッケージ簡略化

Page 91: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 91

§ Lite –  ローカルセッションBeans –  CMT/BMT –  Declarative Security –  Interceptors

§ Full = Lite + –  Message-Driven Beans –  Web Service Endpoint –  2.x/3.x Remote view –  RMI-IIOP Interoperability –  Timer Service –  Async method call –  2.x Local view –  CMP/BMP Entity

Full EJB 3.1機能のサブセットを提供

EJB 3.1 Lite ‒ 軽量版の提供 (Web Profileで利用)

Page 92: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 92

EJB 3.1 ‒ Local Inteface の省略が可能

Page 93: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 93

§ Java EE 5 まで –  Global JNDI名はアプリケーションサーバ提供ベンダー独自に設定 –  他製品へ移行する際JNDI名の変更が必要

§ Java EE 6 から –  JNDI 名が標準化

§  Global JNDI 名 –  java:global[/<app-name>]/<module-name>/<ejb-name>

§  アプリケーション内の JNDI 名 –  java:app/<module-name>/<ejb-name>

§  モジュール定義内の JNDI 名 –  java:module/<ejb-name>

EJB 3.1 ‒ 標準化された Global JNDI 名

Page 94: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 94

 @Stateless!

 public class HelloBean implements Hello {!

! public String sayHello(String msg) {!

  ! return “Hello “ + msg;!

  }!

 }!

JNDI NAME:!

java:global/hello/HelloBean!

java:app/hello/HelloBean!

java:module/HelloBean!

EJB 3.1 ‒ 標準化された Global JNDI 名

Page 95: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 95

§ EJB 3.0まで –  EJBコンポーネントの単体テストは困難 –  Remote Facade/Web Tierで強制実行 –  サーバ/クライアントで別プロセスの稼働

§ EJB 3.1から –  Java SEにEJBコンテナを組み込むことが可能 –  JUnit等で同一Javaプロセス内でテストが可能

EJB 3.1 ‒ 組み込み可能な EJB コンテナ

Page 96: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 96

package test;!

import javax.ejb.Stateless;!

@Stateless!

public class Hello { !

public String sayHello(){!

return "Hello Embedded TEST";!

}!

}!

EJB 3.1 ‒ 組み込み可能な EJB コンテナ

Page 97: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 97

@Test!

public void testSayHello() {!

Map p = new HashMap();!

p.put("org.glassfish.ejb.embedded.glassfish.instance.root",!

"/Applications/GlassFish/glassfishv3-webprofile/glassfish/!

domains/domain1");!

EJBContainer container = EJBContainer.createEJBContainer(p);!

try{!

Hello hello = (Hello)container.getContext().lookup!

("java:global/classes/Hello");!

System.out.println(hello.sayHello());!

}catch(Exception e){…}}!

ご参照: http://bit.ly/hzzjR3

EJB 3.1 ‒ 組み込み可能な EJB コンテナ

Page 98: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 98

EJB 3.1 ‒ 組み込み可能な EJB コンテナ JUnit による EJB の単体テスト

Page 99: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 99

§ GlassFish を使用する場合に必要なライブラリ

§  javax.ejb.jar –  EJBContainerクラスを含むライブラリ

§ glassfish-embedded-static-shell.jar –  組み込み可能なGlassFishライブラリ

EJB 3.1 ‒ 組み込み可能な EJB コンテナ

Page 100: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 100

§ Singleton Session Beansの追加 § 並列アクセス処理対応 § Startup / Shutdownコールバック機能の追加 § タイマーサービス § 自動タイマー生成/カレンダーベースタイマー § 非同期処理

EJB 3.1 ‒ その他の新機能

Page 101: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 101

§ アプリケーションで唯一のインスタンス § コンテナの停止時にインスタンスは破棄 § 並列アクセスをサポート § Singleton Session Beansの初期化 § 複数のSingletonコンポーネントが存在する場合、コンポーネントの初期化順を規定したい場合、@DependsOnを使用

EJB 3.1 ‒ Singleton Session Bean

Page 102: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 102

@Singleton!

public class SharedBean {!

private SharedData shared;!

@PostConstruct !

private void init() { !

shared = ...; !

}!

public int getXYZ() {!

return shared.xyz;!

}!

!

@Stateless !

public class FooBean {!

@EJB !

private SharedBean shared;!

!

public void foo() {!

int xyz = shared.getXYZ();!

…!

}!

}!

EJB 3.1 ‒ Singleton Session Bean

Page 103: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 103

§ コンテナ管理(デフォルト) –  @ConcurrencyManagement(CONTAINER) –  メソッドにメタデータを記述しアクセス制御(ロック)の指定が可能 –  @Lock(READ): 複数アクセスからの読み込みが可能 –  @Lock(WRITE): 書き込みは単一アクセス

§ ビーン管理 –  @ConcurrencyManagement(BEAN) –  開発者による状態の同期処理、インスタンスのアクセス処理制御が可能 –  synchronized,volatileの利用が可能

§ 両方同時の使用は不可能

EJB 3.1 ‒ Singleton Session Bean

Page 104: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 104

@Singleton!

@Startup (アプリケーション起動時 EJB コンテナが初期化) public class StartupBean {!

@PostConstruct !

private void onStartup() { … }!

!

@PreDestroy!

private void onShutdown() { … }!

}!

EJB 3.1 ‒ Singleton Session Bean

Page 105: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 105

§ EJBコンテナが提供するサービス –  アノテーションでスケジュールを定義

§ @Schedule:単一メッソッドに対するタイマースケジュールを定義 § @Schedules:単一メソッドに対して複数の@Scheduleを定義する場合に使用

§ カレンダー表記でタイマー定義可能 –  毎日、毎時、毎分に実行

§  (minute="*", hour="*", timezone="Asia/Tokyo") –  午前9時~午後5時、30分毎

§  (minute="0,30", hour="9-17")

EJB 3.1 ‒ タイマー・サービス

Page 106: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 106

@Stateless !

public class BankBean { !

@PersistenceContext EntityManager accountDB;!

@Resource javax.mail.Session mailSession;!

 //毎月最終日午前8時にsendMonthlyBankStatements()を実行

 @Schedule(hour=”8”, dayOfMonth=”Last”)!

void sendMonthlyBankStatements() {!

...!

}!

}!

!

EJB 3.1 ‒ タイマー・サービス

Page 107: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 107

§ アノテーションでかんたんに非同期処理を定義可能 –  @Asynchronous:非同期処理の定義 –  クラスレベル:クラスに含まれる全メソッドの非同期を定義 –  メソッドレベル:特定のメソッド単位で非同期を定義

§ 非同期メソッド定義における返り値の設定 –  void型:非同期処理で値を返さなくてもよい場合 –  Future<V>:非同期処理結果を返す必要がある場合

§  <V>: 結果の型

EJB 3.1 ‒ 非同期処理

Page 108: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 108

@Stateless public class DocBean {!

@PersistenceContext EntityManager resultsDB;!

@EJB DocBean myself;!

public void processDocument(Document document) {!

myself.doAnalysisA(document);!

myself.doAnalysisB(document);!

}!

@Asynchronous !

  public void doAnalysisA(Document d) {...}!

@Asynchronous !

  public void doAnalysisB(Document d) {...}

EJB 3.1 ‒ 非同期処理

Page 109: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 109 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 16

Java Persistence API

Page 110: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 110

Java Persistence API

Page 111: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 111

JPA の主要コンポーネント § Object Relational Mapping

–  Java オブジェクトと DB テーブルのマッピング § Entity Manager API

–  Entity の CRUD 操作用 API を提供 § Transaction

–  複数処理を単一処理としてまとめる § JPQL

–  オブジェクト指向型のクエリ言語

Page 112: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 112

JPA の構成要素

Persistence Context

Entity

EntityManager Factory

EntityManager API persist() remove() find() …

Persistence Unit Persistence.xml

Page 113: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 113

Persistence Context

Entity

EntityManager Factory

EntityManager API persist() remove() find() …

Persistence Unit Persistence.xml

PersistenceUnitと設定ファイル

Page 114: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 114

Persistence Unit • Persistence Unit

–  EntityManagerのインスタンスを生成するファクトリを定義 –  EntityクラスをRDBにマッピングする設定 – データベースへの接続用データソース設定 – など

•  persistence.xml 設定ファイル –  1つ以上の Persistence Unitを定義可能 – @Entity アノテーションが付加されたクラスを検索

Page 115: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 115

<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">! <persistence-unit name=”SamplePU" transaction-type="JTA">! <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>! <jta-data-source>jdbc/sample</jta-data-source>! <properties>! <property name="eclipselink.ddl-generation" value="create-tables"/>!    </properties>! </persistence-unit>!</persistence>!

Persistence.xml

Page 116: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 116

Entity Manager API

EntityManager Factory

Persistence Unit Persistence.xml

Persistence Context

Entity EntityManager API persist() remove() find() …

Page 117: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 117

EntityManager

•  EntityManager –  Entityのインスタンスのライフサイクルを管理するAPIを提供 – 永続化エンジンとプログラミングによる対話が可能 – 提供機能の例

• ライフサイクル系操作:persist(), remove(), refresh(), merge() • 検索系処理:find(), getReference() • クエリの発行系:createQuery() createNamedQuery(), createNativeQuery()

• Persistence Contextの管理系:flush(), clear(), close(), getTransaction()

Page 118: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 118

Persistence Context

• Persistence Context – 管理する Entity の集合 – 1つの Persistence Unit に属する

Page 119: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 119

Servlet EJB Javaアプリ

persist() remove() refresh() merge() find() createQuery() contains() detach() lock()

EntityManager

Persistence Context

EntityManagerで 管理されるEntity

Persistence ContextとEntityManager

Page 120: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 120

Persistence ContextとEntityManager

•  2種類のEntityManager – コンテナ管理のEntityManager : Java EE コンテナで使用 – アプリケーション管理のEntityManager:Java SE/EE で使用

•  2種類のPersistence Context – トランザクションスコープのPersistence Context –  Extended Persistence Context

Page 121: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 121

コンテナ管理のEntityManager

•  Java EE コンテナによって管理 • DI/JNDI によりEntityManagerインスタンスを取得

– @PersistenceContext EntityManager entityManager;

Page 122: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 122

@Stateless! public class MyEnterpriseBean {! @PersistenceContext(unitName = ”MYJPA_PU")! private EntityManager em;!! public void createMyEntity(Customer customer) {! em.persist(customer);! }! }!

コンテナがトランザクションを管理 コミット、ロールバック等は自動的に実施

コンテナ管理のEntityManager

Page 123: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 123

アプリケーション管理のEntityManager

•  EntityManagerFactoryから生成 –  EntityManager em = emf.createEntityManager();

• アプリケーションでライフサイクルを管理 •  Java SE 環境で利用可能 •  Extended Persistence Contextの使用が必須 •  JTA(Web)もしくはRESOURCE_LOCAL(Java SE)のトランザクションタイプを使用

Page 124: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 124

アプリケーション管理のEntityManager

EntityManagerFactory emf = ! Persistence.createEntityManagerFactory(”MYJPA_PU");! EntityManager em = emf.createEntityManager();! EntityTransaction tx = em.getTransaction();!! tx.begin();! em.persist(customer);! tx.commit();!! em.close();! emf.close();!

アプリケーションでトランザクションを管理 コミット、ロールバック等の実装が必要

Page 125: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 125

Persistence を実現するための概念

PersistenceUnit

EntityManager Factory

EntityManager PersistenceContext

設定

生成 管理

Page 126: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 126

Persistence Context EntityManager

Factory

EntityManager API persist() remove() find() …

Persistence Unit Persistence.xml

Entity

Entity

Page 127: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 127

Entity とテーブルのかんたんなマッピング

@Entity! public class Customer implements Serializable {! @Id! private Long id;! private String address1;! private long age;! private String name;! private String telephone;! //セッタ・ゲッタ }!!

DBのテーブル

Entity クラス

管理下にない場合は単なるPOJO

Page 128: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 128

@Entity! @Table(name=“ORACLE_CUSTOMER”)! public class Customer implements Serializable {! @Id! private Long id;! private String address1;! private long age;! private String name;! private String telephone;! //セッタ・ゲッタ }!!

ORACLE_CUSTOMERテーブル にマッピング

必要時のみデフォルト設定を上書きする手法 (Configuration By Exception)

Page 129: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 129

@Entity! public class Customer implements Serializable {! @Id! private Long id;! @NotNull //入力必須! @Size(min = 1, max = 512) //入力サイズの変更! @Column(name = ”FULL_ADDRESS“) //デフォルトのカラム名をFULL_ADDRESSに変更! private String address1;! private long age;! private String name;! private String telephone;! //セッタ・ゲッタ }!!

デフォルトのカラム設定を上書き

Page 130: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 130

@Entity! public class Customer implements Serializable {! @Id!    private Long id;!    private String address1;! private long age;! private String name;! private String telephone;! @Basic(fetch = FetchType.LAZY)//写真の取得要求があるまで遅らせる! @Lob! private byte[] picture;! }!

LAZY LOAD(遅延読み込み)

Page 131: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 131

@Entity! public class Customer implements Serializable {! @Id!    private Long id;!    private String address1;! private long age;! private String name;! private String telephone;! @Temporal(TemporalType.DATE) //DATE型を使用! private Date dateOfBirth;! @Temporal(TemporalType.TIMESTAMP) //TIMESTAMP型を使用! private Date creationDate;!}!

@Temporal(日付、時刻)

Page 132: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 132

 @Embeddable! public class Address{! private String street;! private String town;! private String city;! private String prefecture;! }!!

組み込み可能コレクション

 @Entity! public class Person {! …! @ElementCollection! private Set<Address> addresses;! }!!

Page 133: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 133

Entity のライフサイクル Entityの生成(new MyEntity())

em.persist()

Persistence Context

管理状態の Entity

管理状態の Entity

管理状態の Entity

デタッチ状態の Entity

em.merge()

tx.flush() tx.commit()

削除されたEntity

em.remove()

tx.commit() tx.rolleback()

tx.reflesh()

Page 134: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 134

Entity のライフサイクル EntityManagerFactory emf = ! Persistence.createEntityManagerFactory(”MYJPA_PU");! EntityManager em = emf.createEntityManager();! EntityTransaction tx = em.getTransaction();! Customer customer = new Customer(); //Entityの生成! tx.begin();! em.persist(customer); //管理状態のEntity! tx.commit(); //デタッチ状態になるEntity! //JavaのHeapにはcustomerは存在するが、JPAの管理状態から外れデタッチ状態! //この状態でcustomerにたいする操作を行った場合は、merge()で同期! em.close();! emf.close();!

Page 135: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 135

Entity と ID を使用した検索

Customer customer = em.find(Customer.class, 1234L)!if (customer!= null) {! //オブジェクトを処理する }

try {! Customer customer = ! em.getReference(Customer.class, 1234L)! //オブジェクトを処理する } catch(EntityNotFoundException ex) {! //エンティティが見つからない }!

Page 136: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 136

Customer customer = ! new Customer(”Taro", ”Yamada", ”[email protected]");!tx.begin();!em.persist(customer);!tx.commit();!tx.begin();!em.remove(customer);!tx.commit();!

Entity の生成と削除

Page 137: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 137

JPQL(Java Persistence Query Language)

•  SQLに類似したクエリ言語 •  Entity を使用したクエリ表現 •  select, update, delete などの機能を提供 • データベースに非依存

SELECT c FROM Customer c!

FROM 句で別名を作成 結果は Customer インスタンス

Page 138: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 138

JPQLクエリ (SELECT 句の例)

SELECT c FROM Customer c WHERE c.lastName = ’Yamada'!

Customer 苗字が ’Yamada’ に一致する0件以上のインスタンスの取得

SELECT c.firstName FROM Customer c!

Customer 名の文字列、もしくは文字列のコレクションを取得

SELECT c.firstName, c.lastName FROM Customer c!

Customer 氏名共に取得

Page 139: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 139

SELECT c FROM Customer c!WHERE c.firstName = ’Taro' AND c.address = ’Tokyo'!

JPQLクエリ (WHERE 句の例)

AND, OR でクエリをさらに限定 SELECT c FROM Customer c WHERE c.age > 18!

WHERE句で =, >, >=, <, <=, <>, (NOT) BETWEEN, (NOT) LIKE, (NOT) IN, IS (NOT) NULL, IS (NOT) EMPTY, (NOT) MEMBER (OF) などの比較演算子を 利用可能

SELECT c FROM Customer c!WHERE c.age NOT BETWEEN 40 AND 50!

Page 140: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 140

JPQLクエリ (パラメータの動的バインド例)

SELECT c FROM Customer c!WHERE c.firstName = ?1 AND c.address = ?2!

? (疑問符)の後に整数を指定 → 実行時引数の番号

SELECT c FROM Customer c!WHERE c.firstName = :fname AND c.address = :address!

: (セミコロン)の後に名前を指定 → 実行時引数の名前

Page 141: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 141

JPQLクエリ (パラメータの動的バインド例)

TypedQuery<Customer> query = ! em.createQuery(! "SELECT c FROM Customer c WHERE c.name = ?1”,Customer.class);! query.setParameter(1, name);!

TypedQuery<Customer> query = ! em.createQuery(! "SELECT c FROM Customer c WHERE c.name = :name”,Customer.class);! query.setParameter(“name”, name);!

Query#setParameter(position,value)でクエリの引数に代入

Page 142: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 142

JPQL(サブクエリ、オーダ)

SELECT c FROM Customer c!WHERE c.age = (SELECT MIN(cust. age) FROM Customer cust)!

WHERE句またはHAVING句の条件式に埋め込むSELECT

SELECT c FROM Customer c WHERE c.age > 18 ORDER BY c.age DESC!

クエリによって得られる結果のソート (ASC: 昇順、DESC: 降順)

Page 143: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 143

• 検索結果を変更したい場合、テーブル定義の変更ができない場合に有効

• CASE – CASE{WHEN <cond_exp> THEN <scalar_expr>} + ELSE <scalar_exp> END

• COALESCE – COALESCE(<scalar_exp> {,<scalar_expr>} + )

• NULLIF – NULLIF(<scalar_expr1>, <scalar_expr2>)

ANSI SQL-92 CASE Expression 対応

Page 144: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 144

UPDATE Employee e!SET e.salary =! CASE e.rating ! WHEN 1 THEN e.salary * 1.2! WHEN 2 THEN e.salary * 1.1! ELSE e.salary * 1.02! END!

CASE 式のサンプル

•  社員の評価レートが1の場合基本給の1.2倍

•  社員の評価レートが2の場合基本給の1.1倍

•  それ以外は、1.02倍

勤務評価に応じた給料の昇給

Page 145: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 145

データの一括操作

DELETE FROM Customer c WHERE c.age < 18!

一括削除 (EntityManager#remove()より効率的)

UPDATE Customer c SET c.firstName = 'TOO YOUNG’ WHERE c.age < 18!

一括更新 (EntityManager#remove()より効率的)

Page 146: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 146

プログラミングによるクエリ(Criteria API)

•  クエリーの制御をJavaオブジェクトで制御 –  JPA1.0ではJPQL/Native SQLでクエリーを記載 –  JPQLで可能なことはプログラム上で実現可能

•  Criteria APIはクエリー実行結果の型の安全性が向上 –  クエリー実行におけるランタイムエラーの発生率が減少 –  統合開発環境の型チェックを利用し安全に実装可能

•  JPQLはSQLに精通した開発者に有効 –  統合開発環境が自動的に雛形を生成(開発効率の向上) –  開発者に選択肢を提供

•  オブジェクトベース、文字列ベースのクエリーを提供

Page 147: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 147

Criteria API

•  CriteriaBuilder : –  CriteriaQueryオブジェクトを生成するファクトリ –  EntityManager#getCriteriaBuilder()より取得

•  CriteriaQuery : –  クエリーの実行結果の型を返す –  <T> CriteriaQuery<T> createQuery(Class<T> resultClass)

•  Root : –  クエリーの範囲指定

•  その他 –  Join, ListJoin, MapJoin, Path, Subqueryなど

Page 148: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 148

Criteria API実装と対応するJPQL

EntityManager em = … ;!CriteriaBuilder cb = em.getCriteriaBuilder();!CriteriaQuery<Person> p = cb.createQuery(Person.class);!Root<Person> person = p.from(Person.class);!p.select(person).where(! cb.equal(person.get(“name”),”Taro Yamada”));!

対応する JPQL 文 SELECT p FROM Person p WHERE p.name = 'Taro Yamada’

Page 149: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 149

Metamodel API

•  強力な型チェックを可能 –  ランタイムエラーの排除

•  文字列によるエンティティの属性へのアクセスを排除 –  コンパイル時に属性の有無、型チェックを実施

•  Metamodelクラスの生成 –  _を付加した正規化したMetamodelクラスを生成 –  IDEで自動生成(※NetBeans は Ver 7.0 より)

•  プログラム上で動的に生成

Page 150: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 150

Metamodel APIを使用しない場合の潜在的問題点

EntityManager em = … ;! CriteriaBuilder cb = em.getCriteriaBuilder();! CriteriaQuery<Person> p = cb.createQuery(Person.class);! Root<Person> person = p.from(Person.class);! p.select(person).where(! cb.equal(person.get(“nema”),”Taro Yamada”));!

“name” と入力すべき所を “nema” とタイプミス ランタイムエラーが発生

Page 151: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 151

@Entity!!public class Person {! @Id! @GeneratedValue(strategy = !    GenerationType.AUTO)! private Long id;! private String name;! Private Integer age;!}!

import javax.persistence.metamodel.SingularAttribute;[email protected](Person.class)!public class Person_ {! public static volatile SingularAttribute<Person,Long> id;! public static volatile SingularAttribute<Person,String> name;! public static volatile SingularAttribute<Person,Integer> age;!}!

Person Entity にたいする Metamodel (Person_)

統合開発環境で自動生成されるMetamodel

Page 152: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 152

Metamodel クラスを利用して実装した例

EntityManager em = … ;! CriteriaBuilder cb = em.getCriteriaBuilder();! CriteriaQuery<Person> p = cb.createQuery(Person.class);! Root<Person> person = p.from(Person.class);! p.select(person).!   where(cb.equal(person.get(Person_.name),”Taro Yamada”));!

Person_.name は属性名でコンパイラがチェック可能 仮に Person_.nema と入力した場合コンパイルエラーが発生 これによりランタイムエラーの発生頻度を抑制可能

Page 153: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 153 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 16

JAX-RS

Page 154: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 154

§ RESTful サービス用の高レベル HTTP API § POJO とアノテーションベース

–  web.xml の設定は不要 –  API の利用が可能

§ HTTP メソッドとのマッピング –  GET, POST, PUT, DELETE 等

§ EJB, CDI, Servlet 等と統合 –  ステートレス、シングルトン Bean と統合 –  Managed Bean 1.0 と統合 –  CDI と統合

JAX-RS 1.1 : JSR -311

Page 155: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 155

§ 全ての HTTP リソースは ID を持つ –  ID を URI で表す –  http://example.com/widgets/foo –  http://example.com/customers/bar –  http://example.com/customers/bar/orders/2 –  http://example.com/orders/110421/customer

JAX-RS 1.1 : Representational State Transfer

Page 156: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 156

§ http://www.oracle.com/servers/blades/t5440

リソースコレクション名

プライマリキー

リソースと URI をどのようにマップするかを定義

JAX-RS 1.1 : URI の例

Page 157: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 157

§ 複数形式のフォーマットを提供 –  XML –  JSON –  (X)HTML

§ コンテンツ・ネゴシエーションのサポート –  Accept header

GET /foo Accept: application/json

–  URI ベース GET /foo.json

JAX-RS 1.1 : 複数の表現形式

Page 158: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 158

§ リクエストのリソース(名詞) –  URI で識別 –  例:http://www.example.com/parts

§ メソッド(動詞) ‒ 名詞を操作する為 –  GET, POST, PUT, DELETE 等

§ 表現 - 状態確認 –  クライアント - サーバ間で状態を転送するための表現 –  XML, JSON, (X)HTML

§ アプリケーションの状態と表現を変換するためメソッドを使用

JAX-RS 1.1 : リクエストの構成

Page 159: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 159

GET /music/artists/beatles/recordings HTTP/1.1 Host: musicsite.example.com Accept: application/xml

HTTPリクエスト

HTTPレスポンス HTTP 1.1 200 OK Date: Wed, 20 Apr 2011 18:22:58 GMT Server: Oracle GlassFish Server 3.1 Content-Type: application/xml; charset=UTF-8 <?xml version=1.0”?> <recordings xmlns=“…”> ….</recordings>

メソッド

リソース

状態表現

状態転送

JAX-RS 1.1 : REST のリクエスト/レスポンス

Page 160: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 160

§ 想定するアプリケーションコンテキスト –  http://example.com/catalogue –  一覧取得 ‒ GET http://example.com/catalogue/widgets –  特定項目取得 ‒ GET http://example.com/catalogue/widgets/nnn @Path(“widgets”)!Public class WidgetsResource{! @GET! String getList(){…}! ! @GET @Path(“{id}”)! String getWidget(@PathParam(“id”) String id) {…}!}!

JAX-RS 1.1 : ルート・リソース・クラスの例

Page 161: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 161

161

@Path(“root”)!Public class RootResource{ //リクエストスコープ @Context UriInfo uri;!! @GET! public String get (){ return “GET”; }! ! @Path(“sub-resource”)! public SubResource sub() { return new SubResource();}!}!!public class SubResource{! …!}!

JAX-RS 1.1 : リソース・クラスの例

Page 162: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 162

§ URI パステンプレート –  URI 表現中の埋め込み変数の利用 –  リクエストされた特定の変数を取得するため @PathParam を使用

162

@Path(“/users/{username}”)!Public class UserResource{! @GET! @Produces(“text/xml”)! String getUser(@PathParam(“username”)String name){! …! }!}!

例:http://example.com/users/FooBar

JAX-RS 1.1 : URI Path テンプレート

Page 163: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 163

§ 2つのアノテーションを使用しクライアントから送信された情報を抽出

§ @PathParam ‒ リクエストから直接情報抽出 –  例:http://host/catalogue/items/123

§ @QueryParam ‒ リクエストの URI クエリーから情報抽出 –  例:http://host/catalogue/items/?item=123

163

JAX-RS 1.1 : @PathParam, @QueryParam

Page 164: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 164

164

@Path(“/items”)!@Consumes(“application/xml”)!Public class ItemResource{! //リクエストhttp://host/catalogue/items/?start=123! @GET! ItemConverter get (@QueryParam(“start”)int start){! … }!! //リクエストhttp://host/catalogue/items/123! @Path(“{id}”)! ItemResource getItemResource(@PathParam(“id”)Long id){! …!}!

JAX-RS 1.1 : @PathParam, @QueryParamの実装例

Page 165: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 165

§ リソース表現のMIME タイプの指定で使用 § MIME タイプに応じたデータを作成しクライアントへ返信 § クラスレベルとメソッドレベルそれぞれで指定可能

–  メソッドレベルで設定した値はクラスレベルで設定した値を上書き

165

JAX-RS 1.1 : @Produces

Page 166: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 166

166

@Path(“/myResource”)!@Produces(“text/plain”)!Public class SomeResource{!! //指定しない場合クラスレベルの設定が有効 @GET! public String doGetAsPlainText (){}!! //クラスレベルの設定を上書き @GET! @Produces(“text/xml”)! public String doGetAsXML () {}!}!

JAX-RS 1.1 : @Produces の実装例

Page 167: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 167

167

!//新規リソースを作成後、追加リソースを指すURIを返す @POST!@Consumes(“application/xml”)!public Response addUser(InputStream userData){! try{! User user = getUser(userData);! long userId = persist(user); //DB に永続化 return Response.created(URI.create(“/” + ! userId)).build();! } catch (Exception e) {! throw new MyException(e);! }!}!

JAX-RS 1.1 : Response クラスを利用したレスポンス

Page 168: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 168

§ クライアントから送信されたリソースの MIME タイプを指定 § クラスレベル、メソッドレベルそれぞれの設定が可能

–  メソッドレベルの設定はクラスレベルの設定を上書き § コンテナはクライアントから指定された MIME タイプに応じたメソッドの呼び出しを行う

–  指定された MIME タイプ用のメソッドが存在しない場合 HTTP のエラーコード “415 Unsupported Media Type” を返信

168

JAX-RS 1.1 : @Consumes

Page 169: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 169

169

!//クライアントで指定された MIME タイプに応じた処理の実施 @POST!@Consumes(“application/xml”)!public Response postXml(String xmlData){! …!}!!@POST!@Consumes(“text/plain”)!public Response postText(String textData){! …!}!

JAX-RS 1.1 : @Consumes の実装例

Page 170: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 170

§ JAX-RS 1.1 –  Web Profile には含まれない (Java EE 7 より Web Profile で利用可能) –  GlassFish Web Profile 版では利用可能

§ JCP –  http://jcp.org/en/jsr/detail?id=311

§ API –  http://jsr311.java.net/nonav/releases/1.1/index.html

§ 仕様 –  http://jsr311.java.net/nonav/releases/1.1/spec/spec.html

170

JAX-RS 1.1 : まとめ

Page 171: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 171 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 16

Bean Validation

Page 172: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 172

§ アプリケーション中で宣言的なバリデーションが可能 § カスタムバリデーションを作成可能 § JSF 2.0 に統合

–  f:validateRequired, f:validateRegexp –  ManagedBean

§ @NotNull, @Size(max=40) String address 等 § JPA 2.0 に統合

–  Entity クラス § @NotNull, @Size(max=40) String address 等

172

Bean Validation

Page 173: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 173 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 16

CDI

Page 174: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 174

§ @Inject アノテーション –  @Inject @LoggedIn User user;

§  Injection メタモデル –  どんなBeanもInject対象 –  EJB session beans –  Plain classes with @ManagedBean –  CDIがモジュール内で見つけたクラス –  デフォルトで無効、有効化する場合は、beans.xmlを配置 –  META-INF/、WEB-INF/に配置

174

Dependency Injection ‒ DI 1.0/CDI 1.0

Page 175: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 175

Java EE 7 プラットフォーム 2013年6月12日

Page 176: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 176

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, Connector Architecture

Java EE 5 Ease of Development, Annotations, EJB 3.0, JPA, JSF, Updated Web Services

J2EE 1.4 Web Services Mgmt, Deployment, Async Connector

Java EE 6 Pruning, Extensibility Ease of Dev, CDI, JAX-RS

Web Profile

Servlet 3.0, EJB 3.1 Lite

J2EE 1.2 Servlet, JSP, EJB, JMS RMI/IIOP

Java EE 7 の進化 Java EE 7 JMS 2.0, Batch, TX Concurrent, Interceptors HTML5: WebSocket, JSON

Web Profile

JAX-RS 2.0

シンプル化 HTML 5 対応

2013年 33 specs

Page 177: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 177

Page 178: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 178

GlassFish v4

NetBeans Java EE SDK

Page 179: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 179

Java  EE  7  へ含まれる予定の  JSR  ⼀一覧

Connector 1.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

Portable Extensions

Servlet 3.1

JSP 2.2 JSF 2.2 JAX-RS 2.0

EL 3.0

Bean Validation 1.1

Concurrency Utilities for EE (JSR-236) Batch

Application (JSR-352)

Java API for JSON

(JSR-353)

Java API for WebSocket (JSR-356)

新規追加 大幅な更新 通常の更新

Page 180: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 180

Java EE 7 のどの機能に興味がありますか? ブログのアンケート結果より

テクノロジー

WebSocket バッチ JAX-RS JSON-P 並列処理

Page 181: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 181

Java EE 7 主要テーマ

DEVELOPER PRODUCTIVITY

MEETING ENTERPRISE DEMANDS

Java EE 7

Page 182: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 182

Page 183: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 183

Java EE 7

JSP/JSTL

WebSocket 1.0 JAX-RS 2.0

JSON-P 1.0

JSF 2.2

EL 3.0 Servlet 3.1

EJB 3.2

JPA 2.1

JTA 1.2

JMS 2.0

JCA 1.7

Batch 1.0 JavaMail 1.5

CD

I 1.1

Bea

n Va

lidat

ion

1.1

Inte

rcep

tors

1.2

Con

curr

ency

1.0

Java EE 7 へ含まれる機能一覧

Page 184: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 184

Java EE 7

JSP/JSTL

WebSocket 1.0 JAX-RS 2.0

JSON-P 1.0

JSF 2.2

EL 3.0 Servlet 3.1

EJB 3.2

JPA 2.1

JTA 1.2

JMS 2.0

JCA 1.7

Batch 1.0 JavaMail 1.5

CD

I 1.1

Bea

n Va

lidat

ion

1.1

Inte

rcep

tors

1.2

Con

curr

ency

1.0

WebSocket 1.0 (JSR-356)

Page 185: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 185 Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 185

#1: WebSocket: アノテーションによるサーバ実装 @javax.websocket.server.ServerEndpoint("/chat") public class ChatServer { @OnMessage public String chat(String name, Session session) { for (Session peer : session.getOpenSessions()) {! peer.getBasicRemote().sendObject(message);! } } }!

双方向・全二重の通信を簡単に実現

Page 186: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 186 Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 186

#2: WebSocket: ライフサイクルのコールバック @javax.websocket.OnOpen public void open(Session s) { . . . } @javax.websocket.OnClose public void close(CloseReason c) { . . . } @javax.websocket.OnError public void error(Throwable t) { . . . }!

接続、切断、エラー処理

Page 187: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 187 Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 187

#3 : WebSocket: クライアント実装

@javax.websocket.ClientEndpoint public class MyClient { @javax.websocket.OnOpen public void open(Session session) { … } // Lifecycle callbacks }!

クライアント・エンドポイントも アノテーションで実装可能

Page 188: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 188 Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 188

#3 : WebSocket: クライアント実装 ContainerProvider .getWebSocketContainer() .connectToServer( MyClient.class, URI.create("ws://localhost:8080/ws/hello"));!

サーバ・エンドポイントへの接続コード

Page 189: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 189 Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 189

#4: WebSocket: エンコーダ・デコーダ @javax.websocket.server.ServerEndpoint( value="/chat", decoders="MyDecoder.class", encoders="MyEncoder.class") public class ChatServer { @OnMessage public String chat(ChatMessage name, Session session) { . . . } }!

オブジェクトとしてメッセージの送受信

Page 190: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 190 Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 190

#4: WebSocket: エンコーダ public class MyEncoder implements !

Encoder.Text<ChatMessage> { public String encode(ChatMessage chatMessage) { // . . . }!

  // . . .  }!

Javaオブジェクトから送信用データを生成

Page 191: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 191 Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 191

#4: WebSocket: デコーダ public class MyDecoder implements Decoder.Text<ChatMessage> { public ChatMessage decode(String s) { // . . . } public boolean willDecode(String string) { // . . . } //. . . } !受信データを Java オブジェクトに変換

Page 192: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 192

Java EE 7

JSP/JSTL

WebSocket 1.0 JAX-RS 2.0

JSON-P 1.0

JSF 2.2

EL 3.0 Servlet 3.1

EJB 3.2

JPA 2.1

JTA 1.2

JMS 2.0

JCA 1.7

Batch 1.0 JavaMail 1.5

CD

I 1.1

Bea

n Va

lidat

ion

1.1

Inte

rcep

tors

1.2

Con

curr

ency

1.0

JAX-RS 2.0 (JSR-339)

Page 193: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 193 Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 193

#5: JAX-RS: クライアント用の API Client client = ClientBuilder.newClient();!WebTarget target = client.target("http://www.foo.com/book");!Invocation invocation = target.request(TEXT_PLAIN).get();!Response response = invocation.invoke();!!Response response = ClientBuilder.newClient()! .target("http://www.foo.com/book")! .request(MediaType.TEXT_PLAIN)! .get();!!String body = ClientBuilder.newClient()! .target("http://www.foo.com/book")! .request()! .get(String.class);!

Page 194: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 194 Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 194

#6: JAX-RS: 非同期クライアント Future <String> future = ClientBuilder.newClient()! .target("http://localhost:8080/JAX-RS-Client/hello/")! .request()! .async()! .get(String.class);!try {! String body = future.get(10, TimeUnit.SECONDS);! System.out.println("Server Response " + body);!} catch (InterruptedException | ExecutionException | ! TimeoutException e) {! logger.log(Level.SEVERE, "Exception occured", e);!}!

Page 195: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 195 Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 195

#7: JAX-RS: 非同期サーバ @Path("/async")!public class AsyncResource {! @GET! public void asyncGet(@Suspended final AsyncResponse ! asyncResp) {! mgdExecService.submit(() -> {! String result = longRunningOperation();! asyncResp.resume(Response.ok(result, "text/plain")! .build());! });! }!

非同期処理:サスペンド&レジューム

Page 196: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 196 Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 196

#8: JAX-RS: メッセージ・フィルタ § クライアント実装用のフィルタ

–  ClientRequestFilter!–  ClientResponseFilter!

§ サーバ実装用のフィルタ –  ContainerRequestFilter!–  ContainerResponseFilter!

リクエスト・レスポンスの ヘッダ用 のインターセプタ(フィルタ)を提供

Page 197: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 197 Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 197

#8: JAX-RS: メッセージ・フィルタ public class LocalCacheFilter implements ClientRequestFilter {! @Override! public void filter(ClientRequestContext req) throws ! IOException{! if (req.getMethod().equals("GET")) {! CacheEntry entry = cache.getEntry(req.getURI());! if (entry != null) {! req.getHeaders().putSingle("If-Modified-Since", ! entry.getLastModified());! }! }}}!

リクエスト・レスポンスの ヘッダ用 のインターセプタ(フィルタ)を提供

Page 198: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 198 Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 198

#9: JAX-RS: エンティティ・インターセプタ

§  Intercepts inbound entity streams (read from the “wire”) –  ReaderInterceptor!

§  Intercepts outbound entity streams (written to the “wire”) –  WriterInterceptor!

メッセージ・ボディ用 のインターセプタを提供

Page 199: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 199 Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 199

#10: JAX-RS: エンティティ・インターセプタ public class GZIPWriteInterceptor implements WriterInterceptor{! @Override! public void around WriteTo(WriteInterceptorContext ctx) ! throws IOException, WebApplicationException{! GZIPOutputStream os = new ! GZIPOutputStream(ctx.getOutputStream());! ctx.getHeader().putSingle("Content-Encoding", "gzip");! ctx.setOutputStream(os);! ctx.proceed();! }!}!

メッセージ・ボディ用 のインターセプタを提供

Page 200: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 200

Java EE 7

JSP/JSTL

WebSocket 1.0 JAX-RS 2.0

JSON-P 1.0

JSF 2.2

EL 3.0 Servlet 3.1

EJB 3.2

JPA 2.1

JTA 1.2

JMS 2.0

JCA 1.7

Batch 1.0 JavaMail 1.5

CD

I 1.1

Bea

n Va

lidat

ion

1.1

Inte

rcep

tors

1.2

Con

curr

ency

1.0

JSF 2.2 (JSR-344)

Page 201: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 201 Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 201

#11: JSF: HTML5対応 & パス・スルー属性 <html xmlns="http://www.w3.org/1999/xhtml”!! >! <body >! <form >! <input type="url" ! value=" "/>! <input type="submit" value="実行"! />! </form>! </body>!</html>!

! xmlns:jsf="http://xmlns.jcp.org/jsf“! xmlns:p="http://xmlns.jcp.org/jsf/passthrough"! jsf:id="body"! jsf:id="form"! jsf:id="url“ ! p:type="url“ "#{html5.url}"! jsf:id="button" ! jsf:action="#{html5.pushButton}"!!!

HTMLコードはそのまま

Page 202: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 202 Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 202

#12: JSF: Facesフロー(関連画面のモジュール化)

画面、画面遷移、バックエンド処理 をモジュール化

<h:body>! <h:form>!<h:commandButton id="start1" ! value="フロー1の開始" action="flow1"/>! <h:commandButton id="start2" ! value="フロー2の開始" action="flow2"/>! </h:form>!</h:body>

Page 203: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 203 Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 203

#13: JSF: Faces フロー・スコープ @Named(value=“flow1”) @FlowScoped("flow1") public class Flow1Bean implements Serializable {!

private String name;!

//… セッタ・ゲッタ メソッドは省略 }!

EL 式におけるフロー・スコープの利用!

#{flow1.name}!

#{flowScope.value} #{facesContext.application.flowHandler.currentFlow}!

!同一フロー中だけ有効な値の参照・取得

Page 204: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 204 Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 204

#14: JSF: リソース・ライブラリの契約

柔軟なデザイン変更が可能

Page 205: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 205 Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 205

#14: JSF:リソース・ライブラリ契約の適用 <f:view ! xmlns:f="http://xmlns.jcp.org/jsf/core" ! contracts=“corporate1">! <ui:composition xmlns:ui="http://java.sun.com/jsf/facelets"! template="/template.xhtml">! <ui:define name="content">! 企業1用のコンテンツ&デザイン! </ui:define>! </ui:composition>!</f:view>

テンプレート・クライアントは契約名を記述

Page 206: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 206 Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 206

#14: JSF:リソース・ライブラリ契約の適用 <f:view ! xmlns:f="http://xmlns.jcp.org/jsf/core" ! contracts=“ ">! <ui:composition xmlns:ui="http://java.sun.com/jsf/facelets"! template="/template.xhtml">! <ui:define name="content">! 企業2用のコンテンツ&デザイン! </ui:define>! </ui:composition>!</f:view>

テンプレート・クライアントは契約名を記述

Page 207: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 207 Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 207

#15: JSF: ファイル・アップロード <h:form enctype="multipart/form-data"> <h:inputFile value="#{fileUploadBean.file}"/><br/> <h:commandButton value="Upload"/><p/> </h:form> !

@Named @RequestScoped public class FileUploadBean { private Part file; //getter and setter } !

Servlet 3.0 API を利用

ファイル・アップロード用JSFコンポーネント

Page 208: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 208

Java EE 7

JSP/JSTL

WebSocket 1.0 JAX-RS 2.0

JSON-P 1.0

JSF 2.2

EL 3.0 Servlet 3.1

EJB 3.2

JPA 2.1

JTA 1.2

JMS 2.0

JCA 1.7

Batch 1.0 JavaMail 1.5

CD

I 1.1

Bea

n Va

lidat

ion

1.1

Inte

rcep

tors

1.2

Con

curr

ency

1.0

JSON-P 1.0 (JSR-353)

Page 209: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 209 Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 209

JsonObject value = Json.createObjectBuilder()! .add("id", "1234")! .add("date", "19/09/2012")! .add("total_amount", "93.48")! .add("customer", Json.createObjectBuilder()! .add("first_name", "James")! .add("last_name", "Rorrison")! .add("email", "[email protected]")! .add("phoneNumber", "+44 1234 1234")! )! .build();!

JSON オブジェクトの生成

Page 210: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 210 Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 210

JsonParser parser = Json.createParser(new ! FileReader(“order.json"));!while (parser.hasNext()) {! JsonParser.Event event = parser.next();! if (event.equals(JsonParser.Event.KEY_NAME) && ! parser.getString().matches("email")) {! parser.next();! email = parser.getString();! }}!

JSON オブジェクトの解析

Page 211: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 211

Java EE 7

JSP/JSTL

WebSocket 1.0 JAX-RS 2.0

JSON-P 1.0

JSF 2.2

EL 3.0 Servlet 3.1

EJB 3.2

JPA 2.1

JTA 1.2

JMS 2.0

JCA 1.7

Batch 1.0 JavaMail 1.5

CD

I 1.1

Bea

n Va

lidat

ion

1.1

Inte

rcep

tors

1.2

Con

curr

ency

1.0

Expression Language 3.0 (JSR-341)

Page 212: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 212 Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 212

<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 式を記述可能

Page 213: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 213

Java EE 7

JSP/JSTL

WebSocket 1.0 JAX-RS 2.0

JSON-P 1.0

JSF 2.2

EL 3.0 Servlet 3.1

EJB 3.2

JPA 2.1

JTA 1.2

JMS 2.0

JCA 1.7

Batch 1.0 JavaMail 1.5

CD

I 1.1

Bea

n Va

lidat

ion

1.1

Inte

rcep

tors

1.2

Con

curr

ency

1.0

Servlet 3.1 (JSR-340)

Page 214: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 214 Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 214

#19: Servlet: ノンブロッキング I/O

§ ServletInputStream!–  public void setReadListener(ReadListener listener);!–  public boolean isFinished();!

–  public boolean isReady();!

§ ServletOutputStream!–  public setWriteListener(WriteListener listener);!

–  public boolean isReady();!

NIO 用に新規追加されたメソッド

Page 215: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 215 Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 215

#19: Servlet: ノンブロッキング I/O public interface ReadListener extends EventListener { public void onDataAvailable(); pubic void onAllDataRead(); public void onError(); }!

public interface WriteListener extends EventListener { public void onWritePossible(); public void onError(); }!

NIO 用に新規追加されたインタフェース

Page 216: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 216 Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 216

#19: Servlet: ノンブロッキング I/O @WebServlet(name="MyNIOServlet”,urlPatterns = !

{"/MyNIOServlet"}, asyncSupported = true)!

public class MyNIOServlet extends HttpServlet {!

protected void doGet(HttpServletRequest req, !

HttpServletResponse res){!

AsyncContext aCon = request.startAsync(req,res);!

ServletOutputStream out = res.getOutputStream();!

WriteListener wListener = new AsyncWriter(aCon,out);!

outStream.setWriteListener(wListener);!

Async Servlet の場合のみ NIO で実装可能

Page 217: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 217 Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 217

#19: Servlet: ノンブロッキング I/O public class AsyncWriter implements WriteListener {!

private LinkedBlockingQueue<String> queue = !

new LinkedBlockingQueue<>();!

public void onWritePossible() throws IOException {!

while (queue.peek() != null && outStream.isReady()) {!

String data = queue.poll();!

outStream.print(data);!

}!

if (queue.peek() == null)!

aContext.complete();!

}}!isReadyで書き込み可能な場合処理を実施

Page 218: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 218 Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 218

#20: Servlet: セキュリティの改善 HttpServletRequest request = … ;!

String oldId = request.getSession().getId();!

 //ログイン前の古いセッション ID :c59804c31c03b080db243c004e63!

request.login("user", "password");!

String newId = request.changeSessionId();!

//ログイン後の新しいセッション ID:c59f21f227d0855718446db3d61c!

Fixation Attack からの防御 ログイン後セッションID を変更しハイジャック防御

Page 219: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 219 Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 219

#20: Servlet: セキュリティの改善 <web-app . . . version="3.1"> <deny-uncovered-http-methods/> <web-resource-collection> <url-pattern>/account/*</url-pattern> <http-method>GET</http-method> </web-resource-collection> </web-app> !

!<deny-uncovered-http-methods> の追加 <http-method>で指定されていないメソッドは全て接続拒否 例:GET 以外は拒否

Page 220: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 220

Java EE 7

JSP/JSTL

WebSocket 1.0 JAX-RS 2.0

JSON-P 1.0

JSF 2.2

EL 3.0 Servlet 3.1

EJB 3.2

JPA 2.1

JTA 1.2

JMS 2.0

JCA 1.7

Batch 1.0 JavaMail 1.5

CD

I 1.1

Bea

n Va

lidat

ion

1.1

Inte

rcep

tors

1.2

Con

curr

ency

1.0

CDI 1.1 (JSR-346)

Page 221: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 221 Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 221

<beans ... version="1.1" bean-discovery-mode="all">! <alternatives>! <class>org.agoncal.book.MockGenerator</class>! </alternatives>!</beans>!

•  all, annotated, none を指定可能 •  all は Java EE 6 と同様の振る舞い

Page 222: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 222 Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 222

@Vetoed!

public class NonProcessedBean { ...!

}!

package-info.java @Vetoed!

package com.non.processed.package;!

all 指定時インジェクション対象から除外 クラス、パッケージ単位で指定可能

Page 223: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 223

Java EE 7

JSP/JSTL

WebSocket 1.0 JAX-RS 2.0

JSON-P 1.0

JSF 2.2

EL 3.0 Servlet 3.1

EJB 3.2

JPA 2.1

JTA 1.2

JMS 2.0

JCA 1.7

Batch 1.0 JavaMail 1.5

CD

I 1.1

Bea

n Va

lidat

ion

1.1

Inte

rcep

tors

1.2

Con

curr

ency

1.0

Bean Validation 1.1 (JSR-349)

Page 224: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 224

#23: Bean Validation: メソッド・バリデーション public class CardValidator {! public CardValidator(@NotNull Algorithm algorithm) {! this.algorithm = algorithm;! }!! @AssertTrue! public Boolean validate(@NotNull CreditCard creditCard) {! return algorithm.validate(creditCard.getNumber());! }! }!

メソッド引数、メソッドの返り値に対する バリデーションも可能

Page 225: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 225

Java EE 7

JSP/JSTL

WebSocket 1.0 JAX-RS 2.0

JSON-P 1.0

JSF 2.2

EL 3.0 Servlet 3.1

EJB 3.2

JPA 2.1

JTA 1.2

JMS 2.0

JCA 1.7

Batch 1.0 JavaMail 1.5

CD

I 1.1

Bea

n Va

lidat

ion

1.1

Inte

rcep

tors

1.2

Con

curr

ency

1.0

Interceptor 1.2 (JSR-318)

Page 226: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 226 Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 226

public class LoggingInterceptor {!! @AroundConstruct! private void init(InvocationContext ic) throws Exception{! logger.fine("Entering constructor");! ic.proceed();! logger.fine("Exiting constructor");! }!! @AroundInvoke! public Object logMethod(InvocationContext ic) ... {! // ...! }}!

コンストラクタに対するインターセプタが可能

Page 227: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 227 Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 227

@Interceptor!@Loggable!@Priority(Interceptor.Priority.LIBRARY_BEFORE + 10)!public class LoggingInterceptor {! @AroundInvoke! ...!}!

複数インターセプタの実行時の優先順位を指定 小さな値が優先 !

PLATFORM_BEFORE (0) > LIBRARY_BEFORE (1000) > APPLICATION (2000) > LIBRARY_AFTER (3000) > PLATFORM_AFTER (4000)!

Page 228: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 228

Java EE 7

JSP/JSTL

WebSocket 1.0 JAX-RS 2.0

JSON-P 1.0

JSF 2.2

EL 3.0 Servlet 3.1

EJB 3.2

JPA 2.1

JTA 1.2

JMS 2.0

JCA 1.7

Batch 1.0 JavaMail 1.5

CD

I 1.1

Bea

n Va

lidat

ion

1.1

Inte

rcep

tors

1.2

Con

curr

ency

1.0

Concurrency 1.0 (JSR-236)

Page 229: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 229 Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 229

§ Java EE 環境で新規スレッドの生成が可能 § 並列処理用のデザインパターンを適用可能 § Java SE(JSR-166y) の並列処理パッケージを拡張

Page 230: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 230 Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 230

@Resource!ManagedExecutorService exec;!! public void foo(){! exec.submit(() -> {doSomething();});! }!

Java SE 8 + Java EE 7 環境で Lambda 式を使用した並列処理の実装

Page 231: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 231 Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 231

@Resource ManagedScheduledExecutorService mgdScheduledExec;

public void bar() { mgdScheduledExec.schedule( () -> {doSomething();}, 30, TimeUnit. MINUTES ); }!

スケジューリング可能な並列処理の実装

Page 232: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 232 Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 232

mgdScheduledExec.scheduleAtFixedRate ( () -> {doSomething();}, 2, 3, TimeUnit.SECONDS);!

2秒後に有効、3秒毎にタスクを実行 (定期的実行) mgdScheduledExec.scheduleWithFixedDelay ( () -> {doSomething();}, 2, 3, TimeUnit.SECONDS);!

2秒後に有効、前タスク完了3秒毎に新タスクを実行 (タスク実行間隔の調整が可能)

Page 233: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 233 Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 233

Thread thread = factory.newThread(() ->{doSomething();});!

thread.start();

@Resource ManagedThreadFactory factory; public void foo(){! ExecutorService exec = Executors.newFixedThreadPool(4, factory); ! execSvs.submit(() -> {doSomething();});! }!!

Page 234: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 234 Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 234

@Resource ContextService service; Runnable proxy = service.createContextualProxy!

(new MyRunnable(), Runnable.class); Future f = executor.submit(proxy);!

タスクにコンテキスト情報 (ClassLoader、JNDI、Security、Transaction) を付加して実行

Page 235: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 235

Java EE 7

JSP/JSTL

WebSocket 1.0 JAX-RS 2.0

JSON-P 1.0

JSF 2.2

EL 3.0 Servlet 3.1

EJB 3.2

JPA 2.1

JTA 1.2

JMS 2.0

JCA 1.7

Batch 1.0 JavaMail 1.5

CD

I 1.1

Bea

n Va

lidat

ion

1.1

Inte

rcep

tors

1.2

Con

curr

ency

1.0

EJB 3.2 (JSR-345)

Page 236: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 236 Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 236

@Stateful(passivationCapable = false)!public class ShoppingCart {! ...!}!

Java EE 6 まで Stateful セッションBean は一定時間を経過後、 2次ストレージに退避し無効化 (passivate) が行われた。 再利用時に有効化(activate) が必要だった。 大量に存在する場合リソースに悪影響があった。 Java EE 7 では passivate の機能自身を無効化可能

Page 237: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 237 Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 237

@Stateless!public class OrderEJB {! @Asynchronous! public void sendEmail (Order order) {! // Very Long task! }! @Schedule(hour="2", persistent=false)! public void createDailyReport() {! // ...! }!}!

※ persistence が false の場合のみ有効

Web プロファイル版で利用可能

Page 238: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 238

Java EE 7

JSP/JSTL

WebSocket 1.0 JAX-RS 2.0

JSON-P 1.0

JSF 2.2

EL 3.0 Servlet 3.1

EJB 3.2

JPA 2.1

JTA 1.2

JMS 2.0

JCA 1.7

Batch 1.0 JavaMail 1.5

CD

I 1.1

Bea

n Va

lidat

ion

1.1

Inte

rcep

tors

1.2

Con

curr

ency

1.0

JTA 1.2 (JSR-907)

Page 239: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 239 Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 239

@Path("book")!@Transactional(value = Transactional.TxType.REQUIRED,! rollbackOn = {SQLException.class, JMSException.class},! dontRollbackOn = SQLWarning.class)!public class BookRestService {!! @PersistenceContext! private EntityManager em;!! @POST! @Consumes(MediaType.APPLICATION_XML)! public Response createBook(Book book) {...}!}!

EJB 以外でもコンテナ管理のトランザクションを利用可能

Page 240: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 240 Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 240

@TransactionScoped!public class BookBean {...}!@WebServlet!public class TxServlet extends HttpServlet {! @Inject UserTransaction tx;! @Inject BookBean b1;! @Inject BookBean b2;! protected void processRequest(...) {! tx.begin();! s_out.println(b1.getReference());! s_out.println(b2.getReference());! tx.commit();! }}!

トランザクション内でのみ有効なスコープ

Page 241: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 241

Java EE 7

JSP/JSTL

WebSocket 1.0 JAX-RS 2.0

JSON-P 1.0

JSF 2.2

EL 3.0 Servlet 3.1

EJB 3.2

JPA 2.1

JTA 1.2

JMS 2.0

JCA 1.7

Batch 1.0 JavaMail 1.5

CD

I 1.1

Bea

n Va

lidat

ion

1.1

Inte

rcep

tors

1.2

Con

curr

ency

1.0

JPA 2.1 (JSR-338)

Page 242: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 242 Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 242

<persistence ... version="2.1">! <persistence-unit ...>! <properties>! <property name=”! javax.persistence.schema-generation.scripts.action"! value="drop-and-create"/>! <property name=”! javax.persistence.schema-generation.scripts.create-target" ! value="create.sql"/>! <property name=”! javax.persistence.sql-load-script-source" ! value="insert.sql"/>! </properties>!</persistence-unit>!

Page 243: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 243 Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 243

@Entity!@Table(indexes = {! @Index(columnList = "ISBN"),! @Index(columnList = "NBOFPAGE")!})!public class Book {! @Id @GeneratedValue! private Long id;! private String isbn;! private Integer nbOfPage;! ...!}!

任意のカラムのインデックス化が可能

Page 244: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 244 Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 244

@PersistenceContext(synchronization =! SynchronizationType.UNSYNCHRONIZED)!private EntityManager em;!...!!em.persist(book);!!...!em.joinTransaction();!

明示的なトランザクションへのジョインまで非同期

Page 245: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 245 Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 245

@Entity!@NamedStoredProcedureQuery(! name = "archiveOldBooks", ! procedureName = "sp_archive_books”,! parameters = {! @StoredProcedureParameter(name = ”date", mode = IN, ! type = Date.class),! @StoredProcedureParameter(name = "warehouse",! mode = IN, ! type = String.class)! })!public class Book {...}!

待望のストアード・プロシージャの標準化

Page 246: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 246

Java EE 7

JSP/JSTL

WebSocket 1.0 JAX-RS 2.0

JSON-P 1.0

JSF 2.2

EL 3.0 Servlet 3.1

EJB 3.2

JPA 2.1

JTA 1.2

JMS 2.0

JCA 1.7

Batch 1.0 JavaMail 1.5

CD

I 1.1

Bea

n Va

lidat

ion

1.1

Inte

rcep

tors

1.2

Con

curr

ency

1.0

JMS 2.0 (JSR-343)

Page 247: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 247 Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 247

JMSContext ctx = connectionFactory.createContext()!!ctx.createProducer().send(queue, "Text message sent");!!ctx.createConsumer(queue).receiveBody(String.class);!!ctx.createProducer()! .setPriority(2)! .setTimeToLive(1000)! .setDeliveryMode(DeliveryMode.NON_PERSISTENT)! .send(queue, message);!

送受信用の新規簡易APIの提供:JMSContext

Page 248: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 248 Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 248

try(JMSContext ctx = connectionFactory.createContext()){! ctx.createProducer().send(queue, "Text message sent");!  ...!!  while (true) {! String s = ctx.createConsumer(queue)!                 .receiveBody(String.class);! }!}!

finaly 節での close() の実装は不要

Page 249: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 249 Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 249

@JMSConnectionFactoryDefinition(! name="java:comp/jms/MyConnectionFactory",! interfaceName = "javax.jms.TopicConnectionFactory",! maxPoolSize = 30,! minPoolSize= 20)!@JMSDestinationDefinition(! name = "java:comp/jms/MyTopic",! destinationName = "mytopic",! interfaceName = "javax.jms.Topic")!

Java EE 6 で DBリソース設定のために @DataSourceDefinition が存在

Page 250: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 250

Java EE 7

JSP/JSTL

WebSocket 1.0 JAX-RS 2.0

JSON-P 1.0

JSF 2.2

EL 3.0 Servlet 3.1

EJB 3.2

JPA 2.1

JTA 1.2

JMS 2.0

JCA 1.7

Batch 1.0 JavaMail 1.5

CD

I 1.1

Bea

n Va

lidat

ion

1.1

Inte

rcep

tors

1.2

Con

curr

ency

1.0

Batch (JSR-352)

Page 251: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 251 Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 251

Page 252: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 252 Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 252

@Stateless!public class MyBatchTimer {! @Schedule(minute = "0,10,20,30,40,50", ! second = "0", dayOfMonth = "*", month = "*", ! year = "*", hour = "9-17", ! dayOfWeek = "Mon-Fri", persistent = false)! public void executeBatchLikeCron() {! JobOperator job = ! BatchRuntime.getJobOperator();! long id = job.start("my-batch-job", ! new Properties());}}

処理の詳細は XMLに記述

Page 253: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 253 Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 253

<job id="my-batch-job”!  xmlns="http://xmlns.jcp.org/xml/ns/javaee" version="1.0">!  <step id=”first-step" next=”next-step">!    ……!  </step>!  <step id="next-step">!    ……!  </step>!</job>!

Page 254: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 254 Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 254

Page 255: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 255 Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 255

<job id="my-batch-job”!  xmlns="http://xmlns.jcp.org/xml/ns/javaee" version="1.0">! <step id=”first-step" next=”next-step">! <chunk>! <reader ref="MyItemReader”/>! <processor ref="MyItemProcessor”/>! <writer ref="MyItemWriter”/>! </chunk>! </step>!</job>!

Page 256: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 256 Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 256

import javax.batch.api.chunk.ItemReader ; @Named public class MyItemReader implements ItemReader { public void open(Serializable checkpoint) throws Exception {} public void close() throws Exception {} public Object readItem() throws Exception {} public Serializable checkpointInfo() throws Exception { } } もしくは public class MyItemReader extends AbstractItemReader も可

<reader! ref="MyItemReader”/>

Page 257: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 257 Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 257

import javax.batch.api.chunk.ItemProcessor ; @Named public class MyItemProcessor implements ItemProcessor { public Object processItem(Object item) throws Exception { } }

<processor ! ref="MyItemProcessor”/>

Page 258: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 258 Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 258

import javax.batch.api.chunk.ItemWriter; @Named public class MyItemWriter implements ItemWriter{ public void open(Serializable checkpoint) throws Exception { } public void close() throws Exception { } public void writeItems(List<Object> items) throws Exception { } public Serializable checkpointInfo() throws Exception { } } もしくは public class MyItemWriter extends AbstractItemWriter も可

<writer! ref="MyItemWriter”/>

Page 259: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 259 Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 259

<step id=”transferFile”>! <batchlet ref=“MyBatchlet” />!</step>!@Named!

public class MyBatchlet implements Batchlet{! @Override! public String process() throws Exception {! //一括処理(ファイル転送、)! }! @Override! public void stop() throws Exception {! }!}!

Page 260: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 260 Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 260

<job id="myJob" xmlns="http://xmlns.jcp.org/xml/ns/javaee" version="1.0”> <listeners> <listener ref="myJobListener"/> </listeners> <step id="myStep" > <listeners> <listener ref="myItemReadListener"/> <listener ref="myItemProcessorListener"/> <listener ref="myItemWriteListener"/> </listeners> <chunk item-count="3”>. . .</chunk> </step> </job>!

!

Page 261: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 261 Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 261

Interface Abstract Classes

JobListener! AbstractJobListener!

StepListener! AbstractStepListener!

ChunkListener! AbstractChunkListener!

ItemRead/Write/ProcessListener! AbstractItemRead/Write/ProcessListener!

SkipRead/Write/ProcessListener! AbstractSkipRead/Write/ProcessListener!

RetryRead/Write/ProcessListener! AbstractRetryRead/Write/ProcessListener!

Page 262: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 262 Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 262

@Named public class MyJobListener extends AbstractJobListener { @Override public void beforeJob() throws Exception { . . . } @Override public void afterJob() throws Exception { . . . } }!

Page 263: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 263 Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 263

<flow id="flow1" next="step3"> <step id="step1" next="step2"> . . . </step> <step id="step2"> . . . </step> </flow> <step id="step3"> . . . </step>!

flow : 複数のステップを束ね単一ユニットを生成 (ステップのグループ化)

Page 264: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 264 Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 264

<split id="split1" next=" . . . "> <flow id="flow1”> <step id="step1”> . . . </step> </flow> <flow id="flow2”> <step id="step2”> . . . </step> </flow> </split>!

split : flow の並列実行

Page 265: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 265 Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 265

<step id="step1" next="decider1">. . .</step> <decision id="decider1" ref="myDecider"> <next on="DATA_LOADED" to="step2"/> <end on="NOT_LOADED"/> </decision> <step id="step2">. . .</step> !

!@Named public class MyDecider implements Decider { @Override public String decide(StepExecution[] ses) throws Exception{ . . . return "DATA_LOADED"; // or "NOT_LOADED"! }}!

decision : step, split, flow の条件分岐のカスタマイズ

Page 266: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 266

Java EE 7

JSP/JSTL

WebSocket 1.0 JAX-RS 2.0

JSON-P 1.0

JSF 2.2

EL 3.0 Servlet 3.1

EJB 3.2

JPA 2.1

JTA 1.2

JMS 2.0

JCA 1.7

Batch 1.0 JavaMail 1.5

CD

I 1.1

Bea

n Va

lidat

ion

1.1

Inte

rcep

tors

1.2

Con

curr

ency

1.0

Java EE 7 共通

Page 267: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 267

@Resource(lookup="java:comp/DefaultDataSource") DataSource myDataSource;!@Resource DataSource myDataSource; !

Appサーバでデフォルト・リソースが設定済 デフォルトを使用する場合リソース設定を省略可能

#45 デフォルト・データソース (JDBC)

Page 268: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 268

@Resource ConnectionFactory myConnectionFactory;!

デフォルトを使用する場合リソース設定を省略可能

#45 デフォルト・データソース (JMS)

Page 269: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 269

@Resource ManagedExecutorService execService; !

開発時: デフォルト・リソースを使用し設定を統一

#45 デフォルト・データソース (並列処理)

Page 270: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 270

本日のアジェンダ はじめに Java SE の現在と将来 Java EE の現在と将来

さいごに

Page 271: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 271

Page 272: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 272

Page 273: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 273 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 273

日程:2014 年 5 月22 日 場所:品川プリンスホテル 参加費用 : 無料

Page 274: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 274

Java Day Tokyo 2014 日本オラクルからの Java SE 8 ローンチ・イベント Lambda の開発者も来る !!

Page 275: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 275 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 275

登録開始予定 : 4 月 2 日 (水)

Page 276: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 276

Java Developer Newsletter http://tinyurl.com/jdn-reg

Page 277: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 277

Page 278: Java EE 6 & Java EE 7 features

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 278