java ee7, html5
TRANSCRIPT
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.1
Yoshio TeradaJava Evangelisthttp://yoshio3.com, Twitter : @yoshioterada
Java EE 7HTML 5WebSocket
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.2
以下の事項は、弊社の一般的な製品の方向性に関する概要を説明するものです。また、情報提供を唯一の目的とするものであり、いかなる契約にも組み込むことはできません。以下の事項は、マテリアルやコード、機能を提供することをコミットメント(確約)するものではないため、購買決定を行う際の判断材料になさらないで下さい。オラクル製品に関して記載されている機能の開発、リリースおよび時期については、弊社の裁量により決定されます。
Oracle は、米国オラクルコーポレーション及びその子会社、関連会社の米国及びその他の国における登録商標です。文中の社名、商品名等は各社の商標または登録商標である場合があります。
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.3
1998 年 5 月
エンタープライズアプリケーション
1999 年 12 月10 specs
堅牢スケーラブル
2001 年 9 月13 specs
Web サービス
2003 年 11 月20 specs
かんたん開発
2006 年 5 月23 specs
軽量化
2009 年 12 月28 specs
Project JPE
J2EE 1.3
CMP,ConnectorArchitecture
Java EE 5
Ease of Development,Annotations,EJB 3.0, JPA, JSF, UpdatedWeb Services
J2EE 1.4Web Services Mgmt, Deployment,AsyncConnector
Java EE 6
Pruning,ExtensibilityEase of Dev,CDI, JAX-RS
Web Profile
Servlet 3.0, EJB 3.1 Lite
J2EE 1.2Servlet, JSP,EJB, JMSRMI/IIOP
Java EE の歴史
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.4
Java EE 7 : 2013 年 春頃提供開始予定
テーマ: HTML5 と開発生産性の向上
Java EE 7 SDK の提供開始
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.5
Java EE 7 へ含まれる予定の JSR 一覧
Connector1.6
JPA 2.1 JTA 1.2 JMS 2.0
Managed Bean 1.0 EJB 3.2
Common Annotations
1.1
Interceptors 1.1
CDI 1.1
PortableExtensio
ns Servlet 3.1
JSP 2.2JSF 2.2
JAX-RS 2.0
EL 3.0
Bean
Valid
atio
n1
.1
Java CachingAPI (JSR-
107)Batch
Application(JSR-352)
Java API forJSON
(JSR-353)
Java API forWebSocket(JSR-356)
新規追加 大幅な更新 通常の更新
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.6
今日ご紹介する内容
WebSocket ( 新 ) JSF 2.2
HTML5 化に関するテーマ
そして、研究・開発プロジェクト
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.7
JSR 344 : JavaServer™ Faces 2.2
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.8
JSF : コンポーネント・ベース開発
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.9
JavaServer Faces
JSF フレームワークと開発の概要
DB
Webサービス
プレゼンテーション
• アプリケーションロジック
• コンバート ( 変換 )• バリデーション ( 検証 )• ナビゲーション ( 画面遷
移 )• イベント処理
ビジネスロジッククライアント Web アプリケーション
Web コンテナ
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.10
デザイナーと開発者の共同作業が可能に (jsf:value=“”, jsf:action=“”)
デザイナーはテキスト&ブラウザで確認 プログラマーは JSP & Web コンテナで確
認 プログラム後のデザイン修正は困難
デザイナーはテキスト&ブラウザで確認
プログラマーは XHTML に要素を挿入 同一ファイルの為デザイン修正も容易
デザイナー(HTML)
プログラマー(JSP)
コード変換が必要
今までの開発スタイル
デザイナー プログラマー(XHTML)
同一ファイルを参照編集可能
JSF 2.0 の開発スタイル
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.11
HTML 5 マークアップ・サポート
JSF 2.2 からは素の HTML コードに
JSF 属性を埋め込みましょう !!
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.12
HTML 5 マークアップ・サポート
HTML 5 の表現力をそのままに !!
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.13
JSR 356: JavaTM API for WebSocket
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.14
WebSocket APIwww.w3.org/TR/websockets/
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.15
Java API for WebSocket (JSR-356)
http://jcp.org/en/jsr/detail?id=356http://java.net/projects/websocket-spec
仕様
ステータス: Early Draft
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.16
参照実装http://java.net/projects/tyrus
最新の GlassFish v4 開発ビルドにバンドル済
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.17
Java の WebSocket標準実装はとてもかんたん
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.18
アノテーション レベル 内容
@WebSocketEndpoint クラス WebSocket のエンドポイントを示す
@WebSocketOpen メソッド 接続確立時に呼び出すメソッドを指定
@WebSocketClose メソッド 接続切断時に呼び出すメソッドを指定
@WebSocketMessage メソッド メッセージを受信した時に呼び出すメソッドを指定
@WebSocketPathParam メソッドパラメータ
エンドポイントの URI 引数に指定されたパラメータを取得する際に仕様
@WebSocketError メソッド エラー発生時に呼び出すメソッドを指定
WebSocket アノテーション
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.19
WebSocket アプリケーション・ライフサイクル
@WebSocketEndpoint("/hello")var wsUri = "ws://HOST/foo/hello";var websocket = new WebSocket(wsUri);
@WebSocketOpenwebsocket.onopen = function(evt) { onOpen(evt) };
websocket.onmessage = function(evt) { onMessage(evt) };
@WebSocketMessage
websocket.onerror = function(evt) { onError(evt) };
@WebSocketError
websocket.onclose = function(evt) { onClose (evt) };
@WebSocketClose
JavaScript WebSocket API
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.20
import javax.net.websocket.annotations.*;
@WebSocketEndpoint("/hello")public class HelloBean {
@WebSocketMessage public void sayHello(Session session, String msg) { session.getRemote().sendString(“Hello” + msg); }}
HelloWorld アプリケーション (1対1 )
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.21
デモ
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.22
監視
サンプル・アプリケーションの構成 (多対1 )
Remote Endpoint
RE
RE
RE
Session
Session
Session
WebSocketEndpoint
Twitter4J
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.23
@WebSocketEndpoint(value= "/twitter")public class TwitterWebSocket { @WebSocketOpen public void initOpen(Session session) { TwitterClientSingleton.peers.add(session); } @WebSocketClose public void closeWebSocket(Session session){ TwitterClientSingleton.peers.remove(session); }}
Twitter Streaming アプリ
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.24
@Startup @Singletonpublic class TwitterClientSingleton extends StatusAdapter { public static Set<Session> peers = null; static { peers = Collections.synchronizedSet(new HashSet()); } ...続く
Twitter Streaming アプリ
Session Session Session Session
クライアントの参照情報を保持
RE RE RE RE・・・・・・
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.25
public void onStatus(Status status) { User user = status.getUser(); String resStr = "@" +user.getScreenName() + " : " + status.getText() ; try { for (Session peer : peers) { peer.getRemote().sendString(resStr); } } catch (IOException ioe) { ioe.printStackTrace(); } }
データ送信コード ( ブロッキング )シーケンシャルに配信を実施 ( 大量のデータで待ち )
全ピア (RE) に対して配信
Session Session Session Session
RE RE RE RE
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.26
データ送信コード ( ノン・ブロッキング )
for (Session peer : peers) { Future<SendResult> futureSend = peer.getRemote().sendStringByFuture(resStr); while (!futureSend.isDone()) { // wait here ? } SendResult status = futureSendResult.get(); if (status.isOK()) { // ok } else { // whoops, send failed. }}
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.27
subprotocol の指定も可能 (iana.org)
http://www.iana.org/assignments/websocket/websocket.xml
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.28
@WebSocketEndpoint("/bookings/{guest-id}")public class BookingServer { @WebSocketMessage public void processBookingRequest( @WebSocketPathParam("guest-id") String guestID, String message, Session session) { // guest-id に紐づく処理を実装 }}
URI のテンプレートマッチ@WebSocketPathParam について
1段目のみ可能
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.29
エンコード、デコード
@WebSocketEndpoint( value="/hello", encoders={MyMessage.class}, decoders={MyMessage.class})
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.30
JSON から文字列へのエンコード
public class MyMessage implements Encoder.Text<MyMessage> { private JsonObject jsonObject;
public String encode(MyMessage myMessage) { return myMessage.jsonObject.toString(); }}
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.31
受信データの JSON へのデコード
public class MyMessage implements Decoder.Text<MyMessage> { private JsonObject jsonObject;
public MyMessage decode(String s) { jsonObject = new JsonReader(new StringReader(s)).readObject(); return this;"} public boolean willDecode(String string) { return true; // デコード可能か否かを返す}}
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.32
OracleResearch Project !!
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.33
Project Avatar
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.34
先進的な HTML 5 アプリ構築フレームワーク– WebSocket, Server-Sent Event, RESTful に対応
モジュール化対応 JavaScript フレームワーク 軽量なサーバ・アーキテクチャ (Thin-Server Architecture)
コンセプト
Project Avatar とは
Avatar のメリット– サーバ・サイド JavaScript と Java EE アプリの融合– Java VM 上で稼働する JavaScrip のスケーラビリテイ・信頼性・運用保守性
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.35
Thin-Server アーキテクチャ (TSA)
今まで アプリView
Modelサーバ側でマー
ジ
HTTP/JS
TSAView
Service
アプリ
クライアント側でマージ
HTTP/JS
JSON
View
Model
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.36
Avatar の概念 ( クライアント側 )
ブラウザ (JavaScript/DOM)
View (UI Node) Avatar(Controller)
Web コンポーネントと同様<a:page><a:form><a:input><a:textarea> …
• データ・ バインディング
• ナビゲーション• ローカル・
ストレージ
アクセス方法を提供• ローカル• RESTful• SSE• WebSocket
Model
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.37
Avatar の概念 ( サーバ側 )
Nashorn (JavaVM で稼働する JavaScript エンジン )
Service Avatar
アクセス方法を提供• RESTful• SSE• WebSocket
ルーティングJSON のシリアライズ
利用可能なデータソース• ファイル• DB(JPA)• インメモリ
Coherence
Data プロバイダ
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.38
Avatar のアーキテクチャ
UI
Avatar アプリ(HTML 5/JS/CSS)
Avatar 実行環境
HTML 5 DOM
ローカルストレージ
Avatar アプリ( XML/JavaScript )
Avatar コンパイラ
Nashorn (JavaScript エンジン )
ブラウザ App サーバ
Java EE アプリ
Viewサービス
Dataサービス
Java EEサービス
HTTP
HTTP/WebSocket
HTTP/WebSocket
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.39
Avatar のアーキテクチャ
UI
Avatar アプリ(HTML 5/JS/CSS)
Avatar 実行環境
HTML 5 DOM
ローカルストレージ
Avatar アプリ( XML/JavaScript )
Avatar コンパイラ
Nashorn (JavaScript エンジン )
ブラウザ App サーバ
Java EE アプリ
Viewサービス
Dataサービス
Java EEサービス
HTTP
HTTP/WebSocket
HTTP/WebSocket
① Avatar アプリの作成
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.40
Avatar のアーキテクチャ
UI
Avatar アプリ(HTML 5/JS/CSS)
Avatar 実行環境
HTML 5 DOM
ローカルストレージ
Avatar アプリ( XML/JavaScript )
Avatar コンパイラ
Nashorn (JavaScript エンジン )
ブラウザ App サーバ
Java EE アプリ
Viewサービス
Dataサービス
Java EEサービス
HTTP
HTTP/WebSocket
HTTP/WebSocket
② Avatar コンパイラで View サービス Data サービス を生成
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.41
Avatar のアーキテクチャ
UI
Avatar アプリ(HTML 5/JS/CSS)
Avatar 実行環境
HTML 5 DOM
ローカルストレージ
Avatar アプリ( XML/JavaScript )
Avatar コンパイラ
Nashorn (JavaScript エンジン )
ブラウザ App サーバ
Java EE アプリ
Viewサービス
Dataサービス
Java EEサービス
HTTP
HTTP/WebSocket
HTTP/WebSocket
③ View サービスの 「複数ページの一括」 ダウンロード (※プラグインは不要)
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.42
Avatar のアーキテクチャ
UI
Avatar アプリ(HTML 5/JS/CSS)
Avatar 実行環境
HTML 5 DOM
ローカルストレージ
Avatar アプリ( XML/JavaScript )
Avatar コンパイラ
Nashorn (JavaScript エンジン )
ブラウザ App サーバ
Java EE アプリ
Viewサービス
Dataサービス
Java EEサービス
HTTP
HTTP/WebSocket
HTTP/WebSocket
④ WebSocket/Server-Sent Event/ RESTful で Data サービスを利用
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.43
Avatar のアーキテクチャ
UI
Avatar アプリ(HTML 5/JS/CSS)
Avatar 実行環境
HTML 5 DOM
ローカルストレージ
Avatar アプリ( XML/JavaScript )
Avatar コンパイラ
Nashorn (JavaScript エンジン )
ブラウザ App サーバ
Java EE アプリ
Viewサービス
Dataサービス
Java EEサービス
HTTP
HTTP/WebSocket
HTTP/WebSocket
⑤ サーバ側は Java EE のサービスも利用可能
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.44
Avatar のアーキテクチャ
UI
Avatar アプリ(HTML 5/JS/CSS)
Avatar 実行環境
HTML 5 DOM
ローカルストレージ
Avatar アプリ( XML/JavaScript )
Avatar コンパイラ
Nashorn (JavaScript エンジン )
ブラウザ App サーバ
Java EE アプリ
Viewサービス
Dataサービス
Java EEサービス
HTTP
HTTP/WebSocket
HTTP/WebSocket
⑥ クライアント側は HTML 5, DOM, ローカルストレージ 等を利用可能
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.45
アプリ View
Model
クライアントで動作するアプリ(Hello World)<a:viewModule …> <a:localModel> var NameModel = function(){ this.first = "Planet"; this.last = "Earth"; this.clear = function(){ this.first = this.last = ""; }; }; <a:/localModel>
<a:page> <a:model id="name" idref="NameModel"/> <a:form> <a:input label="First Name" value="#{name.first}"/> <a:input label="Last Name" value="#{name.last}"/> <a:output value="Hello #{name.first} #{name.last}"/> <a:button label="Clear" action="#{name.clear()}"/><a:/form><a:/page><a:/viewModule>ローカルのモデルを定義
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.46
WebSocket で動作するアプリ( Model の実装例 )
<a:socketModel> var ChatModel = function(){ this.message = ""; this.user = ""; var superSend = this.$send; this.$send = function(){ this.process(this.message); superSend.call(this); }; …. };<a:/socketModel>
ServiceJSON
Model
Model 用に用意されているプロトタイプ関数を上書き実装
• this.$onMessage• this.$send• etc.
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.47
WebSocket で動作するアプリ( Service の実装例 )
<a:socketService url="websocket/chat"> var SocketService = function(){ this.$onMessage = function(peer,message){ this.process(message); peer.getContext().sendAll(message); };};<a:/socketService>
ServiceJSON
Model
Service 用に用意されているプロトタイプ関数を上書き実装
• this.$onMessage• this.$onTimeOut• etc.
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.48
New Announcement2013 年 春頃Java イベント開催予定
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.49
Copyright © 2012, Oracle and/or its affiliates. All rights reserved.50