javaone 2015 報告会 @ 東京 「about mvc 1.0 & json-p」

44
About MVC 1.0 & JSON-P 2015/11/14 JavaOne 2015 報告会 @ 東京 グロースエクスパートナーズ(株) 大中 浩行 Copyright© 2015 Growth xPartners, Inc. All rights reserved. Copyright© 2015 Growth xPartners, Inc. All rights reserved..

Upload: hiroyuki-ohnaka

Post on 14-Apr-2017

5.959 views

Category:

Software


2 download

TRANSCRIPT

Page 1: JavaOne 2015 報告会 @ 東京 「About MVC 1.0 & JSON-P」

About MVC 1.0 & JSON-P

2015/11/14

JavaOne 2015 報告会 @ 東京

グロースエクスパートナーズ(株)

大中 浩行

Copyright© 2015 Growth xPartners, Inc. All rights reserved.Copyright© 2015 Growth xPartners, Inc. All rights reserved..

Page 2: JavaOne 2015 報告会 @ 東京 「About MVC 1.0 & JSON-P」

今日のお題

MVC 1.0

JSON-P 1.1

(ちょこっと)JSON-B

1Copyright© 2015 Growth xPartners, Inc. All rights reserved.

Page 3: JavaOne 2015 報告会 @ 東京 「About MVC 1.0 & JSON-P」

MVC1.0

Copyright© 2015 Growth xPartners, Inc. All rights reserved. 2

2015/1/1

Page 4: JavaOne 2015 報告会 @ 東京 「About MVC 1.0 & JSON-P」

MVC 1.0

actionベースのMVCフレームワーク

JSR371

• 現在のステータスはEarly Draft Release 2(EDR)

リファレンス実装はozark

• https://ozark.java.net/

JJUGもAdopt a JSRを通じて参加

3Copyright© 2015 Growth xPartners, Inc. All rights reserved.

Page 5: JavaOne 2015 報告会 @ 東京 「About MVC 1.0 & JSON-P」

なぜJSFでなくMVCなのか

JSFはcomponentベース

MVC 1.0 は actionベース

4Copyright© 2015 Growth xPartners, Inc. All rights reserved.

Page 6: JavaOne 2015 報告会 @ 東京 「About MVC 1.0 & JSON-P」

なぜactionベースなのか

見通しのよさ、簡便さ

RESTとの親和性

5Copyright© 2015 Growth xPartners, Inc. All rights reserved.

Page 7: JavaOne 2015 報告会 @ 東京 「About MVC 1.0 & JSON-P」

フロントエンドの流行廃りの激しさ

WONTA (Write Once, Never Touch Again)

※どうせそのうち書き直すのだから保守性は考慮にいれない、の意

定着した技術としてのサーバーサイドMVCへのニーズ

6Copyright© 2015 Growth xPartners, Inc. All rights reserved.

Page 8: JavaOne 2015 報告会 @ 東京 「About MVC 1.0 & JSON-P」

Controller

MVCのControllerはJAX-RSのresourceとして実装

ただし、semanticsには若干差異がある

7Copyright© 2015 Growth xPartners, Inc. All rights reserved.

Page 9: JavaOne 2015 報告会 @ 東京 「About MVC 1.0 & JSON-P」

Controller

8Copyright© 2015 Growth xPartners, Inc. All rights reserved.

@Path("hello")public class HelloController {

@Injectprivate Greeting greeting;

@GET@Controllerpublic String hello() {

greeting.setMessage("Hello there!");return "hello.jsp";

}}

Page 10: JavaOne 2015 報告会 @ 東京 「About MVC 1.0 & JSON-P」

Controllerのバリエーション

9Copyright© 2015 Growth xPartners, Inc. All rights reserved.

@GET @Path("void") @View("hello.jsp")public void helloVoid(){}@GET @Path("viewable")public Viewable helloViewable(){

return new Viewable("hello.jsp");}@GET @Path("response")public Response helloResponse(){

return Response.status(Response.Status.OK).entity("hello.jsp").build();}@GET @Path("myview")public MyView helloMyView(){

//toString returns "hello.jsp"return new MyView("hello.jsp");

}

Page 11: JavaOne 2015 報告会 @ 東京 「About MVC 1.0 & JSON-P」

Validation

Bean Validation(JSR349)ベース

Validationエラーの扱いについて

• 以下の2択

ExceptionMapper<ConstraintViolationException>を実装して共通的に

処理する

BindingResultをInjectionして、Controllerのメソッド内部で処理する

