Javaを知らない世代が今からはじめるJava EE開発

JavaEE Advent Calendar 2012 の19日目の記事です。


昨日は@n_agetsuさんの JSF2.0でボタンの2度押しチェックをするでした。
明日は@hiranasuさんのNativeQueryじゃだめ?~JPAクエリ表現ごとのパフォーマンス比較です。


Java EEの何について書こうかなと思ったのですが、これからJavaを始めようと思っている若い世代が迷わず簡単に始めることができるJava EE開発のスタートについて書こうかなと思います。


Java EEの開発はRails等のフルスタックなフレームワークとは違いライブラリやフレームワーク、IDE、テスト等の情報が種類も多くいろんな場所に散らばっていてる為、初心者が全容を把握することはなかなか困難な状態です。
また長年のJava開発の中でWeb上の情報も古くなってしまっているものが多く、今からJavaを始めようとするユーザにとってなかなか理解でしづらいのではないかと思います。

そもそもJava EEってなに?

Java EEJavaでWebアプリケーションを開発するための標準の仕様です。現在、Java EEのバージョンは6で以前のバージョンで冗長だった記載がだいぶスマートに書けるようになりました。来年には7のリリースが予定されています。

開発環境

Javaの開発には統合開発環境(IDE)を利用します。Java EEでWebアプリをするなら是非NetBeansをインストールして下さい。IDEでは他にEclipse等がありますが最新のJava EE開発を行うにはやや環境が整えにくい面があります。

実行環境

開発したアプリケーションを実行するにはGlassFishをオススメします。GlassFishJava EEの参照実装サーバで無料で利用可能です。NetBeansをインストールするとGlassFishも自動的にインストールされます。

アーキテクチャ

Java EEというものは様々な仕様を取りまとめたもので、単にWebアプリケーションを開発するだけでもいろんな仕様の利用パターンがあり自由に選択する事が出来ます。簡単にWebアプリケーションを作成したいのであればJAX-RSをベースにアプリケーションの開発を行う事をオススメします。その他にもJSFServletを利用する方法もありますがJSFはやや古い設計でURLのデザインが難しくサーバ側にクライアント側の画面情報を保有する仕組みのため最近のJavaScriptを利用した動的な画面開発にはやや不向きです。Servletについては最古のWebインターフェースの仕様のため現在ではフレームワークの内部等特別な所でしか利用されないのが現状です。さらにWebアプリにリレーショナルデータベースを利用するのであればEJBJPAといった仕様を利用します。画面はJSPで作成しても良いですしJSONとしてデータを返してJavaScriptで描画しても良いと思います。

実際にJava EEアプリを作ってみる

Java EEを使用して実際にアプリケーションを開発してみましょう。流れは以下です。

  • Javaのインストール
  • NetBeansのインストール
  • プロジェクト作成
  • アプリ作成
  • 実行

Javaのインストール

まずはJavaをインストールしないと始まりません。Javaの開発環境であるJava Development KitJDK)を以下のサイトよりダウンロードしてインストールします。バージョンは7推奨。
http://www.oracle.com/technetwork/java/javase/downloads/index.html

NetBeansのインストール

次に統合開発環境NetBeansをインストールします。下記のサイトにアクセスしてNetBeansをダウンロードしてインストールします。もちろんJava EE対応のものをダウンロードします。
http://netbeans.org/downloads/

プロジェクト作成

NetBeansを起動してプロジェクトを作成します。
f:id:den2sn:20121204000012p:plain


Maven」>「Webアプリケーション」を選択します。
f:id:den2sn:20121204000128p:plain


プロジェクト名等を設定します。
f:id:den2sn:20121204000406p:plain


Java EEのバージョンはもちろん6でサーバにはGlassFishを選択します。サーバが選択出来ない場合は「追加」ボタンでNetBeansをインストールした際に一緒にインストールされるGlassFishを追加して下さい。
f:id:den2sn:20121204000603p:plain


プロジェクトが出来上がりました。
f:id:den2sn:20121204000734p:plain

