分支主题
使用自定义标签就是实现JSTL并没有实现的功能,需要我们程序员自己实现
其实JSTL标签的原理就是自定义标签,只不过JSP对其进行了封装,我们学习了自定义标签,就更好地理解JSTL标签库了。
实现自定义标签步骤:
1、编写标签处理器类
2、在tld文件中描述标签处理器类
实现Tag、SupportTag接口的传统标签
传统标签的执行流程
1、创建标签处理器类实例
2、执行setPageContext()方法
3、调用setParent()方法
4、调用doStart()和doEnd()方法
5、直到Web容器销毁,标签处理器类才会从内存中释放
Tag接口定义的常量就是用来控制流程顺序的
SKIP_BODY
EVAL_BODY_INCLUDE
SKIP_PAGE
EVAL_PAGE
开发带属性的自定义标签
在标签处理器类中定义这个变量
给出对应的setter和getter方法即可
实现SimpleTag接口的简单标签
简单标签的执行顺序
1、调用setJspContext()方法,将代表JSP页面的pageContext对象交给标签处理器类
2、调用setParent()方法,将父标签处理器类的对象给当前处理标签类对象
3、如果设置了属性,那么调用setter方法,把属性值给标签处理器类
4、如果有标签体,调用setJspBody方法把代表标签体的JspFragment对象传递进来
控制流程顺序
通过调用JspFragment对象的invoke()即可控制流程顺序
不调用invoke()方法,则标签体内容不会显示在浏览器上
多次调用invoke()方法,则会循环输出
想要改变标签体的内容,那么先得到标签体内容,再输出【null的时候默认是输出给浏览器,使用StringWriter流,即可获取标签体的数据】
抛出异常则不执行页面剩下的代码
自定义标签之应用一:自定义防盗链标签
1、在JSP页面上判断是否为本站的URI
2、如果不是,跳转到相对应的页面,抛出异常【抛出异常剩下的页面就不会被执行了】
3、如果是,直接执行剩下的页面即可
自定义标签之应用二:自定义if标签
if标签实际是判断属性的值是否成立
成立则执行标签体的内容
不成立则不执行标签体的内容
自定义标签应用之三:自定义forEach标签
得到集合的元素,使用var字符串来保存
var字符串保存在PageContext域中,那么在外头使用EL表达式就可以获取具体的值
每遍历一个元素,就把var存放在PageContext域中,并执行一次标签体
如果是八大类型的数据,我们需要使用reflect包下的Array类,只要是数组,就可以用Colletion来遍历
动态属性DynamicAttribute接口
用一个Map集合来保存具体的属性值
在tld文件记得要设置为true