---
title: NetBeans+GlassFishでEJB3.1+Servlet3.0+JPA2.0なJavaEE6アプリを3分で作る
tags: []
categories: ["Programming", "Java", "JavaEE6"]
date: 2011-09-25T13:35:52Z
updated: 2011-09-25T13:35:52Z
---

いままでIDEはEclipseしか使ったことなかったんですが、NetBeansを使ってみたらJavaEE6との親和性の高さにびつくりでした。

今回はJavaEE6のうちのEJB3.1、Servlet3.0、JPAを使った簡単なアプリを超速で作成してみます。（JSFとかCDIとか他の要素技術のと親和性も高いですよ!）

### インストール

NetBeansは[こちら][1]からダウンロードしてください(JavaEE版かすべて版を選んでください)。GlassFishは同梱されています。インストーラを実行してデフォルトのまま進んで行ってください。
(インストール時間は3分に含みませんｗ)

### Webアプリケーションプロジェクト作成

「ファイル」→「新規プロジェクト」→「Java Web」→「Webアプリケーション」と選択していってください。

プロジェクト名はとりあえず「HelloJavaEE6」にして次へ。デフォルト(サーバーはGlassFish Server3.1になっているはず)のまま完了。

↓こんな画面になっているはず
<a href="/api/v1/files/00033/hellojavaee1.png"><img src="/api/v1/files/00033/hellojavaee1.png" width="100%"></a>

プロジェクト名を右クリックして「実行」を押せばGlassFishが起動してアプリケーションがデプロイされます。

http://localhost:8080/HelloJavaEE6/

にアクセスすれば（多分勝手にブラウザが立ち上がる）

<img src="/api/v1/files/00034/hellojavaee2.png">

が表示されます。

### JPAエンティティ作成

今回のアプリを作るためにDBサーバーは必要ありません。組み込みのJavaDB(Apache Derby)を使うからです。DDLやサンプルデータも必要ありません。**NetBeansに最初からサンプルDBが用意されているからです**。

プロジェクト名を右クリックして「新規」→「データベースからのエンティティークラス」を選んで、データソースに「jdbc/sample」を選んでください。↓のようにサンプルテーブルが表示されます。

<a href="/api/v1/files/00035/hellojavaee3.png"><img src="/api/v1/files/00035/hellojavaee3.png" width="100%"></a>

「全てを追加」を選らんで、「次へ」。パッケージ名に「hellojavaee6.entites」を入力して「完了」。

サンプルDBからリバースエンジニアリングでJPAのエンティティクラスが自動生成されます。

<img src="/api/v1/files/00036/hellojavaee4.png">

### EJB作成

作成されたJPAエンティティを使って、DBをたたくEJBを作ります。

「ソースパッケージ」を右クリックして「新規」→「セッションBean」を選び、EJB名は「HelloSessionBean」、パッケージ名は「hellojavaee6.ejb」にして完了。

生成されたファイルを開いて

    package hellojavaee6.ejb;
    
    import hellojavaee6.entities.Customer;
    import java.util.List;
    import javax.ejb.Stateless;
    import javax.ejb.LocalBean;
    import javax.persistence.EntityManager;
    import javax.persistence.PersistenceContext;

    @Stateless
    @LocalBean
    public class HelloSessionBean {
        @PersistenceContext
        EntityManager em;

        public List<Customer> findAllCustomers() {
            return em.createNamedQuery("Customer.findAll").getResultList();
        }
    }

を実装。インポートは右クリックで「インポートを修正」とすれば勝手にいれてくれます。

このメソッドで`Customer`クラスについている

    @NamedQuery(name = "Customer.findAll", query = "SELECT c FROM Customer c")

に相当するSQLをたたきます。

#### EJBをたたくサーブレット作成

「ソースパッケージ」を右クリックして「新規」→「サーブレット」を選び、サーブレット名は「HelloServlet」、パッケージ名は「hellojavaee6.servlet」にして完了。

生成されたファイルを開いて以下を実装。ほとんどひな形のままで、tryの中をちょっと変えるだけです。

    package hellojavaee6.servlet;
    
    import hellojavaee6.ejb.HelloSessionBean;
    import hellojavaee6.entities.Customer;
    import java.io.IOException;
    import java.io.PrintWriter;
    import javax.ejb.EJB;
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    @WebServlet(name = "HelloServlet", urlPatterns = {"/HelloServlet"})
    public class HelloServlet extends HttpServlet {
    
        @EJB HelloSessionBean ejb; // さっき作ったEJBをインジェクション
        
        protected void processRequest(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            response.setContentType("text/html;charset=UTF-8");
            PrintWriter out = response.getWriter();
            try {
    
                out.println("<html>");
                out.println("<head>");
                out.println("<title>Servlet HelloServlet</title>");  
                out.println("</head>");
                out.println("<body>");
                out.println("<h1>Servlet HelloServlet at " + request.getContextPath () + "</h1>");
                
                // ここから追加
                out.println("<ul>");
                for (Customer c : ejb.findAllCustomers()) {
                    out.printf("<li>%s = %s</li>%n", c.getCustomerId() , c.getName());
                }
                out.println("</ul>");
                // ここまで
                
                out.println("</body>");
                out.println("</html>");
                 
            } finally {            
                out.close();
            }
        }
        
        // 以下略
    }

Servlet3.0です！web.xmlはいりません。
追加するのはEJBのインジェクションとEJBの実行だけです。

`HelloServlet.java`を右クリックして「ファイルを実行」をクリックすれば

<a href="/api/v1/files/00037/hellojavaee5.png"><img src="/api/v1/files/00037/hellojavaee5.png" width="100%"></a>

できた＼(^o^)／
自動で立ち上がらなかったらブラウザの設定がうまくいっていないかもです。「http://localhost:8080/HelloJavaEE6/HelloServlet」に直接アクセスしてください。

<hr>

3分でできましたか？ｗ簡単じゃありませんでしたか？DBを用意する手間が省けたのは大きいです。

3分用にかなり簡略化したアプリですが、とっつきに成功すればサクサク拡張していけると思います。

JavaEEとかEJBと聞くと重々しいイメージがありましたが、NetBeansのおかげでそのイメージは自分の中では払拭されました。他の機能を使う例も今後取り扱おうかなと。


<a href="http://www.amazon.co.jp/Beginning-Java-Platform-Glassfish-Professional/dp/143022889X%3FSubscriptionId%3DAKIAJGZ7MSORH7HQ4FJA%26tag%3Dikam-22%26linkCode%3Dsp1%26camp%3D2025%26creative%3D165953%26creativeASIN%3D143022889X"><img src="http://ecx.images-amazon.com/images/I/51baRLwlufL._SL160_.jpg"></a>
<a href="http://www.amazon.co.jp/Enterprise-JavaBeans-3-1-Andrew-Rubinger/dp/4873115086%3FSubscriptionId%3DAKIAJGZ7MSORH7HQ4FJA%26tag%3Dikam-22%26linkCode%3Dsp1%26camp%3D2025%26creative%3D165953%26creativeASIN%3D4873115086"><img src="http://ecx.images-amazon.com/images/I/51VHA70KMzL._SL160_.jpg"></a>


  [1]: http://netbeans.org/downloads/index.html?pagelang=ja
