2007 年 3 月 16 日 23 時 58 分

Request パラメータの弱点


このアーカイブは同期化されません。 mixi の日記が更新されても、このアーカイブには反映されません。


Web アプリケーションでは、色々なフォームを扱う。
今まで作ってきたログインフォームもその 1 つだし、
他にもユーザ登録フォームや、検索フォーム等色々ある。

利用者がフォームに入力して送信したパラメータは、
Servlet の Request オブジェクトに格納される。
これを受け取った Model では、Request から値を取り出し、
その内容を調べ、値の妥当性を検証した上で処理を行う。

この処理にはある程度パターンがある。

例えば、登録系のフォームの場合は、
その内容をデータベースやファイルに永続化する。
また、検索系のフォームの場合は、
その内容を元にクエリを組み立てて検索を行う。

典型的なアクションの処理においては、
データベース操作用のクラスのインスタンスを作成し、
それにパラメータ値を引き渡して呼び出す。

この場合、Request をそのまま渡すのは設計上良くない。
Request は巨大なオブジェクトなので、
パラメータ以外にも色々な情報を持っているからだ。
それに、Request は、Servlet に依存したクラスなので、
処理モジュールが Servlet に依存する事態になってしまう。

となると、Request からパラメータを切り離すために、
Hashtable や独自クラスなどに値をコピーした後、
それを処理を行うロジックに渡すのが好ましい。

さて、Request から取り出すパラメータは、
全て文字列 (String) となっている。
これは、HTML フォームには型情報が存在しないからである。

しかしながら、アプリケーションにとって
あらゆる項目が String というのはあまりにも柔軟すぎる。

プログラミングでは、型が存在する。
その内容が、型の表現できる範囲に限定されることにより、
処理の見通しや効率が高くなるからである。

そのため、できれば日付を入力する入力ボックスは Date で、
年齢や金額を入力するボックスは int で、
チェックボックスは boolean で扱いたい。

しかしながら、それを行うためには、
「型変換」という面倒な処理が待っている。
これはキャストのような単純な作業ではない。
「文字列表現」から厳密型のインスタンスへの変換なのだ。

簡単に言うと、toString() の逆をやらなければならない。
文字列のパース。面倒そうなのが目に見えている。

実は Struts は上記のような処理を視野に入れており、
パラメータの切り離しと自動的な型変換を行う、
強力なサポート機能を持っている。

それが、ActionForm だ。



Copyright (c) 1994-2007 Project Loafer. All rights reserved.