Sun ONEって何だ!に戻る

Sun ONE Studio 4Enterprise Editionも試し尽くせ!

/主キーを自動生成するEntity Bean "CdList"/BMP Entity Bean "TestOne"/J2EE名無しサーバでMySQL接続を管理する/パッケージなしのJ2EEアプリの作り方/まずはお決まりのStateless Session Bean /


主キーを自動生成するEntity Bean "CdList"

「Entity Beanで使うテーブルには主キーが必ず必要」・・・これは実は結構めんどくさい問題だ。新しい値を挿入するたびに重複しないような主キーを考えなければならないというのは・・・
もっとも簡単そうな解決法としては主キーを番号にすることだが,えーといくつまで入れたっけ,などと考えるのはもちろんアホくさい。アプリケーションでこれまでの最大の番号を探し出し,それに1加えて新しい番号を自動生成してもらわなきゃ話にならん。
だがそれにはどんなメソッドをどこに定義すればよいのか?のに子アタマには結構難問だが,「J2EEチュートリアル」のお手本にならってなんとか作ってみた。

まずidの型。StringまたはIntegerが普通のようだが,他の値がStringなのでひとつだけIntegerを混ぜるとプログラムが混乱しそうだったのでStringにした。id値の比較だの足し算だのは一度parseIntをかましてやればいいんだし。

メソッド自体は,
リモートホームインターフェイスCdListHomeに「setNewId」という名前で定義。
そのために,CdListHomeにもうひとつ「findAll」という全検索メソッドを定義。
それを,CdListBean上では「ejbHomeSetNewId」,「ejbFindAll」という名前で実装する。この名前のつけかたはそれぞれお約束なんだそうだ。
ejbHomeSetNewIdメソッドはfindAllメソッドを使って全レコードを検索し,idの最大値を求め,それに1加える形で新しいidを設定する。
findAllメソッドは,クライアントに全レコードを表示させるためにも用いる。

さて,データベースの内容は今度はCDのリストということにした。id, title, artistがその値である。
クライアントは今度はサーブレットにした。それも二つである。
ひとつは,アーティスト名を入力して送信すると,そのアーティストのCDを抽出して表示するもの。

アーティスト名「Angra」で抽出したところ。

もうひとつは,新しいアーティスト名とタイトル名を入力して送信すると,新しいidが自動生成されてテーブルに挿入されるというものだ。

新しいID=8が自動生成された様子。

コードは別ページに示す。今度はまじめにパッケージ属性を持たせた。

さて,EE上でのアプリケーションの作り方だ。EJBモジュールはTestOneでやったのと全く変わらない。
加えて今度はWebモジュールを作る・・・だが今回またヘンなことになった。久しぶりにやったんで忘れてたのだが・・・。
まず,EEではWebモジュール用のフォルダを個別に作って,そいつをマウントする必要がある。ffjuseree/sampledir/mybmpwebというフォルダを作っておく。
そして「新規作成」->「Webモジュール」とやり,ffjuseree/sampledir/mybmpwebフォルダを指定する。これでマウントされる。
マウントとともに生成したWEB-INFフォルダの下に/classes/mybmp/webとパッケージ用のフォルダも作成。
だがその次に,今マウントしたこのフォルダを選択して「新規作成」->「JSP&サーブレット」->「サーブレット」と指定すると・・・

なんかウィザードがすごくそっけないものになっている。ちなみにこのまま作ろうと無駄な抵抗をすると結局「サーブレットは生成できません」で終わる。なーんーでー?とかなり青まったが,

プルダウンメニューの「ファイル」から「新規作成」しなきゃいけなかったんだヨ

いや,なんでなんだろーね。その区別の必要性は全く感じられないんだが!とにかくようやくなつかしい設定画面に会えたので,サーブレットURLを「/CdListServlet」とする。同様に「InputCdList」サーブレットも作成する。Webモジュールをアプリケーションに組み込むのもSessionBeanの場合と全く同様。

さてこいつを実行するのに・・・ホントはWelcomeページなど作成すればいいんだろうね。今は簡単に,生成したアプリケーションのノードを右クリックして「実行」とやる。

焦っちゃいけません。前述の通りWelcomeページがないのがいかんのデス。 /cdlist/のあとにサーブレット名CdListServlet,あるいはInputCdListを付け足してやります。すると上記のようなサーブレットが起動するというわけ。

