javaone 2015 報告会 @ 東京 「about mvc 1.0 & json-p」
TRANSCRIPT
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 {
@Injectprivate Greeting greeting;
@GET@Controllerpublic 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")@Controllerpublic class FormController {
@Injectprivate 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")@RedirectScopedpublic 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.
@ApplicationScopedpublic 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("[email protected]", 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.