DirectAction と QueryString。〜DirectAction.の2〜

 WebObjectsではなくHTTPの領分ですがQueryStringというのがあります。URIの最後の方によく見かける、“?”以下の“=”でペアになって“&”で区切られていたりする文字列の事で(←やたらと説明的)、ページ間で値をやり取りする為のモノです。一部の文字やマルチバイト文字をエンコードする必要がありますが、URIに引数などを仕込む事ができるので非常に便利です。
 非常に便利ですのでWebObjectsにもQueryStringを扱う仕組みが用意されています。そしてそれはDirect Actionを活用する為にもなくてはならないモノと言えましょう。

 HTTP経由でいろいろなサービスを利用する時に送る要求や問い合わせをHTTPリクエストと言ったりしますが、WebObjectsではそれをWORequestオブジェクトに変換して様々な場面で利用します。今回のQueryStringも、そんなWORequest経由で扱うモノの一つです。
 WORequestに用意してあるformValueForKeyメソッドを利用すると任意のキー名で渡された値を取得できます。WODirectActionでは request() というメソッドで利用中のWORequestオブジェクトにアクセスできるので request().formValueForKey("キー名") となります。例えば“key=aaa”といったQueryStringを受け取った場合、Direct Actionのメソッド内で

String aString = (String)request().formValueForKey("key");

 とすると aString の中身は aaa となります。ちなみに、formValueForKeyメソッドはObject型として返すのでString型にキャストしています。

 後はこの値を元に処理を行ったり、表示するコンポーネントへ渡したりすればよいわけなのですが、基本的にURIに埋め込まれた文字列で渡されて来ますから一発でStringとして取得したいし、場合によっては数値として、日付として取得したいです。Stringにキャストするくらいなら大して手間はかかりませんが、値を元にIntegerとかNSTimestampとか拵えるのは少し面倒です。
 予想通りそんなメソッドも用意されておりまして、

String aString = request().stringFormValueForKey("keyName");

 としたり、

Number aNumber = request().numericFormValueForKey("keyName", NSNumberFomatter);

 としたり、

NSTimestamp aTimestamp = request().dateFormValueForKey("keyName", NSTimestampFormatter);

 としたりできます(←下二つのformatterは“WOString.”辺りを参照のこと)。同じキー名で複数の値(←URI?key=aaa&key=bbb&key=ccc とか)を受け取った場合用に String で格納した NSArray として取得する

NSArray aArray = request().formValuesForKey("key");

 なんてのもあります。
 全てのメソッドが値が無かったり、“formatter”で整形できなかった場合に null を返すので、null が返ってくるかどうかで簡易入力チェックとしても使えますね。