[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 メーリングリストの案内