【问题标题】:JSP tag lifecycleJSP 标记生命周期
【发布时间】:2010-10-11 14:12:14
【问题描述】:

我刚刚在我的代码中引入了一个错误,因为我似乎误解了 jsp 标签的生命周期。

该标签在出现错误之前是这样工作的: 我将一些集合作为属性传递给标签,并将其显示为表格。该集合已从控制器传递到 JSP。

错误之后: 我删除了设置集合的属性。相反,我在标签中检查集合是否为空,然后从请求中按名称获取它(使用命名约定)。

没想到的是: 在最初在标签中设置集合之后,它在后续执行中永远不会变为 null!它仍然被定义为 TLD 中的非必需属性。

预计标签在两次执行之间不会保留以前的值。

【问题讨论】:

  • 属性的作用域是什么?

标签: jsp jsp-tags lifecycle


【解决方案1】:

您自己回答了这个问题 - 它是汇总的。请参阅 tag tutorial 了解在 java 实现中要实现的内容,以及从那里链接的页面,其中包含 invocation sequence

ATag t = new ATag();
t.setPageContext(...);
t.setParent(...);
t.setAttribute1(value1);
t.setAttribute2(value2);
t.doStartTag();
t.doEndTag();
t.release();

也就是说,按照 API 的要求在 doEndTag() 中重新初始化您的标签实例。 (由 Julien Kronegg 更改评论,谢谢)

请注意,池化可能依赖于容器,但非常合法(并且,由于 API 设置,可能在任何地方都进行)。

【讨论】:

    【解决方案2】:

    简短的回答: 您不应该自己编写属性属性。这样一来,您就将清理国家作为您的责任。

    对于更长的答案,JSP 2.0 Spec 规定以下内容(第 2-51 页):

    • 为特定标签出现的所有指定属性调用设置器
    • 省略属性调用设置器(保持默认值不变,在您的情况下,内部状态为非法值)
    • 标签处理程序只能被具有相同的一组指定属性的事件重复使用

    这三点共同保证属性属性始终正确初始化,同时仍保留默认值(在构造函数或属性的声明中定义)。作为回报,它仅在只有容器操作属性属性(通过调用设置器)的假设下才有效。

    为了完整起见:

    • release() 不应用于重置标签处理程序调用之间的内部状态。它只保证在 GC 之前被调用,并且应该用于释放长期资源。
    • 如果要初始化doStartTag()中的实例变量,注意不要覆盖属性,因为此时容器已经调用了setter。
    • doEndTag() 应该可以安全地用于初始化,因为在异常情况下绝不应重复使用标记(参见第 2-54 页 [2])

    【讨论】:

      【解决方案3】:

      JSP 1.2 规范添加了 TryCatchFinally 接口。 http://docs.oracle.com/javaee/1.4/api/javax/servlet/jsp/tagext/TryCatchFinally.html

      所以看起来你应该在 doStartTag() 方法中分配资源并在 doFinally() 方法中进行清理。

      【讨论】:

        【解决方案4】:

        所以答案是: 标签被汇集到魔法池中,并在执行之间重复使用。标签规范说:

        “不应设置未指定的属性/属性(使用 setter 方法)。”

        【讨论】:

          【解决方案5】:

          对 Tomcat 6 的观察表明 release() 仅在容器关闭时调用。标记处理程序实例成员应在 doEndTag() 中清除实例状态。来自 api 文档:

          “必须重置与此实例关联的所有实例状态。”

          TagSupport.doEndTag()

          【讨论】:

            【解决方案6】:

            释放方式是JSP使用完标签的时间段,用来让标签释放。

            【讨论】:

              猜你喜欢
              • 2013-02-27
              • 1970-01-01
              • 1970-01-01
              • 2016-10-05
              • 2013-04-06
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多