またこんな楽しい1日を過ごせたので、もう同じ1日を過ごさないようにメモ。
{CATALINA_HOME}\lib\(tomcat全体)と{CATALINA_HOME}\webApps\hogehoge\WEB-INF\lib\(各動作アプリ)のどちらに入れとくのか?っま、とりあえず共通であるtomcat全体に入れて、正常に動作していたのです。(いいね)
で、別のWebアプリを同じtomcat上で平行して動作させようと・・・。これは以前のtomcatと違って、webApps配下にポコンとディレクトリ作れば・・・html文章が見えた・・・ほら出来上がり。
じゃ、springの記述をして・・・あれ?エラーが出ちゃって見えなくなった。
で、ネットで色々探していたら、log4jは各動作アプリのlibに入れとかないと、設定は後出しの方が優先する・・・との記述がありました。
で、やってみると居るはずのクラスが見つからない・・・とのエラー。調べると依存している親元と子供との見え方に可逆性があるラシイ。
そこで、各アプリ毎にローカルで使われたがっていそうな連中を、入れ替えては様子を見たところ、今回のケースで、各アプリのlibに移動させたのは以下の通り。
- log4j.jar
- slf4j-api.jar
- slf4j-log4j.jar
- spring.jar
- spring-webmvc.jar
- hibernate3.jar
- dwr.jar
半日かかってやっと環境が準備できた。っま、こんなもんだ最初は!
DWRのsortableを使って、従属オブジェクト(例えば組織に対する拠点)の順位付けのメンテナンスがカッコ良く出来ていました。で、実際のD/Bテーブルに反映するには、ブラウザ上で表示されている順序で該当する従属オブジェクトの識別子(id)を配列として作成し、それを受け取ったmanagerクラスが、配列を順番通りにループしながら、そのカウンター(概ね「i」ですよね)をそのまま、データ項目の「表示順(私の場合はdisp_order)」に投げ込む。・・・という、「スバラシイ」ロジックで実装していました。
で、困った点
今度は同じ従属オブジェクトでも再帰的な要素(今回は「部署」・・・部・課・係)を同様に処理しようとして、階層の深さの表現(横の位置とか「┣」「┃」「┗」こういうの)をシコシコ作り込んで実装し、いよいよsortableで、ビジュアルにメンテナンス・・・・。ところが今度は上記のように、ザックリと大胆にやるわけにはイカヌ。
sortable処理後に順番が変わるのは移動させたelementだけではなく、抜けたり、割り込まれたりしてシフト(+1 or -1)された連中。もちろん処理対象はツママレタelementなので、上下の順列の規則性から判断しようとしたが、良く吟味すると隣接する2行が入れ替わった結果からは、どちらがツママレタ本人であるのか判断できない。(だって変更は本人だけなんだもの)
で、実際の更新のトリガーになるonUdateとは別にonChangeとかで、ツママレタ(つまりdragされた)行番号なりidなりが取得出来ないか?・・・・と、調べ回ってオオハマリ。
で、逃げた(工夫した)方法
sortableの対象がtableのtrだったので、trにonmousedownイベントで、dragLineという変数に処理前の位置を特定できる(行番号とか)を予めセット。sortableでのonUdate処理で、対象の上から下へループを回し、dragLine(本人)を発見した行がdropLine(安置された場所)ってことで、結構回りくどい処理になっちゃったケド。・・・・っま、悪くもないか?
まずは、javascriptでの再帰処理で・・・
ある親要素に帰属する複数の要素がある場合(例えば「組織」が持つ「拠点」)に、Ajax的なHTML表示には dwr.util.addRows(…)を使うと非常に「楽チン」なので多用していました。しかし、帰属する複数の要素が再帰的な場合(例えば「部署(部・課・係)」)には、rowCreator:記述内にさらにaddRows的な再帰処理を試してみても・・・ムリみたい。
で、となれば「より手作り側」に戻って、javascriptで、ゴリゴリ記述しました。・・・Listをループして各行の表示要素を作成しツツ、ソイツに子要素Listがあれば、己れ自身(function)を再帰的に呼び出す。・・・へへへっ、エレガントじゃん。ところが、「深さ1」から「深さ2」を数行表示して、本来は次の「深さ1」に戻って続くハズが、表示されない。
結論:javascriptはvar宣言した場所(scope)内で通用するが、var宣言しないと、グローバル変数とみなされちゃう。・・・・えっ!。宣言を省略すると範囲が大きくなるとは、感覚的に違和感があるなぁ。っま、仕様ならばしょうがない。つまり今回のミスは、再帰的なfunction内のループカウンタのiにvar宣言がなかったので、2回目以降はゼロからの再カウントをしていなかったらしいのだ!function内でvar宣言すると、アッサリと正常動作した。・・・とほほ。
参考にしたコンテンツ:ペントミノを解く ←シラーっと書いてありますが、納得できました。ありがとさんです。
script.aculo.usのsortableで
ほいで、その子要素の順序の指定(変更)は、いつものように「ツマんでポイ」のscript.aculo.usでカッチョ良く・・・と、アレ?・・・。ツマメナイ。何もエラーも出ていないゾ。で、これは5分で解決。コンテンツを作ってから設定をしろ・・・と、なんだそんなコトか。っでも、行追加したら改めて設定し直さないと追加行は「仲間外れ」になるようです。ちっちぇえハマリでしたが貴重な内容でした。
参考にしたコンテンツ:happy lie, happy life ピンポイントでありがたかったッス。