O slideshow foi denunciado.
Utilizamos seu perfil e dados de atividades no LinkedIn para personalizar e exibir anúncios mais relevantes. Altere suas preferências de anúncios quando desejar.

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

6.269 visualizações

Publicada em

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

Publicada em: Software
  • Seja o primeiro a comentar

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.

×