らどくら通信 |
Web開発ツールその他について、あるいは無関係でも、たうら+うらのの興味がある話題、
あるいは興味がない話題(ないのか!!)、
開発現場の生の声、カスタマーの不倫事件等(ありません)などなどを載せていきます。
あと、文書の更新履歴もこちらです。
|
● 2006/12/31 (sun)
Spring - JSF統合に関しては、
Webをちょっと検索するとDelegatingVariableResolverを利用した設定手順が詳しく解説された文書がたくさん見つかるので、
さほど苦労はありません。
しかしなぜか、私の環境ではそのよく言及されているDelegatingVariableResolverの一部の機能が使えません。
つまり
- JSFのBeanから、SpringのWebApplicationContextを参照してSpringのBeanを取得することはできる。
- JSP文書中で、JSFのEL式を使いSpringのBeanを参照することはできる。
- faces-config.xml中で、JSFのEL式を使いSpringのBeanを参照することができない。
なんでや!なんでなんや!と両方のXML(SpringのapplicationContext.xmlとJSFのfaces-config.xml)
のタグの並び順やなんかを変えてみましたがうまくいきません。
JSFをSun RI 1.1を使っているためかしらん?と思い、Sun RI 1.2をダウンロードしてみましたが、
バージョン1.2のバイナリ配布はなんとJRE 5.0でないと動かせないみたいです。
つまりそろそろJRE 1.4 + Tomcat 5.0の環境を卒業して、
JRE 5.0 + Tomcat 5.5の環境をこの冬休み中に作らざるをえないしか。
とりあえずこの問題は、「Beanは極力Spring側で定義する」という超解決策で回避できるので、
勉強するぶんにはもう少し勉強しようと思います。
● 2006/12/30 (sat)
冬休みに入りまとまった時間が取れたので、入門書だけ買ってしばらく放置していた
Spring MVCを使ってみました。Spring FrameworkはJava用のよく知られた
「何でも有り系」のフレームワークです。
つまり、普通はDIxAOPコンテナ・フレームワークとして有名ですが、
Jakarta Commons DBUtilsのようなJDBCをラップしたデータベースアクセス・フレームワークを含んでいるかと思えば、
Struts同様のMVCフレームワークも入っているので、
そのMVCフレームワークを入門書ことオライリーの「開発者ノートシリーズ・Spring」
を見ながら作ってみました。感想は
-
DIコンテナと綺麗に統合されていて、
再利用可能なPOJO(Plain Old Java Object)ベースのプログラミングができる点は
Strutsの課題が解決されていてとてもよい。
-
コントローラの実装方法が何種類もあるのは、Struts出身の自分としてはちょっと気持ち悪い。
-
Strutsのように専用のHTMLタグを使わないので、JSPにかけなくても画面デザインを確認できる
(Tapestryとかでよく言われていた利点がSpring MVCにもあるわけですね)。
-
ただし、出来合いのバリデータとか、レンダリングのための便利なタグって何も標準で用意されてないんですね。
一から運用レベルになるまで自前で作るのはタイヘンそう
ということで、頑張れば実システムに適用もできそうですが、
バックエンドが強い代わりにプレゼンテーションに弱い気がします。
そこで巷でよくやられているらしい、JSF(Java Server Faces)との統合ということになるのでしょう。
次はそれをやってみます。
● 2006/12/23 (sat)
次世代スクリプト言語?としてブレークするのかしないのかちょっと分からないGroovyを少しだけ使ってみました。
が、文法が…
プログラムをとにかく簡潔に書くという観点では、Jython(Python)と一長一短なのが惜しいです。
Jython(Python)は、クラスのインスタンス変数やメソッドにアクセスする際に、
必ずself.とつけないといけません。つまりJavaでいうthis.に当たるキーワードが省略できません。
一方ローカル変数は宣言せずに何でもいきなり代入できます。
Groovyは逆です。this.はJavaと同様省略可能です。
しかし、ローカル変数を使う前に一々defで宣言しないと代入できません。
慣れればどってことないのだと思いますが、
両者を少しずつ使い始めると面食らうことしきりです。
● 2006/12/22 (fri)
JavaでのPDF帳票ライブラリとして職場ではなかなか高価な市販製品、
家ではiTextを少し試してちょっと職場の実帳票への適用は難しいかと断念、
というところでJasperReportsに再注目しています。
それで、JasperReportsは内部的にiTextのAPIをコールしているようですね。
両者は何が違うかというと、iTextがJava APIで印字内容を1つずつ書いていく代わりに、
JasperReportsはそれらの設定をXML文書に定義しておき、
それを読み出して出力を生成するという感じです。
というかiTextを少し使うと誰しもそういう方向で拡張したくなるのは山々、
自分でそういう物を作り始める前に、
キチンとしたオープンソースのソフトウェアが既に公開されていると知ったことは、
大変よかったことです。
● 2006/12/17 (sun)
Struts 1.3のモジュールの1つとして配布されているStruts Scriptingを使ってみました。
Actionをスクリプト言語を使って書けるということで、
・記述が少なく、早く作れる
・クラスのコンパイルが不要(Eclipse等を起動する必要がない)
・Webアプリケーションも再起動の必要がない
という利点があります。使う言語処理系はBSF(Bean Scripting Framework)
でサポートされているものなら何でもいいのですが、
スクリプトで書いた物を本格運用する際には通常Javaで書き直すと思うので、
文法がJavaに似た言語、例えばJython(Python)、Rhino(JavaScript)、そして勿論Groovyなどを使うのがいいでしょう。
また、Form BeanやレコードBean(いわゆるValue Object)等はスクリプト言語では書けないみたいでこれは残念。
またScriptActionという専用のActionクラスを使うので、
Actionを既に何らかの自前のフレームワークとして拡張している場合、
その中に組み込むと他の画面との動作の整合性がとれない可能性も高いといえます。
● 2006/12/16 (sat)
最近Oracle等のデータベースの勉強をきれいさっぱりサボっていたところ、
とある個人サイトでとても面白くて役に立つSQLの技を見て、
すぐに職場で開発中のWebシステムに適用しようと思いました。
CASE式を使って、縦横2次元の集計表が簡単に作れるので、
このSQL結果をそのまま画面に表示すると簡単にそのようなWebシステムが作れます。
以下の例は車の種類ごとに総数、完成済、製作中の台数を表示する、というのを想定したものです:
SELECT CAR_TYPE, COUNT(*),
SUM(CASE WHEN STATUS='KANSEI' THEN 1 ELSE 0 END),
SUM(CASE WHEN STATUS='KANSEI' THEN 0 ELSE 1 END)
FROM CAR_SEISAKU
GROUP BY CAR_TYPE;
おーコレは簡単。列ごとに3回SQLを発行する手間も、
ホスト言語(呼び出し側)で行数を1行ずつ数える必要もありません。
● 2006/12/10 (sun)
ちゃんとしたデータベース環境がない所でもwebappの画面遷移動作を一式開発できるよう、
「CSVファイルを読めるJDBCドライバ」を探していまして、
CSVJDBCを見つけて試してみました。
これこれ、まさにこういうソフトが今回の目的には最適なんですが、
Webフレームワークに組み込むには後一歩が惜しい!
惜しいと思ったのは、Connection.setAutoCommit(boolean)をコールすると
UnsupportedOperationExceptionが飛んでしまう点です。
これでは、既に作ってしまったWebフレームワークがsetAutoCommitを呼んでいるので組み込んで使うことができません。
超残念。
● 2006/11/04 (sat)
半月経って結局、iTextは諦めました。(←あっさり諦める人)
原因は、要件定義をユーザと詰めていて、
やはり一度決めた帳票様式をずっと使うのではなく、
最初に作ったものを要求に応じてType2、Type3と派生させて、
様々な場合に対応できるように何種類かテンプレートを用意したいという話があり、
それならばExcelでテンプレートフォームを作っておいて、
アプリケーションでそれに値を埋め込んでいく、つまりExcelで出力するのが一番早道ということになりました。
また、iTextを使っていて思ったのですが、
何十種類も必要な帳票様式ごとに、
数値の右寄せ、カンマ区切り等の各印字フィールドの書式設定を、
GUIではなく全てJavaプログラム上で書いていくのは、やはり精神的にキツイです。
そんなわけで、JavaのサーバーアプリケーションからExcelを出力するというと、
過去何度か話が出て立ち消えになったJakarta POIの出番ということになりましょう。
それで今回問題となったのが、従来POIではセルに「100」などの値がじかに入っている場合にそれを取り出すのはとても簡単なのですが、
「=C13+C14」のような参照式(Formula)が入っている場合、
その式(C13+C14という文字列)ではなくて、計算した結果の値を取得することができない、という点です。
気になってWebで検索したところ、メーリングリスト等で
「だからPOIは駄目なんだ。jexcelapiの方が機能、パフォーマンス、メモリ効率全てにおいてお勧めだヨ(意訳)」
等のやりとりを見ていて、そうそうjexcelapiという同様のオープンソースのライブラリがあることも最近知りましたが、
それはそれでリスキーじゃあるまいか?ということでさらに調べてようやっと分かりました。
現在Jakarta POIの3.0-alpha1というのが完全なαリリースですが出ていて、
その中にさらに「poi-3.0-alpha1-scratchpad.jar」という超実験的APIのライブラリが入っており、
これを使うと式の参照が可能だということを!!
試した結果、最初は出まくるんです。NullPointerExceptionが!!
やっぱ駄目やん!!とソースも入手して調べたところ、何とか簡単な式ならばその結果の値を取得できることが確認できました。
ドキュメントを簡単に斜め読みしただけですが、
Excelでは式は内部的に逆ポーランド記法で格納されていて、
多分POI内部でそれらを計算して結果を出しているのだと思います。
● 2006/10/14 (sat)
iTextを使おうかどうかと検討しているシステム開発の要件もまだ途中なんですが、
一通りiTextの基本的なAPIを使ってみて、
ページ内に文章をダラダラ並べるタイプのPDF文書、
売上一覧表のように表形式でデータを見せるPDF文書が大体作れるようになりました。
後はどこまで精密な帳票を要求されるか、次第ということになりますが…
要求サンプルが来てみないと何ともいえないところです。
とりあえず、覚え書きメモを掲載してみました。
● 2006/09/23 (sat)
JavaでPDF帳票を生成するオープンソースのライブラリがいろいろあると聞いて
Webを探して、iTextというライブラリの噂を聞きつけ、
試してみたところすぐに作れて注目しています。
名前だけ知っている同様のソフトとしてJasperReportsというものもあるそうで、
またExcelファイルを先に作り、それからPDFに変換するJooConverterというものもあるようですね。
現在職場のシステム開発では、
枠線や印字フィールドなどの帳票設計がGUIでできるベンダー製品を使っています。
これは、1キーレコード1帳票の固定様式での大量出票
(いわゆる伝票と呼ばれる種類の業務帳票)
の場合は大変生産性がよく重宝していますが、
よくある「社内用部門別売上一覧表」のようなあまりに単純な帳票の場合は、
帳票サーバとの連係の仕組なども必要な分、
逆に開発効率に不満がありました。
印刷データだけ渡せばローカルで出来合いの枠線を引いた中に印字フィールドを埋め込んでいけば、
PDF文書が出力される、というAPIを提供するライブラリはないかしらん?
ということで、今回の目的にiTextはぴったりでした。
ただし心配なのは、複雑な枠線、細かいフォントや位置指定を要求される帳票だと、
処理を共通化・再利用できず、
APIでミリミリ書いていかないといけないので、GUIの製品より、
逆に生産性が落ちそうなところです。
印字位置や枠線に対するこだわりがどこまで微細に必要な帳票であるかによって、
どちらを使うかを要件の早い段階で決めることがポイントになりそうです。
● 2006/08/15 (tue)
この次の、つまり来期のシステム開発にStruts 1.3を使おうとしています。
1.3.4をダウンロードして使ってみましたが、気になる点が1点。
ユーザガイドでは、「Arbitrary configuration properties」
の使用例を「Action#getProperty()」のように書いているものが多い
(例えばこのページ)
のですが、実際には「ActionMapping#getProperty()」だと思うので
Action#execute()の中では「mapping.getProperty("foo")」と書かないといけません。
(つまり、
ITProのこの紹介の2ページ目の使用例が正しい)
この Arbitrary configuration properties が、
次回から1.3台を使いたいと思った一番大きな理由です。
ちなみにITProの同じ特集で、
「ポストStrutsは何か?次世代Webフレームワークを展望する」
という記事があり、Strutsの次世代として使えるフレームワークは何か?
と題して、Struts 1.2自身を使い続けるという選択肢を除いて5つの候補を挙げています。
Struts 1.3、Struts 2 (aka WebWork)、Shale、JSF、SeasarのTeedaで、
近々開発するならStruts1系、自力でOSS開発に参画する体制があるならShaleかTeeda、
開発がかなり先ならなんでもOKという、ある意味凡庸な結論になってしまっています。
ただし「ホントの結論はJSFの普及次第」というのはその通りだと思います。
私はStruts 1.3に早めに移行し、JSFの普及期に入ったらShaleと検討しています。
● 2006/08/11 (fri)
JDBCのバッチ更新(Batch Updates)という機能があって、
複数レコードを更新するのに便利だというので仕事で使えるかと試してみましたが、使えません。(-_-)
というのはOracle JDBC DriverだとPreparedStatementの標準バッチ更新
(Oracle依存ではなく標準JDBCの更新機能)だと、各SQLごとに更新した行数が得られないのだそうで、
今回の目的には使えませんでした。
むー、パラメータのリスト「のリスト」を渡して、1つのPreparedStatementで複数回
SQLを発行する処理を別途作りました。
● 2006/08/05 (sat)
今まで家のWindows PC上のファイルの履歴を管理するのに、
もう一台のLinux PCにCVSサーバを立てて行っていましたが、
Windows PC上にローカルのSubversionリポジトリを作ってTortoiseSVNで行い、
リポジトリをHDDにバックアップする方法に変えてしまいました。
Linux PCの電源をなかなか入れなくなってしまったので、
同じファイルをコミットせずに数回続けて編集してしまうことが増え、
履歴管理の役を果たさなくなってきたためです。(-_-)
開発ツールの利用法を家で勉強するという目的には、
共有利用を想定したリモートのサーバを立てる方がずっといいと思いますが、
本来の役を果たさないのでは仕方ありません。
当面頻繁に更新するファイルは「ひとりSubversion」、
あまり更新しないファイルはLinux PC上に(CVSの代わりに)Subversionのサーバを作り、
コマンドラインでの操作はこちらで勉強しようと思います。
● 2006/08/04 (fri)
Strutsの構成ファイル(struts-config.xml)のActionマッピングの定義にワイルドカードが使える
(ver1.2から)というので便利に使っていましたが、
さらにForm Bean定義にもワイルドカードが使えると、
Form Beanの名前に規則性を持たせてワイルドカードを定義しておくと、
新しい画面を追加しても全く構成ファイルを変更せずに済ますこともできるのではないかと思い調べてみました。
が、検索エンジンでWebを探しても、
Form Bean Definitionsにワイルドカードが使えるかどうかを書いているページは見つからなかったので、
何でも調査隊は実際に試してみました。
結果。使えません(号泣)。
新しい画面を追加すると、Form Beanの定義だけは必ず書き足さないといけません。
これは残念無念。
● 2006/08/02 (wed)
Google Desktop Searchをインストールしてみました。
最初はインデックスの作成でPCが急激に遅くなりますが、一度作成が終わると普通の負荷に戻ります。
それで、Google Desktop Searchだけでは、.html、.txt、.doc、.xlsなど、
決まった拡張子のファイルしか検索してもらえず、
当初私が期待していた、XML文書の検索等には使えません。
これに対し、Larry Gadeaさんが公開している
こちらのサイトの
「Any Text File Indexer」をインストールすると、
見事.xmlを含むその他の拡張子のテキストファイルも検索してくれるようになりました。
ただし、シフトJISで書かれたXML文書だけが検索でき、
日本語EUCで書かれた文書はキーワードがインデックスに登録されないらしく、
ASCII文字列で検索したとき以外は検索結果に出てきません。
これは少し残念ですが、ともあれファイル検索がとても便利になったのは間違いなく、大助かりです。
● 2006/07/18 (tue)
お勧めのフリーソフトを紹介しているWebサイトを点々を見て回ったところ、
Google Desktop Searchは便利だというコメントを発見。
名前だけは知れ渡っていますが今一使われているのか分からないGoogle Desktop、
もう少し見るとベータリリースでは英語など数ヶ国語にしか対応していないとのこと。
しかし、ひょっとしてこれが使えるようになれば、個人ユースの場合、
XML文書の検索はわざわざXMLデータベース化しなくてもよくなるかもしれないのでやや注目しているところです。
● 2006/07/15 (sat)
XMLデータベースを再び少しだけ調べています。
職場のシステム運用メモをXML手書きで書いているのですが、
検索はXML文書をテキストファイルとして検索をかけるというレベルにとどまっており、
これを改良したいところ。無償のXMLデータベースソフトが幾つかあるようなので、
追々つついてみたいと考えています。
● 2006/07/08 (sat)
先日から職場で新しいWebシステムを何個か開発していますが、
やはりStruts 1.3.0にものすごい利点というか移行を急ぐ理由があまりないということで、
今期もStruts 1.2台で開発することになりました。
● 2006/06/15 (thu)
Struts 1.3.0をずっと試しており、なんとか一通り動作を確認できました。
下に紹介した以外にも、global-exceptionsの適用範囲が広がり、
RequestProcessorのチェーンの中でトラップされたエラーも、
global-exceptionsで捕まえて自分のエラーページにフォワードさせることができる点も異なる点です。
また、Struts 1.2のJARをCLASSPATHに入れてビルドした手製のライブラリ等は、
特にリビルドしなくてもStruts 1.3のJARと共に動作するみたいで、これは移行作業が大変助かります。
● 2006/05/25 (thu)
Struts 1.3.0を使ってみました。
試した機能はほんのさわりだけですが、Actionクラスの再利用化が進みそうだと実感できました。
今までよく似たActionクラスで、呼び出すSQL文だけが違うようなものは、
問合せのIDをset-propertyで渡すことで共通化を図ることができます。
また1.2から1.3への移行もさほど難しくなく、ある程度決まった手順で移行作業ができるようです。
今度それをメモして上げてみようと思います。
● 2006/05/21 (sun)
Strutsのホームページだけを見ていると全然載らないので知りませんでしたが、
密かに(ってちゃんと情報を集めている人には全然秘密ではないのだと思いますが)
今年2月にStruts 1.3の開発者向けリリースが出ているそうですね。(←入手しろよ)
バージョン1.3では1.2とほとんど互換性を保っていろいろ拡張が行われており、
中でもSpringなどのDIコンテナに影響を受けたと思われる便利機能が2つ追加されています。
便利機能の1つめは、struts-config.xmlのActionマッピングで、
set-propertyタグを使ってActionクラスに外部から(DIで)プロパティを設定することができるようになった点で、
従来のparameter属性を使う方法から大きくActionクラスの再利用化、疎結合化が推進されます。
2番目はstruts-config.xmlの記述が長くなるという従来の欠点を軽減するもので、
他のActionマッピングなどの定義を流用して、一部を書き足す、
つまりOO言語でいう継承みたいなことができるextends属性です。
これらは今まさに私が丁度ほしかった機能どもで、
Java Server Facesが定着するまで当面DIコンテナ要らずで
Struts 1.3一本で生き抜けることができるかもしれません。
● 2006/05/06 (sat)
StrutsとSpringの連係方法について、
この文書を読んでみました。
Actionを継承したActionSupportクラスを利用するなど、いずれもかなり「重い」方法です。
それに対して、
Struts Spring Plugin
(実際のソフト自体はSpringに同梱されています。このサイトはその跡地のようです)
は、もっと簡単で分かりやすい方法で連係させています。
その代わり、ActionにSpringが管理しているBeanを設定する、というそれだけの機能しかありませんが…
それで、StrutsとSpringの連係ということでstruts.apache.orgをいろいろ探しているうちにやっと気がついたのですが、
JSFとSpringの連係ということならShale Frameworkがまさにそれをやっています。
従って、JSF+Springを自分でやるのと別に、Shale Frameworkの勉強もぜひやってみようと思います。
いろいろ手を出すと大変ですが…
● 2006/05/05 (fri)
連休を利用してリファレンスなどを読みながら勉学したので、
Spring Frameworkの究極奥義を習得できました。(できてないできてない)
実際は、簡単な検索画面を作っただけですが…
それで現在は、Spring MVCを一式完全に利用しているわけではなく、
ViewはJSF、Beanを探したりDBアクセスをしたりする部分をSpring、という使い方にしています。
Strutsに比べてJSFやSpringを使うと、
疎結合化、部品化、再利用化というよく言及されるメリットを確かに享受できます。
しかし、この使い方だとJavaコードの他に、JSFのBean定義(faces-config.xml)
とSpringのBean定義の3つを整合をとって管理していかなければいけません。
また何でもPOJOということは、どのクラスにどの機能を持たせ、
相互のBeanの依存性をどのように定義するかが自由に決められる反面、最適解を探すのが難しいです。
最適解があるのなら、それをもう一段フレームワーク化しないといけない感じです。
とりあえず現在は、
「画面から直接メソッドを呼ばれたりするViewに直結したManaged Bean(JSFで管理)」
→ 「検索入力項目などを持つBean(JSFで管理)」
→ 「DB接続情報などを持ちDBアクセスを行うBean、いわゆるDAO(Springで管理)」
という依存関係にしています。
このあたり、仕事でいろいろ教えてもらっている開発者の方に今期相談してみようと思います…
● 2006/04/25 (tue)
現在JSF-Spring連係ということで、
Spring側で定義したBeanをJSFのManaged Beanの中のプロパティに設定するというのに取り組んでいます。
それで、DelegatingVariableResolverを使ってfaces-config.xml
の中でEL式によってSpring側BeanオブジェクトをJSFに渡す例、
というのがWebを検索すると各所に載っているので真似してみたものの、
"JSF Expression Error: Named Object ??? not found."というJSFのエラーになって成功しません。
一方、オブジェクトをEL式で直接渡すのではなく、
Spring側におけるBeanの名前だけをfaces-config.xmlで渡しておき、
JSFのFacesContext(中略)getVariableResolver().resolveVariable()を使う方法も紹介されていたので、
これを試すとうまくいきました。
しばらくはこの方法で連係させようと思います…
● 2006/04/22 (sat)
ようやくついに、Spring Frameworkの勉強を始めました。
というか、ちまたで話題のSpring Frameworkが、なぜちまたで話題なのか、
3年遅れにしてようやく理解できたということです。
Strutsの勉強を始めた時を思い出してしまう同じ展開ではありますが、
SpringはStrutsよりもずっと入っていきやすいと感じました。
そのわけは、Springの一部みたいなお手製ライブラリを半分作っていたからで、
つまりデータベースの接続情報や実行するSQLをXML文書に書いておき、
これをBeanのリストに読み込んで、JDBC経由でSQLを発行し、結果集合をレコードBeanのリストにして返す。
という一連の処理は、Springでもほとんど同じ、より強まった仕組が提供されているので、
お手製ライブラリをSpringでAPI単位で置き換えていくということで導入ができそうです。
しかもそれをWebアプリケーションに適用する際のやり方も、
ContextLoaderListenerという、サーブレットリスナーの実装クラスでアプリ起動時にXML文書を読んで、
ServletContextに覚えさせておくというのも同じなので分かりやすくて良いです。
逆にJ2EEにおけるトランザクション管理などは全然理解していないので、
Springを手本にこれから勉強をしようと思います。
また、現在はStrutsと一緒に使うためのtipsという話題が多いようですが、
StrutsとSpringではMVCのCの部分で競合している面もあります。
今からStrutsとSpringの統合を図るくらいなら、JSFとSpringの組み合わせを考えた方がいいのかな?
という気がします。
● 2006/04/16 (sun)
CachedRowSetを使わないように決めてしまうと、割とJSFの勉強がはかどるようになりました。
標準で用意されているような、RangeValidatorを自分で作りました。
JSFのRIについているバリデータは種類が少なく、多分実用ではとても足りません。
そこでカスタムバリデータの出番となるわけですが、
しかし、3/26の日記にも書きましたがエラーメッセージの生成方法の定義について自由度が高いので、
もう少し高レベルでフレームワーク化したものが必要ではないかと思います。
● 2006/04/13 (thu)
JavaScriptのファイルのインクルードで依存関係が解決できればいいんですけど…
共通化可能な汎用関数のライブラリを作っているのですが、
BBB.jsを使うためにAAA.jsが必要、ということはよくあります。
しかし、BBB.jsの冒頭に「AAA.jsをインクルードする」という指令を書く方法が分からず、
現在は必要そうな関数の.jsファイルはとりあえずJSPのヘッダ部に全部書いておく、
という方法でやっていますが…現在うまい解決法はないか調べているところです。
● 2006/04/12 (wed)
JSFのデータモデルとしてCachedRowSetを使うことをずっと検討してきましたが、
どうも難しく一旦中断しました。難しいと思ったのは、
(1) テーブル状に表示したとき、各行の左端にチェックボックスをつける方法が分からないので、
レコードを削除するアプリケーションが作れない。
(2) CachedRowSetに対して一度手動でカーソルを回さないと行数が分からないので、
「*行のデータが見つかりました」という表示ができない。
(じゃあやればいいだろうという話なんですが、そんな汚いのは嫌だ〜!!)
ということで、当面はStruts時代によくやったのと同じ、
結果集合をBeanのListに保持する方法です。
各行をBeanにマップするのはJakarta DbUtilsを使ってもできますし、
私はお手製のライブラリを作っており、これを当面使うことになりそうです。
CachedRowSet#acceptChanges()で一発更新の夢が〜〜〜まだ先は長いです。
● 2006/03/26 (sun)
JSFのカスタム・バリデータで自由度が高く面倒だというのは、
「{0}は{1}以上でなければいけません。」のようなエラーメッセージのプレースホルダーに、
実際に何をセットさせるかについて、Strutsだとvalidation.xmlのarg0、arg1みたいなタグが対応する、
という部分まで仕様が決まっていますが、JSFの場合はどうなのかが分からないことです。
あえて似たようなやり方をするならf:attributeタグを使うのだと思いますが、
それを受け取ってMessageFormatにかけるところまでフレームワーク化してくれてもいいのになあという気はします。
Apache MyFacesの実装も見てみましたが、
そのバリデータのエラーメッセージが幾つのプレースホルダーを取るのか、
それらがそれぞれ何を意味する値をセットされるのかは、
全て実装のJavaコードの中にハードコードされている点が、Strutsと異なる点です。
それがMyFacesの仕様なのか、もともとJSFの仕様なのかはよく分からず、
もう少し調べてみようと思います。
● 2006/03/25 (sat)
JSFのカスタム・バリデータ作りに挑戦しています。
Webを検索すると幾つかサンプルが載っているので、真似て作るだけの話ですが、
一応動作を確認できました。
が…
JSFはバリデーションエラーになった際のエラーメッセージをどうやって生成するか、
という仕様がStrutsより自由度が高く、その分面倒なように思います。
● 2006/03/24 (fri)
2月25日の日記に書いた、自作のEL関数を苦労してやって実現することができました。
実は、「関数が呼ばれない」という謎の現象があり、延々悩んでいたのですが、
原因は何のことはない、「<c:if test="${fn:booleanFunc(arg)}">」
と書くべきところを、「<c:if test="fn:booleanFunc(arg)">」
と書いていたので、EL式になっていないだけの話でした。これに気づくまで数時間。
c:ifタグの仕様がそうなっているので仕方ないのでしょうが、警告とか出ないものですかねえ…
● 2006/03/18 (sat)
今日初めて知りました。OracleのNVLという関数の名前の意味は「Null Value Logic」だそうです。
…なんで調べる気になったかというと、
JavaでNVLと同様の処理をする関数(staticメソッド)をnvlと名づけたのですが、
その親戚で、最初の引数が空文字列の場合に2番目の引数の値を、
そうでなければ最初の引数の値を返す関数を作ろうとした際に、名前をどうしよう?
と考えたわけで。それだと名づけてEVL(Empty Value Logic)とでもなりますか。
なんかウィザードリィのアラインメント表示みたいで嫌だなあ…(昔を思い出す)
● 2006/03/12 (sun)
Servlet/JSPでデータベースにアクセスするサンプルWebアプリケーションを作っています。
そのデータベースとして使うJava製の軽量RDBMSとして、
hsqldbとApache Derbyを並行に試しています。
それで、Webアプリケーションの起動・停止に連動してデータベースのサーバープロセスの起動・停止ができるととても便利ですが、
これはhsqldbでは成功し、今Derbyでの方法を調べています。
Derbyでは、データベースのホームディレクトリ
(=JDBCのURLでデータベースのパスを相対パスで指定されたとき、起点となるディレクトリ)
を指定するのに、derby.system.homeシステムプロパティで指定する必要があります。
Webアプリケーションが1つならいいのですが、2つ以上ある場合、
異なるWebアプリケーションに異なるホームディレクトリ、ということができるのかが謎です。
そんな変なことをしなければ良いということなんでしょうけど…
しかし、サンプルアプリケーションとして可搬性を保つには当然、
データベースのディレクトリはWebアプリケーションのディレクトリの中に入れる形になるので、
アプリケーションごとにデータベースのホームは変えざるをえません。
これが解決できないと、DerbyではNetworkServerは自分で起動すること、
という方式にしないといけないかなあと考えています。
● 2006/02/25 (sat)
JSPのJSTL(c:ifタグなど)で使うEL式で使う関数を自分で作れるというのを初めてやってみました。
あんまり込み入った動機ではないんですけど、
c:ifタグの条件分岐に使う関数で、「現在ログインしているユーザーが○○の権限を持っているか」
を真偽値で返す、というものが必要だったのです。
同じことは当然、その動作をするstaticメソッドを作って
JSP内にscriptletとして書けばよいのですが、
どうせならタグだけで書きたいということで、EL関数を作りました。
それで初めて知ったのですが、EL式内ではrequestやsession等は暗黙の変数として定義されていないんですね。
(requestScopeやsessionScope、pageContextは定義されている)
そのため、requestオブジェクトをEL式内で参照しようとしたら、
requestではなくて、pageContext.requestと書かないといけません。
● 2006/02/22 (wed)
そして今日は数年来不思議だった現象の原因が分かりすっきりの気分です。
Oracleでシーケンス(順序)を発番するプロシージャを実行すると、
なぜか毎回20弱くらい連番が飛んでしまう、つまり欠番が発生することがありました。
なんでや!なんでなんや!!と思いつつも気持ち悪いなあ〜と言いながらそのままにしていましたが、
ようやく分かりました。CREATE SEQUENCE文のCACHEオプションが原因だったんですね。
疑問が晴れて気分爽快であります。
● 2006/02/19 (sun)
職場でやっているシステム開発で先週話が出て(またですか)、
Strutsの(またですか)、
設定ファイル(struts-config.xml)が大きくなりすぎた際に複数にモジュール化する方法、
の勉強を始めました。
AtmarkITのTips
などが参考になります。
このページはずっと前、Strutsの勉強を始めた頃に一度見たのですが、
当時はそんなに画面数の大きいシステムを作ることがなかったのでふーんと読み飛ばしてしまいました。
今になって必要になろうとは〜。
それでそのページに書かれている通り、単純にファイルを2つに分ける方法と、
モジュール(サブアプリケーション)に分ける方法があり、両方一長一短ありますが、
今回はより単純な方ということで、前者の方法にしました。
● 2006/02/11 (sun)
職場でやっているシステム開発で先週話が出て、
Strutsのカスタム・バリデータを本格的に整理しよう、ということでライブラリ化を始めました。
T-Strutsなどでも、
Struts標準では用意されていない幾つかの追加のバリデータを作られていますが、
このように実業務システムに必要なバリデータの整理をしてみようと思います。
● 2006/02/10 (sat)
で結局、現在hsqldbとApache Derbyと両方並行して取り組んでいます。(-_-)
hsqldbの方は一通り、起動・停止とJDBCでの接続方法を確認できました。
Webで検索して、
ServletContextListenerを使ってWebアプリケーションの起動・停止に連動して
hsqldbサーバープロセスの起動・停止を行うサンプルを載せておられる方がいたので、
参考に早速やってみるとうまくいきました。
Derbyはやっと、Embedded(スタンドアロン)モードでのコマンドラインツール「ij」
の使い方を覚えたところです。先は長い!ぜえぜえ。
● 2006/02/04 (sun)
今、Javaで書かれたRDBMS、hsqldbの勉強をしています。
私の職場ではStrutsでWebアプリケーションの開発をしていますが、
DB接続周りは手製のライブラリでJDBCをラップして使っています。
その使用例となるサンプルアプリケーションを作るのに、
今まで自宅ではMySQL、職場にはOracleの開発環境があるのでOracleに接続するものを使っていましたが、
新規の開発者の方にすぐに説明できるようにもっとポータブルなもの、
つまりパソコンにTomcatを入れ、JNDIの設定を書いてwarファイルを展開したらすぐに使用例の動作が確認できるようなものは作れないか、
ということでスタンドアローンで動作するRDBMSを探してhsqldbに決めました。
もう1つの候補はApache Derby(旧称Cloudscape)でしたが、
とりあえずhsqldbの方がドキュメントが多そうだったのでこちらにしました。
今までの操作内容は、
はくつーるにメモってみました。
● 2006/01/21 (sat)
PHP 5.1.2がリリースされたので、1月3日の日記に書いた不具合が直っているかとChangeLogを見たのですが、
直っていません。
そのバグレポもレスがついていないところを見ると、実はバグではないのでは?
と思い、今度は先にSQLite 3.3.1をインストールしてから、
PHP 5.1.2をビルドしてみるとちゃんとApacheが起動できました。
つまり、undefined symbolが出る原因はsqlite.hがインクルードできてなかっただけで、
バグではなかったのですね。
しかし、それならconfigureでSQLiteがインストールされていないことを検出してエラーを出すべきとは思います。
ひとまず、インストールできたので、これから何をしようか(おーい)と考えています。
● 2006/01/18 (wed)
JSPのEL(Expression Language)をサーブレットのフィルタで解釈する
(なんじゃ、そりゃ)ために、ELのインタープリタがないかと探したところ、
Jakarta CommonsにELとJexlとJellyという3つのライブラリ・パッケージがありました。
しかし、3つの違いがさっぱり分かりません。(-_-)
そこで各紹介ページを読んで見た所…
・Commons EL…JSP 2.0で定義されている式言語(EL)のインタープリタ実装。
・Commons Jexl…Velocity開発の過程で得られたノウハウをもとに、
JSTLやJSPの式言語(EL)を拡張した式言語。
・Commons Jelly…VelocityやCocoonに影響を受けたXMLベースのスクリプト処理エンジン。
(VelocityやCocoonが専らHTMLを生成するためのテンプレートエンジンなのに対し、
Jellyは普通のプログラミング言語のように普通の処理がいろいろできるらしい)
動的な値の出力にJexlを利用している。
ということですが、Commons ELのドキュメントにはサンプルが全くありません。
ソース配布をダウンロードしてみましたが、ソースの中にも使い方サンプルはありません。
むむ、これは本当にJakarta TaglibsのJSTLの実装であるstandard taglibのソースを見れ、
ということなのかと思ってみましたが、理解できません。(号泣)
ということで、ELは諦め、次にJexlに行きますが、
こちらもJakarta Commonsのインデックスページ
の紹介を見ると、ELを拡張したのがJexlだと読めるのですが、
今度はJexlのホームページに行くと、
「JexlはJSP 2.0仕様と完全に互換性があるわけではない」
と書かれていて、なんだか全然分かりません。
しかしJexlの方は紹介ページにもドキュメントにもサンプルが豊富で、使いやすそうです。
というところまで見たところで、
開発の事情でフィルタを使わなくてもよくなりそうなので、中断ということにしました。
● 2006/01/15 (sun)
ひょんなことから気づいたのですが、JSPのJSTLでは、"lt"は予約語だったんですね。
ltという名前のプロパティを参照しようとして、EL式で"${aobject.lt}"のように書くと、
「識別子を期待しましたが、"lt"に出会いました」のようなエラーになります。
リットルとかそういうプロパティを使うときは要注意ですね。(ないないないない)
私が使おうとしたのは、「Lead Time」の意味でltと名づけたプロパティです。
素直にleadTimeと名づけることにします。(シクシク)
● 2006/01/03 (tue)
PHP 5.1.1を入手して使ってみようと思いましたが、
Apacheの起動時に次のようなエラーが出ます。
undefined symbol: sqlite3SelectDelete
ここに報告されている通りの現象で、
これはもう少し待つしかないですね。とりあえず、今日確認したところまでを改訂して載せてみました。
● 2006/01/02 (mon)
明けましておめでとうございます。今年も当サイトをよろしくお願いします。
年末年始にちょっと取り組んでいるねたは、
Oracleの配列データ型(VARRAY)やユーザ定義型(RECORD)の値を引数にとるストアドプロシージャを、
JDBCでJavaから呼べるか?
というものです。いや、呼べるのはハッキリしているのですけど、
やり方を自分で試したいということで。
そこで「Oracle8i Javaプログラミング」という本と、
Webで公開されている例を元に作ってみると、うまく行きました!
その顛末を私も載せてみました。
最新 2006年 2005年8月〜12月 2005年1月〜7月
Designed and Written by (C) 2002-2007 URANO398.
|