営業の人はパワーが違う

今日、またったま某社の営業さんと飲んだんですがパワーが違いますね。すごい活力にあふれていました!なんかエネルギーを感じました。こっちは晩御飯を食べていない所ウィスキーが出てきたので、ほどほどに押さえるのに一苦労(笑)それでもそこにグラスがあると飲んでしまうんですよねー。別に接待術なぞ教わった事は無いですけど、素直にすげぇと思ったことをすげぇと伝えるのは両者ともに楽しいですね。よいしょしてるつもりは無いんですけど、いろいろからんでもらえて楽しかったぁ。

そして帰りはタクシー。地元につくまで途切れなくタクシーの運転手さんと話す。タクシー業界の話がいろいろ聞けて新しい事がいろいろ知れた。昔はどんな長距離タクシーに乗っても終始無言だったんですけど、タクシーの運転手さんと話せるようになったのはいつからかなぁ。ジェームズアレンの本を読んでから変わった気がします。最初の頃は緊張しながらぎこちなく会話していましたけど、今となっては普通。タクシーに乗って限られた空間と限られた時間の中、自然と会話が成り立ってます。いろいろ詳しく話してくれる人で新しい発見があった!

人の話を聞くのはとても楽しくて好き。

Ajaxって奥が深い

サーバサイドの戻り値の返し方をどうやって楽ちんにしようかと考えていた。要求はサーバサイド(Java)の戻り値はPOJOがイイ。戻り値を受け取るJavaScript側のコーディングは極力減らしたい。これだけ。楽することばっかり(笑)

戻り値はこうしようかと思っていた「1.POJO→2.XML→3.JSON」。別になんにも難しくないけど、これだとクライアントの方にコーディングが必要なんだよなぁと。うけとった戻り値から値を取り出して、更新対象のオブジェクトをちょこちょこ操作してあげないといけない。間にXMLを介しているのは、単純にXMLJSONのライブラリがあるから。

public class MakerSelectOption extends JSONOption {
  private String text;
  private String value;
}

これをJSONにしてJavaScriptで受け取ったとしよう。はしょりまくりだけどやりたい事はサーバの戻り値でオブジェクトをごっそり入れ替えてしまうのは無理なんだろうかという事。JavaScriptで作成したオブジェクトは代入できているけど、JSONだとダメなのは何かが足りないからだろう…。

document.forms[0].selectObject.options = eval(xmlhttp.responseText);

でも入れ替えるだけならJSONである必用はなくて「1.POJO→2.HTML」にして

document.getElementById("selectObject").innerHTML = xmlhttp.responseText;

としてしまえばいいわけだ。これならサーバサイドでHTMLのテンプレートを作れば楽ちんだけど一部分だけを書き換えたりするAjaxには使いづらい。

というわけで思い立ったからすぐ実行してみて、すぐ現実に戻されたorz

次のシステム開発の設計時にAjaxを盛り込んでみようかと思ってる。階層的なデータを絞り込むために使うドロップダウンリストあたりに適用すると画面全体の再読込みが減らせるので是非とも採用したい。非常に部分的なものでかまわないし、全体的に使うつもりもない。使うと効果覿面の所だけ提案したいと思う。

そうするためには設計・開発・テストにわたってどういう影響があるかを考え中。設計は問題ないと思うけど、Ajaxである事を明示するのが難しいなと。そこで共通部品として提供する。開発者は特に意識する事なく設計者から指定されたコンポーネントを使えばいい。テストは画面がリロードされないだけで、従来どおりでかまわないだろうけど、画面遷移してそのあと戻ってきた時に状態を復元させる事も考えないといけない。

書いててこんがらがってきた(@_@;)なに言ってるのかまとまってない(苦笑)頭の中だけじゃ間に合わないので紙に書き始めようー。

Ajax勉強終了

メーカー(大分類)・モデル(中分類)と絞り込むリストボックスを作ってみた。JavaScript側で書いたのはこれだけ。

#追記:中途半端だったんでJavaScript部分を全部貼り付けました。とりあえずコードなのでIE専用。


//サーバにアクセスして戻り値をcallbackに渡す
function ajax(url, callback) {
try {
xmlhttp = new XMLHttpRequest();
} catch(e) {
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
}
if (xmlhttp) {
xmlhttp.onreadystatechange = function() {
if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
callback(eval(xmlhttp.responseText));
}
};
xmlhttp.open('GET', url, true);
xmlhttp.send(null);
}
}

//リストボックスを作る
function buildListbox(target, options) {
target.length = options.length;
for (var i = 0; i < options.length; i++) {
target[i].text = options[i].text;
target[i].value = options[i].value;
}
}

//--- ここまで共通の関数 ---

//--- ここからアプリの関数 ---

//メーカー(大分類)の一覧を取得する
function getMakerList() {
ajax('ajaxservlet?id=getMakerList', getMakerListResult);
}

function getMakerListResult(result) {
buildListbox(document.frm.makerList, result);
}

//モデル(中分類)の一覧を取得する
function changeMaker(caller) {
var makerCode = caller.options[caller.selectedIndex].value;
ajax('ajaxservlet?id=getModelList&maker=' + makerCode, changeMakerResult);
}

function changeMakerResult(result) {
buildListbox(document.frm.modelList, result);
}

簡単に言うとajax関数はサーバサイドのどの処理を呼び出したいのか、それを識別するidと、サーバの処理に渡したいパラメータと、戻り値を処理する関数を指定するのみ。

サーバサイドからの戻り値はJSONテキスト。配列の中にoptionオブジェクトを生成しているので、この戻り値専用のリストボックスを生成するbuildListboxという関数を作ってある。

利用者が記述するのは呼び出しの部分と戻り値の部分。これだけやる事が限定されているなら、もっとはしょって書けますね。これならめんどくさがらずに使ってもらえるかな(笑)

サーバサイドの処理をしているのはPOJOでtextとvalueというプロパティを持つOptionオブジェクトの配列をreturnしているだけ。入り口のサーブレットで呼び出し先のクラスだのメソッドだの処理だの戻り値のオブジェクトをJSONテキストにするだのやってみた。

だいたい概要をつかんだので、後はフレームワーク化するにあたって実務で使えるレベルに仕上げるという所です。そしてこういう仕組みは既に世の中にあるはず。なんか萌えてしまったので自力で作りましたけど、拾ってきたほうが楽だと思う(笑)。JSON in Javaは使うとして、入り口のサーブレット部分もOpenAMFのInvokerみたいなのがどこかにあると思うのでそれも探す〜。

JSONテキストをPOJOから作り上げる所で時間食ったくらいで、あとは結構シンプルだったのであまり時間は食わなかった。

Ajaxが段々と見えてきた〜?

POJOの戻り値はObject。そのObjectがJSON関連のオブジェクトなら戻り値はJSONテキスト、他はプレーンなテキスト(POJOXMLの変換もサポート)を返す。これだけあればサーバサイドの開発は楽にできるし、テストケースも書ける。

JavaScriptも基礎部分はこれで良いとして、後は戻り値を楽に処理できる関数を追加してあげればAjaxを使った開発は楽できそうかも。JSONのオブジェクトに対応したユーティリティー関数を追加すれば戻り値の処理も簡単簡単。あとは実務に合わせて必用なものを作れば、すんなり導入できるかなー。