kagamihogeの日記

kagamihogeの日記です。

GlassFish 4さわる

EclipseからGlassFishを起動して、ServletEJBが動くとこまでやる。

やったこと

Eclipseからglassfish起動する

まず、ServersビューからGlassFishサーバを追加できるようにするために、GlassFish Toolsプラグインをインストールする。Help -> Eclipse Marketplaceを選択して、glassfishとかで検索する。そのあと、使ってるEclipseのバージョンに合わせたプラグインをインストールする。ここではKeplerなので、for Keplerを選ぶ。

Serversビューから新しいServer設定を追加する。今回は4.0を使うので、そちらを選ぶ。

GlassFish Server Directoryには%GLASSFISH_ROOT%\glassfishを指定する。

ここはそのまんま。

これで起動させて、http://localhost:8080/ で初期ページが見れたり、http://localhost:4848 で管理コンソールが見れたりすればOK

Mavenでプロジェクトを作る

ぐぐってみると、archetypeはとりあえずwebapp-javaee7を使えばいいらしいことが分かる。

で、いま使ってるEclipseのデフォルトではソレが出てこない。ので、まずArchetype Catalogを追加する。やり方はJavaEE7(GlassFish4.0)のEclipse4.3(Kepler)におけるMaven(M2E)連携 | あらぶるトラブル を参考にしました。まず、Window -> Preferences -> Maven -> Archtypes を選ぶ。

Add Remote Catalogを押して、Catalog Fileに http://repo1.maven.org/maven2/archetype-catalog.xml と入力して、Vefiryを押す。

準備できたのでNew -> Maven Projectからプロジェクトを作っていく。Select an Archtypeでwebapp-javaee7を選ぶ。

テキトーに入力する。

プロジェクトを作成し終わると、下記のようなエラーが出る。

Plugin execution not covered by lifecycle configuration: org.apache.maven.plugins:maven-dependency-plugin:2.6:copy (execution: default, phase: validate)

JavaEE7(GlassFish4.0)のEclipse4.3(Kepler)におけるMaven(M2E)連携 | あらぶるトラブルによるとPermanently mark goal copy in pom.xml as ignored in Eclipse build.のクイックフィックスを選べば良い、とのこと。

プロジェクトの構成はこんな感じ。TestServletは俺が追加したものだけど。

Servletうごかす

環境が出来たので、とりあえずはServletを作ってみる。

package glassfish4test;

import java.io.IOException;

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("/hoge")
public class TestServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        resp.getWriter().write("hoge get");
    }
}

http://localhost:8080/glassfish4test/hoge でブラウザにhoge getと表示されればOK

EJBうごかす

このServletからEJBを呼んでみる。

Wizardがあるのでそっから作る。New -> EJBでSession Beanを選ぶ。

State typeはStatelessにしておく。

ここはそのまんま。

で、クラスが生成されるので、そこにいっこ適当なメソッドを追加する。

package glassfish4test;

import java.util.Calendar;

import javax.ejb.LocalBean;
import javax.ejb.Stateless;

/**
 * Session Bean implementation class TestEJB
 */
@Stateless
@LocalBean
public class TestEJB {

    /**
     * Default constructor. 
     */
    public TestEJB() {
        // TODO Auto-generated constructor stub
    }
    
    public String getHogeMessage() {
        return Calendar.getInstance().getTime() + " hoge";
    }
}

さっき作ったServletをちょっと修正する。TestEJBをDIされるようにして、doGetの中でEJBのメソッドを呼ぶようにする。

@WebServlet("/hoge")
public class TestServlet extends HttpServlet {
    
    @Inject
    private TestEJB testEJB;
    
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        resp.getWriter().write("hoge get:" + testEJB.getHogeMessage());
    }
}

これでブラウザから http://localhost:8080/glassfish4test/hoge にアクセスして適当な文字列が表示されればOK