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..
今日のお題
 MVC 1.0
 JSON-P 1.1
 (ちょこっと)JSON-B
1Copyright© 2015 Growth xPartners, Inc. All rights reserved.
MVC1.0
Copyright© 2015 Growth xPartners, Inc. All rights reserved. 2
2015/1/1
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.
なぜJSFでなくMVCなのか
 JSFはcomponentベース
 MVC 1.0 は actionベース
4Copyright© 2015 Growth xPartners, Inc. All rights reserved.
なぜactionベースなのか
 見通しのよさ、簡便さ
 RESTとの親和性
5Copyright© 2015 Growth xPartners, Inc. All rights reserved.
フロントエンドの流行廃りの激しさ
 WONTA (Write Once, Never Touch Again)
※どうせそのうち書き直すのだから保守性は考慮にいれない、の意
 定着した技術としてのサーバーサイドMVCへのニーズ
6Copyright© 2015 Growth xPartners, Inc. All rights reserved.
Controller
 MVCのControllerはJAX-RSのresourceとして実装
 ただし、semanticsには若干差異がある
7Copyright© 2015 Growth xPartners, Inc. All rights reserved.
Controller
8Copyright© 2015 Growth xPartners, Inc. All rights reserved.
@Path("hello")
public class HelloController {
@Inject
private Greeting greeting;
@GET
@Controller
public String hello() {
greeting.setMessage("Hello there!");
return "hello.jsp";
}
}
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");
}
Validation
 Bean Validation(JSR349)ベース
 Validationエラーの扱いについて
• 以下の2択
 ExceptionMapper<ConstraintViolationException>を実装して共通的に
処理する
 BindingResultをInjectionして、Controllerのメソッド内部で処理する
 ハンドリングの仕様がprimitiveな印象
10Copyright© 2015 Growth xPartners, Inc. All rights reserved.
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();
}
}
Controllerによるハンドリング
12Copyright© 2015 Growth xPartners, Inc. All rights reserved.
@Path("form")
@Controller
public class FormController {
@Inject
private 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();
}
}
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.
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.
 Viewのデフォルトのパスは”/WEB-INF/views”以下
 変更した場合は
javax.mvc.engine.ViewEngine.viewFolder プロパテ
ィを使ってオーバーライド
15Copyright© 2015 Growth xPartners, Inc. All rights reserved.
スコープ
 Controllerのデフォルトスコープはrequest
 CDIのスコープを使用可能
 application/session/request/conversation
 MVCで @RedirectScoped を定義
 PRG(POST-Redirect-GET)パターンをサポート
16Copyright© 2015 Growth xPartners, Inc. All rights reserved.
@RedirectScoped
17Copyright© 2015 Growth xPartners, Inc. All rights reserved.
@Named("bean")
@RedirectScoped
public class Greeting {
private String message;
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
イベント
 Observerパターン
 モニタリング/デバッグ/チューニング用途
 BeforeControllerEvent / AfterControllerEvent
BeforeProcessViewEvent / AfterProcessViewEvent
ControllerRedirectEvent
 追加の可能性あり
18Copyright© 2015 Growth xPartners, Inc. All rights reserved.
19Copyright© 2015 Growth xPartners, Inc. All rights reserved.
@ApplicationScoped
public 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());
}
}
感想
 「フレームワーク」ではなく「API」
 All in one フレームワークとは一線を画している
 「ポストStruts」ではない
 とはいえ、Validationとそれに関係する画面遷移の周
りをもうちょっと作り込まないと実用にはつらい!
20Copyright© 2015 Growth xPartners, Inc. All rights reserved.
JSON-P 1.1
Copyright© 2015 Growth xPartners, Inc. All rights reserved. 21
2015/1/1
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.
JSON-P 1.1
 JSON-P 1.0(RFC4627)をRFC7159でアップデート
 JSR374
 現在のステータスはEarly Draft Review
23Copyright© 2015 Growth xPartners, Inc. All rights reserved.
RFC7159
 全ての値がトップレベルに可能に
 つまり、以下がvalidになる
24Copyright© 2015 Growth xPartners, Inc. All rights reserved.
追加された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.
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();
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"))
ポインターによるJSON操作API
 add(JsonStructure, JsonValue)
 replace(JsonStructure, JsonValue)
 remove(JsonStructure)
28Copyright© 2015 Growth xPartners, Inc. All rights reserved.
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);
JSON-PATCHによるJSON間の差分取得
 JsonArray diff =
