バフンウニとは、かのオライリー出版のJ2EEの本の表紙をイメージしたもの(実はバフンじゃなかったんだヨ!)。うちにはオライリーの「ワニ本」があるが、ワニとウニは微妙に大きく違う・・・
それはいい。「なんかビジネスっぽいWebアプリの世界だと、サーバはJ2EEだ」と,何がなんだかわからないままに始めたJ2EEの勉強。SunのJ2EE SDKバージョン1.3から始めて、やはり何がなんだかわからないままに勉強しているうちにJ2EEは1.4になり、Java EE5になり、そろそろ6も出るかと言われているのにやっぱりまだわからない。
積み上げ方式なので下段の内容ほど初期のものですが、あまり古くてぬかみそクサ!という話題から順次カットして、同じ目的でより新しい手法のものに変えて上に積み直していくことにします。。
/Webクライアントはちょっとむづかしいかも/簡単すぎてつまんねえ!NetBeansでHelloEJB/NetBeansで再起だ!JavaEE/
/BorlandでJ2EE/Transaction Rollbackエラーは怖くない(ものもある)!/データソースって何だ!/Websphereをまた試してみる/hpアプリケーションサーバを試してみる/商用アプリケーションサーバを試してみる/配備エラーを乗り越えろ!/コンテナ管理Entity Bean(3)配備の仕方/コンテナ管理Entity Bean(2)状況設定/コンテナ管理Entity Bean(1)学習法/Cloudscapeをさらに手なづける/いよいよデータベース接続だ!/ステートフルセッションBean「Cart(のに子の魚屋さん)」/Webコンポーネントを含むステートレスセッションBean/いよいよ俺EJBだッ/RMIの基本/

さあ、ではナルトなどがついてすっかりEoDまったというEJBをやってみよう。お決まりのはじめの一歩、「あなたと呼べばハローと答える〜」のステートレスセッションビーンだ。
NetBeansのメニューから「ファイル」>「新規プロジェクト」を選ぶ。ウィザードが立ち上がってどんなプロジェクトを作るかと聞いてくるので「エンタープライズアプリケーション」を選ぶ。



