JSP自定义标签的页面解析生命周期及线程安全

本文探讨了JSP自定义标签在不同页面请求中共享同一实例的问题,并分析了其背后的原因。通过查看编译后的servlet代码,揭示了标签实例是如何从缓存池中获取并复用的。此外,还讨论了如何确保线程安全及标签内变量管理的最佳实践。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述:

使用JSP自定义标签时,发现标签内的私有变量在页面第一次请求之后就不会发生变化了。而且不同的页面同样的标签变量值不一样。

问题猜想:

原以为JSP自定义标签在JSP编译的时候会被new出来,但是看样子JSP在编译的时候用了缓存池来存放解析后的标签的对象。并且这个缓存池针对同一个页面是共享的。

问题原因跟踪:

查看JSP编译成的servlet代码,发现标签的实例果然不是new出来的,而是这么创建的:

com.xxx.tag.XXTag _jspx_th_xxx_005fxx_005f0 = (com.xxx.tag.XXTag) _005fjspx_005ftagPool_005xxx_005fxx_0026_005ftitle.get(com.xxx.tag.XXTag.class);

是从一个缓存池里取出来的,再往前跟踪缓存池的创建和销毁:

public void _jspInit() { .... _005fjspx_005ftagPool_005xxx_005fxx_0026_005ftitle = org.apache.jasper.runtime.TagHandlerPool.getTagHandlerPool(getServletConfig()); .... } public void _jspDestroy() { ..... _005fjspx_005ftagPool_005xxx_005fxx_0026_005ftitle.release(); ..... }

把当前servlet的config作为参数,得到了一个标签缓存池的实例,也就是说对于同一个servlet标签缓存池是共享的。证明了之前的猜想。

既然实例共享,那么很自然的就想到了tomcat是怎么做到线程安全的呢?

关于标签的线程安全可以参考下面的链接,不再赘述:

http://klcwt.iteye.com/blog/749652

结论:

虽然使用标签时可以不用担心线程安全,但是在使用标签内的属性变量时要特别小心,在标签解析完时要注意将一些不必要的属性变量重置为默认值,否则很容易“一劳永逸”。

P.s:JSP自定义标签生命周期http://blog.youkuaiyun.com/xuejianxinokok/archive/2010/06/29/5702155.aspx

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值