ハンドリングの仕様がprimitiveな印象

10Copyright© 2015 Growth xPartners, Inc. All rights reserved.

Page 12: JavaOne 2015 報告会 @ 東京 「About MVC 1.0 & JSON-P」

ExceptionMapperによるハンドリング

11Copyright© 2015 Growth xPartners, Inc. All rights reserved.

public class FormViolationMapper implements ExceptionMapper<ConstraintViolationException> {public Response toResponse(ConstraintViolationException e) {

Set<ConstraintViolation<?>> set = e.getConstraintViolations();if (!set.isEmpty()) {

// fill out ErrorDataBean}return Response.status(Response.Status.BAD_REQUEST)

.entity("error.jsp").build();}

}

Page 13: JavaOne 2015 報告会 @ 東京 「About MVC 1.0 & JSON-P」

Controllerによるハンドリング

12Copyright© 2015 Growth xPartners, Inc. All rights reserved.

@Path("form")@Controllerpublic class FormController {

@Injectprivate BindingResult br;@POST@ValidateOnExecution(type = ExecutableType.NONE)public Response formPost(@Valid @BeanParam FormDataBean f) {

if (br.isFailed()) {return Response.status(Response.Status.BAD_REQUEST)

.entity("error.jsp").build();}return Response.status(Response.Status.OK).entity("data.jsp")

.build();}

}

Page 14: JavaOne 2015 報告会 @ 東京 「About MVC 1.0 & JSON-P」

View

仕様としてサポートを要求するのはJSPとFacelet

他は全てextension

Ozarkには以下のextensionがcontribute済み

Asciidoc, Freemarker, Handlebars, Jade, JSR 223 (JavaScript)

Mustache, StringTemplate, Thymeleaf, Velocity

13Copyright© 2015 Growth xPartners, Inc. All rights reserved.

Page 15: JavaOne 2015 報告会 @ 東京 「About MVC 1.0 & JSON-P」

BYOVE

Bring Your Own View Engine

BYODKM(Bring Your Own Display, Keyboard and Mouse)のもじり

MVC1.0としてはViewのあり方については規定しない

14Copyright© 2015 Growth xPartners, Inc. All rights reserved.

Page 16: JavaOne 2015 報告会 @ 東京 「About MVC 1.0 & JSON-P」

Viewのデフォルトのパスは”/WEB-INF/views”以下

変更した場合は

javax.mvc.engine.ViewEngine.viewFolder プロパテ

ィを使ってオーバーライド

15Copyright© 2015 Growth xPartners, Inc. All rights reserved.

Page 17: JavaOne 2015 報告会 @ 東京 「About MVC 1.0 & JSON-P」

スコープ

Controllerのデフォルトスコープはrequest

CDIのスコープを使用可能

application/session/request/conversation

MVCで @RedirectScoped を定義

PRG(POST-Redirect-GET)パターンをサポート

16Copyright© 2015 Growth xPartners, Inc. All rights reserved.

Page 18: JavaOne 2015 報告会 @ 東京 「About MVC 1.0 & JSON-P」

@RedirectScoped

17Copyright© 2015 Growth xPartners, Inc. All rights reserved.

@Named("bean")@RedirectScopedpublic class Greeting {

private String message;

public String getMessage() {return message;

}

public void setMessage(String message) {this.message = message;

}}

Page 19: JavaOne 2015 報告会 @ 東京 「About MVC 1.0 & JSON-P」

イベント

Observerパターン

モニタリング/デバッグ/チューニング用途

BeforeControllerEvent / AfterControllerEvent

BeforeProcessViewEvent / AfterProcessViewEvent

ControllerRedirectEvent

追加の可能性あり

18Copyright© 2015 Growth xPartners, Inc. All rights reserved.

Page 20: JavaOne 2015 報告会 @ 東京 「About MVC 1.0 & JSON-P」

19Copyright© 2015 Growth xPartners, Inc. All rights reserved.

@ApplicationScopedpublic class EventObserver{

public void onBeforeController(@Observes BeforeControllerEvent e){System.out.println("URI:“

+ e.getUriInfo().getRequestURI());}public void onAfterController(@Observes AfterControllerEvent e){

System.out.println("Controller:" + e.getResourceInfo().getResourceMethod());

}}

Page 21: JavaOne 2015 報告会 @ 東京 「About MVC 1.0 & JSON-P」

感想

「フレームワーク」ではなく「API」

All in one フレームワークとは一線を画している

「ポストStruts」ではない

とはいえ、Validationとそれに関係する画面遷移の周

りをもうちょっと作り込まないと実用にはつらい!

20Copyright© 2015 Growth xPartners, Inc. All rights reserved.

Page 22: JavaOne 2015 報告会 @ 東京 「About MVC 1.0 & JSON-P」

JSON-P 1.1

Copyright© 2015 Growth xPartners, Inc. All rights reserved. 21

2015/1/1

Page 23: JavaOne 2015 報告会 @ 東京 「About MVC 1.0 & JSON-P」

JSON-P 1.0

Java API for JSON Processing

JSR353

リファレンス実装はjava.net

• https://java.net/projects/jsonp

JavaEE7で採用

22Copyright© 2015 Growth xPartners, Inc. All rights reserved.

Page 24: JavaOne 2015 報告会 @ 東京 「About MVC 1.0 & JSON-P」

JSON-P 1.1

JSON-P 1.0(RFC4627)をRFC7159でアップデート

JSR374

現在のステータスはEarly Draft Review

23Copyright© 2015 Growth xPartners, Inc. All rights reserved.

Page 25: JavaOne 2015 報告会 @ 東京 「About MVC 1.0 & JSON-P」

RFC7159

全ての値がトップレベルに可能に

つまり、以下がvalidになる

24Copyright© 2015 Growth xPartners, Inc. All rights reserved.

Page 26: JavaOne 2015 報告会 @ 東京 「About MVC 1.0 & JSON-P」

追加されたAPI

Json

public static JsonString createValue(String value)

public static JsonNumber createValue(int value)

imilarly for long, double, BigInteger, and BigDecimal

JsonReader

default JsonValue readValue()

JsonWriter

default void write(JsonValue value)

25Copyright© 2015 Growth xPartners, Inc. All rights reserved.

Page 27: JavaOne 2015 報告会 @ 東京 「About MVC 1.0 & JSON-P」

JsonArray and JsonObject Transformations

ビルダーパターンを用いたJsonオブジェクトの変換

26Copyright© 2015 Growth xPartners, Inc. All rights reserved.

JsonArray value = Json.createArrayBuilder().add(Json.createObjectBuilder()

.add("type", "home")

.add("number", "212 555-1234")).build();

JsonArray result = Json.createArrayBuilder(value).add(Json.createObjectBuilder()

.add("type", "fax")

.add("number", "646 555-4567")).build();

Page 28: JavaOne 2015 報告会 @ 東京 「About MVC 1.0 & JSON-P」

JSON-Pointer

RFC6901

JSONの特定値を差すための文字列syntax

27Copyright© 2015 Growth xPartners, Inc. All rights reserved.

JsonStructure commit = reader.read();JsonPointer p = new JsonPointer("/employee/name");JsonStructure result = p.replace(commit,

Json.createValue("Hiroyuki Onaka"))

Page 29: JavaOne 2015 報告会 @ 東京 「About MVC 1.0 & JSON-P」

ポインターによるJSON操作API

add(JsonStructure, JsonValue)

replace(JsonStructure, JsonValue)

remove(JsonStructure)

28Copyright© 2015 Growth xPartners, Inc. All rights reserved.

Page 30: JavaOne 2015 報告会 @ 東京 「About MVC 1.0 & JSON-P」

JSON-PATCH

JSON更新処理の標準化

RFC6902

29Copyright© 2015 Growth xPartners, Inc. All rights reserved.

JsonStructure commit = reader.read();JsonPatchBuilder builder = new JsonPatchBuilder();JsonStructure result =

builder.add("/John/phones/office", "1234-567").remove("/Amy/age").apply(commit);

Page 31: JavaOne 2015 報告会 @ 東京 「About MVC 1.0 & JSON-P」

JSON-PATCHによるJSON間の差分取得

JsonArray diff =

JsonPatch.diff(commit1,commit2)

30Copyright© 2015 Growth xPartners, Inc. All rights reserved.

Page 32: JavaOne 2015 報告会 @ 東京 「About MVC 1.0 & JSON-P」

JSON-MERGE PATCH

RFC7386

JSON間のマージ処理

nullの値をマージするとキーの削除になる

application/json-patch+json

31Copyright© 2015 Growth xPartners, Inc. All rights reserved.

JsonObject removeEntry = Json.createObjectBuilder().add("[email protected]", JsonValue.NULL).build();

JsonValue newCommit = JsonMergePatch.mergePatch(reader.read(), removeEntry)

Page 33: JavaOne 2015 報告会 @ 東京 「About MVC 1.0 & JSON-P」

JSON-MERGE PATCHによるパッチ

リバースパッチが可能

32Copyright© 2015 Growth xPartners, Inc. All rights reserved.

Page 34: JavaOne 2015 報告会 @ 東京 「About MVC 1.0 & JSON-P」

JSON Queries with java.util.stream.Stream

JsonObject/JsonArrayをMap/Listとして

stream+LambdaでOperation可能に

javax.json.stream.JsonCollectors

#groupingBy / #toJsonArray / #toJsonObject

33Copyright© 2015 Growth xPartners, Inc. All rights reserved.

Page 35: JavaOne 2015 報告会 @ 東京 「About MVC 1.0 & JSON-P」

JSON PROCESSING IN PARSING

streamモデルによる大容量Jsonデータの処理

javax.json.stream.JsonParserにAPI追加

getArray / getObject / getArrayStream / getObjectStream

34Copyright© 2015 Growth xPartners, Inc. All rights reserved.

Page 36: JavaOne 2015 報告会 @ 東京 「About MVC 1.0 & JSON-P」

JSON-P

JSONに対する低レベル操作API

JSONとJavaオブジェクト(JavaBean)へのマッピング

機能は持っていない

35Copyright© 2015 Growth xPartners, Inc. All rights reserved.

Page 37: JavaOne 2015 報告会 @ 東京 「About MVC 1.0 & JSON-P」

JSON-B

Java API for JSON Binding

JSR367

• 現在のスタータスはEarly Draft 2

リファレンス実装はeclipselink MOXy(開発中)

36Copyright© 2015 Growth xPartners, Inc. All rights reserved.

Page 38: JavaOne 2015 報告会 @ 東京 「About MVC 1.0 & JSON-P」

37Copyright© 2015 Growth xPartners, Inc. All rights reserved.

protected void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {Jsonb jsonb = JsonbBuilder.create();

ServletOutputStream out = response.getOutputStream();out.print(jsonb.toJson(new JsonPlans()));out.flush();

}

デモ: https://github.com/m0mus/jason_plans

Page 39: JavaOne 2015 報告会 @ 東京 「About MVC 1.0 & JSON-P」

JSON-P 1.1はフレームワーク/ライブラリー開発者

には垂涎の機能だがそれ以外の開発者には…?

JSON-Bなら使い出はありそうだが如何せん標準化に

時間がかかりすぎる!

38Copyright© 2015 Growth xPartners, Inc. All rights reserved.

Page 40: JavaOne 2015 報告会 @ 東京 「About MVC 1.0 & JSON-P」

おまけ

Copyright© 2015 Growth xPartners, Inc. All rights reserved. 39

2015/1/1

Page 41: JavaOne 2015 報告会 @ 東京 「About MVC 1.0 & JSON-P」

JavaOne中にちょくちょくあったこと

「それ日本の(ブログ|勉強会)で聞いたやつだ!」

「そのネタだったら俺に喋らせろ!」

40Copyright© 2015 Growth xPartners, Inc. All rights reserved.

Page 42: JavaOne 2015 報告会 @ 東京 「About MVC 1.0 & JSON-P」

世界はそんなに遠くない

あれだけの数技術にとがったセッションを集めること

のできるパイの大きさというのは、超えられない壁です

が…

software developmentのレベルでは海外(主に米国)

と日本は大差はなかったと思う。

41Copyright© 2015 Growth xPartners, Inc. All rights reserved.

Page 43: JavaOne 2015 報告会 @ 東京 「About MVC 1.0 & JSON-P」

References

MVC: Model-View-Controller API Version 1.0 Early Draft (Second

Edition)

http://download.oracle.com/otndocs/jcp/mvc-1-edr2-spec/index.html

JSR-000374 Java API for JSON Processing 1.1 Early Draft Review

Javadoc

http://download.oracle.com/otndocs/jcp/json_p-1_1-edr-spec/index.html

JavaOne 2015 セッション資料

Introduction to MVC 1.0 (JSR 371) [CON4176]

What’s New in the Java API for JSON Processing? [CON3561]

What’s New in Java API for JSON Binding (JSR 367) [CON6155]

42Copyright© 2015 Growth xPartners, Inc. All rights reserved.

Page 44: JavaOne 2015 報告会 @ 東京 「About MVC 1.0 & JSON-P」

Thank you!

大中浩行(Onaka,Hiroyuki)

グロースエクスパートナーズ(株)

テクニカルリード

http://blog.fieldnotes.jp/

@setoazusa

43Copyright© 2015 Growth xPartners, Inc. All rights reserved.