MENU

J2EE環境構築編

J2EE体験編

J2EE体験編
CMPを体験する

環境が一式揃ったので、試しに何かやってみましょう。
EJBにはSession Bean、Entity Bean、Message Driven Beanがあって、SessionにはStatelessとStatefulが、EntityにはBean Managed PersistenceとContainer Managed Persistenceが、Message DrivenにQueueとTopicがあります。
この中で、簡単にデータベースへのアクセスを実現する、Container Managed Persistenceを最初に体験してみましょう。
以下ではeclipse、lomboz、jboss、mysqlをインストールしてあることを前提として説明するので、構築編を参考にするか、御自身の環境に応じて読みかえるかしてください。

手順

事前準備
新規プロジェクトの追加
EJBの追加
モジュールへEJBを追加
classを作成
jspの作成
deploy

事前準備

あらかじめMySQLにテーブルを作成して、いくつかのデータをいれておきます。
CMPの場合、テーブルがなければ勝手に作ってくれますが、データがinsertされていることを確認しておきたいので、あらかじめ作成しておきます。

mysql -u root -p
Enter password:********
create database jbossdb;
use jbossdb;
create table user (id int primary key auto_increment,name varchar);
insert into user(name) values('myname');

これで追加されました。

select * from user;

で、1とmynameが表示されれば成功しています。何も表示されない場合はどこかで失敗しています。
さしあたりの目標はこの「1」と「myname」をブラウザに表示させることです。

プロジェクトの追加

メニューの「ファイル」から「新規」へたどって、「Lomboz J2EE Project」を選びます。
パッケージエクスプローラ上で右クリックしてもよいでしょう。
ダイアログに適当なプロジェクト名を入力します。
ここでは「Test1」としておきます。
入力すれば「次へ」をクリックできるようになるので、次のページへ移動します。

次のページではいろいろ設定できるのですが、さしあたりデフォルトで問題ありません。
「次へ」をクリックして次のページへ移動します。

最後のページはモジュールの設定です。後から追加することも出来るのですが、ここで追加しておくのが楽で良いでしょう。
それぞれのタブで「add」を押して、モジュール名を決めます。
ここでも「test1web」「test1ejb」としておきます。Target ServersではJBoss 3.2.xを選びます。
「終了」をクリックすればパッケージエクスプローラ上にTest1プロジェクトが現れ、その中にtest1webとtest1ejbが追加されているはずです。

EJBの追加

EJBを追加します。
追加にあたってはソースパッケージを作成しておくのが良いらしいので、srcの下にパッケージを作成します。
パッケージエクスプローラ上のsrcを右クリックして、「新規」「パッケージ」を選びます。「名前」欄に適当な名前を入力して「終了」を押します。ここも「test1」としておきます。ソースはこのパッケージに追加していくことになります。

作成したパッケージを右クリックして「Lomboz J2EE...」(下の方にあります)「Add New EJB」をクリックすると、EJBを追加するダイアログが表示されます。
ここは「Test1」という名前を入力して、Container Managed Entity EJBを選びます。すると「次へ」をクリックできるようになるので、クリックして次のページへ移動します。

次のページはデータベースとの連携に関する設定です。
一番上の欄は任意の名前を記入することが出来ますが、あとあとの識別のために、table名と同じ「user」にしておきます。
次の欄はMySQLに作成したtableの名前です。事前準備で「user」というtableを作成したので、「user」とします。
その次のDataSourceとは何だろうと思う向きも多いでしょうが、ここは騙されたと思って「java:/MySqlDS」とします。
次の4つの欄には、上から「id」「java.lang.Integer」「id」「int」を記入して「add」を押します。下の欄に追加されるので、Make Primary Keyを押します。
同じ様に「name」「java.lang.String」「name」「varchar」と入力して「add」を押したら、「終了」を押します。

これでsrcの下にTest1Bean.javaが追加されます。

これだけだと、デプロイ時にエラーになるので、getName()の上にある

sql-type=varchar

>sql-type=varchar(256)

に書き換えます。
この部分を書き忘れていました。
大変失礼しました。

