Java EE 6の勉強を始めるならばNetBeans 6.8開発版を使うのが今のところ手っ取り早い。が、Eclipseでもプラグインを入れれば可能だ。Eclipse 3.4以降ならば以下の方法でいける。
セットアップ
メニューから「ヘルプ」−「ソフトウェア更新」を選択。「使用可能なソフトウェア」タブを選択し、「サイトの追加」でURL「https://ajax.dev.java.net/eclipse」を追加し、リフレッシュする。Glassfishにチェックをつけてインストールだ。
サーバーの追加でGlassfishが選べるようになっているのでGlassfish V3(Java EE 6リファレンス実装)を選択。
Glassfish V3があるパスを入力。注意したいのがこのパス直下はインストーラ等が利用していてその中のglassfishフォルダを選ぶこと。NetBeansはこのへんも考慮してくれるのでEclipseプラグインもやってくれるといいんだけどなぁ。
ウィザードが終わるとGlassfish V3が追加される。メニューもいくつかある。
WTP自体はJava EE 6対応してないので3.0は選択できないようだ。
新規作成のウィザードにGlassfishカテゴリが追加されている。サーブレットとEJB、JDBCリソースは作成できるようになっているようだ。
サーブレットをウィザードに従って作成。URLはどこ二マッピングされるかわかりやすいようにかえてある。
このウィザードで生成されるコードは以下の通り。
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>
ちなみにログに表示されるデプロイ時間。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
今回Java EE 6の新機能ELメソッドを使ってみたが、これは早いうちから触ることをお勧めする。いろんな面白い使い方ができると思う。
ついでにEJB 3.1 lite
計算のロジックを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にきくとよい。