EclipseではじめるJava EE 6

Java EE 6の勉強を始めるならばNetBeans 6.8開発版を使うのが今のところ手っ取り早い。が、Eclipseでもプラグインを入れれば可能だ。Eclipse 3.4以降ならば以下の方法でいける。

セットアップ

メニューから「ヘルプ」−「ソフトウェア更新」を選択。「使用可能なソフトウェア」タブを選択し、「サイトの追加」でURL「https://ajax.dev.java.net/eclipse」を追加し、リフレッシュする。Glassfishにチェックをつけてインストールだ。
http://shin.cside.com/diary/2009/0924-01.png


サーバーウィンドウで「新規」−「サーバー」を選択する。
http://shin.cside.com/diary/2009/0924-02.png


サーバーの追加でGlassfishが選べるようになっているのでGlassfish V3(Java EE 6リファレンス実装)を選択。
http://shin.cside.com/diary/2009/0924-03.png


Glassfish V3があるパスを入力。注意したいのがこのパス直下はインストーラ等が利用していてその中のglassfishフォルダを選ぶこと。NetBeansはこのへんも考慮してくれるのでEclipseプラグインもやってくれるといいんだけどなぁ。
http://shin.cside.com/diary/2009/0924-04.png


ウィザードが終わるとGlassfish V3が追加される。メニューもいくつかある。
http://shin.cside.com/diary/2009/0924-05.png


WTP自体はJava EE 6対応してないので3.0は選択できないようだ。
http://shin.cside.com/diary/2009/0924-06.png



新規作成のウィザードにGlassfishカテゴリが追加されている。サーブレットEJBJDBCリソースは作成できるようになっているようだ。
http://shin.cside.com/diary/2009/0924-07.png

サーブレットをウィザードに従って作成。URLはどこ二マッピングされるかわかりやすいようにかえてある。
http://shin.cside.com/diary/2009/0924-08.png

このウィザードで生成されるコードは以下の通り。

package servlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.annotation.WebServlet;

/**
 * Servlet implementation class HogeServlet
 */
@WebServlet(name="HogeServlet", urlPatterns={"/hoge"})
public class HogeServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public HogeServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// TODO Auto-generated method stub
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// TODO Auto-generated method stub
	}

}

これを使ってJava EE 6らしいコードを書いてみる。

サンプル作成


ELで利用する計算クラス。

package bean;

public class Calc {
	public int add(int a,int b){
		return a + b;
	}
}

サーブレット。アプリケーションスコープに上のクラスを入れる。

package servlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.annotation.WebServlet;

import bean.Calc;

/**
 * Servlet implementation class HogeServlet
 */
@WebServlet(name="HogeServlet", urlPatterns={"/hoge"})
public class HogeServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

    /**
     * @see HttpServlet#HttpServlet()
     */
    public HogeServlet() {
        super();
    }

    @Override
    public void init() throws ServletException {
    	super.init();
        getServletContext().setAttribute("CALC", new Calc());
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		request.getRequestDispatcher("/index.jsp").forward(request, response);
	}


}


テンプレート。

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
    	               "http://www.w3.org/TR/html4/loose.dtd">

<html>
  <head>
    	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    	<title>GlassFish JSP Page</title>
  </head>
  <body>
    <h1>1 + 2 = ${CALC.add(1 , 2)}</h1>
  </body>
</html>


実行。
http://shin.cside.com/diary/2009/0924-09.png

ちなみにログに表示されるデプロイ時間。Glassfish V3あいかわらずちょっぱやですな。

情報: DOL Loading time32
情報: Loading application jee6test at /jee6test
情報: Deployment of jee6test done is 141 ms

情報: DOL Loading time47
情報: Loading application jee6test at /jee6test
情報: Deployment of jee6test done is 203 ms

あとヘルプメニューにドキュメントが追加されていて便利だ。
http://shin.cside.com/diary/2009/0924-10.png

今回Java EE 6の新機能ELメソッドを使ってみたが、これは早いうちから触ることをお勧めする。いろんな面白い使い方ができると思う。

ついでにEJB 3.1 lite

計算のロジックをEJBにしてみる。

まずはEJBアノテーションがついただけ。

package bean;

import javax.ejb.Singleton;

@Singleton
public class Calc {
	public int add(int a,int b){
		return a + b;
	}
}

サーブレットアノテーションで注入している。

package servlet;

import java.io.IOException;

import javax.ejb.EJB;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.annotation.WebServlet;

import bean.Calc;

/**
 * Servlet implementation class HogeServlet
 */
@WebServlet(name="HogeServlet", urlPatterns={"/hoge"})
public class HogeServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	@EJB
	private Calc calc;

    /**
     * @see HttpServlet#HttpServlet()
     */
    public HogeServlet() {
        super();
    }

    @Override
    public void init() throws ServletException {
    	super.init();
		getServletContext().setAttribute("CALC", calc);
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {


		request.getRequestDispatcher("/index.jsp").forward(request, response);
	}

}

ログを見てみると

情報: DOL Loading time47
情報: Portable JNDI names for EJB Calc : [java:global/jee6test/Calc, java:global/jee6test/Calc!bean.Calc]
情報: Loading application jee6test at /jee6test
情報: Deployment of jee6test done is 203 ms

JNDIとしてEJBが自動で登録されているのがわかる。したがって

Calc calc = InitialContext.doLookup("java:global/jee6test/Calc");

のように名前での取得もできるということ。

また、liteとはいえEJBなのでAOPの設定も何もせずともデータベースアクセスをすると自動的にトランザクションが開始され、例外がなければコミットされる。EJB内に

@Resource
DataSource ds;

もしくは

@PersistenceContext
EntityManager em;

などと書いて利用するだけでよい。

今回はELから呼び出せるようにトリッキーにシングルトンにしたが、HTTPセッションのかわりにStatefulなセッションビーンを利用したり、ビジネスロジックにはStatelessセッションビーンを使うとよいだろう。

IDEAでJava EE 6の触り方はid:masanobuimaiにきくとよい。