java ee 6 & java ee 7 features
DESCRIPTION
This explains Java EE 6 & Java EE 7 features.TRANSCRIPT
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 1
Yoshio Terada Java Evangelist http://yoshio3.com, Twitter : @yoshioterada
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 2
以下の事項は、弊社の一般的な製品の方向性に関する概要を説明するものです。また、情報提供を唯一の目的とするものであり、いかなる契約にも組み込むことはできません。以下の事項は、マテリアルやコード、機能を提供することをコミットメント(確約)するものではないため、購買決定を行う際の判断材料になさらないで下さい。オラクル製品に関して記載されている機能の開発、リリースおよび時期については、弊社の裁量により決定されます。
Oracleは、米国オラクルコーポレーション及びその子会社、関連会社の米国及びその他の国における登録商標です。文中の社名、商品名等は各社の商標または登録商標である場合があります。
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 3
Java EE の 歴史と今後について
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 の歴史
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 5
独自フレームワークの組み合わせ (今まで) 運用・保守性の低下
JSP Servlet EL
+ Struts spring HIBERNATE
AXIS
OpenEJB
Jersey
Webコンテナ (Tomcat等)
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 6
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 月 製品ライフサイクル終了
フレームワーク活用のトレンド:世界
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 8
以前と状況は 変わっている
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 9
Rod は会社を去り 今はプロプラ技術
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 10
Paul Maritz 曰く(EMC World)
30歳以下はJavaを使わない
Rubyをはじめとする新たな開発 フレームワークとの親和性を高め、新世代のプログラマもターゲット
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 11
Pivotal 社の将来的な業績予測 も必要
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 12
OSS だから安心
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 13
OSS で安心できる場合
各OSS ライセンスに従い ソースコード・レベルで治す人、治せる人
OSS をベースとした製品の サポート契約を締結されている場合
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 14
独自フレームワーク利用時のリスク セキュリティの脆弱性の対処 ライブラリ間の相性問題 バージョン・アップ
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 15
メンテナンス・コストの増大
納品物の構成 Struts
提供サービス
struts.apache.org/ www.springsource.org/ www.hibernate.org/
実行環境 OSS はソースコードが公開 メンテナンスは利用者の負担が必要
Spring Hibernate
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 16
納品後に発注者のコスト負担が大 ●フレームワーク毎に脆弱性情報の随時 チェックが必要 ●1つに脆弱性が発生した場合、他との 互換性は誰が保証するか不明 ●フレームワーク互換性に対するテスト工数 ●セキュリティ専任技術者の確保が必要
実行環境が Tomcat ならば、さらに負担が大
Struts
提供サービス
Spring Hibernate
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 17
2013 年 7 月 18 日
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 18 WebLogic/GlassFish に標準で含まれる技術を利用
Java EE で発注者の負担が大幅軽減
●Java EE 準拠サーバより脆弱性情報・ パッチ提供が通知 ●各技術間の互換性は、膨大なテストを 実施後正式リリース ●上記より無駄なテスト工数を排除 ●サーバ管理者による管理が可能
Java EE
(オール・イン・ワン)
提供サービス
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 19
軽量化のメリット
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
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 21
war ファイル・サイズ比較
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 22
サーバ側のリソースを開発時から利用
開発者
参照
ライブラリは サーバ側で保持
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 23
アプリケーション起動時間 配備時間の大幅短縮
運用・保守性の向上
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以降 かんたん・軽量
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 25
コード行数 XML設定 クラス数
* JavaOne向けに構築されたPOJO/JPA/RESTベースのサンプル・アプリケーション
開発効率の大幅な改善
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 26
Java: 世界中の広範囲な適用
9,000,000 JAVA DEVELOPERS
DEPLOYING TO 18 COMPLIANT APPLICATION SERVERS
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
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 28
Java EE 利用者の声
三菱UFJインフォメーション テクノロジー ITプロデュース部 斉藤賢哉氏
ロックインが懸念される ベンダー固有の技術ではなく、 オープンな仕様であり、 長く安心して取り組める技術
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 29
Java EE 6に移行することで、構築したアプリケーションのライフサイクルを延長でき、技術トレンドに沿った機能を容易に導入できるようになる。また、サードパーティ製ライブラリへの依存を減らすことで、管理性や安定性が向上し、コードの修正が容易な環境を実現できるだろう
Java EE 利用者の声
楽天株式会社 岩崎浩文氏
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 30
アリエルネットワーク株式会社CTO 井上 誠一郎氏
Java EE 利用者の声
Java EEが使える標準技術になったことで、Java EEの選択が長期開発におけるリスクを大きく軽減できると期待しています。
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 31
Java EE 利用者の声
NTTデータビジネスブレインズ ビジネスソリューション事業部伊賀敏樹氏
これまでのJava EEに対する印象を、一度リセットする必要があると感じた。特にJSFは今では大好きな技術の1つ。小規模な案件でJava EE 6とFaceletsの組み合わせを採用するケースも出てきている
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 32
builder ‒ WebLogic Channel
Java EE に関する情報の宝庫 • .Net 開発者の Java EE 移行経験談 • Java EE の新機能のご紹介 • Struts から JSF への移行ポイント
• など
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 標準
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 34
Java EE 6 プラットフォーム 2009年12月10日
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 35
拡張性 プロファイル 仕様の削減 かんたん開発
Java EE 6 のテーマ
開発生産性の大幅向上
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>
拡張性
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 37
プロファイル
Full Java EE 6 (Enterprise Platform)
Web Profile
Java EE のサブセットを提供 Web 開発に特化 & 軽量
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 開発は十分
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 39
Pruning (枝きり、剪定) → 仕様の削減
古く使われなくなって仕様の整理 次期バージョンで削除 JAX-RPC EJB Entity Bean JAX-R など
→ JAX-WS → JPA
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 40
かんたん開発
• 全てのWeb API でアノテーションを利用可能
• web.xmlはオプション化
• RESTful Webサービス対応
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 に含まれる技術
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 42
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 標準
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 44
HTML 5 対応のフレームワーク選定
従来型 アプリ View
Model
HTTP/JS
View
Service
アプリ HTTP/JS
JSON
View
Model 次世代型
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
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 46
Java EE の一般的なアプリケーション構成
DB
JSF CDI
EJB
クライアント Web アプリケーション
Web コンテナ
JPA (O/R Mapping)
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 47
豊富なコンポーネント
JSF : コンポーネント・ベース開発
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 48
JSFフレームワークと開発の概要
JavaServer Faces
DB
Web サービス
プレゼン テーション
• アプリケーションロジック • コンバート (変換) • バリデーション (検証) • ナビゲーション (画面遷移) • イベント処理
ビジネスロジック クライアント Web アプリケーション
Web コンテナ
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 49
JSF における MVC
ビュー (XHTML)
コントローラ (Faces Servlet)
モデル (マネージド Bean)
操作・ リダイレクト
生成・管理
アクセス
HTTP リクエスト
HTTP レスポンス
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 レスポンス
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 51
Webページ作成者 (デザイナー)
アプリケーション開発者
コンポーネント開発者
JSF 開発者の役割(役割毎に疎で開発可能)
DB
BackEnd 処理
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 52
Webページ作成者 (デザイナー)
アプリケーション開発者
コンポーネント開発者
Web ページ作成者 (プレゼンテーション)
DB
BackEnd 処理
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 53
Web ページの基本
テキストフィールド
ラジオボタン コンボボックス
テキストフィールド
ボタン
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> タグ
テキストフィールド
ラジオボタン
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> タグ
コンボボックス
ボタン
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 56
http://javaserverfaces.java.net/nonav/docs/2.0/pdldocs/facelets/
標準仕様で用意されている JSF タグ
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
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;! }
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!
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 60
表示メッセージの国際化対応
ロケール:ja_JP ロケール:en_US
<h:outputText value="#{msgs.userName1}"/>
表示用の文字列をプロパティより取得 対応ロケールに応じた適切な文字列を取得
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
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/
強力なテンプレート機能
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 63
デザイナーと開発者の共同作業が可能に (jsfc=“”)
§ デザイナーはテキスト&ブラウザで確認 § プログラマーはJSP&Webコンテナで確認 § プログラム後のデザイン修正は困難
§ デザイナーはテキスト&ブラウザで確認 § プログラマーはXHTMLに要素を挿入 § 同一ファイルの為デザイン修正も容易
デザイナー (HTML)
プログラマー (JSP)
コード変換 が必要
今までの開発スタイル
デザイナー プログラマー
(XHTML)
同一ファイルを参照編集可能
JSF 2.0 の開発スタイル
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 タグと同一タグを指定
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 65
Webページ作成者 (デザイナー)
アプリケーション開発者
コンポーネント開発者
JSF 利用者の役割
DB
BackEnd 処理
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 66
View の復元 リクエスト値の 適用 入力値の検証
レスポンスの レンダリング
App ロジックの呼び出し
モデル値の 更新
イベント 処理
イベント 処理
イベント 処理
イベント 処理
JSFのリクエスト処理のライフサイクル
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 67
リクエスト値の 適用 入力値の検証
レスポンスの レンダリング
App ロジックの呼び出し
モデル値の 更新
イベント 処理
イベント 処理
イベント 処理
イベント 処理
JSFのリクエスト処理のライフサイクル
View の復元
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コンポーネント・ツリーの作成・復元)
デコード
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 69
View の復元 入力値の検証
レスポンスの レンダリング
App ロジックの呼び出し
モデル値の 更新
イベント 処理
イベント 処理
イベント 処理
イベント 処理
JSFのリクエスト処理のライフサイクル
リクエスト値の 適用
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()
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 71
View の復元 リクエスト値の 適用
レスポンスの レンダリング
App ロジックの呼び出し
モデル値の 更新
イベント 処理
イベント 処理
イベント 処理
イベント 処理
JSFのリクエスト処理のライフサイクル
入力値の検証
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"/>
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カスタム バリデータ)
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);!
}}}
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;!! }
コンバージョン ‒ (入力データの変換)
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 76
View の復元 リクエスト値の 適用 入力値の検証
レスポンスの レンダリング
App ロジックの呼び出し
イベント 処理
イベント 処理
イベント 処理
イベント 処理
JSFのリクエスト処理のライフサイクル
モデル値の 更新
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 バインディング (通常はこちらを使用)
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 バインディング (必要に応じ使用)
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 79
View の復元 リクエスト値の 適用 入力値の検証
レスポンスの レンダリング
モデル値の 更新
イベント 処理
イベント 処理
イベント 処理
イベント 処理
JSFのリクエスト処理のライフサイクル
App ロジックの呼び出し
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";! }!}
実際の処理にバインディング
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
画面遷移 (ナビゲーション)
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 暗黙的ナビゲーション)
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 暗黙的ナビゲーション)
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 暗黙的ナビゲーション)
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 85
View の復元 リクエスト値の 適用 入力値の検証
App ロジックの呼び出し
モデル値の 更新
イベント 処理
イベント 処理
イベント 処理
イベント 処理
JSFのリクエスト処理のライフサイクル
レスポンスの レンダリング
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 86
UIComponent ツリーから レンダリングコンポーネントの状態保存
HTML
エンコード
HTML HTML
レスポンスのレンダリング
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
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
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 時代のパッケージング
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 のパッケージ簡略化
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で利用)
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 92
EJB 3.1 ‒ Local Inteface の省略が可能
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 名
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 名
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 コンテナ
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 コンテナ
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 コンテナ
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 98
EJB 3.1 ‒ 組み込み可能な EJB コンテナ JUnit による EJB の単体テスト
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 コンテナ
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 100
§ Singleton Session Beansの追加 § 並列アクセス処理対応 § Startup / Shutdownコールバック機能の追加 § タイマーサービス § 自動タイマー生成/カレンダーベースタイマー § 非同期処理
EJB 3.1 ‒ その他の新機能
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 101
§ アプリケーションで唯一のインスタンス § コンテナの停止時にインスタンスは破棄 § 並列アクセスをサポート § Singleton Session Beansの初期化 § 複数のSingletonコンポーネントが存在する場合、コンポーネントの初期化順を規定したい場合、@DependsOnを使用
EJB 3.1 ‒ Singleton Session Bean
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
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
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
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 ‒ タイマー・サービス
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 ‒ タイマー・サービス
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 107
§ アノテーションでかんたんに非同期処理を定義可能 – @Asynchronous:非同期処理の定義 – クラスレベル:クラスに含まれる全メソッドの非同期を定義 – メソッドレベル:特定のメソッド単位で非同期を定義
§ 非同期メソッド定義における返り値の設定 – void型:非同期処理で値を返さなくてもよい場合 – Future<V>:非同期処理結果を返す必要がある場合
§ <V>: 結果の型
EJB 3.1 ‒ 非同期処理
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 ‒ 非同期処理
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
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 110
Java Persistence API
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
– オブジェクト指向型のクエリ言語
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
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と設定ファイル
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 114
Persistence Unit • Persistence Unit
– EntityManagerのインスタンスを生成するファクトリを定義 – EntityクラスをRDBにマッピングする設定 – データベースへの接続用データソース設定 – など
• persistence.xml 設定ファイル – 1つ以上の Persistence Unitを定義可能 – @Entity アノテーションが付加されたクラスを検索
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
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() …
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()
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 118
Persistence Context
• Persistence Context – 管理する Entity の集合 – 1つの Persistence Unit に属する
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
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
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 121
コンテナ管理のEntityManager
• Java EE コンテナによって管理 • DI/JNDI によりEntityManagerインスタンスを取得
– @PersistenceContext EntityManager entityManager;
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
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)のトランザクションタイプを使用
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();!
アプリケーションでトランザクションを管理 コミット、ロールバック等の実装が必要
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 125
Persistence を実現するための概念
PersistenceUnit
EntityManager Factory
EntityManager PersistenceContext
設定
生成 管理
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
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
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)
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;! //セッタ・ゲッタ }!!
デフォルトのカラム設定を上書き
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(遅延読み込み)
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(日付、時刻)
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;! }!!
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()
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();!
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) {! //エンティティが見つからない }!
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 の生成と削除
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 インスタンス
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 氏名共に取得
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!
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!
: (セミコロン)の後に名前を指定 → 実行時引数の名前
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)でクエリの引数に代入
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: 降順)
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 対応
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倍
勤務評価に応じた給料の昇給
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()より効率的)
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 146
プログラミングによるクエリ(Criteria API)
• クエリーの制御をJavaオブジェクトで制御 – JPA1.0ではJPQL/Native SQLでクエリーを記載 – JPQLで可能なことはプログラム上で実現可能
• Criteria APIはクエリー実行結果の型の安全性が向上 – クエリー実行におけるランタイムエラーの発生率が減少 – 統合開発環境の型チェックを利用し安全に実装可能
• JPQLはSQLに精通した開発者に有効 – 統合開発環境が自動的に雛形を生成(開発効率の向上) – 開発者に選択肢を提供
• オブジェクトベース、文字列ベースのクエリーを提供
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など
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’
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 149
Metamodel API
• 強力な型チェックを可能 – ランタイムエラーの排除
• 文字列によるエンティティの属性へのアクセスを排除 – コンパイル時に属性の有無、型チェックを実施
• Metamodelクラスの生成 – _を付加した正規化したMetamodelクラスを生成 – IDEで自動生成(※NetBeans は Ver 7.0 より)
• プログラム上で動的に生成
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” とタイプミス ランタイムエラーが発生
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
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 と入力した場合コンパイルエラーが発生 これによりランタイムエラーの発生頻度を抑制可能
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
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
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
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 156
§ http://www.oracle.com/servers/blades/t5440
リソースコレクション名
プライマリキー
リソースと URI をどのようにマップするかを定義
JAX-RS 1.1 : URI の例
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 : 複数の表現形式
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 : リクエストの構成
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 のリクエスト/レスポンス
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 : ルート・リソース・クラスの例
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 : リソース・クラスの例
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 テンプレート
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
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の実装例
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 165
§ リソース表現のMIME タイプの指定で使用 § MIME タイプに応じたデータを作成しクライアントへ返信 § クラスレベルとメソッドレベルそれぞれで指定可能
– メソッドレベルで設定した値はクラスレベルで設定した値を上書き
165
JAX-RS 1.1 : @Produces
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 の実装例
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 クラスを利用したレスポンス
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
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 の実装例
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 : まとめ
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
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
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
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
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 175
Java EE 7 プラットフォーム 2013年6月12日
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
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 177
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 178
GlassFish v4
NetBeans Java EE SDK
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)
新規追加 大幅な更新 通常の更新
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 180
Java EE 7 のどの機能に興味がありますか? ブログのアンケート結果より
テクノロジー
WebSocket バッチ JAX-RS JSON-P 並列処理
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 181
Java EE 7 主要テーマ
DEVELOPER PRODUCTIVITY
MEETING ENTERPRISE DEMANDS
Java EE 7
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 182
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 へ含まれる機能一覧
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)
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);! } } }!
双方向・全二重の通信を簡単に実現
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) { . . . }!
接続、切断、エラー処理
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 }!
クライアント・エンドポイントも アノテーションで実装可能
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"));!
サーバ・エンドポイントへの接続コード
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) { . . . } }!
オブジェクトとしてメッセージの送受信
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オブジェクトから送信用データを生成
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 オブジェクトに変換
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)
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);!
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);!}!
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());! });! }!
非同期処理:サスペンド&レジューム
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!
リクエスト・レスポンスの ヘッダ用 のインターセプタ(フィルタ)を提供
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());! }! }}}!
リクエスト・レスポンスの ヘッダ用 のインターセプタ(フィルタ)を提供
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!
メッセージ・ボディ用 のインターセプタを提供
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();! }!}!
メッセージ・ボディ用 のインターセプタを提供
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)
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コードはそのまま
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>
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}!
!同一フロー中だけ有効な値の参照・取得
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 204 Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 204
#14: JSF: リソース・ライブラリの契約
柔軟なデザイン変更が可能
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>
テンプレート・クライアントは契約名を記述
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>
テンプレート・クライアントは契約名を記述
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コンポーネント
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)
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 オブジェクトの生成
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 オブジェクトの解析
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)
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 式を記述可能
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)
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 用に新規追加されたメソッド
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 用に新規追加されたインタフェース
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 で実装可能
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で書き込み可能な場合処理を実施
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 を変更しハイジャック防御
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 以外は拒否
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)
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 と同様の振る舞い
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 指定時インジェクション対象から除外 クラス、パッケージ単位で指定可能
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)
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());! }! }!
メソッド引数、メソッドの返り値に対する バリデーションも可能
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)
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) ... {! // ...! }}!
コンストラクタに対するインターセプタが可能
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)!
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)
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) の並列処理パッケージを拡張
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 式を使用した並列処理の実装
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 ); }!
スケジューリング可能な並列処理の実装
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秒毎に新タスクを実行 (タスク実行間隔の調整が可能)
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();});! }!!
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) を付加して実行
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)
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 の機能自身を無効化可能
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 プロファイル版で利用可能
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)
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 以外でもコンテナ管理のトランザクションを利用可能
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();! }}!
トランザクション内でのみ有効なスコープ
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)
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>!
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;! ...!}!
任意のカラムのインデックス化が可能
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();!
明示的なトランザクションへのジョインまで非同期
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 {...}!
待望のストアード・プロシージャの標準化
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)
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
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() の実装は不要
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 が存在
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)
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 251 Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 251
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に記述
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>!
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 254 Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 254
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>!
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”/>
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”/>
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”/>
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 {! }!}!
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>!
!
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!
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 { . . . } }!
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 : 複数のステップを束ね単一ユニットを生成 (ステップのグループ化)
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 の並列実行
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 の条件分岐のカスタマイズ
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 共通
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 267
@Resource(lookup="java:comp/DefaultDataSource") DataSource myDataSource;!@Resource DataSource myDataSource; !
Appサーバでデフォルト・リソースが設定済 デフォルトを使用する場合リソース設定を省略可能
#45 デフォルト・データソース (JDBC)
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 268
@Resource ConnectionFactory myConnectionFactory;!
デフォルトを使用する場合リソース設定を省略可能
#45 デフォルト・データソース (JMS)
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 269
@Resource ManagedExecutorService execService; !
開発時: デフォルト・リソースを使用し設定を統一
#45 デフォルト・データソース (並列処理)
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 270
本日のアジェンダ はじめに Java SE の現在と将来 Java EE の現在と将来
さいごに
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 271
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 272
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 日 場所:品川プリンスホテル 参加費用 : 無料
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 274
Java Day Tokyo 2014 日本オラクルからの Java SE 8 ローンチ・イベント Lambda の開発者も来る !!
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 275 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 275
登録開始予定 : 4 月 2 日 (水)
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 276
Java Developer Newsletter http://tinyurl.com/jdn-reg
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 277
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 278