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.

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