jsp自定义标签——添加标签属性
通过标签属性控制标签展示的样式,这使其目的之一。
在[jsp自定义标签1] jsp自定义标签的处理过程
中介绍了最基础的自定义标签的开发流程。在此基础上我们添加自定义标签的属性:
第一步:调整tld文件,为标签定义属性名称和相应的参数。
<tag> <name>helloTag2</name> <tag-class>com.fox.mytag.HelloMyTag2</tag-class> <body-content>empty</body-content> <attribute> <name>fontColor</name> <required>false</required> </attribute> <attribute> <name>fontSize</name> <required>false</required> </attribute> </tag>
第二步:调整handler类,为属性字段添加set、get方法。
package com.fox.mytag; import java.io.IOException; import javax.servlet.jsp.JspException; import javax.servlet.jsp.JspWriter; import javax.servlet.jsp.tagext.TagSupport; /** * * @author huangfox * jsp自定义标签(标签属性) */ public class HelloMyTag2 extends TagSupport { private String fontSize = "14px" ; private String fontColor = "red" ; @Override public int doEndTag() throws JspException { JspWriter out = pageContext.getOut(); try { out.print("do End Tag "); } catch (IOException e) { e.printStackTrace(); } return super.doEndTag(); } @Override public int doStartTag() throws JspException { JspWriter out = pageContext.getOut(); try { out.print("<font color=\""+fontColor+"\" size=\""+fontSize+"\">hello!</font>"); } catch (IOException e) { e.printStackTrace(); } return super.doStartTag(); } public String getFontSize() { return fontSize; } public void setFontSize(String fontSize) { this.fontSize = fontSize; } public String getFontColor() { return fontColor; } public void setFontColor(String fontColor) { this.fontColor = fontColor; } }
第三步:使用标签
<f:helloTag2 fontColor="green" fontSize="30px"/>
------------------------------------------------------------------
自定义标签——添加标签体
要开发带标签体的标签,可实现BodyTag接口,也可从BodyTag接口的实现类BodyTagSupport继承,为简化开发,推荐从BodyTagSupport类继承开发。
编写标签对应的实现类时,需要重载BodyTagSupport类几个方法:
doStartTag(), setBodyContent(), doInitBody(), doAfterBody(), doEndTag(),
他们执行顺序如下:
doStartTag()→doInitBody()→setBodyContent()→doAfterBody()→doEndTag()
doStartTag()方法可返回EVAL_BODY_INCLUDE或SKIP_BODY,如果返回EVAL_BODY_ INCLUDE则继续执行;如果返回SKIP_BODY则接下来的doInitBody(),setBodyContent(), doAfterBody()三个方法不会被执行,而直接执行doEndTag()方法。
setBodyContent()方法用于设置标签体内容,如果在此之前要作一些初始化工作,则在doInitBody()方法中完成。标签体内容执行完后,会调用doAfterBody()方法,此方法可返回EVAL_BODY_TAG, SKIP_BODY,EVAL_PAGE或SKIP_PAGE。如果返回EVAL_BODY_TAG则会再次设置标签体内容,直到返回SKIP_BODY;如果返回EVAL_PAGE则标签体执行完后会继续执行JSP页面中接下来的部分;如果返回SKIP_PAGE,则JSP页面的后续内容将不再执行。
第一步:修改tld文件
<tag> <name>helloTag3</name> <tag-class>com.fox.mytag.HelloMyTag3</tag-class> <body-content>JSP</body-content> <attribute> <name>times</name> <required>true</required> </attribute> </tag>
第二步:调整handler class
package com.fox.mytag; import java.io.IOException; import javax.servlet.jsp.JspException; import javax.servlet.jsp.JspWriter; import javax.servlet.jsp.tagext.BodyTagSupport; public class HelloMyTag3 extends BodyTagSupport { private int times ; @Override public int doStartTag() throws JspException { JspWriter out = pageContext.getOut(); try { out.print("标签开始"); if(times<0) return SKIP_BODY ; else return EVAL_BODY_INCLUDE ; } catch (IOException e) { e.printStackTrace(); return SKIP_BODY ; } } // @Override public int doAfterBody() throws JspException { // JspWriter out = pageContext.getOut(); if (times>0) { times--; return EVAL_BODY_AGAIN; }else return SKIP_BODY ; } @Override public int doEndTag() throws JspException { JspWriter out = pageContext.getOut(); try { out.print("标签结束"); } catch (IOException e) { e.printStackTrace(); } return EVAL_PAGE ; } // public int getTimes() { return times; } public void setTimes(int times) { this.times = times; } }
第三步:使用标签
<f:helloTag3 times="5"> 这个就是标签体的内容。。。<br> </f:helloTag3>