いや,なんかBMPはかなりイケそうな感じだぞ!でもきっと世の中CMPなんだろうな!この次はそれをやらなければならないんだろうな!え

2003年06月01日

ページ先頭に戻る


BMP Entity Bean "TestOne"

さて初めての俺Entity Beanだゾ。まずMySQLのtestデータベースにtestoneというテーブルを作る。
中身は,他のデータベース学習でもやったことあるような内容だが,idと車のメーカーと車名,というものだ。
idが主キーである。Entity Beanで使うにはテーブルには主キーが必ず必要なのだ。
とにかくできるかどーかおぼつかない状態なので,クライアントアプリケーションからアクセスすることにした。

コードをこちらに示す。

さて,EE上でアプリケーションを作るやり方はセッションBeanのときとほとんど変わりない。
「新規作成」で「J2EE」->「BMPエンティティBean」を選ぶ。
するとEJBに関する情報を入力する画面になる。デフォルトは「ローカルインターフェイスのみ」をことになっている。わたしが勉強した「J2EEチュートリアル」では,BMPのサンプルはリモートインターフェイスのみだった。そこで「リモートインターフェイスのみ」にチェックを直した。
「パッケージの選択」では,デフォルトは「ファイルシステムのルート」となっている。今回のようにパッケージ属性を与えない場合はこれでよしよしという感じだ。「ブラウズ」ボタンでファイルシステムのリストを出して,作ってマウントしておいた$HOME/j2eenoniko/testoneフォルダを選べばいい。
「EJB名」を「TestOne」と指定することにより,TestOne.java, TestOneHome.java, TestOneBean.javaファイルが生成されるので,中身を埋めてやって,コンパイルする。

データベース参照を指定するには,エクスプローラ[ファイルシステム]の
TestOne.ejbdd(EJB)
ノードをつついて「プロパティ」を出し,セッションBeanのクライアントからEJB参照をやったのと同じような編集をする。

「参照」の「名前」にプログラム中に書いた「jdbc/TestOneDB」,「J2EE RI」の「JNDI名」に,サーバのresource.propertiesに書いた「jdbc/MySQL」を書く。

クライアントアプリケーションについてもセッションBeanと全く同様。実行すると,

上部にあるのは一回目失敗したときの残りです。はずかしー。だがその下のほうにNissanな車のリストが出ている。クライアントアプリケーション上でcreateすべくコーディングしたSilviaもちゃんと出てきている。

2003年06月01日

ページ先頭に戻る


J2EE名無しサーバでMySQL接続を管理する

「J2EE1.3リファレンス実装」などと呼ばれている,J2EE1.3SDKに組み込まれているあのサーバ。うっかり落としてしまったSun ONE Application Server 7抜きのSun ONE Studio Enterprise Editionは,まあクリープを入れないコーヒーのようなものだが,デフォルトのサーバとしてはそれがついている。これにはCloudscape4がついていて今まではそれを使っていた。だがやはりMySQLも使えるようになりたい。それには

(1)j2sdk1.3.1/config/resource.properties
に以下の内容を付け加える。

jdbcDataSource.5.name=jdbc/MySQL
jdbcDataSource.5.url=jdbc:mysql://localhost/test?useUnicode=true&characterEncoding=EUC_JP
jdbcDriver.5.name=com.mysql.jdbc.Driver

(2)j2sdk1.3.1/lib/system
にMySQLのJDBCドライバをコピーする。

このディレクトリj2sdk1.3.1というのは,個人フォルダffjuser40eeの下にも,Sun ONE Studio EEインストールディレクトリの下にもある。念のためどっちにも同様の変更をしてしまった。どっちかは変更しなくていいのかどうかは確かめていない。とにかく,これで,リソース参照のJNDI名を「jdbc/MySQL」にすれば,MySQLのデータベースtestに接続できるようになった。もちろん,今までのJ2EE SDKでも全く同じことである。

2003年06月01日

ページ先頭に戻る


パッケージなしのJ2EEアプリの作り方

ところで「J2EEチュートリアル」などでは,簡単なEJBなどではわざわざパッケージ属性をつけないようだ。今度初めて俺EntityBeanを作るぞと決意したとき,このパッケージというヤツが結構めんどくさくてやだなと思った。そこでパッケージ属性のないアプリを作りたいと考えた。だがデフォルトパッケージであるffjuse40ree/sampledir中にはもういくつかパッケージフォルダができているのでそのルートにEJBなどを散らかすわけにはいかない。
そこでいつもj2ee関係で使っているフォルダ$HOME/j2eenonikoの下にtestoneというフォルダを作った。
そしてまずEE上でこの$HOME/j2eenoniko/testoneフォルダをマウントした。
これで$HOME/j2eenoniko/testそのものがデフォルトパッケージになり,この下に作ったクラスファイルはパッケージ属性をつけられずにすむ。前のようにejb,clientというパッケージ分離もやめ,