なんかつまんねぇーなぁー (超わがまま)
さて、すっかりJ2EEの勉強をサボっているうちに、JavaEEが出た。最近ようやくこれを勉強する気になり、java.sun.comからJavaEE SDKを入手してインストールしてみた。
以前は「デプロイツール」というカワイイ配備ツールがついていたんだけど、最近はもうついていない。NetBeansでヤレというらしい。
え〜
なんかつまんないー。だってNetBeansを使えばEJBなんざ[ヘ]のように簡単でアタマ使う必要全然なくて前頭前野真っ白けのけということはJ2EE1.4のときからわかっている。
かくしてJ2EEは1.4になったが、世の中のサーバはまだまだ1.3である。JBuilderのXが出た。思えばわたしはJBuilderのEnterprise版というものを使ったことがなかった。Personal版にあれだけお世話になりながら、これは罪である。そこで試してみることにした。「お揃い」の好きな女コドモとしては、やはりそれならエンプラ・サーバもデータベースもBorland製品で揃えてみたいと思うのも無理もない。というわけで、Borlad
Enterprise ServerとInterbaseを使って、J2EEアプリケーションを作って試してみることにした。
Borland Enterprise Serverの現時点での最新版は6であるが、JBuilderXがデフォルトで用意しているサーバ連携用の環境はひとつ前の5.2.1のようだ。実際6と連携してみようとしたがマイ力量では無理であった。一方5.2.1との連携は気絶モノに簡単だ。ということでひとつお古くて申し訳ないがBESは5.2.1を使わせていただくことにした。Interbaseは最新版の7.1である。詳しくはコチラ。
2004年02月17日
家庭で学習専用にデータベースやアプリケーションをいじっている身には、トランザクション処理を考える必要は全然ない。だから全然勉強してない。ところがそんなわたしの作ったDBアプリをある日実行してみたら「Transaction
Rollbackがアレです」というエラーが出た。「アレだ」というのはつまりその内容もよくわからないということである。
わたしの全く知らない分野だからお手上げかと思ったが、よく調べてみると、根本は別のところにあるらしいというケースがかなり多い。あまり確かではないのだが・・・
SunのJ2EE SDKについてくるCloudscapeやPointBaseは「限定版」であり、その限定とは「アクセス数が1だけ」というものだ。
これをわたしは、「どーせ使ってるのはわたしひとりだから関係ないわホホホ」と思っていた。
だが、それは人間の問題ではなくプロセスの問題であることに近頃ようやく気がついた。つまりアプリケーションは一回の実行で複数回データベースに問い合わせを行うのがまずあたりまえのことであり、その「複数回」のところで引っかかっているのでは?
・conn.close() などの接続を閉じる処理を書き忘れたりしている。
・SQL例外処理のところで、エラーが出てもとにかく接続を閉じるようにコードを書かないと、そのエラーで止まっているところに他の問い合わせ処理が始まってしまい、データベースはそれをログインの重複と見なすのかも?
このように単なるコードミスや、実はSQLエラーが原因なのだが、結果的にトランザクションエラーだけが目立ってビックリする、というのを近頃わかってきた。あわてないのが肝心である。説明がかなり曖昧で申し訳ありませんがそんな感じ~。
2003年07月15日
よし,今度はWebsphereでもEntity Beanだ!それにはまずデータベース接続・・・
と,思った。SunのSDKでは,resource.propertiesファイルに必要事項をご記入の上再起動すればよかった。Websphereの場合は・・・
いろいろ調べた上,サーバについているCloudscape5.0への接続の仕方はなんとかわかった。「データソース」の指定のしかたを試してみたかったので,Entity
Beanを書く前に,もっと簡単な「サーブレットでのデータソース利用」というケースを用いた。
2003年06月03日
IBM WebsphereアプリケーションサーバのV5が出たので,またおためし版をゲットして使ってみた。JSP,サーブレット,EJBを連携させたStateless Session Beanアプリケーションをひとつ作って配備して動かしてみたぞ!くわしくはコチラ!
2003年05月31日
そのうちにダソナがHPのアプリケーションサーバというのを見つけてきてくれた。開発終了直前のモノだったが、レアもので楽しかった。詳細はコチラ
「SunのJ2EESDKと心中だゼ!」と言い切ったはずのわたしだが,ちょっと他のJ2EE準拠商用アプリケーションサーバを使ってみることにした。
使ってみるったってホンモノは172万円よりとかってとてもフツーのサラリーマンの家庭で買えるものではない!!お試し版である。
ゆえに,教本が本屋さんに並んでいても,さすがに買うわけにはいかない。アプリ付属のヘルプやベンダーサイトのヘルプページが頼りだ。
ここ2週間ばかりの間に,以下の二つの商用アプリケーションを試してみた。詳細はそれぞれに別ページを用意した。
IBM WebSphere Application Server V4.0.1
アドバンストデベロッパー版(Windows200 SP2)
BEA WebLogic Server 7.0J ベータ版(Solaris8)
試した内容は,以下の3つである。
1.カンタンなJSPを動かしてみる
2.カンタンなServletを動かしてみる
3.カンタンなEJB+JSPからなるアプリケーションを動かしてみる
ただし,いずれもかなり我流なので,決してこれらが正しいもしくは最適な操作法であるとは言えないことをお断りしておかなければならない。よってページ中で告白してある数々の苦労や混乱も,これらのアプリケーションの欠点であると主張する気は全くない。おそらくはわたしの勝手な勘違いや無知による自業自得である。いくつかブータレたいことは確かにあるが。
ぶっちゃけ,最初はどちらの使い方も
理由は,どちらもファイルを開こうとしたりインポートしようとしたりすると,jarやwarなどのファイルを必ず要求してくるように見えるからである。たとえば「ファイル参照」のウィンドウでは「ファイルの種類」が「.*ear,*jar,*war(アーカイブ)」となっている。
これまでSunのSDKでは,コンパイルまでは自分でやったが,できたクラスファイル,あるいはjspファイルそのままを,どこに置いていても好きなように指定できた。けどこれらのアプリケーションは自分でjarとかwarとか作らなきゃだめなの!?そんなんわかんないヨ!と思ったのである・・・
だが実際は違った。コツは,BEA WebLogicのヘルプでは「ステージディレクトリ」と呼んでいるようだが,適当なディレクトリをひとつ作ってそこに使いたいクラスファイルを入れておけばよい。
そしてアーカイブを要求されているように見えるファイル参照画面でも,そのフォルダを指定して「OK」とやると,これらのアプリケーションはその中身を賢く読み取ってくれるのだった。
それさえ終われば,他のめんどくさいweb.xmlやapplication.xmlなどの設定ファイルを含むファイル構造はアプリケーションがみな作ってくれるところは,いずれもSunのSDKと変わらない使いやすさであった。
ただそれぞれにちょこちょこっと使いにくいというか,理解までに時間のかかるところがあった。わかってしまえばオッケーなのだが・・・IBM使ってみてわかんなくてBEA使ってみてまたIBMに戻って見ると今度はわかった,という感じで2週間格闘した。両方克服できたところでなんか面白くなってきた。他の商用サーバも試してみようかと思っている。
2002年09月15日
deploytoolによるEJBアプリケーションの作成で一番悲しいのは,各クラスのコンパイルまでこぎつけていざ配備のときに途中でエラーになることだ。
このとき,エラーログのパスが表示されそこを見ろ,と言われるが,英語で書いてるしよくわからない。それよりはコマンドプロンプトでdeploytoolを起動したままフェアボーズしている(冗長モードというらしいです)ウィンドウを見たほうがいい。そこにはまだもすこしわかりやすいエラーメッセージとともに,
コンパイルに失敗しました・・・
と,非常にさみしげに結んで終わる。一度だけなら一緒にさみしがれるが,あんまり何度も出てくるとキレたくなる。だがこいつもこれまでなんとかのに越えてきた。
エラーメッセージで示されるクラスやファイル名はおそらくdeploytoolが配備時に自動生成するものの名前なので,一見手のつけようがないかと思ってしまう。だがわたしの経験では結局は・・・配備の設定よりも,むしろアプリケーションのソースコードの打ち間違いのほうが多い!
自動生成したらしいクラスの名前がejbのナントカImplのナントカtmpのと見覚えのないものでもよく見るとその中にたとえばMaterialとかいう表記が見られる。すると自分が作った(Local)Material.java,
(Local)MaterialHome.java, MaterialBean.java・・・のようなコードのうちのどれかが間違っているということになる!
間違っている。コンパイルはちゃんとできたのに!?だが,javacコンパイルはひとつひとつのソースに対して行うものだから,単独では文法的にエラーがなくても,配備のときそれらの関係に矛盾があればエラーになるのだ!
たとえば,配備のとき初めて共通に使うように設定されるメソッドの名前の指定を,どこかでスペルミスった場合。
そしてわたしが経験した中で一番多いのは以下のことだった。
リモートインターフェイスNumber.java(たとえば)で,
public int getNumber() throws RemoteException;
と宣言しておきながら, NumberBean.javaでうっかり
public double getNumber(){
return number;
}
みたくしてしまった場合だ。これはわたしの勉強方法がお手本をなるべくカンタンにしたものを作ってみるというものなので,お手本でdoubleにしている変数を自分でintに書き換えるのだが,ときどき書き換え損なう,という「経験した中で一番多い」などと果たして威張れるのかッ,という事情によるのだが・・・
EJBではBeanが直接インターフェイスを実装しているわけじゃないのが問題なんじゃないかな?
public class NumberBean implements Number{
みたいに直接宣言してればコンパイルのときに両者の型の不整合でエラーになってくれるんでしょうけどネ。
それから,リモートホームインターフェイスの宣言のひとつに
throws RemoteException;
を書くのをうっかり忘れていて,でもソースのコンパイル自体は問題なくて,
配備の時に例外だスローだとエラーメッセージが出て初めて気がついたというときもあった。
配備エラーも落ち着いて検討すればそれほど恐れるものではないのだ。ゴーゴーのに子!
2002年08月29日
別ページに示します。これはかの「J2EEチュートリアル」に準拠しっぱなしなので,申し訳ありませんがそれを参照しながらご覧くださいませ。
2002年08月29日
サンプルアプリケーションでの状況設定は,スポーツ選手の名簿ということだ。扱うチームは異種のスポーツが混在しているので,複数のスポーツ選手は複数のチームに所属できる・・・まあ清水さんや橋本さんがスケートと競輪をなさるようなものだな・・・だが一つのチームはひとつのリーグにしか所属できない。というもののようだ。
これを変えてみることにした。アメリカの映画に出てくるスタンドインカフェみたいなものを想定・・・
複数の食材が複数の料理に所属する。各料理はそれぞれ「主菜」「スープ」のようなカテゴリーに所属する(からひとつのカテゴリーにしか所属しないわけだ)
各クラスは次の持続フィールドを持つ。
食材:id,食材名,販売店,価格
料理:id,料理名,国(フランス風とか)
カテゴリー:id,カテゴリー名(主菜とかスープとか),安売り日(月曜日はスープ2割引,みたいな)
安売り日には需要が集中するから購入量を増やす必要がある,ゆえにスープ材料についてスープの安売り日を検索する必要がある,というシチュエイションである。
ここまで凝らなくてもサンプルコードそのままマネして打ちゃいーんだろーが,なんか変えないとやる気起きないじゃん?
2002年08月29日
「J2EEチュートリアル」の勉強はさらに進んで,「コンテナ管理による持続性」まで来た。
これは,データベースへの接続やsqlなどの制御を,deploytoolで全部やってしまうという様式だ。ゆえに各アプリケーションのコードそのものには,それらのコマンドを書かなくていいので非常にカンタンに・・・
すいません。ちょっと寝不足なんでテンション高くて・・・
その例題を学習するに,まずサンプルアプリケーションを加工することにした。
サンプルアプリはどこかで書いたと思うが,「J2EEチュートリアル」と同じところからダウンロードできる。だがWinではzip形式のこれを解凍できなそうだ。ファイル名情報だけ得られてどれも空ファイルという情けない状況になることもある。UnixでUnzipしたものをWindowsにコピーするか,Windows上にCygwinを置いとくという手もある。本当はWindowsで解凍する方法があるのかも知れない。わたしにはできませんでした。
とにかくそのディレクトリ,j2eetutorial/examples/src/ejb/cmprosterにソースコードがある。そのファイルを全部,
(1)上記のようにシチュエイションを変更し,変数名だけ置換した(手で置換したヨ一個一個。勉強のため。)
(2)各クラスのプロパティを減らし,基本的でないと思われるメソッドや検索コマンドを削除した。たとえばplayerというクラスに出てくるsalaryなんていうプロパティはなくして,彼らのサラリーを比較するメソッドも削除した。
これをdeploytool上で配備してみた。実はこれがむづかしいのだ。ていうか「J2EEチュートリアル」でこのサンプルアプリケーションRosterの実行方法というクダリを見ると・・・
よく読むと一応ポイントポイントは説明してある。deploytool上で配備するときの各種設定の仕方が・・・だが,自分で一から設定しようとすると書いてない部分がかなり多い。そこでこれは公開する意義があると思うので「配備の仕方」を上に公開することにしました。サンプルコード自体は部分省略や変数名変更だけでは無断転載と同じと思って公開しませんでした。 なんとか配備できたので,
(3)サンプルアプリケーションの全ての要素を置換できるような状況設定をしたのち,サンプルをマネして一字一字打っていった。
大変だったヨ・・・実はきのうはダンナさまが朝5時出発で夜23時半御帰宅という地獄の日帰り出張で,それを待ってる間やってみたわけだが・・・クソ長いコードなんで打ちミスによるバグだらけでキレそうになった。それでテンションが高いというわけです。
2002年08月29日
GUIツールCloudview,ヘルプが動かない。なぜか。カンタンだった。SDKをダウンロードしただけではjh.jarというヘルプのアーカイブがもらえないんだヨ。これはibmのサイトからダウンロードできます。のんのんがそれをしてくれた。ダウンロードサイトを紹介しようと思いましたがなんかえれえ複雑なところに隠れているので,ポータルなどでキーワード検索されたほうがいいかも。cloudscapeそのものはトライアル版しかダウンロードできませんが,ページの下のほうにあるSamplesのところでcloudviewはゲットできる。これにjh.jarが入っていると思うんだけど,もし入ってなかったらゴメンナサイ。とにかくこいつを$J2EE_HOME/lib/cloudscape/jh.jarと入れてやって,ここにクラスパスを通すとヘルプファイルが使えるようになるようです。
ただT21ではなぜかCloudviewからテーブルなどの新規データが入力できないという問題は解決してない。ダンナ様の(もとに戻った)dynabookではちゃんとできるのになー。
ちなみにBladeのSolarisからは入力ができるので,cloudviewから新規テーブルを作ったり,新規データを入力することができる。とても便利だ。
しかーし。cloudviewが使えなくても,isqlをもっと便利に使うことはできた。それはテキストファイルからコマンドをかますことだ。その前に,この前ようやく,isqlのヘルプを出すことができた。コマンドプロンプトでisql -helpなんてやってもエラーが出るし,ijプロンプト上で\hとかやってもダメだったのに・・・正解は,
だあああー。まんまやん!これで,いろんなコマンドが使えるようになった。といってももっぱら使っているのは
ij>RUN 'filepath';
でテキストファイルに書いたコマンドを走らせることだ。filepathは相対パスが利くので,コマンドを書いたテキストファイルのあるディレクトリまでコマンドプロンプトで降りて行ってからisqlをスタートさせるとファイルの指定が楽である。
前後するが,cloudscape -isqlでこれをスタートさせたときのデータベースはCloudscapeDBである。ではNONIDBのような他のデータベースを使うには,実はヘルプに書いてあるのだが
ij>CONNECT 'jdbc:cloudscape:rmi:NONIDB' AS NONIDB;
AS NONIDBはお好みである。つけなければ雲助のほうで勝手にCONNECTION1みたいな名前を名乗ってくる。もちろんいちいちめんどくさいのでこのコマンドをテキストファイルにして上の方法で走らせればもっと楽だ。もっと楽なのはデフォルトDBの変更なんだろうがその方法はまだわかりまセ~ン。
こうしてだんだん雲助と仲良くなって行くのに子であった。
2002年08月29日
さて,勉強も進んでいよいよデータベース接続だ。同時に,「エンティティBean」の実装も試みる。なぜか。「セッションBean」でももちろんデータベース接続できるんだろうが,「J2EEチュートリアル」にその例が載ってないんだも~ん。
それはあとからホントに自分で一からコード書いて試してみなければならないだろう。今はとにかく,jssdkeeに付属のデータベースCloudscapeに接続するEJBアプリケーションが作れるのか,それをまず試さなければならない。
データの入出力をするテーブルは先に作っておく。せっかくCloudviewが使えるようになったと思ったのに,なぜかこいつはテーブルの新規作成とかやれそうなメニューがあるのに入力を受け付けてくれないからできない~。バグか~。しょうがないので以前作ったjavaアプリケーションを使った。SQL文は
create table POINT (ID VARCHAR(3),
CONSTRAINT pk_POINT PRIMARY KEY,"
FIRSTNAME VARCHAR(24), LASTNAME VARCHAR(24), POINT INT)
である。文字列フィールドID,姓,名,あと適当に数字を入力するポイントというフィールドを作った。IDにプライマリキーを設定するのだが,設定の仕方がPostgreSQLとかと違ってめんどくせえ。
それから,データベースのたぶんJNDI名ってヤツを,J2EEサーバに登録しておく必要がある。
$J2EE_HOME/config/resource.properties
というファイルを開くとこんな風に書いてある。
jdbcDataSource.0.name=jdbc/Cloudscape
jdbcDataSource.0.url=jdbc:cloudscape:rmi:CloudscapeDB;create=true
jdbcDataSource.1.name=jdbc/EstoreDB
jdbcDataSource.1.url=jdbc:cloudscape:rmi:CloudscapeDB;create=true
...........................
こいつに(4まで登録されているようなので)追加してやる。
jdbcDataSource.5.name=jdbc/NONIDB
jdbcDataSource.5.url=jdbc:cloudscape:rmi:NONIDB;create=true
あ。このcreate=trueはいるのかな今気がついたけど。でも他みんな書いてあるし,このままでもエラー出ないし,まいっか。
とにかく,これでJNDI名に
jdbc/NONIDB
と指定すれば,いつものに子が使っているNONIDBに接続できることになる。
この設定がめんどくさければデータベース参照はいつもJNDI名jdbc/Cloudscapeを指定することにしとけばデフォルトのデータベースに接続できるんだけどネッ。
アプリケーションはいくつかの項目をテーブルに挿入し,かつテーブルの値を全部表示させる,というものだ。なるべく簡単なものを作りたかったんですが。とにかくデータベースに接続できてうれしいです。
2002年08月12日
「J2EEチュートリアル」を勉強しながら自分なりのもっと単純な形式のアプリを作って行こうという試み。今度のは「ステートフルセッションBean」らしい。なにがどうしてそうなのかよくわからないッ。実際,てっきり同様ステートレスだと思ってそのように設定して「deploytool」でどーしても配備エラーが出るから「ステートフル」に設定し直してみたらさっくり配備されたという無知ぶりだッ。
なんてことはない,魚の名前を入力して行くと,「あなたが買う魚はこれこれですね」とリストアップするというだけのものだ。なんとなく魚屋らしいメッセージを入れたというだけで,別に魚でないものを入れてもお構いなし!・・・詳細はこちらデス。
2002年08月12日
EJBはもともとRMIという分散アプリケーション技術から発達したという。そのRMI ってヤツも自分なりにうんと簡単なモノを作ってみた。
詳細を別ページに示す。同じマシンにサーバもクライアントもある場合のことで,これが本当に別のマシンからの接続ということになるとセキュリティポリシーなどがめんどくさくなるらしいが,その辺は勉強していない。ともあれ,これでなんとなくリモートオブジェクトというものがわかったような気がした。しませんか?
2002年08月08日