ajaxをコリコリやると、サーバー側でjavaをシコシコで、やはりクライアント側はjavaScriptでポチポチ・・・と。
で、javaScriptは変数のスコープとかで解釈が「あらっ」ってのもありますが、今回は数値を表示する際の書式の指定ですね。勘定系のシステムでは、整数を扱うことが多く、正規表現を使った方法ってのを参考に、チョチョイとやっておりました。
今回は小数点以下も持った数値を扱うので、これもチョチョイと思ったらサにあらず。今まで通りの3桁ごとカンマと同時に、小数の桁を指定するのが、「こんなこと」がエレガントにできないみたいでした。
で、以下のような関数を呼び出すことで自作しました。
//
// 数値のフォーマット
//
function numFormat(num, period) {
var i = String(num).lastIndexOf(".");
var strInt;
var strPer;
if(i<0) { //小数点なし
strInt = String(num).replace( /(\d)(?=(\d\d\d)+(?!\d))/g, '$1,' );
strPer = parseFloat("0").toFixed(period);
} else { //小数点あり
strInt = String(num).substring(0, i).replace( /(\d)(?=(\d\d\d)+(?!\d))/g, '$1,' );
strPer = parseFloat(String(num).slice(i)).toFixed(period);
}
return strInt + strPer.slice(1);
}
@param num 整形したい数値データ
@param period 表示したい小数以下の桁数
これで、numFormat(‘1234.1234’, 2) で、1,234.12 が返ります。
ヨシヨシ。
ajax処理でDWRはとても便利ですが、よくハマルので「身が引き締まる思い(?)」です。
さて、今回はパラメータに配列を使った場合にチョイとヤラカシました。
以前にやったのは、ちゃんと上手く動作したのですよ。
hogeMng.hoge(param, function(result) { ….hoge…});
ここで、paramは受け側のjavaでlong[]で、問題なかった。
で、今度は同様な感じで、paramを受け側javaでString[]でやったら、「Input parameter probably is not an object. (Missing: {).」と、怒られちゃいます。
どうやらDWR君は配列がプリミティブ型であれば通るのに、オブジェクト型だとダメな感じです。
※ もちろん連想配列にして「クラス」としてパラメータ渡しするのはバッチリですが、たかだか文字列配列がダメ。
で、悩んで試して、落ちついた対処が、受け側のパラメータをString[]ではなくList<String>にすることで動作しました。
もっと、カッチョ良い方法もあるカモですが、「javascript側の配列は、javaではListで受ける」ってのでとりあえず許してね。
CRUDってヤツですよね。Create,Read,Update,Delete・登録、読込、修正、削除。
これの処理の集結にヤッキになっておるのですよ。「同じような処理をコピペなどせずに一箇所にまとめる」、非常に良いことですよね。
なので、CommonManagerで型パラメーター付きで実装し、各Managerで継承すれば、何のコーディングもなく実装できちゃいました。パチパチパチ・・・・。
で、このRestructを進めてまいりました。・・・・が、
単純なEntityのManagerでは、何の記述も不要ですが、別のEntityを包含しているようなヤツでは、登録やら修正の際には内容の必須検査や整合性検査などのチョコッと前処理(下ごしらえ)してから、共通のヤツをヤリたいってコトになりまして、「そんなことは任せなさい!メソッドをオーバーライトして最後にsuper.hogehoge()でイイじゃん。
ですよねぇ~。ホラ出来ちゃった。
で、ブラウザからDWRを使ってソレ・・・・あら?エラー。
DWRはオーバーロードのあるメソッドはダメってのは分かっていたので、避けていましたが、オーバーライトもダメなのね。
っま、対処法は実装する各Managerが別名のメソッドで、super.hogehoge()と一筆入れるだけなんですが、かなりトホホな感じが否めないデスね。