TestOne
TestOneHome
TestOneBean
TestOneClient

というクラスを一緒にそこに作ってしまった。なんつーかいろんなクラス指定が簡単にできるからである。
ま,ちょっとしたことなんだが・・・・

2003年06月01日

ページ先頭に戻る


まずはお決まりのStateless Session Bean

まず、
ffjuser40ee/sampledir/test/ejb
ffjuser40ee/sampledir/test/client

というフォルダを作っておく。
アプリケーションの編集画面の「エクスプローラ[ファイルシステム]」上で、今作ったtestフォルダを右クリックすると「新規・・・」というメニューになる。リストから「J2EE」->「セッションEJB」を選ぶ。

「セッションBean名とプロパティ」という画面になるので、
「EJB名」を「SayOnceMore」
「パッケージ」はtest.ejbを選ぶ。
「状態」は「ステートレス」がデフォルトだからオッケー。
ほれ、「トランザクション管理」はやっぱり「コンテナ」がデフォルトになってる。いっけど。
「コンポーネントインターフェイス」は「リモート」でオッケー。

「次へ」進むと、各インターフェイスやBeanの名前の確認になる。まあ、普通通りの値に設定されている。
「完了」を押すと、ひな形ファイルが作成されている。さっき作ったソースファイルの中身を、みんな流し込んでしまおう。

そうしたら、ひとつひとつのファイルについて、メニューで「構築」->「コンパイル」を選び、コンパイルしてやる。

そろったら、「エクスプローラ[ファイルシステム]」を見ると、SayOnceMore.ejbdd(EJB)というものができている。これを右クリックして「新規EJBモジュールを作成」を選ぶ。

モジュールの名前と、パッケージ(デフォルトはtest.ejb)を選択する画面になるが、提案通り受け容れよう。

これでEJBモジュールができたことになるが、このプロパティはいつでも設定できる。今回は、JNDI名の設定をしてやらなければならない。上のメニューの「プロパティ」を選ぶ。

タブ「参照」については、今回EJB自体はなんら参照を行わない。「J2EE RI」タブをクリックすると、「JNDI名」欄に「SayOnceMore」と入力されている。
Application Serverでは「sayoncemore」でしたね。この欄はクリックすれば編集できるので直してもいいんだが、まいっしょ。

さて、アプリケーションクライアントだが、こっちではその前に、「アプリケーション」を作成することが必要のようだ。「test」フォルダを右クリックして「新規」->「J2EE」->「アプリケーション」を選ぶ。「オブジェクト名」を選択させられるが、つまりはSayOnceMoreAppと入力すればよい。

すると、三角野郎の後ろ姿かこれは!?みたいなアイコンがまた現れる。こいつを右クリックして「モジュールを追加」を選ぶ。図は間違って「コピー」をつついてしまったところだ。追加するモジュールを選ぶことになる。さっき作成したモジュールを選ぶ。他に候補が出てこないので選びやすい。

「無効なJAR」ってのがちょっとはずかしいけど。こうしておいて、クライアントアプリケーションを作るのだが、まずはただのクラスファイルを作る。「test.client」パッケージを選択して、SayOnceMoreClientクラスをフツーに作って、AS用に作ってあったソースファイルの中身を同様に流し込む。
そしてコンパイル。

そうしておいてから、「クライアントアプリケーション」を新規作成する。
「名前」と「パッケージ名」の入力を求められるので、パッケージ名はejb.client, 名前は「SayOnceMoreAppClient」とする。これは、SayOnceMoreAppClient.jarを生成するための名前だと思う。
すると、clientフォルダのところに、やはり三角野郎の尻のようなアイコンができる。これを右クリックする。

「主クラスを設定」を選び、SayOnceMoreClient.javaを指定する。

次に、同メニューから「プロパティ」を選ぶ。今度は「参照」タブをつつく。

