[Seasar-user:16610] [Teeda]"null"文字列を入力したらPageクラスで"null"(文字列)として受け取りたい

[E-MAIL ADDRESS DELETED] [E-MAIL ADDRESS DELETED]
2009年 1月 7日 (水) 18:46:46 JST


お世話になっております。
平田と申します。

teedaで、入力フォームに "null"(文字列) を入力→submitした際に
Pageクラスの該当フィールドに "null"(文字列) ではなく、
null(オブジェクト)がバインディングされてしまう件を
IEで限定的に回避したいと考えています。

理由としては、
入力フォームに"null"(文字列)が入力された場合は、
"null"(文字列)入力されたことをサーバサイドで知りたいためです。
(未入力の場合もnull(オブジェクト)がバインディングされる為)

下記対策を行った場合、
フィルタでServletRequestを変更することになりますので、
フィルタ実行順番をs2filterの前に行うべきか、
各種フィルタの最後に実行すべきかでフレームワーク的に
何らかの影響がないかを特に懸念しています。

また、本件解決手段としてもっとよい方法があれば
ご教示いただけると助かります。


対策内容詳細は以下の通りです。

まず、teedaにおいて、ValueBindingでnull(オブジェクト)が
セットされるコアロジックは以下の部分であると認識しています。

・ServletRequestParameterMap#getAttribute
  request.getParameter(key)の返却値が"null"(文字列)の場合、
  ""(空文字)を返却する。

・UIInput#setValue(Object value)
  引数値=""(空文字)の場合、null(オブジェクト)をセットする。

そして、

(1)seasar/teedaソース内で、"null"(文字列)を意識しているロジックは
  ServletRequestParameterMap#getAttributeのみ。

(2)ServletRequestParameterMap#getAttributeの"null"(文字列)→""(空文字)変換は
  もともとはブラウザ間で挙動が異なるために実装された。(Seasar-user:10928)

上記理由から対策を以下のように考えています。

//-----------------------------
// 対策内容
//-----------------------------
(1)新規フィルタ(TestFilter)追加
  FilterChain#doFilterに渡すrequestオブジェクトを下記ラッパークラスに変更。

(2)HttpServletRequestWrapperを継承したラッパークラス(TestRequestWrapper)追加。
  ServletRequestWrapper#getParameter(name)をオーバーライドし、
  super.getParameter(key)の返却値="null"(文字列) の場合、
  別の値(例ではとりあえず"NULL"としている)を返却する。
  (ServletRequestParameterMap#getAttributeの変換ロジックを通らないようにしたい)

■フィルタ(TestFilter)
public void doFilter(ServletRequest request, ServletResponse response,
        FilterChain chain) throws IOException, ServletException {

    // RequestWrapper作成
    TestRequestWrapper requestWrapper = new TestRequestWrapper(
            (HttpServletRequest) request);

    // 後続Filter呼出
    chain.doFilter(requestWrapper, response);
}

■ラッパークラス(TestRequestWrapper)
@Override
public String getParameter(String name) {
    String value = super.getParameter(name);
    if (value != null && value.equals("null")) {
        return "NULL";
    }
    return value;
}

#teeda-html-sampleを使用して動作確認を行ったところ、
#サーバサイドではnull(オブジェクト)ではなく、
#指定した文字列(今回は"NULL")が取得される所までは確認済。

■動作環境
・IE6
・s2-framework-2.4.18
・s2-extension-2.4.18
・teeda-core-1.0.11-SP1
・teeda-extensionは使用していない
(なるべくseasar/teedaのバージョンアップは行わない前提)

以上、よろしくお願いいたします。


Seasar-user メーリングリストの案内