Weitere ähnliche Inhalte Ähnlich wie Java EE8 Report (20) Java EE8 Report1. Java EE 8 Report
JavaOne2014 サンフランシスコ報告会Tokyo
2014/10/18 上妻宜人
2. 上妻宜人
あげつまのりと
• JavaOne 3回生
2012 2013 2014
• Java/APサーバサポート, トラブル対応
• Software Design 2014年10月号
5. Java EE 8 テーマ
コミュニティ要望・最新技術動向に応じた3つのテーマ
• HTML5 / Web層の拡張
• HTTP2, SSE, JSON Binding, JSON Patch ..
• かんたん開発
• JSF @Inject FacesContext, CDIセキュリティインターセプタ
• クラウド上でのインフラ
• REST API 運用監視, デプロイetc
8. Servlet 4.0
HTTP/2 対応
• HTTP/2
• GoogleのSPDYプロトコルが原型
• バイナリフレーム/ ヘッダ圧縮/ 多重化
• ヘッダの意味合い(GET/POST/200 OK など) は基本的に踏襲
client server client server
.html
.js, .png, .css
client server
ブラウザ実装によっては
同時接続数『6』1TCP接続で多重化
9. Servlet 4.0
HTTP/2 ストリームによる多重化
Connection : 1つのTCPコネクション
Stream #1
Stream : コネクションに含まれるチャネル
Response Message
HEADERS frame
:status:200
:version: HTTP/2.0
Server: nginx/..
Stream #2 .. #n
Request Message
Frame : HTTP2.0通信の最小単位
:method: GET
:path: /index.html
:version: HTTP/2.0
DATA frame
response
payload
http://chimera.labs.oreilly.com/books/1230000000545/ch12.html#HTTP2_STREAMS_MESSAGES_FRAMES
10. Servlet 4.0
Servlet API追加のアイディア
• StreamIDへのアクセス
• HttpServletRequest / HttpServletReponse が対象
• int getStreamId()
11. Servlet 4.0
HTTP/2 サーバプッシュ
client server
.html
.js
.png
.css
• WebSocketを置き換えるものではない
• 関連リソースをサーバプッシュ
• 例えばhtmlの要求がきたら
• 関連のjs, png, css もプッシュする
従来の1リクエスト= 1レスポンス型では対応できないので要検討
public void doGet(HttpServletRequest req, HttpServletResponse res) ...
12. Java SE 9でもHTTP/2
HTTP 1.1 / 2 を対象にAPIを追加予定(JEP110)
HttpRequestGroup group = HttpRequestGroup.create();
HttpRequest res = group.createRequest()
.setRequestMethod(“POST”)
.setRequestURI(new URI(“http//www.foo.com/a/b”))
.setRequestBody(“Param1=1,Param2=2”)
.onResponseHeader (“X-Foo”, (request, name, value) ->
System.out.printf(“received an X-Foo header”);
})
.sendRequest()
.waitForCompletion();
14. MVC 1.0
アクションベースMVCの導入
• SpringMVC, JerseyMVC, Struts, VRaptor ...
• そもそも必要?JAX-RSに入れる?の議論があったが、
結果的に独立した仕様として検討がスタート
Q. Java EEはJSFに加えて新たなMVCをサポートすべきですか?
https://java.net/downloads/javaee-spec/JavaEE8_Community_Survey_Results.pdf
15. MVC 1.0
MVC 1.0 テーマ
• 新たなテンプレートの”標準化”は対象外
• Java EE標準としては既にJSPとFaceletsがある
• 標準化はせずに、OSS実装と連携するアプローチ
• 既存仕様との連携
• CDI, Bean Validation
16. MVC 1.0
JavaOneのBOFでのラフアイディア
• 初期HTML画面ページ
<form action=”/rough-example/form1a.jsp”>
<input id="input1" value="#{roughExampleBean.value}"/>
<input id="submit" type="submit" value="Submit"/>
</form>
17. MVC 1.0
JavaOneのBOFでのラフアイディア
• CDI - Managed Bean
@Named("roughExampleBean”)
@RequestScoped
public class RoughExampleBean implements Serializable {
private String value;
@Path(value = "/form1a.jsp”)
public String form1(@Inject HttpServletRequest request) {
String input1 = request.getParameter("inputText1");
setValue("We set input1 manually to - " + input1);
return "/form1b.jsp”;
}
… omitted getter/setter methods …
}
20. JSF 2.3
重複仕様の整理/ 小さな機能改善
• CDI 連携の強化
• @Inject FacesContext
• ValidatorやConverter実装クラスに@Injectできるようにする
• @javax.faces.bean.ManagedBeanの扱い見直し
• 非推奨ではなく、@javax.inject.Namedと同様として扱う
• EL式のキャッシュによる性能向上
• マルチコンポーネントのバリデーション
22. JAX-RS 2.1
パフォーマンス/ SSEサポート
• パフォーマンス向上
• Non-Blocking I/O APIのサポート(主にサーバサイド)
• Reactive プログラミングモデル(主にクライアントサイド)
• SSE - Server Sent Eventのサポート
• Java EE 内連携の強化
• JSON-B : Java API for JSON Bindingとの連携
• MVC1.0 との連携?
24. JSON-B 1.0
JSONとJavaオブジェクトのマッピング
• JAXB (XML Binding) と同様に相互変換
• 既存実装としてJackson data binding など
public class Customer {
private String name;
private String mailAddr;
private String phoneNumber;
...
}
{
“name”:“Norito Agetsuma”,
“mailAddr”:“test@gmail.com”,
“phoneNumber”:“xxx-xxxx-xxxx”
}
25. JSON-B 1.0
コード例: マーシャライズ(Java -> JSON)
JsonContext context = new JsonContext.newInstance();
// プロパティ設定, 見やすいJSON生成PrettyPrintingはオプション
Marshaller marshaller = context.createMarshaller()
.setProperty(Marshaller.Property);
.setPrettyPrinting(true);
// JSON文字列変換
String string = marshaller.marshall(myObject);
// ファイルへ
marshaller.marshall(myObject, new FileWriter(“file.json”));
26. JSON-B 1.0
コード例: マッピングアノテーション
• プロパティ名変更
@JsonProperty(“longDesc”)
String longDescription;
• Enumマッピング
{
“longDesc”:”some params..”
}
@JsonEnum
public enum Option {
@JsonEnumValue(“1”) OPTION_1,
@JsonEnumValue(“2”) OPTION_2,
@JsonEnumValue(“3”) OPTION_3
}
{
“Option”:1
}
28. JSON-P 1.1
JSON Processing - Java EE 7 導入のJSON処理API
JsonObject customer = Json.createObjectBuilder()
.add(“name”, “ Norito Agetsuma”)
.add(“mailAddr”, “test@gmail.com”)
.add(“phone”, “xxx-xxxx-xxxx”)
.build();
StringWriter json = new StringWriter();
try (JsonWriter writer = Json.createWriter(json)) {
writer.writeObject(customer);
}
json.toString();
{
“name”:”Norito Agetsuma”,
“mailAddr”:”test@gmail.com”,
“phone”:”xxx-xxxx-xxxx”
}
29. JSON-P 1.1
Java EE 8 - JSON Patch
• JSONデータの一部を置き換える仕組み– RFC6902
• HTTP “PATCH” と組み合わせて差分更新に使う
• “PUT”は対象URLのリソース全体を置き換えることを示す
• “POST”はリソースの新規作成に用途を絞る
http://xxx/user/1
{
“name”:”n-agetsuma”
“state”:”chiba tokyo”
“phone”:”xxx-xxxx-xxxx”
}
一部を変更したい
新規項目を追加したい
30. JSON-P 1.1
HTTP “PATCH” メソッドで差分適用
PATCH /user/1 HTTP1.1
Content-Type: application/json-patch
[
{“op”:”replace”, “path”:”/state”, “value”:”tokyo”},
{“op”:”add”, “path”:”/phone”, “value”:”xxx-xxxx-xxxx”}
]
{
“name”:”Norito Agetsuma”
“state”:”Chiba tokyo”
“ phone”:”xxx-xxxx-xxxx”
...
}
31. JSON-P 1.1
JSON Patch - APIのアイディア
// パッチ対象とパッチの生成
JsonObject target = Json.createObjectBuilder().add(..).build();
JsonArray patch = Json.createArrayBuilder() …build();
// パッチからJsonPatch の生成
JsonPatch jsonpatch = Json.createPatch(patch);
// パッチの適用と結果取得
JsonArray result = jsonpatch.apply(target);
33. CDI 2.0
非同期イベント機能の導入
@Inject
Event<NotifyAlarm> event;
public void fire() {
// 各@Observesメソッドの終了を待たずに応答が返る
event.fire(new NotifyAlarm(“server hang”));
}
public void consumeA(
@Observes(asynchronous=true) NotifyAlarm n) {
n.getDetails(); ...
}
public void consumeB(
@Observes(asynchronous=true) NotifyAlarm n) {..}
通知
通知する側
通知される側
通知される側
34. CDI 2.0
モジュール化, Java SE CDI起動API
• 仕様のモジュール分割
• CDI仕様が肥大化してきて、Weld以外の安定実装が少ない
• 3つに分割して、3rdパーティ実装による機能提案を加速
• CDI Light : DIのみ。イベント, コンテキスト, AOP なし
• Events : CDIによるObserverパターン実現@Observes 等
• Full CDI : 全ての仕様
• Java SE 上でのCDIコンテナ起動APIの標準化
36. Java EE Management API 2.0
REST APIによる監視・デプロイの標準化
• J2EE Management 1.1 - JSR77 の更新
• RESTT API による管理
• 既にJSR77で定義されているJava EE管理モデルに準拠
• SSE - Server Sent Event による通知モデルの定義
• MEJB API - リモートEJB によるアクセス仕様のオプション化
• REST APIによるアプリケーションのデプロイ
37. Java EE Management API 2.0
J2EE管理対象オブジェクトのモデル抜粋
http://download.oracle.com/otn-pub/jcp/j2ee_management-1_1-mrel-eval-oth-JSpec/j2ee_management-1.1-mrel-spec.pdf
39. Java EE Security 1.0
詳細についてはこれから検討が始まる予定
• 検討スコープを整理中
• ユーザ管理
• ロールマッピング
• RESTの認証・認可...
• CDIインターセプタによる認可制御
40. Java EE 8 Schedule
Final仕様リリースは2016年予定
• Early Draft 2015/Q1
アイディアが出始める
• Public Review 2015/Q3
大分内容が固まってくる
• Proposed Final Draft 2015/Q4
仕様によってはFinal Draftで複数回の修正あり
• Final Release 2016/Q3