デフォルトでは「EJB参照なし」になっている。このセルをつつくと、カスタマイザ起動のための「...」ボタンが横に現れる。
それをつつくとEJB参照のプロパティエディタになる。最初の画面はごく殺風景な物だ。
だが「追加」ボタンを押すとさらにその詳細入力画面になる。これもほとんどが空欄だ。
参照名にejb/SayOnceMoreと、クライアントプログラム中に記述した参照名を書く。
だが参照EJB名なんてロクに覚えちゃいねーよ!と言いたいところだが、ブラウズ画面で探せるのだ。先に作っておいたejbモジュールを指定。
他に選択肢がないので、どれを選択すればいいかはすぐわかる。

グラフィカルな選択により、あっという間に他の空欄が埋まる。
JNDI名の指定は、今入力している「標準」タブの隣の「J2EERI」タブをつつく。
「JNDI名」という入力欄がひとつだけあるので、そこにさっきEJBモジュールのほうで指定してあるSayOnceMoreを入力する。
「了解」で設定完了だ。

そしたら、さっきの「アプリケーション」に、同じ要領で「モジュールを追加」する。今度はクライアントモジュールが追加候補に挙がっている。

これで配備の準備ができたが、ひとつやらなければならないことがある。このままでは「サーバのインスタンスが作成されていません」とかなんとか、かなり激しく怒られるのだ。

Sun ONE Studio EEは、やはりAppication Serverに接続するためのものなのだろう。デフォルトサーバというものが設定されていない。一応親切でバンドルしてある(のか)J2EE SDKサーバをデフォルトに指定するのは手動でやらなければならないのだ。

「エクスプローラ[実行時]」ウィンドウを開く。「サーバーレジストリ」ノードを開くと、ほらJ2EEのサーバはデフォルトなしとなっている。「インストールされているサーバー」の、さらに「R1インスタンス1」ってヤツを「デフォルトに設定」する。

そうして、「エクスプローラ[ファイルシステム]」にもどり、あの三角野郎のケツのような「SayOnceMoreApp」を右クリック。
一番てっとり早いのは「実行」を選ぶことだ。ゴー!

「進捗モニター」ってヤツが現れて、かなーり長い時間かかる。だが一番時間かかるのはサーバ起動のためみたいだ。
待っていると、隅っこのほうにログイン画面が現れるので、名前guest、パスワードguest123と入力する。
すると下の出力ウィンドウ「SayOnceMoreAppClientの実行」 タブのウィンドウに結果が出力されるというわけなのだー。

さて、ではWebクライアントも作ってみよう・・・というのだが、これが案外、めんどっちかったぞ。

まず、 Webモジュールのためのフォルダを作らなければならない。そしてこれを「新規作成」->「Webモジュール」としてマウントする。
ここでは、ffj40useree/sampledir/testwebというフォルダを作った。
Webモジュールとしてマウントすると、例によって自動的にWEB-INFフォルダやweb.xmlファイルが生成される。
例のindex.jspをtestwebフォルダ直下に作る。

で、こいつをアプリケーションSayOnceMoreAppに追加すればいいのだが、「追加モジュールの選択」画面では、testwebフォルダを選んでも何もしてもらえない。

testwebフォルダのノードをつついて、下にあるWEB-INFを選ばなければならないのだ。

すると、「testweb」という名前の、いかにもWebモジュール風のアイコンが、ようやくアプリケーションノードの下に、EJBモジュールやクライアントアプリケーションと同列に追加される。

次はEJB参照などの設定だ。これも一筋縄ではいかなかった。
というのも、今追加したモジュールのアイコンからプロパティを選んでも、出てくるEJB参照のプロパティは、上書き?値を上書き?よくわからない。

ではソースモジュールの「WEB-INF」ノードは?・・・プロパティにはEJB関係の項目が現れない。
正解は、「WEB-INF」ノードをさらに開いた「web.xml」ノードだった!

最後。「コンテキストルート」は」?・・・これはアプリケーションに追加されたtestwebモジュールのプロパティだった。

これらの細かい区別は・・・一応「ヘルプ」から探し出せたものではある。だがちょっとわかりにくかったなー。それにしてはこの苦労して設定したWebクライアントの実行は簡単だった。
すなわち、このアプリケーション自体を「実行」とやると、以前はコンソールアプリケーションが立ち上がったものを、今度はJSPが優先して立ち上がるのだ。そりゃ時流はWebクライアントだもの・・・でもそれなら設定の仕方ももすこしわかりやすくしてくれヨSunさんヨ〜と思った。

ページ先頭に戻る