アプリ作成

次にアプリケーションを作成します。JAX-RSでアプリを作ります。
f:id:den2sn:20121204000827p:plain


ファイルのタイプに「Webサービス」>「パターンからのRESTful Webサービス」を選択します。
f:id:den2sn:20121204000940p:plain


パターンに「単純なルート・リソース」を選択します。
f:id:den2sn:20121204001035p:plain


クラス名等を設定します。
f:id:den2sn:20121204001153p:plain


JAX-RSのクラスが作成されました。
f:id:den2sn:20121204001325p:plain


次にソースを修正して行きましょう。まずはindex.jspファイルを開いてJAX-RSを呼び出すソースを追加します。DOCTYPEの修正(なぜかデフォルトはhtml5ではないので)、jqueryライブラリの追加、JAX-RSの呼び出し等を追加します。

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>JSP Page</title>
        <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
    </head>
    <body>
        <h1>Hello World!</h1>
        <div id="list"></div>
        <script type="text/javascript">
            $(document).ready(function(){
                $("#list").load("webresources/hello/list");
            });
        </script>
    </body>
</html>


次にHelloResource.javaを修正します。今回はJSPを返信するためにjersyのViewableクラスを使用しました。ソースのエラー解決でMavenリポジトリで検索を選びpom.xmlにjersy-serverを追加します。

package com.den2sn.mavenproject1;

import com.sun.jersey.api.view.Viewable;
import java.util.ArrayList;
import java.util.List;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.UriInfo;
import javax.ws.rs.Path;
import javax.ws.rs.GET;
import javax.ws.rs.Produces;

@Path("hello")
public class HelloResource {

    @Context
    private UriInfo context;

    public HelloResource() {
    }

    @GET
    @Path("list")
    @Produces("text/html")
    public Viewable list() {
        List<String> messages = new ArrayList<String>();
        messages.add("message1");
        messages.add("message2");
        messages.add("message3");

        return new Viewable("/list.jsp", messages);
    }
}

f:id:den2sn:20121204002454p:plain


最後にJAX-RSで返信するJSPを追加します。
f:id:den2sn:20121204002538p:plain


ファイル名をlistとします。
f:id:den2sn:20121204002603p:plain


作成されたlist.jspのソースを修正します。今回はJSTLで設定したリストを表示しました。Java側でセットした値がitで取得できます。

<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<c:forEach var="message" items="${it}">
    <div><c:out value="${message}"></c:out></div>
</c:forEach>

実行

ではアプリケーションを実行してみましょう。プロジェクトを右クリックして「実行」を選択します。
f:id:den2sn:20121204002843p:plain


ブラウザに呼び出された一覧が表示されれば完成です。
f:id:den2sn:20121204002935p:plain

作ったアプリケーションをWeb上に公開したいのだけれども...

実はJava EEはエンタープライズ向けの重たい仕様のため近年利用されているGoogle App EngineやHerokuのようなPaaSサービスでは未対応で、そのままWebアプリケーションとして登録する事は残念ながらできません。ただしHerokuでJAX-RSをひとまず動作させることは出来ます。heroku のサインアップが終了していれば


http://java.heroku.com/


にアクセスし、RESTful API with JAX-RSのCreate Appボタンを押せばjettyサーバを使用したひな形がアプリができあがるのでそのひな形を元にいろいろといじってみるのが良いかと思います。

参考書籍


まずは金魚本を一通り読めばJava EEの大まかに把握できると思います。


Beginning Java EE 6 GlassFish 3で始めるエンタープライズJava (Programmer’s SELECTION)

Beginning Java EE 6 GlassFish 3で始めるエンタープライズJava (Programmer’s SELECTION)


もっと細かい内容を知りたい人はマスタリングJava EE本で。


マスタリングJavaEE5 第2版 (DVD付) (Programmer’s SELECTION)

マスタリングJavaEE5 第2版 (DVD付) (Programmer’s SELECTION)


JAX-RSとKnockout.jsでJSON連携 に続く