JsonPatch.diff(commit1,commit2)
30Copyright© 2015 Growth xPartners, Inc. All rights reserved.
JSON-MERGE PATCH
 RFC7386
 JSON間のマージ処理
 nullの値をマージするとキーの削除になる
 application/json-patch+json
31Copyright© 2015 Growth xPartners, Inc. All rights reserved.
JsonObject removeEntry = Json.createObjectBuilder()
.add("hiroyuki@fieldnotes.jp", JsonValue.NULL).build();
JsonValue newCommit =
JsonMergePatch.mergePatch(reader.read(), removeEntry)
JSON-MERGE PATCHによるパッチ
 リバースパッチが可能
32Copyright© 2015 Growth xPartners, Inc. All rights reserved.
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.
JSON PROCESSING IN PARSING
 streamモデルによる大容量Jsonデータの処理
 javax.json.stream.JsonParserにAPI追加
 getArray / getObject / getArrayStream / getObjectStream
34Copyright© 2015 Growth xPartners, Inc. All rights reserved.
JSON-P
 JSONに対する低レベル操作API
 JSONとJavaオブジェクト(JavaBean)へのマッピング
機能は持っていない
35Copyright© 2015 Growth xPartners, Inc. All rights reserved.
JSON-B
 Java API for JSON Binding
 JSR367
• 現在のスタータスはEarly Draft 2
 リファレンス実装はeclipselink MOXy(開発中)
36Copyright© 2015 Growth xPartners, Inc. All rights reserved.
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
 JSON-P 1.1はフレームワーク/ライブラリー開発者
には垂涎の機能だがそれ以外の開発者には…?
 JSON-Bなら使い出はありそうだが如何せん標準化に
時間がかかりすぎる!
38Copyright© 2015 Growth xPartners, Inc. All rights reserved.
おまけ
Copyright© 2015 Growth xPartners, Inc. All rights reserved. 39
2015/1/1
JavaOne中にちょくちょくあったこと
 「それ日本の(ブログ|勉強会)で聞いたやつだ!」
 「そのネタだったら俺に喋らせろ!」
40Copyright© 2015 Growth xPartners, Inc. All rights reserved.
世界はそんなに遠くない
 あれだけの数技術にとがったセッションを集めること
のできるパイの大きさというのは、超えられない壁です
が…
 software developmentのレベルでは海外(主に米国)
と日本は大差はなかったと思う。
41Copyright© 2015 Growth xPartners, Inc. All rights reserved.
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.
Thank you!
 大中浩行(Onaka,Hiroyuki)
 グロースエクスパートナーズ(株)
テクニカルリード
 http://blog.fieldnotes.jp/
 @setoazusa
43Copyright© 2015 Growth xPartners, Inc. All rights reserved.

More Related Content

PPTX
JavaOne2015報告会 Java EE アップデート #j1jp
PPTX
Java EE8 Report
PPTX
Java EE パフォーマンスTips #glassfish_jp
PDF
JavaOne 2015 JDK Update (Jigsaw) #j1jp
PDF
CDI2.0アップデート&クックブック #JavaDayTokyo #jdt2016_4c
PDF
Lt agetsuma 拡大するcdi
PPTX
Jsf アプリ作ったった
PDF
WildFly Swarmではじめる「パーツとしてのJavaEE」
JavaOne2015報告会 Java EE アップデート #j1jp
Java EE8 Report
Java EE パフォーマンスTips #glassfish_jp
JavaOne 2015 JDK Update (Jigsaw) #j1jp
CDI2.0アップデート&クックブック #JavaDayTokyo #jdt2016_4c
Lt agetsuma 拡大するcdi
Jsf アプリ作ったった
WildFly Swarmではじめる「パーツとしてのJavaEE」

What's hot (18)

