Your SlideShare is downloading. ×
0
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.1
Yoshio Terada
Java Evangelist
http://yoshio3.com,
Tw...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.2
以下の事項は、弊社の一般的な製品の方向性に関する概要を説明するもの
です。また、情報提供を唯一の目的とす...
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
堅牢
スケーラ...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.5
独自フレームワークの組み合わせ (今まで)
運用・保守性の低下
JSP
Servlet
EL
+
Str...
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 Ecl...
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.or...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.16
納品後に発注者のコスト負担が大
●フレームワーク毎に脆弱性情報の随時
 チェックが必要
●1つに脆弱性...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.17
2013 年 7 月 18 日
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.18WebLogic/GlassFish に標準で含まれる技術を利用
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/hiberna...
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
堅牢
スケー...
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
DEPLOYIN...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.27
NTTドコモが顧客情報管理システムのアプリケーション
実行基盤として
「Oracle WebLogic...
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に移行することで、構
築したアプリケーションのライフサ
イクルを延長でき、技術トレン...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.30
アリエルネットワーク株式会社
CTO 井上 誠一郎氏
Java EE 利用者の声
Java EEが使え...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.31
Java EE 利用者の声
NTTデータビジネスブレイ
ンズ ビジネスソリューショ
ン事業部伊賀敏樹氏...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.32
builder ‒ WebLogic Channel
Java EE に関する情報の宝庫
•  .Ne...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.33
独自技術から標準技術への移行
DB
画面デザイン	
依存性注入
・
ビジネス
ロジック	
DB連携
O...
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  
    ...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.37
プロファイル
Full Java EE 6 (Enterprise Platform)
Web Pro...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.38
Web プロファイルに含まれる仕様
Servlet 3.0 JPA 2.0
JSP 2.2/EL JT...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.39
Pruning (枝きり、剪定) → 仕様の削減
古く使われなくなって仕様の整理
次期バージョンで削除...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.40
かんたん開発
•  全てのWeb API でアノテーションを
利用可能
•  web.xmlはオプショ...
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 ...
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/...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.44
HTML 5 対応のフレームワーク選定
従来型 アプリ
View
Model
HTTP/JS
View...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.45 Copyright © 2012, Oracle and/or its affiliates. All...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.46
Java EE の一般的なアプリケーション構成
DB
JSF
CDI
EJB
クライアント
Web ア...
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
サービス
プレゼン
...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.49
JSF における MVC
ビュー
(XHTML)
コントローラ
(Faces Servlet)
モデル...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.50
コンバータ
ブラウザ
HTML
JavaScript
CSS
バリデータ
JSF の内部アーキテクチャ...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.51
Webページ作成者
(デザイナー)
アプリケーション
開発者
コンポーネント開発者
JSF 開発者の役...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.52
Webページ作成者
(デザイナー)
アプリケーション
開発者
コンポーネント開発者
Web ページ作成...
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:in...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.55
HTML タグ JSF タグ
<select size="1"> !
<option value=”1...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.56
http://javaserverfaces.java.net/nonav/docs/2.0/pdld...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.57
HTML 4.0 & DHTML 属性利用可
onblur	
onchange	
onclick	
 ...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.58
スタイルシートの適用
<HTML>!
<h:head>!
<h:outputStylesheet" l...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.59
JavaScript の読み込み (h:outputScript)
<h:head>!
<h:outp...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.60
表示メッセージの国際化対応
ロケール:ja_JP ロケール:en_US
<h:outputText v...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.61
properties ファイルの作成と利用方法
<h:outputText value="#{msgs...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.62
1 ヘッダ部作成
2
 
左
ペ
イ
ン
作
成
4 フッダ部作成
3
 
右
ペ
イ
ン
作
成
共...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.63
デザイナーと開発者の共同作業が可能に (jsfc= )
§  デザイナーはテキスト&ブラウザで確認
...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.64
XHTMLに対する JSF 要素の埋め込み (jsfc= )
<BODY>!
<FORM>!
<inp...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.65
Webページ作成者
(デザイナー)
アプリケーション
開発者
コンポーネント開発者
JSF 利用者の役...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.66
View の復元
リクエスト値の
適用
入力値の検証
レスポンスの
レンダリング
App ロジック
の...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.67
リクエスト値の
適用
入力値の検証
レスポンスの
レンダリング
App ロジック
の呼び出し
モデル値...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.68
<HTML>!
<h:head>!
<title>タイトル</title>!
</h:head>!
<...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.69
View の復元 入力値の検証
レスポンスの
レンダリング
App ロジック
の呼び出し
モデル値の
...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.70
リクエスト値の適用
<h:inputText value=“#{someData}”/>!
	
