2009-11-11
Tagは属性を自分で変更してはいけない(例えばS2SubmitTag)
SAStrutsのSubmitTagは以下のように実装されている
public int doEndTag() throws JspException {
if (clientValidate) {
FormTag formTag = (FormTag) findAncestorWithClass(this,
FormTag.class);
if (formTag == null) {
throw new JspTagException("FormTag not found.");
}
String actionFormName = formTag.getBeanName();
StringBuilder sb = new StringBuilder();
sb.append("var myForm = document.forms['").append(actionFormName)
.append("'];");
sb.append("myForm.id='").append(actionFormName).append("_").append(
property).append("'; ");
sb.append("return validate").append(
actionFormName.substring(0, 1).toUpperCase()).append(
actionFormName.substring(1)).append("_").append(property)
.append("(myForm);");
String originalOnclick = getOnclick();
if (originalOnclick == null
|| originalOnclick.startsWith("var myForm")) {
setOnclick(sb.toString());
} else {
setOnclick(originalOnclick + ";" + sb.toString());
}
}
return super.doEndTag();
}
setOnClick()で属性を書き換えて、super.doEndTag()の出力を書き換えているわけだが、こうするとJSPのTagキャッシュで問題が生じる。
たとえば、
<s:submit property="update" value="更新" onclick="hoge=1" clientValidate="true"/>
だった場合、これらの『指定された属性を含めたキーにして』JSPはタグをキャッシュに保存し、同じ属性が指定された場合にそのTagのインスタンスを再利用する。同じ属性が指定されている前提なので、当然『Tagのrelease()が呼ばれて再度属性が設定されるということはない』。つまり一度設定された属性はキャッシュに置かれたTagで使い回される。
このため、Tagの中で属性を書き換えるとおかしなことになってしまう。
上記の場合だと、1回目は期待通り onClick="hoge=1;var myForm = ....._update(myForm)" と出力されるが、
2回目は onClick="hoge=1;var myForm = .....;var myForm = ......;" となってしまう。つまり、属性を書き換えたために、その書き換えた内容に追加していく動作になってしまうわけだ。
これを回避するためには、タグの属性について不変であるようにするため、
public int doEndTag() throws JspException {
String originalOnclick = getOnclick();
....
if (originalOnclick == null) {
setOnclick(sb.toString());
} else {
setOnclick(originalOnclick + ";" + sb.toString());
}
}
int ret = super.doEndTag();
setOnClick(originalOnClick);
return ret;
}
こんな感じにしないといけない。
originalOnclick.startsWith("var myForm") の検査は冗長なので不要になる。
トラックバック - http://d.hatena.ne.jp/cleverware/20091111/1257903061
リンク元
- 164 http://www.google.co.jp/search?sourceid=navclient&hl=ja&ie=UTF-8&rlz=1T4GGLL_jaJP349JP349&q=AspectCustomizer+seasar2
- 162 http://ml.seasar.org/archives/seasar-user/2009-April/017272.html
- 149 http://www.google.co.jp/search?hl=ja&client=firefox-a&rls=org.mozilla:ja:official&hs=CFR&q=message+resource+struts.xml&btnG=検索&lr=lang_ja&aq=f&oq=
- 119 http://tech.x-neon.com/show/63/
- 98 http://www.google.co.jp/search?hl=ja&lr=lang_ja&tbs=lr:lang_1ja&q=java+MessageResources+bundle+get(+vm&aq=f&aqi=&aql=&oq=&gs_rfai=
- 78 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=18&ved=0CFoQFjAHOAo&url=http://d.hatena.ne.jp/cleverware/20090415/1239785049&ei=kuc0T8SoI6PkmAX-xKmPAg&usg=AFQjCNFxVU5A6KPGdrTrb0tbQ5Bun_r9xQ&sig2=5eCRDSI6P8DvG88UBZpyBQ
- 71 http://www.google.co.jp/search?q=Ognl&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:ja:official&hl=ja&client=firefox-a
- 59 http://www.google.co.jp/search?hl=ja&lr=lang_ja&client=firefox-a&rls=org.mozilla:ja:official&hs=BaY&ei=qwQCS6vNGYLo6gOXtNzpCg&sa=X&oi=spell&resnum=0&ct=result&cd=1&ved=0CBAQBSgA&q=aop+customizer&spell=1
- 42 http://www.google.com/search?hl=ja&lr=lang_ja&ie=UTF-8&oe=UTF-8&q=カスタマイザ+メソッド名&num=50
- 41 http://www.google.co.jp/url?sa=t&rct=j&q=aspectcustomizer&source=web&cd=2&ved=0CCwQFjAB&url=http://d.hatena.ne.jp/cleverware/20090426/1240726962&ei=HDq2Tq6TC8vAmQXiz5jdAw&usg=AFQjCNEJEj150e-4ahJl1yxUUe12oJqgLw&sig2=FLeGnpWMUF1YkvpaLNFKkA