モジュールへEJBを追加

作成されたTest1Bean.javaを右クリックして「Lomboz J2EE...」「Add EJB to module...」をクリックします。
ダイアログが表示されるので、チェックをいれて追加します。同じ名前のモジュールが2つ表示されるかも知れませんが、全部選択してしまえば問題ありません。

次に「xdoclet.xml」を書き換えます。
test1ejb/META-INF/xdoclet.xmlというファイルがあるのでそれをダブルクリックしてエディタに表示してください。
下の方に<jbossというエントリがあるので、

datasource="java:/MySqlDS"
datasourcemapping="mySQL"
preferredrelationmapping="foreign-key"

と書き換えて下さい。

classを作成

test1ejbを右クリックして「Lomboz J2EE...」「Generate EJB Classes」をクリックします。
コンソールにメッセージが流れて、やがてできあがりです。
パッケージエクスプローラのejbsrc以下にできあがったソースが収まっています。
lombozの基本的な使いかたでは、ここに生成されるソースを修正する必要はありません。というより、クラスを生成するたびにejbsrc以下のソースは書き換えられてしまうので、ここを手動で書き換えるというのは余程のことでなければしないほうが良いでしょう。

jspの作成

データベースへ接続してデータを取得するjspを作成します。
パッケージエクスプローラのtest1webを右クリックして「新規」「Lomboz JSP Wizard」をクリックします。

名前は「show」とでもしておきましょう。拡張子はwizardが勝手につけてくれますが、自分でつけておいても二重に拡張子がつけられてしまうことはありません。
名前を入力すると「次へ」をクリックできるようになりますが、次のページで設定すべきことはないので、「終了」をクリックします。

以下には私が作成したjspを載せておきます。何をやっているか、ejbsrc以下に生成されるソースと突き合わせながら読んでみると、J2EEの基本が分かると思います。

<%@ page language="java" pageEncoding="EUC-JP" %>
<!DOCTYPE HTML PUBLIC "-//w3c//dtd html 4.0 transitional//en">
<html>
<head>
<title>Lomboz JSP</title>
</head>
<body bgcolor="#FFFFFF">
<%@ page import="test1.*" %>
<%@ page import="java.util.*"%>
<%@ page import="javax.ejb.*"%>

<%
	Collection cl=Test1Util.getHome().findAll();

	Iterator cli=cl.iterator();

	while(cli.hasNext()){
		Test1 t1=(Test1)cli.next();
		out.println(t1.getId());
		out.println(t1.getName());
		cli.remove();
%>
<br>
<%
	}
%>
</body>
</html>

deploy

パッケージエクスプローラ上のtest1ejbを右クリックして「Lomboz J2EE..」「Deploy Module」を選びましょう。コンソールにいろいろ表示されて、やがてできあがります。

同様に、test1webもdeployしましょう。

既にjbossを起動している場合には、deployに関するログが表示されるはずです。まだ起動していない場合には、test1webかtest1ejbを右クリックして、「Run Server」を選びましょう。

問題がなければhttp://localhost:8080/test1web/show.jspをブラウザで見てみましょう。
エラーが出たらどこかに間違いがあります。ログやトレースバックを眺めて原因を探して、修正しましょう。
チェックポイントは

MySQLのJDBC-Connectorをきちんと配置しているか
$JBOSS_ROOT/server/default/deploy/mysql-ds.xmlのホスト名、ユーザ名、パスワードはMySQLの設定と合致しているか
jbossのディレクトリは正しく設定されているか(メニューの「ウィンドウ」「設定」の中の「Lomboz」「Server Definitons」の設定は正しいか)

等です。これらは私がはまったことがらです。

ちょっとだけJ2EEの仕組み

最後にちょっとだけJ2EEの仕組みを説明しておきます。
最初にHome interfaceを取得し、Home interfaceを通じてRemote interfaceを取得し、Remote interfaceを通じてデータをやりとりします。
非常に簡単に言ってしまえば、これだけです。細かいことはいろいろありますが、まずはこの仕組みを理解しておけば良いでしょう。