<Ht...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.71
View の復元
リクエスト値の
適用
レスポンスの
レンダリング
App ロジック
の呼び出し
モデ...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.72
バリデーション (Bean Validation)
public class Customer imp...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.73
@FacesValidator("jp.co.oracle.validate.EmailValidat...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.74
バリデーション ( JSFカスタム バリデータ)
続き!
@Override!
public void...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.75
<h:inputText id="cal" value="#{person.date}" !
requ...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.76
View の復元
リクエスト値の
適用
入力値の検証
レスポンスの
レンダリング
App ロジック
の...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.77
@ManagedBean(name=“person”)!
//@Named(value=“person...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.78
@ManagedBean(name=“person”)!
//@Named(value=“person...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.79
View の復元
リクエスト値の
適用
入力値の検証
レスポンスの
レンダリング
モデル値の
更新
イ...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.80
§  ボタンが押下された際の実装処理にバインディング
<h:commandButton !
valu...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.81
<navigation-rule>
<from-view-id>page1.xhtml</from-v...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.82
<h:commandButton action="page2" value="Submit" />!
...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.83
<h:commandButton action=“#{customerManage.savePerso...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.84
<h:commandButton action="page2?faces-redirect=true"...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.85
View の復元
リクエスト値の
適用
入力値の検証
App ロジック
の呼び出し
モデル値の
更新
...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.86
UIComponent ツリーから
レンダリングコンポーネントの状態保存
HTML
エンコード
HTM...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.87 Copyright © 2012, Oracle and/or its affiliates. All...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.88
§ 特徴
–  パッケージの簡略化
–  EJB 3.1 Lite の提供
–  ローカルビジネスイ...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.89
適切なアーカイブファイル (ear,war,jar)へパッケージ化が必要
面倒なパッケージング/作業負...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.90
•  かんたんなパッケージング
•  EJBをwarファイルへ含める事が可能
•  WEB-INF/c...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.91
§ Lite
–  ローカルセッションBeans
–  CMT/BMT
–  Declarative...
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名はアプリケーションサーバ提供ベンダー独...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.94
 @Stateless!
 public class HelloBean implements Hel...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.95
§  EJB 3.0まで
–  EJBコンポーネントの単体テストは困難
–  Remote Faca...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.96
package test;!
import javax.ejb.Stateless;!
@Statel...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.97
@Test!
public void testSayHello() {!
Map p = new Ha...
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
– ...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.100
§  Singleton Session Beansの追加
§  並列アクセス処理対応
§  ...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.101
§  アプリケーションで唯一のインスタンス
§  コンテナの停止時にインスタンスは破棄
§  ...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.102
@Singleton!
public class SharedBean {!
private Sha...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.103
§  コンテナ管理(デフォルト)
–  @ConcurrencyManagement(CONTAI...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.104
@Singleton!
@Startup (アプリケーション起動時 EJB コンテナが初期化)
pu...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.105
§  EJBコンテナが提供するサービス
–  アノテーションでスケジュールを定義
§  @Sch...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.106
@Stateless !
public class BankBean { !
@Persistenc...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.107
§  アノテーションでかんたんに非同期処理を定義可能
–  @Asynchronous:非同期処理...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.108
@Stateless public class DocBean {!
@PersistenceCon...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.109 Copyright © 2012, Oracle and/or its affiliates. Al...
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
–  Jav...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.112
JPA の構成要素
Persistence Context	
Entity
EntityManage...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.113
Persistence Context	
Entity
EntityManager
Factory	...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.114
Persistence Unit
•  Persistence Unit
–  EntityMana...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.115
<persistence version="2.0" xmlns="http://java.sun....
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.116
Entity Manager API
EntityManager
Factory	
Persiste...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.117
EntityManager
•  EntityManager
–  Entityのインスタンスのライ...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.118
Persistence Context
•  Persistence Context
–  管理する...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.119
Servlet
EJB
Javaアプリ
persist()
remove()
refresh()
m...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.120
Persistence ContextとEntityManager
•  2種類のEntityMan...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.121
コンテナ管理のEntityManager
•  Java EE コンテナによって管理
•  DI/J...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.122
@Stateless!
 public class MyEnterpriseBean {!
@Per...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.123
アプリケーション管理のEntityManager
•  EntityManagerFactoryから...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.124
アプリケーション管理のEntityManager
EntityManagerFactory emf ...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.125
Persistence を実現するための概念
PersistenceUnit	
EntityMana...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.126
Persistence Context	
EntityManager
Factory	
Entity...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.127
Entity とテーブルのかんたんなマッピング
@Entity!
public class Cust...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.128
@Entity!
@Table(name=“ORACLE_CUSTOMER”)!
public cl...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.129
@Entity!
public class Customer implements Serializ...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.130
@Entity!
public class Customer implements Serializ...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.131
@Entity!
public class Customer implements Serializ...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.132
 @Embeddable!
 public class Address{!
private Stri...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.133
Entity のライフサイクル
Entityの生成(new MyEntity())
em.persi...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.134
Entity のライフサイクル
EntityManagerFactory emf = !
Persi...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.135
Entity と ID を使用した検索
Customer customer = em.find(Cu...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.136
Customer customer = !
new Customer(”Taro", ”Yamada...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.137
JPQL(Java Persistence Query Language)
•  SQLに類似したク...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.138
JPQLクエリ (SELECT 句の例)
SELECT c FROM Customer c WHER...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.139
SELECT c FROM Customer c!
WHERE c.firstName = ’Tar...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.140
JPQLクエリ (パラメータの動的バインド例)
SELECT c FROM Customer c!
...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.141
JPQLクエリ (パラメータの動的バインド例)
TypedQuery<Customer> query...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.142
JPQL(サブクエリ、オーダ)
SELECT c FROM Customer c!
WHERE c....
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.143
•  検索結果を変更したい場合、テーブル定義の変更ができ
ない場合に有効
•  CASE
–  CA...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.144
UPDATE Employee e!
SET e.salary =!
CASE e.rating !...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.145
データの一括操作
DELETE FROM Customer c WHERE c.age < 18!
...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.146
プログラミングによるクエリ(Criteria API)
•  クエリーの制御をJavaオブジェクトで...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.147
Criteria API
•  CriteriaBuilder :
–  CriteriaQuery...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.148
Criteria API実装と対応するJPQL
EntityManager em = … ;!
Cr...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.149
Metamodel API
•  強力な型チェックを可能
–  ランタイムエラーの排除
•  文字列...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.150
Metamodel APIを使用しない場合の潜在的問題点
EntityManager em = … ...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.151
@Entity!
!
public class Person {!
@Id!
@GeneratedV...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.152
Metamodel クラスを利用して実装した例
EntityManager em = … ;!
Cr...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.153 Copyright © 2012, Oracle and/or its affiliates. Al...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.154
§  RESTful サービス用の高レベル HTTP API
§  POJO とアノテーションベ...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.155
§  全ての HTTP リソースは ID を持つ
–  ID を URI で表す
–  http:...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.156
§  http://www.oracle.com/servers/blades/t5440	
リソ...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.157
§  複数形式のフォーマットを提供
–  XML
–  JSON
–  (X)HTML
§  コ...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.158
§  リクエストのリソース(名詞)
–  URI で識別
–  例:http://www.exam...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.159
GET /music/artists/beatles/recordings HTTP/1.1
Hos...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.160
§  想定するアプリケーションコンテキスト
–  http://example.com/catal...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.161
161
@Path(“root”)!
Public class RootResource{ //リク...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.162
§  URI パステンプレート
–  URI 表現中の埋め込み変数の利用
–  リクエストされた特...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.163
§  2つのアノテーションを使用しクライアントから送信された情報を抽出
§  @PathPara...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.164
164
@Path(“/items”)!
@Consumes(“application/xml”)!...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.165
§  リソース表現のMIME タイプの指定で使用
§  MIME タイプに応じたデータを作成しク...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.166
166
@Path(“/myResource”)!
@Produces(“text/plain”)!...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.167
167
!
//新規リソースを作成後、追加リソースを指すURIを返す
@POST!
@Consume...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.168
§  クライアントから送信されたリソースの MIME タイプを指定
§  クラスレベル、メソッド...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.169
169
!
//クライアントで指定された MIME タイプに応じた処理の実施
@POST!
@Con...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.170
§  JAX-RS 1.1
–  Web Profile には含まれない (Java EE 7 より...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.171 Copyright © 2012, Oracle and/or its affiliates. Al...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.172
§  アプリケーション中で宣言的なバリデーションが可能
§  カスタムバリデーションを作成可能
...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.173 Copyright © 2012, Oracle and/or its affiliates. Al...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.174
§  @Inject アノテーション
–  @Inject @LoggedIn User user...
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
堅牢
スケ...
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 ...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.180
Java EE 7 のどの機能に興味がありますか?
ブログのアンケート結果より
テクノロジー
Web...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.181
Java EE 7 主要テーマ
DEVELOPER
PRODUCTIVITY
MEETING
ENT...
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...
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...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.185 Copyright © 2014, Oracle and/or its affiliates. Al...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.186 Copyright © 2014, Oracle and/or its affiliates. Al...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.187 Copyright © 2014, Oracle and/or its affiliates. Al...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.188 Copyright © 2014, Oracle and/or its affiliates. Al...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.189 Copyright © 2014, Oracle and/or its affiliates. Al...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.190 Copyright © 2014, Oracle and/or its affiliates. Al...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.191 Copyright © 2014, Oracle and/or its affiliates. Al...
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...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.193 Copyright © 2014, Oracle and/or its affiliates. Al...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.194 Copyright © 2014, Oracle and/or its affiliates. Al...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.195 Copyright © 2014, Oracle and/or its affiliates. Al...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.196 Copyright © 2014, Oracle and/or its affiliates. Al...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.197 Copyright © 2014, Oracle and/or its affiliates. Al...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.198 Copyright © 2014, Oracle and/or its affiliates. Al...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.199 Copyright © 2014, Oracle and/or its affiliates. Al...
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...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.201 Copyright © 2014, Oracle and/or its affiliates. Al...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.202 Copyright © 2014, Oracle and/or its affiliates. Al...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.203 Copyright © 2014, Oracle and/or its affiliates. Al...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.204 Copyright © 2014, Oracle and/or its affiliates. Al...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.205 Copyright © 2014, Oracle and/or its affiliates. Al...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.206 Copyright © 2014, Oracle and/or its affiliates. Al...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.207 Copyright © 2014, Oracle and/or its affiliates. Al...
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...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.209 Copyright © 2014, Oracle and/or its affiliates. Al...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.210 Copyright © 2014, Oracle and/or its affiliates. Al...
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...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.212 Copyright © 2014, Oracle and/or its affiliates. Al...
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...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.214 Copyright © 2014, Oracle and/or its affiliates. Al...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.215 Copyright © 2014, Oracle and/or its affiliates. Al...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.216 Copyright © 2014, Oracle and/or its affiliates. Al...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.217 Copyright © 2014, Oracle and/or its affiliates. Al...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.218 Copyright © 2014, Oracle and/or its affiliates. Al...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.219 Copyright © 2014, Oracle and/or its affiliates. Al...
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...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.221 Copyright © 2014, Oracle and/or its affiliates. Al...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.222 Copyright © 2014, Oracle and/or its affiliates. Al...
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...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.224
#23: Bean Validation: メソッド・バリデーション
public class Ca...
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...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.226 Copyright © 2014, Oracle and/or its affiliates. Al...
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.227 Copyright © 2014, Oracle and/or its affiliates. Al...
Java EE 6 & Java EE 7 features
Java EE 6 & Java EE 7 features
Java EE 6 & Java EE 7 features
Java EE 6 & Java EE 7 features
Java EE 6 & Java EE 7 features
Java EE 6 & Java EE 7 features
Java EE 6 & Java EE 7 features
Java EE 6 & Java EE 7 features
Java EE 6 & Java EE 7 features
Java EE 6 & Java EE 7 features
Java EE 6 & Java EE 7 features
Java EE 6 & Java EE 7 features
Java EE 6 & Java EE 7 features
Java EE 6 & Java EE 7 features
Java EE 6 & Java EE 7 features
Java EE 6 & Java EE 7 features
Java EE 6 & Java EE 7 features
Java EE 6 & Java EE 7 features
Java EE 6 & Java EE 7 features
Java EE 6 & Java EE 7 features
Java EE 6 & Java EE 7 features
Java EE 6 & Java EE 7 features
Java EE 6 & Java EE 7 features
Java EE 6 & Java EE 7 features
Java EE 6 & Java EE 7 features
Java EE 6 & Java EE 7 features
Java EE 6 & Java EE 7 features
Java EE 6 & Java EE 7 features
Java EE 6 & Java EE 7 features
Java EE 6 & Java EE 7 features
Java EE 6 & Java EE 7 features
Java EE 6 & Java EE 7 features
Java EE 6 & Java EE 7 features
Java EE 6 & Java EE 7 features
Java EE 6 & Java EE 7 features
Java EE 6 & Java EE 7 features
Java EE 6 & Java EE 7 features
Java EE 6 & Java EE 7 features
Java EE 6 & Java EE 7 features
Java EE 6 & Java EE 7 features
Java EE 6 & Java EE 7 features
Java EE 6 & Java EE 7 features
Java EE 6 & Java EE 7 features
Java EE 6 & Java EE 7 features
Java EE 6 & Java EE 7 features
Java EE 6 & Java EE 7 features
Java EE 6 & Java EE 7 features
Java EE 6 & Java EE 7 features
Java EE 6 & Java EE 7 features
Java EE 6 & Java EE 7 features
Java EE 6 & Java EE 7 features
Upcoming SlideShare
Loading in...5
×

Java EE 6 & Java EE 7 features

3,301

Published on

This explains Java EE 6 & Java EE 7 features.

Published in: Technology
0 Comments
10 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
3,301
On Slideshare
0
From Embeds
0
Number of Embeds
5
Actions
Shares
0
Downloads
96
Comments
0
Likes
10
Embeds 0
No embeds

No notes for slide

Transcript of "Java EE 6 & Java EE 7 features"

  1. 1. Copyright © 2012, Oracle and/or its affiliates. All rights reserved.1 Yoshio Terada Java Evangelist http://yoshio3.com, Twitter : @yoshioterada
  2. 2. Copyright © 2012, Oracle and/or its affiliates. All rights reserved.2 以下の事項は、弊社の一般的な製品の方向性に関する概要を説明するもの です。また、情報提供を唯一の目的とするものであり、いかなる契約にも 組み込むことはできません。以下の事項は、マテリアルやコード、機能を 提供することをコミットメント(確約)するものではないため、購買決定 を行う際の判断材料になさらないで下さい。オラクル製品に関して記載さ れている機能の開発、リリースおよび時期については、弊社の裁量により 決定されます。 Oracleは、米国オラクルコーポレーション及びその子会社、関連会社の米国及びその他の国における登録商 標です。文中の社名、商品名等は各社の商標または登録商標である場合があります。
  3. 3. Copyright © 2012, Oracle and/or its affiliates. All rights reserved.3 Java EE の 歴史と今後について
  4. 4. 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 Architectur e J2EE 1.4 Web Services Mgmt, Deployment, Async Connector J2EE 1.2 Servlet, JSP, EJB, JMS RMI/IIOP Java EE の歴史
  5. 5. Copyright © 2012, Oracle and/or its affiliates. All rights reserved.5 独自フレームワークの組み合わせ (今まで) 運用・保守性の低下 JSP Servlet EL + Struts spring HIBERNATE AXIS OpenEJB Jersey Webコンテナ (Tomcat等)
  6. 6. Copyright © 2012, Oracle and/or its affiliates. All rights reserved.6
  7. 7. 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 月 製品ライフサイクル終了 フレームワーク活用のトレンド:世界
  8. 8. Copyright © 2012, Oracle and/or its affiliates. All rights reserved.8 以前と状況は 変わっている
  9. 9. Copyright © 2012, Oracle and/or its affiliates. All rights reserved.9 Rod は会社を去り 今はプロプラ技術
  10. 10. Copyright © 2012, Oracle and/or its affiliates. All rights reserved.10 Paul Maritz 曰く(EMC World) 30歳以下はJavaを使わない Rubyをはじめとする新たな開発 フレームワークとの親和性を高め、 新世代のプログラマもターゲット
  11. 11. Copyright © 2012, Oracle and/or its affiliates. All rights reserved.11 Pivotal 社の将来的な業績予測 も必要
  12. 12. Copyright © 2012, Oracle and/or its affiliates. All rights reserved.12 OSS だから安心
  13. 13. Copyright © 2012, Oracle and/or its affiliates. All rights reserved.13 OSS で安心できる場合 各OSS ライセンスに従い ソースコード・レベルで治す人、治せる人 OSS をベースとした製品の サポート契約を締結されている場合
  14. 14. Copyright © 2012, Oracle and/or its affiliates. All rights reserved.14 独自フレームワーク利用時のリスク セキュリティの脆弱性の対処 ライブラリ間の相性問題 バージョン・アップ
  15. 15. Copyright © 2012, Oracle and/or its affiliates. All rights reserved.15 メンテナンス・コストの増大 納品物の構成 Struts 提供サービス struts.apache.org/ www.springsource.org/ www.hibernate.org/ 実行環境 OSS はソースコードが公開 メンテナンスは利用者の負担が必要 Spring Hibernate
  16. 16. Copyright © 2012, Oracle and/or its affiliates. All rights reserved.16 納品後に発注者のコスト負担が大 ●フレームワーク毎に脆弱性情報の随時  チェックが必要 ●1つに脆弱性が発生した場合、他との  互換性は誰が保証するか不明 ●フレームワーク互換性に対するテスト工数 ●セキュリティ専任技術者の確保が必要 実行環境が Tomcat ならば、さらに負担が大 Struts 提供サービス Spring Hibernate
  17. 17. Copyright © 2012, Oracle and/or its affiliates. All rights reserved.17 2013 年 7 月 18 日
  18. 18. Copyright © 2012, Oracle and/or its affiliates. All rights reserved.18WebLogic/GlassFish に標準で含まれる技術を利用 Java EE で発注者の負担が大幅軽減 ●Java EE 準拠サーバより脆弱性情報・   パッチ提供が通知 ●各技術間の互換性は、膨大なテストを  実施後正式リリース ●上記より無駄なテスト工数を排除 ●サーバ管理者による管理が可能 Java EE (オール・イン・ワン) 提供サービス
  19. 19. Copyright © 2012, Oracle and/or its affiliates. All rights reserved.19 軽量化のメリット
  20. 20. 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
  21. 21. Copyright © 2012, Oracle and/or its affiliates. All rights reserved.21 war ファイル・サイズ比較
  22. 22. Copyright © 2012, Oracle and/or its affiliates. All rights reserved.22 サーバ側のリソースを開発時から利用 開発者 参照 ライブラリは サーバ側で保持
  23. 23. Copyright © 2012, Oracle and/or its affiliates. All rights reserved.23 アプリケーション起動時間 配備時間の大幅短縮 運用・保守性の向上
  24. 24. 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以降 かんたん・軽量
  25. 25. Copyright © 2012, Oracle and/or its affiliates. All rights reserved.25 コード行数 XML設定クラス数 * JavaOne向けに構築されたPOJO/JPA/RESTベースのサンプル・アプリケーション 開発効率の大幅な改善
  26. 26. Copyright © 2012, Oracle and/or its affiliates. All rights reserved.26 Java: 世界中の広範囲な適用 9,000,000 JAVA DEVELOPERS DEPLOYING TO 18 COMPLIANT APPLICATION SERVERS
  27. 27. 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
  28. 28. Copyright © 2012, Oracle and/or its affiliates. All rights reserved.28 Java EE 利用者の声 三菱UFJインフォメーション テクノロジー ITプロデュー ス部 斉藤賢哉氏 ロックインが懸念される ベンダー固有の技術ではなく、 オープンな仕様であり、 長く安心して取り組める技術
  29. 29. Copyright © 2012, Oracle and/or its affiliates. All rights reserved.29 Java EE 6に移行することで、構 築したアプリケーションのライフサ イクルを延長でき、技術トレンドに 沿った機能を容易に導入できるよう になる。また、サードパーティ製ラ イブラリへの依存を減らすことで、 管理性や安定性が向上し、コードの 修正が容易な環境を実現できるだろ う Java EE 利用者の声 楽天株式会社 岩崎浩文氏
  30. 30. Copyright © 2012, Oracle and/or its affiliates. All rights reserved.30 アリエルネットワーク株式会社 CTO 井上 誠一郎氏 Java EE 利用者の声 Java EEが使える標準技術に なったことで、Java EEの選 択が長期開発におけるリスク を大きく軽減できると期待し ています。
  31. 31. Copyright © 2012, Oracle and/or its affiliates. All rights reserved.31 Java EE 利用者の声 NTTデータビジネスブレイ ンズ ビジネスソリューショ ン事業部伊賀敏樹氏 これまでのJava EEに対する 印象を、一度リセットする必 要があると感じた。特にJSF は今では大好きな技術の1つ。 小規模な案件でJava EE 6と Faceletsの組み合わせを採 用するケースも出てきている
  32. 32. Copyright © 2012, Oracle and/or its affiliates. All rights reserved.32 builder ‒ WebLogic Channel Java EE に関する情報の宝庫 •  .Net 開発者の Java EE 移行経験談 •  Java EE の新機能のご紹介 •  Struts から JSF への移行ポイント •  など
  33. 33. 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 標準
  34. 34. Copyright © 2012, Oracle and/or its affiliates. All rights reserved.34 Java EE 6 プラットフォーム 2009年12月10日
  35. 35. Copyright © 2012, Oracle and/or its affiliates. All rights reserved.35 拡張性 プロファイル 仕様の削減 かんたん開発 Java EE 6 のテーマ 開発生産性の大幅向上
  36. 36. 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> 拡張性
  37. 37. Copyright © 2012, Oracle and/or its affiliates. All rights reserved.37 プロファイル Full Java EE 6 (Enterprise Platform) Web Profile Java EE のサブセットを提供 Web 開発に特化 & 軽量
  38. 38. 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 開発は十分
  39. 39. Copyright © 2012, Oracle and/or its affiliates. All rights reserved.39 Pruning (枝きり、剪定) → 仕様の削減 古く使われなくなって仕様の整理 次期バージョンで削除 JAX-RPC EJB Entity Bean JAX-R など → JAX-WS → JPA
  40. 40. Copyright © 2012, Oracle and/or its affiliates. All rights reserved.40 かんたん開発 •  全てのWeb API でアノテーションを 利用可能 •  web.xmlはオプション化 •  RESTful Webサービス対応
  41. 41. 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 BeanValidation Java EE 6 に含まれる技術
  42. 42. Copyright © 2012, Oracle and/or its affiliates. All rights reserved.42
  43. 43. 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 標準
  44. 44. Copyright © 2012, Oracle and/or its affiliates. All rights reserved.44 HTML 5 対応のフレームワーク選定 従来型 アプリ View Model HTTP/JS View Service アプリ HTTP/JS JSON View Model 次世代型
  45. 45. 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
  46. 46. Copyright © 2012, Oracle and/or its affiliates. All rights reserved.46 Java EE の一般的なアプリケーション構成 DB JSF CDI EJB クライアント Web アプリケーション Web コンテナ JPA (O/R Mapping)
  47. 47. Copyright © 2012, Oracle and/or its affiliates. All rights reserved.47 豊富なコンポーネント JSF : コンポーネント・ベース開発
  48. 48. Copyright © 2012, Oracle and/or its affiliates. All rights reserved.48 JSFフレームワークと開発の概要 JavaServer Faces DB Web サービス プレゼン テーション •  アプリケーションロジック •  コンバート (変換) •  バリデーション (検証) •  ナビゲーション (画面遷移) •  イベント処理 ビジネスロジック クライアント Web アプリケーション Web コンテナ
  49. 49. Copyright © 2012, Oracle and/or its affiliates. All rights reserved.49 JSF における MVC ビュー (XHTML) コントローラ (Faces Servlet) モデル (マネージド Bean) 操作・ リダイレクト 生成・管理 アクセス HTTP リクエスト HTTP レスポンス
  50. 50. 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 レスポンス
  51. 51. Copyright © 2012, Oracle and/or its affiliates. All rights reserved.51 Webページ作成者 (デザイナー) アプリケーション 開発者 コンポーネント開発者 JSF 開発者の役割(役割毎に疎で開発可能) DB BackEnd 処理
  52. 52. Copyright © 2012, Oracle and/or its affiliates. All rights reserved.52 Webページ作成者 (デザイナー) アプリケーション 開発者 コンポーネント開発者 Web ページ作成者 (プレゼンテーション) DB BackEnd 処理
  53. 53. Copyright © 2012, Oracle and/or its affiliates. All rights reserved.53 Web ページの基本 テキストフィールド ラジオボタン コンボボックス テキストフィールド ボタン
  54. 54. 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> タグ テキストフィールド ラジオボタン
  55. 55. 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> タグ コンボボックス ボタン
  56. 56. Copyright © 2012, Oracle and/or its affiliates. All rights reserved.56 http://javaserverfaces.java.net/nonav/docs/2.0/pdldocs/facelets/ 標準仕様で用意されている JSF タグ
  57. 57. Copyright © 2012, Oracle and/or its affiliates. All rights reserved.57 HTML 4.0 & DHTML 属性利用可 onblur onchange onclick ondblclick onfocus onkeydown onkeypress onmousemove 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
  58. 58. 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;! }
  59. 59. 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!
  60. 60. Copyright © 2012, Oracle and/or its affiliates. All rights reserved.60 表示メッセージの国際化対応 ロケール:ja_JP ロケール:en_US <h:outputText value="#{msgs.userName1}"/> 表示用の文字列をプロパティより取得 対応ロケールに応じた適切な文字列を取得
  61. 61. 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
  62. 62. 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/ 強力なテンプレート機能
  63. 63. Copyright © 2012, Oracle and/or its affiliates. All rights reserved.63 デザイナーと開発者の共同作業が可能に (jsfc= ) §  デザイナーはテキスト&ブラウザで確認 §  プログラマーはJSP&Webコンテナで確認 §  プログラム後のデザイン修正は困難 §  デザイナーはテキスト&ブラウザで確認 §  プログラマーはXHTMLに要素を挿入 §  同一ファイルの為デザイン修正も容易 デザイナー (HTML) プログラマー (JSP) コード変換 が必要 今までの開発スタイル デザイナー プログラマー (XHTML) 同一ファイルを参照編集可能 JSF 2.0 の開発スタイル
  64. 64. 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 タグと同一タグを指定
  65. 65. Copyright © 2012, Oracle and/or its affiliates. All rights reserved.65 Webページ作成者 (デザイナー) アプリケーション 開発者 コンポーネント開発者 JSF 利用者の役割 DB BackEnd 処理
  66. 66. Copyright © 2012, Oracle and/or its affiliates. All rights reserved.66 View の復元 リクエスト値の 適用 入力値の検証 レスポンスの レンダリング App ロジック の呼び出し モデル値の 更新 イベント 処理 イベント 処理 イベント 処理 イベント 処理 JSFのリクエスト処理のライフサイクル
  67. 67. Copyright © 2012, Oracle and/or its affiliates. All rights reserved.67 リクエスト値の 適用 入力値の検証 レスポンスの レンダリング App ロジック の呼び出し モデル値の 更新 イベント 処理 イベント 処理 イベント 処理 イベント 処理 JSFのリクエスト処理のライフサイクル View の復元
  68. 68. 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コンポーネント・ツリーの作成・復元) デコード
  69. 69. Copyright © 2012, Oracle and/or its affiliates. All rights reserved.69 View の復元 入力値の検証 レスポンスの レンダリング App ロジック の呼び出し モデル値の 更新 イベント 処理 イベント 処理 イベント 処理 イベント 処理 JSFのリクエスト処理のライフサイクル リクエスト値の 適用
  70. 70. 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()
  71. 71. Copyright © 2012, Oracle and/or its affiliates. All rights reserved.71 View の復元 リクエスト値の 適用 レスポンスの レンダリング App ロジック の呼び出し モデル値の 更新 イベント 処理 イベント 処理 イベント 処理 イベント 処理 JSFのリクエスト処理のライフサイクル 入力値の検証
  72. 72. 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"/>
  73. 73. 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カスタム バリデータ)
  74. 74. 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);! }}}
  75. 75. 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;! ! } コンバージョン ‒ (入力データの変換)
  76. 76. Copyright © 2012, Oracle and/or its affiliates. All rights reserved.76 View の復元 リクエスト値の 適用 入力値の検証 レスポンスの レンダリング App ロジック の呼び出し イベント 処理 イベント 処理 イベント 処理 イベント 処理 JSFのリクエスト処理のライフサイクル モデル値の 更新
  77. 77. 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 バインディング (通常はこちらを使用)
  78. 78. 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 バインディング (必要に応じ使用)
  79. 79. Copyright © 2012, Oracle and/or its affiliates. All rights reserved.79 View の復元 リクエスト値の 適用 入力値の検証 レスポンスの レンダリング モデル値の 更新 イベント 処理 イベント 処理 イベント 処理 イベント 処理 JSFのリクエスト処理のライフサイクル App ロジック の呼び出し
  80. 80. 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";! }! } 実際の処理にバインディング
  81. 81. 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 画面遷移 (ナビゲーション)
  82. 82. 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 暗黙的ナビゲーション)
  83. 83. 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 暗黙的ナビゲーション)
  84. 84. 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 暗黙的ナビゲーション)
  85. 85. Copyright © 2012, Oracle and/or its affiliates. All rights reserved.85 View の復元 リクエスト値の 適用 入力値の検証 App ロジック の呼び出し モデル値の 更新 イベント 処理 イベント 処理 イベント 処理 イベント 処理 JSFのリクエスト処理のライフサイクル レスポンスの レンダリング
  86. 86. Copyright © 2012, Oracle and/or its affiliates. All rights reserved.86 UIComponent ツリーから レンダリングコンポーネントの状態保存 HTML エンコード HTMLHTML レスポンスのレンダリング
  87. 87. 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
  88. 88. 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
  89. 89. 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 時代のパッケージング
  90. 90. 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 のパッケージ簡略化
  91. 91. 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で利用)
  92. 92. Copyright © 2012, Oracle and/or its affiliates. All rights reserved.92 EJB 3.1 ‒ Local Inteface の省略が可能
  93. 93. 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 名
  94. 94. 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 名
  95. 95. 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 コンテナ
  96. 96. 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 コンテナ
  97. 97. 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 コンテナ
  98. 98. Copyright © 2012, Oracle and/or its affiliates. All rights reserved.98 EJB 3.1 ‒ 組み込み可能な EJB コンテナ JUnit による EJB の単体テスト
  99. 99. 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 コンテナ
  100. 100. Copyright © 2012, Oracle and/or its affiliates. All rights reserved.100 §  Singleton Session Beansの追加 §  並列アクセス処理対応 §  Startup / Shutdownコールバック機能の追加 §  タイマーサービス §  自動タイマー生成/カレンダーベースタイマー §  非同期処理 EJB 3.1 ‒ その他の新機能
  101. 101. Copyright © 2012, Oracle and/or its affiliates. All rights reserved.101 §  アプリケーションで唯一のインスタンス §  コンテナの停止時にインスタンスは破棄 §  並列アクセスをサポート §  Singleton Session Beansの初期化 §  複数のSingletonコンポーネントが存在する場合、コンポーネント の初期化順を規定したい場合、@DependsOnを使用 EJB 3.1 ‒ Singleton Session Bean
  102. 102. 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
  103. 103. 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
  104. 104. 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
  105. 105. 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 ‒ タイマー・サービス
  106. 106. 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 ‒ タイマー・サービス
  107. 107. Copyright © 2012, Oracle and/or its affiliates. All rights reserved.107 §  アノテーションでかんたんに非同期処理を定義可能 –  @Asynchronous:非同期処理の定義 –  クラスレベル:クラスに含まれる全メソッドの非同期を定義 –  メソッドレベル:特定のメソッド単位で非同期を定義 §  非同期メソッド定義における返り値の設定 –  void型:非同期処理で値を返さなくてもよい場合 –  Future<V>:非同期処理結果を返す必要がある場合 §  <V>: 結果の型 EJB 3.1 ‒ 非同期処理
  108. 108. 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 ‒ 非同期処理
  109. 109. 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
  110. 110. Copyright © 2012, Oracle and/or its affiliates. All rights reserved.110 Java Persistence API
  111. 111. 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 –  オブジェクト指向型のクエリ言語
  112. 112. 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
  113. 113. 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と設定ファイル
  114. 114. Copyright © 2012, Oracle and/or its affiliates. All rights reserved.114 Persistence Unit •  Persistence Unit –  EntityManagerのインスタンスを生成するファクトリを定義 –  EntityクラスをRDBにマッピングする設定 –  データベースへの接続用データソース設定 –  など •  persistence.xml 設定ファイル –  1つ以上の Persistence Unitを定義可能 –  @Entity アノテーションが付加されたクラスを検索
  115. 115. 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
  116. 116. Copyright © 2012, Oracle and/or its affiliates. All rights reserved.116 Entity Manager API EntityManager Factory Persistence Unit Persistence.xml Persistence Context EntityEntityManager API persist() remove() find() …
  117. 117. 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()
  118. 118. Copyright © 2012, Oracle and/or its affiliates. All rights reserved.118 Persistence Context •  Persistence Context –  管理する Entity の集合 –  1つの Persistence Unit に属する
  119. 119. 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
  120. 120. 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
  121. 121. Copyright © 2012, Oracle and/or its affiliates. All rights reserved.121 コンテナ管理のEntityManager •  Java EE コンテナによって管理 •  DI/JNDI によりEntityManagerインスタンスを取得 –  @PersistenceContext EntityManager entityManager;
  122. 122. 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
  123. 123. 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)のトラ ンザクションタイプを使用
  124. 124. 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();! アプリケーションでトランザクションを管理 コミット、ロールバック等の実装が必要
  125. 125. Copyright © 2012, Oracle and/or its affiliates. All rights reserved.125 Persistence を実現するための概念 PersistenceUnit EntityManager Factory EntityManager PersistenceContext 設定 生成 管理
  126. 126. 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
  127. 127. 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
  128. 128. 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)
  129. 129. 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;! //セッタ・ゲッタ }! ! デフォルトのカラム設定を上書き
  130. 130. 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(遅延読み込み)
  131. 131. 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(日付、時刻)
  132. 132. 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;!  }! !
  133. 133. 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()
  134. 134. 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();!
  135. 135. 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) {! //エンティティが見つからない }!
  136. 136. Copyright © 2012, Oracle and/or its affiliates. All rights reserved.136 Customer customer = ! new Customer(”Taro", ”Yamada", ”taro.yamada@mail.com");! tx.begin();! em.persist(customer);! tx.commit();! tx.begin();! em.remove(customer);! tx.commit();! Entity の生成と削除
  137. 137. 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 インスタンス
  138. 138. 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 氏名共に取得
  139. 139. 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!
  140. 140. 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! : (セミコロン)の後に名前を指定 → 実行時引数の名前
  141. 141. 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)でクエリの引数に代入
  142. 142. 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: 降順)
  143. 143. 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 対応
  144. 144. 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倍 勤務評価に応じた給料の昇給
  145. 145. 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()より効率的)
  146. 146. Copyright © 2012, Oracle and/or its affiliates. All rights reserved.146 プログラミングによるクエリ(Criteria API) •  クエリーの制御をJavaオブジェクトで制御 –  JPA1.0ではJPQL/Native SQLでクエリーを記載 –  JPQLで可能なことはプログラム上で実現可能 •  Criteria APIはクエリー実行結果の型の安全性が向上 –  クエリー実行におけるランタイムエラーの発生率が減少 –  統合開発環境の型チェックを利用し安全に実装可能 •  JPQLはSQLに精通した開発者に有効 –  統合開発環境が自動的に雛形を生成(開発効率の向上) –  開発者に選択肢を提供 •  オブジェクトベース、文字列ベースのクエリーを提供
  147. 147. 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など
  148. 148. 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
  149. 149. Copyright © 2012, Oracle and/or its affiliates. All rights reserved.149 Metamodel API •  強力な型チェックを可能 –  ランタイムエラーの排除 •  文字列によるエンティティの属性へのアクセスを排除 –  コンパイル時に属性の有無、型チェックを実施 •  Metamodelクラスの生成 –  _を付加した正規化したMetamodelクラスを生成 –  IDEで自動生成(※NetBeans は Ver 7.0 より) •  プログラム上で動的に生成
  150. 150. 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 とタイプミス ランタイムエラーが発生
  151. 151. 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.SingularAttrib ute;! @javax.persistence.metamodel.StaticMetaMod el(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
  152. 152. 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 と入力した場合コンパイルエラーが発生 これによりランタイムエラーの発生頻度を抑制可能
  153. 153. 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
  154. 154. 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
  155. 155. 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
  156. 156. Copyright © 2012, Oracle and/or its affiliates. All rights reserved.156 §  http://www.oracle.com/servers/blades/t5440 リソースコレクション名 プライマリキー リソースと URI をどのようにマップするかを定義 JAX-RS 1.1 : URI の例
  157. 157. 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 : 複数の表現形式
  158. 158. 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 : リクエストの構成
  159. 159. 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 のリクエスト/レスポンス
  160. 160. 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 : ルート・リソース・クラスの例
  161. 161. 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 : リソース・クラスの例
  162. 162. 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 テンプレート
  163. 163. 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
  164. 164. 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の実装例
  165. 165. Copyright © 2012, Oracle and/or its affiliates. All rights reserved.165 §  リソース表現のMIME タイプの指定で使用 §  MIME タイプに応じたデータを作成しクライアントへ返信 §  クラスレベルとメソッドレベルそれぞれで指定可能 –  メソッドレベルで設定した値はクラスレベルで設定した値を上書き 165 JAX-RS 1.1 : @Produces
  166. 166. 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 の実装例
  167. 167. 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 クラスを利用したレスポンス
  168. 168. 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
  169. 169. 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 の実装例
  170. 170. 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 : まとめ
  171. 171. 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
  172. 172. 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
  173. 173. 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
  174. 174. 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
  175. 175. Copyright © 2012, Oracle and/or its affiliates. All rights reserved.175 Java EE 7 プラットフォーム 2013年6月12日
  176. 176. 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 Architectur e 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
  177. 177. Copyright © 2012, Oracle and/or its affiliates. All rights reserved.177
  178. 178. Copyright © 2012, Oracle and/or its affiliates. All rights reserved.178 GlassFish v4 NetBeans Java EE SDK
  179. 179. 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 BeanValidation1.1 Concurrency Utilities for EE (JSR-236) Batch Application (JSR-352) Java API for JSON (JSR-353) Java API for WebSocket (JSR-356) 新規追加 大幅な更新 通常の更新
  180. 180. Copyright © 2012, Oracle and/or its affiliates. All rights reserved.180 Java EE 7 のどの機能に興味がありますか? ブログのアンケート結果より テクノロジー WebSocket バッチ JAX-RS JSON-P 並列処理
  181. 181. Copyright © 2012, Oracle and/or its affiliates. All rights reserved.181 Java EE 7 主要テーマ DEVELOPER PRODUCTIVITY MEETING ENTERPRISE DEMANDS Java EE 7
  182. 182. Copyright © 2012, Oracle and/or its affiliates. All rights reserved.182
  183. 183. 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 CDI1.1 BeanValidation1.1 Interceptors1.2 Concurrency1.0 Java EE 7 へ含まれる機能一覧
  184. 184. 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 CDI1.1 BeanValidation1.1 Interceptors1.2 Concurrency1.0 WebSocket 1.0 (JSR-356)
  185. 185. 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);! }
 }
 }! 双方向・全二重の通信を簡単に実現
  186. 186. 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) { . . . }! 接続、切断、エラー処理
  187. 187. 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
 }! クライアント・エンドポイントも アノテーションで実装可能
  188. 188. 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"));! サーバ・エンドポイントへの接続コード
  189. 189. 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) {
 . . . 
 }
 }! オブジェクトとしてメッセージの送受信
  190. 190. 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オブジェクトから送信用データを生成
  191. 191. 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 オブジェクトに変換
  192. 192. 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 CDI1.1 BeanValidation1.1 Interceptors1.2 Concurrency1.0 JAX-RS 2.0 (JSR-339)
  193. 193. 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);!
  194. 194. 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);! }!
  195. 195. 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());! });! }! 非同期処理:サスペンド&レジューム
  196. 196. 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! リクエスト・レスポンスの ヘッダ用 のインターセプタ(フィルタ)を提供
  197. 197. 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());! }! }}}! リクエスト・レスポンスの ヘッダ用 のインターセプタ(フィルタ)を提供
  198. 198. 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! メッセージ・ボディ用 のインターセプタを提供
  199. 199. 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();! }! }! メッセージ・ボディ用 のインターセプタを提供
  200. 200. 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 CDI1.1 BeanValidation1.1 Interceptors1.2 Concurrency1.0 JSF 2.2 (JSR-344)
  201. 201. 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コードはそのまま
  202. 202. 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>
  203. 203. 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}! ! 同一フロー中だけ有効な値の参照・取得
  204. 204. Copyright © 2012, Oracle and/or its affiliates. All rights reserved.204 Copyright © 2014, Oracle and/or its affiliates. All rights reserved.204 #14: JSF: リソース・ライブラリの契約 柔軟なデザイン変更が可能
  205. 205. 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> テンプレート・クライアントは契約名を記述
  206. 206. 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> テンプレート・クライアントは契約名を記述
  207. 207. 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コンポーネント
  208. 208. 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 CDI1.1 BeanValidation1.1 Interceptors1.2 Concurrency1.0 JSON-P 1.0 (JSR-353)
  209. 209. 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", "j.rorri@me.com")! .add("phoneNumber", "+44 1234 1234")! )! .build();! JSON オブジェクトの生成
  210. 210. 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 オブジェクトの解析
  211. 211. 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 CDI1.1 BeanValidation1.1 Interceptors1.2 Concurrency1.0 Expression Language 3.0 (JSR-341)
  212. 212. 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 式を記述可能
  213. 213. 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 CDI1.1 BeanValidation1.1 Interceptors1.2 Concurrency1.0 Servlet 3.1 (JSR-340)
  214. 214. 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 用に新規追加されたメソッド
  215. 215. 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 用に新規追加されたインタフェース
  216. 216. 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 で実装可能
  217. 217. 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で書き込み可能な場合処理を実施
  218. 218. 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 を変更しハイジャック防御
  219. 219. 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 以外は拒否
  220. 220. 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 CDI1.1 BeanValidation1.1 Interceptors1.2 Concurrency1.0 CDI 1.1 (JSR-346)
  221. 221. 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 と同様の振る舞い
  222. 222. 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 指定時インジェクション対象から除外 クラス、パッケージ単位で指定可能
  223. 223. 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 CDI1.1 BeanValidation1.1 Interceptors1.2 Concurrency1.0 Bean Validation 1.1 (JSR-349)
  224. 224. 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());! }! }! メソッド引数、メソッドの返り値に対する バリデーションも可能
  225. 225. 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 CDI1.1 BeanValidation1.1 Interceptors1.2 Concurrency1.0 Interceptor 1.2 (JSR-318)
  226. 226. 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) ... {! // ...! }}! コンストラクタに対するインターセプタが可能
  227. 227. 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)!
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×