我遇到一个问题,标签文件中的某些属性会在下次使用标记时出现。
我认为这是因为正在对类进行类加载,然后为每次调用重用相同的实例。所以我在以后的调用中没有设置的属性不像我期望的那样是空的,并且包含陈旧的值!
我希望不再发生这种情况。有谁知道tomcat 6中的设置控制是什么?
答案 0 :(得分:7)
Tomcat 7.0使用标记池:
http://tomcat.apache.org/tomcat-7.0-doc/jasper-howto.html
JSP自定义标记池 - 现在可以合并和重用为JSP自定义标记实例化的java对象。这显着提高了使用自定义标记的JSP页面的性能。
该页面还说web.xml可以包含“enablePooling”选项,并且其默认值为true。
所以我想说禁用标记重用不是一个好主意,因为它会导致一些性能损失。
Tomcat 7.0保证标记类的状态在doStartTag()和doEndTag()之间保持不变:
http://tomcat.apache.org/tomcat-7.0-doc/jspapi/javax/servlet/jsp/tagext/Tag.html
可以在标记处理程序上调用doStartTag和doEndTag方法。 在这些调用之间,假定标记处理程序保持必须保留的状态
但同一段落也在括号内表示该对象应该在以下后保留其属性:
在doEndTag调用之后,标记处理程序可用于进一步调用(,并且预计它将保留其属性)。
所以我所做的就是在doEndTag()返回之前将所有局部变量重置为默认值。我没有找到关于如何实现Tomcat标记池和重用的解释(我猜是TagHandlerPool.java)所以我认为这是最安全的选择。
答案 1 :(得分:2)
您需要清除调用之间的标记状态。您应该在返回之前在班级的doEndTag()
方法中执行此操作。此时,您应将所有状态变量设置为null
。
答案 2 :(得分:1)
实际上,每次只创建一个标记实例。也许你宣布了属性static
?
答案 3 :(得分:1)
也许有点晚了,但我遇到了同样的问题。当我将具有空值的Tag属性设置为值时,它会引发。更改值不会提供任何错误,只会设置。
所以我认为标签重用的实现确实记住了哪些属性被设置并且在标签完成其工作之后取消设置。如果在标记代码中设置了该属性,则标记池不知道重置taht attrbiute并保持其值。
不确定这是否属实,但它符合我的观察