PDF
Advanced database monitoring in modern java
PDF
WildFly Swarm - Rightsize Your Java EE Apps
PDF
Javaアプリケーションサーバ 構築・運用の勘所
PPTX
はじめてのJPA
PDF
Nashorn in the future (Japanese)
PDF
20160521 大規模映像配信サービスの Java8による全面リニューアルの裏側
PDF
Java Batch 仕様 (Public Review時点)
PDF
MVC 1.0 JSR-371を通してAdopt a JSRに知ろう #jjug_ccc #ccc_r57
PDF
Introduction to JShell: the Java REPL Tool #jjug_ccc #ccc_ab4
PPTX
Seasar2で作った俺たちのサービスの今
PDF
Webアプリに低レイテンシ・高可用性を求めるのは間違っているのだろうか
PPT
Java9新機能概要
PDF
10のJava9で変わるJava8の嫌なとこ!
PDF
Java EE 再入門
PDF
Java SE 再入門
PDF
Prepare for Java 9 #jjug
PDF
次世代Webコンテナ Undertowについて
PDF
これからのNashorn
Advanced database monitoring in modern java
WildFly Swarm - Rightsize Your Java EE Apps
Javaアプリケーションサーバ 構築・運用の勘所
はじめてのJPA
Nashorn in the future (Japanese)
20160521 大規模映像配信サービスの Java8による全面リニューアルの裏側
Java Batch 仕様 (Public Review時点)
MVC 1.0 JSR-371を通してAdopt a JSRに知ろう #jjug_ccc #ccc_r57
Introduction to JShell: the Java REPL Tool #jjug_ccc #ccc_ab4
Seasar2で作った俺たちのサービスの今
Webアプリに低レイテンシ・高可用性を求めるのは間違っているのだろうか
Java9新機能概要
10のJava9で変わるJava8の嫌なとこ!
Java EE 再入門
Java SE 再入門
Prepare for Java 9 #jjug
次世代Webコンテナ Undertowについて
これからのNashorn
Ad

Viewers also liked (20)

PPTX
JSON-B for CZJUG
PDF
いまさら聞けないJSONPのまとめ
PDF
Himotoki: A type-safe JSON decoding library #関モバ
PDF
2015/10/14 JJUGナイトセミナー「テスト駆動開発ここが聞きたい」
PDF
ObjectMapperでJSONマッピング
PPTX
JSON Support in Java EE 8
PDF
Java one 2015 [con3339]
PPTX
Adopt-a-JSR session (JSON-B/P)
PDF
JavaOne感想&技術トレンド紹介 - JavaOne2015報告会
PDF
Javaのプログラムはどうやって動いているの? GC編
PDF
JSONBはPostgreSQL9.5でいかに改善されたのか
PDF
「TDDはじめて物語」 #tddbc
PDF
実録Blue-Green Deployment導入記
PDF
Java EE 8 - February 2017 update
PDF
JavaOne 2014 BOF4241 What's Next for JSF?
PDF
What's next for Java API for WebSocket (JSR 356)
PPTX
תוצאות שאלון עמדות מנהלי שיווק מצייצים - אירוע קורנפלקס תלמה/יוניליוור
PPT
El preescolar desde adentro
DOC
Sven Mary trekt financiële situatie kantoor bijna recht
PDF
Internet Marketing Trends 2007
JSON-B for CZJUG
いまさら聞けないJSONPのまとめ
Himotoki: A type-safe JSON decoding library #関モバ
2015/10/14 JJUGナイトセミナー「テスト駆動開発ここが聞きたい」
ObjectMapperでJSONマッピング
JSON Support in Java EE 8
Java one 2015 [con3339]
Adopt-a-JSR session (JSON-B/P)
JavaOne感想&技術トレンド紹介 - JavaOne2015報告会
Javaのプログラムはどうやって動いているの? GC編
JSONBはPostgreSQL9.5でいかに改善されたのか
「TDDはじめて物語」 #tddbc
実録Blue-Green Deployment導入記
Java EE 8 - February 2017 update
JavaOne 2014 BOF4241 What's Next for JSF?
What's next for Java API for WebSocket (JSR 356)
תוצאות שאלון עמדות מנהלי שיווק מצייצים - אירוע קורנפלקס תלמה/יוניליוור
El preescolar desde adentro
Sven Mary trekt financiële situatie kantoor bijna recht
Internet Marketing Trends 2007
Ad

Similar to JavaOne 2015 報告会 @ 東京 「About MVC 1.0 & JSON-P」 (20)

