寫struts的html標(biāo)記的人不知道是不是對(duì)html標(biāo)記不熟,寫出來(lái)的標(biāo)記怎么怪里怪氣的,id標(biāo)記被用來(lái)綁定bean了,我還以為不支持html的id屬性了,不小心看到org.apache.struts.taglib.html.BaseHandlerTag的prepareStyles()方法里面,居然赫然寫著:
if (styleId != null) {
styles.append(" id=\"");
styles.append(getStyleId());
styles.append("\"");
}
原來(lái)要用styleId屬性來(lái)定義html的id屬性,不看源碼你敢這么猜嗎,怎么看styleId都象是個(gè)樣式有關(guān)的屬性嘛,要定義html的id屬性,如果不能用id至少也應(yīng)該叫HTMLID或者tagId之類的名字嘛。ok,源碼都看了,那我們用styleId也成,可是看看radio標(biāo)記就實(shí)在是笨了:
public int doAfterBody() throws JspException {
if (this.bodyContent != null) {
String value = this.bodyContent.getString().trim();
if (value.length() > 0) {
this.text = value;
}
}
return (SKIP_BODY);
}
你說(shuō)我把文字括到<html:radio>text</html:radio>標(biāo)記中間為的是什么?當(dāng)然這個(gè)文字要和radio綁定啦。可是上面的代碼居然直接把文字往生成的<input type="radio"...>標(biāo)記后面一丟了事,有這么不負(fù)責(zé)的嘛?
還好咱java和html都還懂一點(diǎn)。自己寫個(gè)類:
package com.reuse.common.web.tag;
import javax.servlet.jsp.JspException;
public class RadioTag extends org.apache.struts.taglib.html.RadioTag{
public int doAfterBody() throws JspException {
if (this.bodyContent != null) {
String value = this.bodyContent.getString().trim();
if (value.length() > 0) {
this.text = "<label for=\""+getStyleId()+"\" "+
prepareEventHandlers()+
prepareStyles().replaceAll(" id=\""+getStyleId()+"\"","")+
">"+value+"</label>";
}
}
super.setStyleId(null);
return (SKIP_BODY);
}
static int idCount=0;
public int doStartTag() throws JspException {
if (super.getStyleId() == null){
super.setStyleId("RadioTag_"+ ++idCount);
}
return super.doStartTag();
}
}
然后再在WEB-INF下面找到struts-html.tld,把
<tagclass>org.apache.struts.taglib.html.RadioTag</tagclass>
改為
<tagclass>myPackage.RadioTag</tagclass>
這下整個(gè)世界都清涼多了。回家過(guò)五一了,下次再對(duì)checkbox開刀吧
struts 的checkbox標(biāo)記的增強(qiáng) |
五一過(guò)完,checkbox也開了刀了:
package com.reuse.common.web.tag;
import javax.servlet.jsp.JspException;
public class CheckboxTag
extends org.apache.struts.taglib.html.CheckboxTag
{
public int doAfterBody() throws JspException {
if (this.bodyContent != null) {
String value = this.bodyContent.getString().trim();
if (value.length() > 0) {
this.text = "<label for=\""+getStyleId()+"\" "+
prepareEventHandlers()+
prepareStyles().replaceAll(" id=\""+getStyleId()+"\"","")+
">"+value+"</label>";
}
}
super.setStyleId(null);
return (SKIP_BODY);
}
static int idCount=0;
public int doStartTag() throws JspException {
if (super.getStyleId() == null){
super.setStyleId("CheckBoxTag_"+ ++idCount);
}
return super.doStartTag();
}
}