参考地址:http://blog.sina.com.cn/s/blog_7c60fac90100qq2r.html
1、在tomcat4.1之后的版本中默认开启了标签缓冲池(websphere和weblogic并不会这么做),所以执行完标签后并不会执行release()方法(_jspDestroy()时才释放),也就是说同一个jsp页面自定义标签不管使用多少次只会存在一个实例,但也并不是每一个标签都会为其创建一个缓冲池,要根据参数来判断,例如:
<cc:UserInfoTag user=”…” />
<cc:UserInfoTag />
上面例子中由于参数不同就会创建两个标签缓冲池。
这个问题可以通过设定tomcat的配置文件加以解决:
在%tomcat%\conf\web.xml加入enablePooling参数,并设置为false(不缓存自定义标签)。
<init-param>
<param-name>enablePooling</param-name>
<param-value>false</param-value>
</init-param>
然后清空%tomcat%\conf\目录。
1,初始化实例:创建标签实例,调用所有的设置方法(setPageContext,setParent方法和所有属性的设置方法)来初始化实例。
2,调用doStartTag()方法将实例变量设为仅在当前调用的有效值。如果该方法正在处理元素的标签体,就会调用doEndTag方法。
3,标签实例被重用,如果属性有不同的值则调用对应的设置方法,重复2的操作。只有在具有相同属性集合时,标签处理器才将实例重用。
4,使用release方法让标签处理器释放内部占有资源。
注意:
* 为"属性"提供默认值。
*由于容器缓存标签处理器类实例,重复使用缓存的标签处理类实例。
所以在改变类变量后,后面使用该类变量也会受影响,要注意并发访问的问题。
所以,要每次重设调用的状态。最佳地点是doStartTag方法中。
* 标签在调用期间绝不会调用release();
*不要在setBodyContent方法和doInitBody方法中使用BodyContent对象,只用于获取该对象和做准备工作。
*对于实现BodyTag接口的自定义标签,同时使用空标签和不为空的标签,那就会抛出异常。因为空标签不会调用一些方法。
标签的静态引用与动态引用:
静态引用:通过web.xml声明一个静态引用。
动态引用:通过在JSP页面中直接加入<%@ taglib uri="/WEB-INF/lib/DateTagLib.tld" prefix="abc"%>指令:
静态引用和动态引用的比较:
静态引用:如果标签库的描述文件路径改变,或者在web.xml添加更多的标签库描述文件,则需要停止服务器。
动态引用:在JSP页面直接声明标签库文件的实际位置,在JSP运行的时候进行解析。无需修改web.xml。
如果为了防止标签库的位置变动导致需要修改大量的页面taglib指令的 uri,可以将引用这些标签库的JSP单独放到一个页面,其他的JSP页面包含此JSP即可。