むしろ一昨日参ります。
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 が返ってくるかどうかで簡易入力チェックとしても使えますね。
たぐ - webobjects
(-1)