我们再来看一看效果:
好像是没什么区别!我们再查看一下源代码,发现执行完标签后,后面的代码全都没有执行!
- doStartTag()方法使用的是SKIP_BODY和EVAL_BODY_INCLUDE这两个变量,判断是否执行标签体的内容。
- doEndTag()方法使用的是SKIP_PAGE和EVAL_PAGE这两个变量,判断是否执行剩下页面的内容
- 控制JSP页面内容重复执行和修改JSP页面内容输出后面会有!
tld文件详细说明
首先我们来看一下tld文件当前用到的内容吧!
<tlib-version>1.0</tlib-version> <short-name>myshortname</short-name> <uri>http://mycompany.com</uri> <tag> <name></name> <tag-class></tag-class> <body-content></body-content> </tag>
- 我们一个一个来看:
- shortname推荐使用prefix
- uri就是引入这个标签库使用的uri
- name为标签名
- tagclass为实现类
- bodycontent为标签体的限制,它有4个值: EMPTY【不允许有标签体】,JSP【允许有JSP代码】 ,scriptless【不允许有脚本代码(也就是<%%>),允许有EL表达式,文本,JSP行为】 , tagdepentend【标签体内的JSP代码不会被解析,直接输出文本】
TagSupport类
大部分时候我们都不需要实现Tag接口来编写自定义标签,TagSupport是Tag的一个模板类,实现了pageContext,parent的getter、setter方法以及一些其他的功能。我们要做的就是重写doStartTag()和doEndTag()方法
- 下面我们就来简单使用一下吧:
- 继承TagSupport类,重写doStartTag()方法,比直接实现Tag接口简洁很多!
public class Demo1 extends TagSupport { @Override public int doStartTag() throws JspException { //获取到request对象 HttpServletRequest httpServletRequest = (HttpServletRequest) pageContext.getRequest(); String method = httpServletRequest.getMethod(); JspWriter jspWriter = pageContext.getOut(); try { jspWriter.write(method); } catch (IOException e) { e.printStackTrace(); } return 0; } }
在tld文件中描述一把:
<tag> <name>showMethod</name> <tag-class>tag.Demo1</tag-class> <body-content>empty</body-content> </tag>
效果:
带属性的标签
上面我们编写的自定义标签都没有附带属性的,我们在使用core标签库的时候,标签一般都带有属性。
其实JSTL标签库的原理就是自定义标签,把自定义标签搞明白了,对JSTL标签库的使用就有更好的理解了!
- 想要自定义标签带有属性也非常简单,只要在标签处理器类上加一个成员变量和setter、getter(),再在tld文件中描述下该属性即可!它的原理是这样的:当标签使用到属性的时候,引擎就会调用它的setter()方法
- 下面我想要完成的功能是:使用标签的人,传入一个字符串格式就可以显示想要的格式日期
- 编写标签处理器类,增加一个成员变量以及对应的setter、getter方法
public class Demo1 extends TagSupport { //创建成员对象,对应的setter、getter方法 private String format = null; @Override public int doStartTag() throws JspException { //创建日期格式化对象 SimpleDateFormat simpleDateFormat = new SimpleDateFormat(format); //格式化日期并向浏览器输出 try { pageContext.getOut().write(simpleDateFormat.format(new Date())); } catch (IOException e) { e.printStackTrace(); } return 0; } public String getFormat() { return format; } public void setFormat(String format) { this.format = format; }