Weitere ähnliche Inhalte
Ähnlich wie JavaOne 2015 報告会 @ 東京 「About MVC 1.0 & JSON-P」 (20)
Mehr von Hiroyuki Ohnaka (20)
JavaOne 2015 報告会 @ 東京 「About MVC 1.0 & JSON-P」
- 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. 今日のお題
MVC 1.0
JSON-P 1.1
(ちょこっと)JSON-B
1Copyright© 2015 Growth xPartners, Inc. All rights reserved.
- 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.
- 7. フロントエンドの流行廃りの激しさ
WONTA (Write Once, Never Touch Again)
※どうせそのうち書き直すのだから保守性は考慮にいれない、の意
定着した技術としてのサーバーサイドMVCへのニーズ
6Copyright© 2015 Growth xPartners, Inc. All rights reserved.
- 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. 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. Validation
Bean Validation(JSR349)ベース
Validationエラーの扱いについて
• 以下の2択
ExceptionMapper<ConstraintViolationException>を実装して共通的に
処理する
BindingResultをInjectionして、Controllerのメソッド内部で処理する
ハンドリングの仕様がprimitiveな印象
10Copyright© 2015 Growth xPartners, Inc. All rights reserved.
- 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. 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. 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. 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.
- 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. イベント
Observerパターン
モニタリング/デバッグ/チューニング用途
BeforeControllerEvent / AfterControllerEvent
BeforeProcessViewEvent / AfterProcessViewEvent
ControllerRedirectEvent
追加の可能性あり
18Copyright© 2015 Growth xPartners, Inc. All rights reserved.
- 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. 感想
「フレームワーク」ではなく「API」
All in one フレームワークとは一線を画している
「ポストStruts」ではない
とはいえ、Validationとそれに関係する画面遷移の周
りをもうちょっと作り込まないと実用にはつらい!
20Copyright© 2015 Growth xPartners, Inc. All rights reserved.
- 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. JSON-P 1.1
JSON-P 1.0(RFC4627)をRFC7159でアップデート
JSR374
現在のステータスはEarly Draft Review
23Copyright© 2015 Growth xPartners, Inc. All rights reserved.
- 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. 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();
- 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);
- 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)
- 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. JSON PROCESSING IN PARSING
streamモデルによる大容量Jsonデータの処理
javax.json.stream.JsonParserにAPI追加
getArray / getObject / getArrayStream / getObjectStream
34Copyright© 2015 Growth xPartners, Inc. All rights reserved.
- 37. JSON-B
Java API for JSON Binding
JSR367
• 現在のスタータスはEarly Draft 2
リファレンス実装はeclipselink MOXy(開発中)
36Copyright© 2015 Growth xPartners, Inc. All rights reserved.
- 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
- 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.