【问题标题】:how to prevent jsp tags from being reused after being classloaded如何防止jsp标签被类加载后被重用
【发布时间】:2011-01-29 16:25:19
【问题描述】:

我有一个问题,标签文件中的某些属性在下次使用该标签时仍然存在。

我认为这是因为 Tag 类正在被类加载,然后每次调用都会重用同一个实例。因此,我在以后的调用中未设置的属性不会像我期望的那样为空,并且包含陈旧的值!

我希望这种情况不再发生。有谁知道在 tomcat 6 中控制的是什么设置?

【问题讨论】:

  • 你能举个例子吗?例如,一个最小的失败测试用例?
  • 这个例子意味着什么?我的 tomcat 配置 + jsp + 自定义标签?似乎尺寸令人望而却步

标签: java tomcat jsp-tags


【解决方案1】:

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),所以我认为这是最安全的选择。

【讨论】:

  • 您提到的保证不仅与Tomcat有关,而且与所有servlet容器有关(您链接的javadoc是规范的一部分)
【解决方案2】:

您需要在调用之间清除标签的状态。你应该在你的类的doEndTag() 方法中这样做,就在返回之前。此时您应该将所有状态变量设置为null

【讨论】:

  • 你能给我指出一个 javadoc 或者说我需要这样做的东西吗?这是常态而不是例外,这似乎有点疯狂
  • 我发现的一件事是特定于 Apache Tomcat 的实现,但无论如何,这里是:tomcat.apache.org/tomcat-5.5-doc/jasper-howto.html
  • 罗兰,你可能在正确的轨道上。我试试那个设置,看看它是否能解决问题
【解决方案3】:

其实每次只创建一个标签实例。也许你声明了属性static

【讨论】:

    【解决方案4】:

    可能有点晚了,但我遇到了同样的问题。当我将具有空值的标记属性设置为值时,它会引发。更改值不会提供任何错误,只会提供设置。

    所以我认为标签重用的实现会记住在标签完成工作后设置了哪些属性并取消设置这些属性。如果您在标签代码中设置该属性,则标签池不知道重置 taht attrbiute 并保持其值。

    不确定这是不是真的,但它符合我的观察

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-02-13
      • 2020-04-19
      • 2020-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多