Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

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

6,224 views

Published on

2015/11/14
JavaOne 2015 報告会 @ 東京

Published in: Software
  • Be the first to comment

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

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

×