Java による Web...
-
Upload
yu-nobuoka -
Category
Software
-
view
5.125 -
download
5
description
Transcript of Java による Web...
![Page 1: Java による Web アプリケーションのプロトタイプのために最近使っている構成](https://reader033.fdocument.pub/reader033/viewer/2022052323/55921db11a28ab78218b464e/html5/thumbnails/1.jpg)
id:nobuoka (@nobuoka)
2014-05-03 Kyoto.なんか
Java による Web アプリケーションのプロトタイプのために最近使っている構成
![Page 2: Java による Web アプリケーションのプロトタイプのために最近使っている構成](https://reader033.fdocument.pub/reader033/viewer/2022052323/55921db11a28ab78218b464e/html5/thumbnails/2.jpg)
![Page 3: Java による Web アプリケーションのプロトタイプのために最近使っている構成](https://reader033.fdocument.pub/reader033/viewer/2022052323/55921db11a28ab78218b464e/html5/thumbnails/3.jpg)
動かすことができた!!!!!
が、パフォーマンス的に厳しい
空ファイルのコンパイルに 3 分メモリ 1.7 GB 使用
![Page 4: Java による Web アプリケーションのプロトタイプのために最近使っている構成](https://reader033.fdocument.pub/reader033/viewer/2022052323/55921db11a28ab78218b464e/html5/thumbnails/4.jpg)
Web アプリケーションの記述
Perl!!!!いいところもあるけどつらい!!!!
変数に型がない
はまりどころが多い柔軟であるが故に保守性が低くなりがち
データ型が十分でない
![Page 5: Java による Web アプリケーションのプロトタイプのために最近使っている構成](https://reader033.fdocument.pub/reader033/viewer/2022052323/55921db11a28ab78218b464e/html5/thumbnails/5.jpg)
というわけで、最近はWeb アプリケーションを Java で書いてる。
プロトタイピングに使用している構成を紹介。
![Page 6: Java による Web アプリケーションのプロトタイプのために最近使っている構成](https://reader033.fdocument.pub/reader033/viewer/2022052323/55921db11a28ab78218b464e/html5/thumbnails/6.jpg)
HTTP サーバー
ルーティングリクエスト処理 / レスポンス生成
ドメインロジックアプリケーション処理
HTML 生成テンプレートエンジン
ドメインモデルORM
RDBMS
![Page 7: Java による Web アプリケーションのプロトタイプのために最近使っている構成](https://reader033.fdocument.pub/reader033/viewer/2022052323/55921db11a28ab78218b464e/html5/thumbnails/7.jpg)
HTTP サーバー
ルーティングリクエスト処理 / レスポンス生成
ドメインロジックアプリケーション処理
HTML 生成テンプレートエンジン
ドメインモデルORM
RDBMS
![Page 8: Java による Web アプリケーションのプロトタイプのために最近使っている構成](https://reader033.fdocument.pub/reader033/viewer/2022052323/55921db11a28ab78218b464e/html5/thumbnails/8.jpg)
Grizzly (HTTP サーバー)
● Java NIO による非同期 I/O。 スケーラブル。● HTTP 以外のプロトコルも扱える汎用ネットワーク
エンジン。● 同様のものに Play! Framework で使われている
Netty など。● 後述の Jersey アプリケーションを動かせる非
サーブレットコンテナな HTTP サーバーとして選択。
● プログラム上で起動させたり停止させたり。
![Page 9: Java による Web アプリケーションのプロトタイプのために最近使っている構成](https://reader033.fdocument.pub/reader033/viewer/2022052323/55921db11a28ab78218b464e/html5/thumbnails/9.jpg)
HTTP サーバー
ルーティングリクエスト処理 / レスポンス生成
ドメインロジックアプリケーション処理
HTML 生成テンプレートエンジン
ドメインモデルORM
RDBMS
Grizzly
![Page 10: Java による Web アプリケーションのプロトタイプのために最近使っている構成](https://reader033.fdocument.pub/reader033/viewer/2022052323/55921db11a28ab78218b464e/html5/thumbnails/10.jpg)
HTTP サーバー
ルーティングリクエスト処理 / レスポンス生成
ドメインロジックアプリケーション処理
HTML 生成テンプレートエンジン
ドメインモデルORM
RDBMS
Grizzly
![Page 11: Java による Web アプリケーションのプロトタイプのために最近使っている構成](https://reader033.fdocument.pub/reader033/viewer/2022052323/55921db11a28ab78218b464e/html5/thumbnails/11.jpg)
Jersey (JAX-RS 実装)
● JAX-RS: Java API for RESTful Web Services。– Java EE に含まれている。
– サーブレットコンテナ内でもそれ以外でも。
● リクエスト URI から呼び出しメソッド決定; リクエストパラメータやレスポンスをいい感じに処理。– POJO → JSON の変換とか。
● アノテーション使いまくり。● Jersey は JAX-RS 2.0 の参照実装。
– ドキュメントが読みやすく、癖もなくて扱いやすい。
![Page 12: Java による Web アプリケーションのプロトタイプのために最近使っている構成](https://reader033.fdocument.pub/reader033/viewer/2022052323/55921db11a28ab78218b464e/html5/thumbnails/12.jpg)
リソースクラス、リソースメソッド
@Path("/sample")public class SampleResource { @Path("/{id}") @GET @Produces("text/plain; charset=utf-8") public Response getSample( @PathParam("id") String id) { return Response.ok("Sample " + id).build(); }}
![Page 13: Java による Web アプリケーションのプロトタイプのために最近使っている構成](https://reader033.fdocument.pub/reader033/viewer/2022052323/55921db11a28ab78218b464e/html5/thumbnails/13.jpg)
Grizzly 上で動かす
URI u = UriBuilder.fromUri("http://localhost/"). port(10082).build();ResourceConfig conf = new ResourceConfig();conf.register(SampleResource.class);
HttpServer server = GrizzlyHttpServerFactory.createHttpServer( u, conf);
![Page 14: Java による Web アプリケーションのプロトタイプのために最近使っている構成](https://reader033.fdocument.pub/reader033/viewer/2022052323/55921db11a28ab78218b464e/html5/thumbnails/14.jpg)
HTTP サーバー
ルーティングリクエスト処理 / レスポンス生成
ドメインロジックアプリケーション処理
HTML 生成テンプレートエンジン
ドメインモデルORM
RDBMS
Grizzly
Jersey
![Page 15: Java による Web アプリケーションのプロトタイプのために最近使っている構成](https://reader033.fdocument.pub/reader033/viewer/2022052323/55921db11a28ab78218b464e/html5/thumbnails/15.jpg)
HTTP サーバー
ルーティングリクエスト処理 / レスポンス生成
ドメインロジックアプリケーション処理
HTML 生成テンプレートエンジン
ドメインモデルORM
RDBMS
Grizzly
Jersey
![Page 16: Java による Web アプリケーションのプロトタイプのために最近使っている構成](https://reader033.fdocument.pub/reader033/viewer/2022052323/55921db11a28ab78218b464e/html5/thumbnails/16.jpg)
EclipseLink (ORM; JPA 実装)
● JPA: Java Persistence API。– Java SE、Java EE 環境用の ORM。
● 設定ファイルやクラス定義から自動的に DB、テーブルを生成可能。
● アノテーション使いまくり。● EclipseLink は JPA 2.1 の参照実装。
– Hibernate の方が web 上の情報は多そうだけど、多機能で複雑そうなので EclipseLink を選択。
● Jersey の DI 機能でインジェクションしてる。
![Page 17: Java による Web アプリケーションのプロトタイプのために最近使っている構成](https://reader033.fdocument.pub/reader033/viewer/2022052323/55921db11a28ab78218b464e/html5/thumbnails/17.jpg)
エンティティクラス
@Entity@Table(name="sample_user")public class SampleUser implements Serializable { private static final long serialVersionUID = 1L;
@Id @GeneratedValue(strategy=GenerationType.IDENTITY) @Column(name="id") private long id; public long getId() { return id; }
@Column(name="name") private String name; public String getName() { return name; }
protected SampleUser() {} public SampleUser(String name) { this.name = name; }}
![Page 18: Java による Web アプリケーションのプロトタイプのために最近使っている構成](https://reader033.fdocument.pub/reader033/viewer/2022052323/55921db11a28ab78218b464e/html5/thumbnails/18.jpg)
EntityManager による操作
// EntityManager em;
// 永続化em.getTransaction().begin();SampleUser u = new SampleUser("nobuoka");em.persist(u);em.getTransaction().commit();
// 取得SampleUser u = em.find(SampleUser.class, u.getId());
![Page 19: Java による Web アプリケーションのプロトタイプのために最近使っている構成](https://reader033.fdocument.pub/reader033/viewer/2022052323/55921db11a28ab78218b464e/html5/thumbnails/19.jpg)
HTTP サーバー
ルーティングリクエスト処理 / レスポンス生成
ドメインロジックアプリケーション処理
HTML 生成テンプレートエンジン
ドメインモデルORM
RDBMS
Grizzly
Jersey
EclipseLink
![Page 20: Java による Web アプリケーションのプロトタイプのために最近使っている構成](https://reader033.fdocument.pub/reader033/viewer/2022052323/55921db11a28ab78218b464e/html5/thumbnails/20.jpg)
HTTP サーバー
ルーティングリクエスト処理 / レスポンス生成
ドメインロジックアプリケーション処理
HTML 生成テンプレートエンジン
ドメインモデルORM
RDBMS
Grizzly
Jersey
EclipseLink
![Page 21: Java による Web アプリケーションのプロトタイプのために最近使っている構成](https://reader033.fdocument.pub/reader033/viewer/2022052323/55921db11a28ab78218b464e/html5/thumbnails/21.jpg)
Derby (RDBMS)
● Java で書かれた RDB 管理システム。– Derby ベースの Java DB が JDK に含まれている。
● SQLite のようにアプリケーション内で RDBMS を動かせる。
● ディレクトリを指定して DB を作成。● トランザクション機能などもある。● Pure Java なので外の何かに依存することもない
し、プロトタイピングの際に扱いやすい。
![Page 22: Java による Web アプリケーションのプロトタイプのために最近使っている構成](https://reader033.fdocument.pub/reader033/viewer/2022052323/55921db11a28ab78218b464e/html5/thumbnails/22.jpg)
HTTP サーバー
ルーティングリクエスト処理 / レスポンス生成
ドメインロジックアプリケーション処理
HTML 生成テンプレートエンジン
ドメインモデルORM
RDBMS
Grizzly
Jersey
EclipseLink
Derby
![Page 23: Java による Web アプリケーションのプロトタイプのために最近使っている構成](https://reader033.fdocument.pub/reader033/viewer/2022052323/55921db11a28ab78218b464e/html5/thumbnails/23.jpg)
HTTP サーバー
ルーティングリクエスト処理 / レスポンス生成
ドメインロジックアプリケーション処理
HTML 生成テンプレートエンジン
ドメインモデルORM
RDBMS
Grizzly
Jersey
EclipseLink
Derby
![Page 24: Java による Web アプリケーションのプロトタイプのために最近使っている構成](https://reader033.fdocument.pub/reader033/viewer/2022052323/55921db11a28ab78218b464e/html5/thumbnails/24.jpg)
Velocity (テンプレートエンジン)
● 汎用のテンプレートエンジン。● VLT という独自言語を使用して記述。● パフォーマンスや扱いやすさなどを考慮して
Velocity を選択。● とはいえすごく良いテンプレートエンジンかという
とそうではないのでもうちょっと何とかしたい。● Java 8 の機能を活用していい感じのものできない
かなーと最近考えたりしてる。
![Page 25: Java による Web アプリケーションのプロトタイプのために最近使っている構成](https://reader033.fdocument.pub/reader033/viewer/2022052323/55921db11a28ab78218b464e/html5/thumbnails/25.jpg)
HTTP サーバー
ルーティングリクエスト処理 / レスポンス生成
ドメインロジックアプリケーション処理
HTML 生成テンプレートエンジン
ドメインモデルORM
RDBMS
Grizzly
Jersey
EclipseLink
Derby
Velocity
![Page 26: Java による Web アプリケーションのプロトタイプのために最近使っている構成](https://reader033.fdocument.pub/reader033/viewer/2022052323/55921db11a28ab78218b464e/html5/thumbnails/26.jpg)
雑感
● Grizzly + Jersey (JAX-RS) の組み合わせは本番用でそのまま使えそう。
● EclipseLink (JPA) と Velocity も本番で使って良さそうだけど、他の選択肢もある。– DB 周りに関しては Hibernate も良さそう?
– 自前で JDBC 操作とか。
● Derby はプロトタイプ用という感じ。– EclipseLink による DB、テーブル自動生成と組み合わ
せて、プロトタイピング時に扱いやすくて重宝する。