[Seasar-user:3644] Re: S2JSF validatorについて

O.Goto [E-MAIL ADDRESS DELETED]
2006年 5月 18日 (木) 19:18:05 JST


後藤です。

> 
> > > <select><textarea>のバリデータのほうはよろしくお願いします。
> > 
> > すいません、selectの件は、私の勘違いでした。
> > 
> > public void addChild(TagProcessor child) {
> >  if(child instanceof TextProcessor
> >      || getProperty(JsfConstants.ITEMS_ATTR != null)) {
> >      return;
> >  }
> >  super.addChild(child);
> > }
> > 
> > のif文を修正して、
> > 
> >  if(child instanceof TextProcessor
> >      || ((!(child instanceof ValidatorProcessor)) &&
> > getProperty(JsfConstants.ITEMS_ATTR != null))) {
> > 
> > 
> > のようにするとValidatorを追加することは可能になります。
> > ただしValidatorの方ではvalueが配列でくる場合の考慮や
> > primitive型へのconvertなどが必要です。
> > 
> 今日にでも試してみたいと思います。
> 
<select>の方はこの修正でValidatorが追加できました。ありがとうございます。

valueがnullでもvalidateを呼ぶというのは、とりあえず
org.seasar.jsf.component.htmlの各クラスを継承して
public void validate(FacesContext context)
をオーバーライドして解決しました。
公式にサポートがあればそちらに乗り換えようと思います。

> > 
> > <textarea>の問題も似たような問題のようで
> > デフォルトのテキストの一部として解釈されて
> > 無視されてしまうようです。
> > 
で、<textarea>も同じように修正してみたのですが、こちらはダメでした。
HTMLとしてパースしているので、<textarea>の子要素はPCDATAとして処理され、
TagProcessorHandler#startElement()ではなくTagProcessorHandler#characters()で処理されてしまうのですね。

私が思いつく解決方法としては、

1)<textarea>の子要素をPCDATAに加えて<span>も追加した改変DTDでパースする。
2)TagProcessorHandler#characters()でpeekProcessor()の戻りがInputTextareaProcessorの時に
textがバリデータかどうかチェックしてバリデータならValidatorProcessorを作成してaddChild()する。

1)についてはCyberNeko HTML Parserについてまだわかっていないので、できるかどうかわかりません。
CyberNeko HTML Parserを使わなければできると思いますが。
できるとすれば簡単な解決方法だと思います。

2)についてはちょっとスマートじゃないなって思います。



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