PPT
Spring mvc
PDF
Javaで1から10まで書いた話(sanitized)
PDF
Introduction for Browser Side MVC
PDF
SpringOne 2GX 2014 参加報告 & Spring 4.1について #jsug
PDF
【Spring fest 2019】徹底解剖Spring MVCアーキテクチャー
PDF
Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework
PDF
ASP.NET MVC と jQuery で実践する標準志向 Web 開発
PPTX
Spring I/O 2015 報告
PPTX
今こそ知りたいSpring Web(Spring Fest 2020講演資料)
PPTX
Clojureの世界と実際のWeb開発
PDF
JavaOne2015報告またはこれからのJava
PDF
RESTful開発フロントエンド編(SPA・AltJS・フレームワーク)
PDF
GUI アプリケーションにおける MVC
KEY
関ジャバ JavaOne Tokyo 2012報告会
PDF
Using Ext Direct with SenchaTouch2
PDF
ADRという考えを取り入れてみて
PDF
JSer Class #3
PDF
BPStudy20121221
PDF
Spring Framework ふりかえりと4.3新機能
PDF
あの日見たMVCを僕たちはまだ知らない for RoR
Spring mvc
Javaで1から10まで書いた話(sanitized)
Introduction for Browser Side MVC
SpringOne 2GX 2014 参加報告 & Spring 4.1について #jsug
【Spring fest 2019】徹底解剖Spring MVCアーキテクチャー
Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework
ASP.NET MVC と jQuery で実践する標準志向 Web 開発
Spring I/O 2015 報告
今こそ知りたいSpring Web(Spring Fest 2020講演資料)
Clojureの世界と実際のWeb開発
JavaOne2015報告またはこれからのJava
RESTful開発フロントエンド編(SPA・AltJS・フレームワーク)
GUI アプリケーションにおける MVC
関ジャバ JavaOne Tokyo 2012報告会
Using Ext Direct with SenchaTouch2
ADRという考えを取り入れてみて
JSer Class #3
BPStudy20121221
Spring Framework ふりかえりと4.3新機能
あの日見たMVCを僕たちはまだ知らない for RoR

More from Hiroyuki Ohnaka (20)

PDF
remote Docker over SSHが熱い
PDF
VSCode Remote Container & GitHub Codespacesで拓く次世代のJava開発体験
PDF
Remote Development with Visual Studio Code & A clean dev env, working every ...
PDF
ChefとItamaeをニコイチしてAnsibleにマイグレーションした話
PDF
「WindowsデスクトップでWeb開発 改訂版」サンプル
PDF
Mackerelの薄い本
PDF
Microsoft DocsにContributeした話
PDF
Azure functions+typescript
PDF
技術書典4 く-35「錬金術MeetUp」 Alchemist Vol.1 サンプル版
PDF
4/22 技術書典4 か-16「ふぃーるどのーつ」 新刊「すいーとみゅーじっく vol.5Mackerelではじめるお手軽サーバー監視」サンプル版
PDF
仮想通貨始めました~GethではじめるEthereum~
PDF
錬金術MeetUpへのお誘い
PDF
Mackerelではじめる お手軽サーバー監視
PDF
「GebとSpockではじめるシステムテスト自動化」
PDF
TDDはじめて物語Second Season(updated)
PDF
TDDはじめて物語 Second Season #tddbc
PDF
XP祭り2017 LT 「DevOps再考」(改題)
PDF
JDK9の真の目玉機能はこれだ!
PDF
Java8移行は怖くない~エンタープライズ案件でのJava8移行事例~
PDF
「すいーとみゅーじっく」のできるまで
remote Docker over SSHが熱い
VSCode Remote Container & GitHub Codespacesで拓く次世代のJava開発体験
Remote Development with Visual Studio Code & A clean dev env, working every ...
ChefとItamaeをニコイチしてAnsibleにマイグレーションした話
「WindowsデスクトップでWeb開発 改訂版」サンプル
Mackerelの薄い本
Microsoft DocsにContributeした話
Azure functions+typescript
技術書典4 く-35「錬金術MeetUp」 Alchemist Vol.1 サンプル版
4/22 技術書典4 か-16「ふぃーるどのーつ」 新刊「すいーとみゅーじっく vol.5Mackerelではじめるお手軽サーバー監視」サンプル版
仮想通貨始めました~GethではじめるEthereum~
錬金術MeetUpへのお誘い
Mackerelではじめる お手軽サーバー監視
「GebとSpockではじめるシステムテスト自動化」
TDDはじめて物語Second Season(updated)
TDDはじめて物語 Second Season #tddbc
XP祭り2017 LT 「DevOps再考」(改題)
JDK9の真の目玉機能はこれだ!
Java8移行は怖くない~エンタープライズ案件でのJava8移行事例~
「すいーとみゅーじっく」のできるまで

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