JavaEE使い方メモ（基本＋環境構築）

#Java EE とは
Java Platform, Enterprise Edition の略。
Java SE(Standard Edition) がデスクトップアプリケーション開発向けの仕様がまとめられているのに対して、Enterprise ーすなわち企業向けのアプリケーション（Web アプリとか）を開発するうえで必要になるライブラリやフレームワークの仕様がまとめられたエディション。

##名称について
2014年12月現在の最新はバージョン７。
バージョン４までは J2EE (Java 2 Platform, Enterprise Edition)と呼ばれていたが、バージョン５からは Java EE (Java Platform, Enterprise Edition)と名称が変更されている（年上の人たちは J2EE って言っちゃう人が多い）。

バージョン４までは J2EE 1.4 というふうに 1.x という形でバージョンを表記し、バージョン５からは Java EE 5 という形で表記している。

##歴史的なこと
###J2EE 1.2 ～ 1.4 （暗黒時代）
ちょっと Hello World するだけでも設定ファイルなどを含めて 100 行くらいコードを書かないといけなかった。
EJB は「重量コンテナ」などと呼ばれ、敬遠されるようになる。

EE とは別にサードパーティのライブラリ・フレームワークである [Spring Framework](http://spring.io/)、 [Hibername](http://hibernate.org/)、[Seasar2](http://www.seasar.org/) などが勢力を伸ばすようになる。
特に Spring や Seasar2 の DI (Dependency injection)の仕組みは、 EE の重量コンテナに対して軽量コンテナなどと呼ばれ広く受け入れられた。

###Java EE 5 (大改定)
Spring や Hibernate など、他のライブラリで培われてきたノウハウを吸収する形で大改定が行われた。

- EJB に DI の仕組みを導入。
- JPA の仕様策定に、 Hibernate の作者（Gavin King）が参画。
- アノテーションを導入して設定ファイルの量を削減

などなど。でも、まだまだ Spring とかの方が便利だった。

###Java EE 6 (洗練化)
Ruby on Rails の思想で有名な「設定より規約」を積極的に導入して、設定の記述量が激減。 EJB はアノテーションを付けるだけで使えるようになった。
また、 CDI や JAX-RS などの新しい仕様が追加されたり、使われなくなった仕様の削除が予告された。

結構いい感じになってきた印象。でも、使ってるとまだちょっと痒いところに手が届かない感があった（JAX-RS と CDI が連携しない。CDI で宣言的トランザクション管理ができない。CDI で HttpServletRequest をインジェクションできない。 JPA の JPQL がやや貧弱。などなど...）。

###Java EE 7 （成熟？）
EE6 で届いてなかった痒いところに手が届いた感じ。
WebSocket や JBatch など新たな仕様追加も行われた。

？が付いてるのは、 Java EE 8 でさらに発展しそうだから。
[寺田さんの AC 記事](http://yoshio3.com/2014/12/19/java-ee-8-new-features/) を読んだら wktk してきました（特に CDI と MVC）。


##Java EE 7 に含まれている仕様の例
Java EE 7 に含まれているなかで、主要っぽいものを独断と偏見でリストアップしてみる。

| 名前（略称）                                         | 説明                                                                                                     | リファレンス実装                                                | JSR                                         |
| :--                                                  | :--                                                                                                      | :--                                                             | :--                                         |
| Java Servlet 3.1                                     | Web アプリを作るための基礎となる仕組み。                                                                 | GlassFish?                                                      | [340](https://jcp.org/en/jsr/detail?id=340) |
| Java Server Pages 2.3 (JSP)                          | 動的に HTML ページを生成するための仕組み。                                                               | Tomcat?                                                         | [245](https://jcp.org/en/jsr/detail?id=245) |
| Java API for WebSocket                               | Java で WebSocket を扱うための仕様。                                                                     | [Tyrus](https://java.net/projects/tyrus)                        | [356](https://jcp.org/en/jsr/detail?id=356) |
| JavaServer Faces 2.2 (JSF)                           | Java EE 標準の MVC フレームワーク（コンポーネント指向）。                                                | [Mojarra](https://javaserverfaces.java.net/)                    | [344](https://jcp.org/en/jsr/detail?id=344) |
| Expression Language 3.0 (EL式)                       | 簡潔な記述でオブジェクトの値参照やメソッド実行をするための式言語。                                       | GlassFish?                                                      | [341](https://jcp.org/en/jsr/detail?id=341) |
| Batch Applications for the Java Platform (jBatch)    | バッチ処理を実装するための標準仕様。                                                                     | [GlassFish?](https://java.net/projects/jbatch)                  | [352](https://jcp.org/en/jsr/detail?id=352) |
| Contexts and Dependency Injection for Java 1.1 (CDI) | オブジェクトのスコープまで管理する DI コンテナ。                                                         | [Weld](http://weld.cdi-spec.org/)                               | [346](https://jcp.org/en/jsr/detail?id=346) |
| Concurrency Utilities for Java EE 1.0                | EE コンテナ上で非同期処理を実装するための仕組み。                                                        | [GlassFish?](https://java.net/projects/concurrency-ee-spec)     | [236](https://jcp.org/en/jsr/detail?id=236) |
| Bean Validation 1.1                                  | JavaBeans の値検証を行うためのフレームワーク。                                                           | [Hibernate Validator](http://hibernate.org/validator/)          | [349](https://jcp.org/en/jsr/detail?id=349) |
| Enterprise JavaBeans 3.2 (EJB)                       | ビジネスロジックを持つクラスを管理するためのフレームワーク。トランザクション境界の管理や DI 機能も持つ。 | [GlassFish?](https://java.net/projects/ejb-spec)                | [345](https://jcp.org/en/jsr/detail?id=345) |
| Java Persistence 2.1 (JPA)                           | O/R マッパー。 JPQL という独自のクエリ言語を持つ。                                                       | [Eclipse Link](http://eclipse.org/eclipselink/downloads/ri.php) | [338](https://jcp.org/en/jsr/detail?id=338) |
| Java Message Service API 2.0 (JMS)                   | Java でメッセージサービスを扱うための API 仕様。                                                         | [Open Message Queue?](https://mq.java.net/)                     | [343](https://jcp.org/en/jsr/detail?id=343) |
| Java Transaction API 1.2 (JTA)                       | Java でトランザクションを扱うための API 仕様。                                                           | GlassFish?                                                      | [907](https://jcp.org/en/jsr/detail?id=907) |
| Java API for RESTful Web Services 2.0 (JAX-RS)       | Java で RESTful な Web API を実装するためのフレームワーク。                                              | [Jersey](https://jersey.java.net/)                              | [339](https://jcp.org/en/jsr/detail?id=339) |

リファレンス実装で `?` がついてるのは、自信なし。

###JSR とは
Java に関する標準仕様は、 JCP (Java Community Process)という標準化手続きに則って決められている。

JCP では、 JSR (Java Specification Request)という単位で仕様が策定されている。
各 JSR には番号が振られていて、仕様のことを指すときに「JSR 346」のように番号で呼ぶことがある（番号で呼んでるとカッコイイという噂があるとかないとか）。

JSR は一般公開されているので、誰でも各仕様のドキュメントを読むことができる（ただし当然英語）。

JCP の具体的な標準化手順については [Java API、使ってますか? (1) JCPによって進められるJava関連技術の標準化 | マイナビニュース](http://news.mynavi.jp/column/jsr/001/) が参考になるかと。

###リファレンス実装とは
JSR には、その仕様を具体的に実装したサンプルとなる実装が必ず用意されている（JCP のルール）。
これを**参照実装**、**リファレンス実装**、**Reference Implementation (RI)** などと呼ぶ。

Java EE 7 の仕様も JCP で策定されており、リファレンス実装は GlassFish になる。

各仕様で分からないことがあれば、各リファレンス実装の Web ページに行き、チュートリアルとかを読めば解決することがままある。

あくまでリファレンス実装なので、ここに挙げたもの以外にも仕様によっては以下のように他の実装が存在する。

| 仕様      | 他の実装例     |
| :--       | :--            |
| Java EE 7 | WildFly        |
| JPA       | Hibernate      |
| JAX-RS    | RESTEasy       |
| EJB       | Apache OpenEJB |


#開発環境の構築
IDE は今まで Eclipse を頑なに使っていたけど、そろそろ NetBeans も覚えようと思うので、 NetBeans を使う。
たぶん、 Java EE まわりの入力補完とかは NetBeans の方が上っぽい（特に JSF 周り）。

AP サーバは、 RI である GlassFish 4.1 を使う。

##NetBeans のインストール
[こちら](http://qiita.com/opengl-8080/items/ba68b4a73731af1d26d7) を参照。

バージョンは 8.0.2 をインストールした。
ただし、 GlassFish は一緒にインストールしなかった。

今回は、あえて別途手動でインストールした GlassFish と連携させる（常にバンドルしているやつが使えるとは限らん気がするので）。

##GlassFish のインストール
[こちら](https://glassfish.java.net/download.html) から zip をダウンロード。
今回は、 Full Platform をダウンロードした。

ダウンロードしたら、任意の場所で zip を解凍してインストールは完了。

###Profile について
Java EE 6 からは、 Profile というものが導入された。

Full Platform は、 Java EE で決められた全ての仕様を使うことができる。
一方、 Web Profile では、一部の仕様だけを使うことができる。 Web Profile に含まれる仕様で事足りるのであれば、 Web Profile を使えばいい。

[このページ](http://www.oracle.com/technetwork/java/javaee/tech/index.html) の一番右の列にチェックが入っている仕様が Web Profile に含まれている。

##HeloWorld
###NetBeans に手動インストールした GlassFish を追加する
- 「ツール」→「サーバー」を選択。
- 「サーバーの追加」を選択。
- 画面指示に従って、手動インストールした GlassFish を追加する。
    - GlassFish の場所は zip を解凍したフォルダの場所ではなく、その直下にある `glassfish` フォルダを指定する。
    - 「ドメインの場所」は何も入力を変更することなく終了してOK（パスワードなどは、デフォルトは未設定になっている）。

###プロジェクトを作成する
- NetBeans 上で、「ファイル」→「新規プロジェクト」を選択。
- 「カテゴリ」の中から「Java Web」を選択し、「プロジェクト」の「Webアプリケーション」を選択して「次へ」をクリック。
- 「プロジェクト名」に任意の名前を入力して「次へ」。
- 「サーバーと設定」では、先ほど登録した GlassFish を選択して「終了」。

###起動する
- 「プロジェクトを実行する」ボタン（緑三角のやつ）をクリック。
- GlassFish が起動して、アプリがデプロイされ、既定のブラウザで画面が表示される。

#Java EE 関係の書籍
自分が今まで読んだ Java EE 関係の書籍について。

##[マスタリングJava EE 5](http://www.amazon.co.jp/%E3%83%9E%E3%82%B9%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0JavaEE5-%E7%AC%AC2%E7%89%88-DVD%E4%BB%98-Programmer%E2%80%99s-SELECTION/dp/4798120545/ref=pd_cp_b_0)
Java EE を勉強するうえで最初に読んだ本。
最初に読んでよかったと思える本。

めっちゃ分厚いけど、それだけ情報が濃い。
とりあえず一読する価値はあるかと（サンプルコードが多いので、結構読み飛ばせる）。

バージョンは古いけれど、基礎となる考え方などは変わっていないので、まずこの本で勉強してから 6, 7 に進むのも良いと思う（自分がそうだった）。
ただし、 JSF は結構大きく変わっているので、使えない部分が多い（Facelets は EE 6 からなので、本書では JSP をビューにしている）。
また、 CDI, JAX-RS などは EE6 から追加されたので、当然その辺の話は載っていない。

しかし、日本人が書いただけあって翻訳本より圧倒的に文章が読みやすいのが良い。

このレベルの EE 7 本出たら嬉しいのになー。

##[Beginning Java EE 6](http://www.amazon.co.jp/Beginning-GlassFish-3%E3%81%A7%E5%A7%8B%E3%82%81%E3%82%8B%E3%82%A8%E3%83%B3%E3%82%BF%E3%83%BC%E3%83%97%E3%83%A9%E3%82%A4%E3%82%BAJava-Programmer%E2%80%99s-SELECTION/dp/4798124605/ref=pd_bxgy_b_img_y)
広くやや深く Java EE 6 の事が書かれた本。
通称**金魚本**。

EE6 を一巡りするのに良い。
ただし、何故か CDI の話が一切書かれていない。不思議だ。

##[Enterprise Java Beans 3.1](http://www.amazon.co.jp/Enterprise-JavaBeans-3-1-Andrew-Rubinger/dp/4873115086/ref=pd_sim_b_5?ie=UTF8&refRID=1SH66YZJPA2R667XS8MN)
EJB について金魚本よりもうちょっと知りたい場合の本。
EJB と言いつつ、 JPA の説明も多い（1/3 くらい JPA）。

##[JavaによるRESTfulシステム構築](http://www.amazon.co.jp/Java%E3%81%AB%E3%82%88%E3%82%8BRESTful%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E6%A7%8B%E7%AF%89-Bill-Burke/dp/4873114675/ref=pd_bxgy_b_img_z)
JAX-RS について知りたければこの本。

基本的な使い方はひと通り網羅されている。
さらに知りたい場合は、 Jersey のユーザーガイドとかを読めばいいと思う。

##[わかりやすいJavaEEウェブシステム入門](http://www.amazon.co.jp/%E3%82%8F%E3%81%8B%E3%82%8A%E3%82%84%E3%81%99%E3%81%84JavaEE%E3%82%A6%E3%82%A7%E3%83%96%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E5%85%A5%E9%96%80-%E5%B7%9D%E5%A0%B4-%E9%9A%86/dp/4798042161)
初心者でも分かるように噛み砕いた表現で書かれた入門書。

[作者さんの Qiita 記事](http://qiita.com/tkxlab/items/3c0d4073defacb1215f5) にもあるように、 JSF 周りの説明に重点が置かれている。

CDI についても解説されているのが個人的に嬉しい。

「マスタリング Java EE 5」はちょっと。。。という人は、こちらで入門するのがいいと思う（まだ全部読んでないけど）。