【问题标题】:Calling init() inside doget() method of servlet在 servlet 的 doget() 方法中调用 init()
【发布时间】:2012-07-16 12:44:53
【问题描述】:

请告知如果我在 servlet 的 doget() 方法中调用 init() 方法会发生什么。它会抛出异常吗?它会对 servlet 生命周期产生什么影响?

请指教。

【问题讨论】:

  • 永远不要这样做。它使服务器越过黑暗面并炸毁正在运行浏览器的机器,然后它会自行销毁。根据您的服务器和发送重要获取请求的浏览器所在的位置,它还可能导致跨大西洋海底通信电缆中断。

标签: jakarta-ee tomcat servlets


【解决方案1】:

很可能,init() 方法中的代码将执行。

init 方法没有什么特别之处,只是容器会在您的 servlet 投入使用之前调用它。您可以随时调用它。如果您的 init 方法更改了任何共享数据的值,那么您可能会遇到奇怪的问题。

我无法想象为什么有人必须在他们的 doGet 方法中调用 init

【讨论】:

    【解决方案2】:

    首先,如果您尝试从doGet() 调用init() 方法并看看会发生什么,您可以避免问这个问题。

    无论如何,Servlet Spec 2.3 说:

    提供了初始化,以便 servlet 可以读取持久性 配置数据,初始化昂贵的资源(例如 JDBC™ API 基于连接),并执行其他一次性活动。

    所以,您应该想知道在您当前的init() 方法中有多少一次性活动。调用该方法与调用不同的方法没有什么不同。我正在考虑一个场景,您的init() 方法唯一要做的就是从ServetConfig 的初始化参数初始化拥有的属性;在这种情况下,不会发生任何错误。

    但是,如果您的init() 方法执行的任何任务可能会改变 servlet 的内部状态,那么您就有机会面临奇怪的行为。

    如果您在 init() 方法中执行任何可能需要在 doGet() 中使用的任务,则将它们移至私有内部方法。

    【讨论】:

      【解决方案3】:

      如果你没有实现 init() 方法,几乎​​什么都不会发生。原因是继承的实现也是空的。您的 servlet 可能扩展了 HttpServlet,后者从 GenericServlet 继承了以下实现:

      public void init() throws ServletException {
          // NOOP by default
      }
      

      如果您有自己的实现,则执行您的实现中的代码。它是否引发异常 - 这取决于您编码的内容。

      如果您调用以 ServletConfig 作为参数的 init,则原始 ServletConfig 将被替换并调用 init()。我看不出您为什么要调用initinit(ServletConfig) 方法。方法供您在需要时覆盖,并由 servlet 容器调用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-12
        • 2015-06-02
        • 2011-08-18
        • 1970-01-01
        • 2012-01-31
        相关资源
        最近更新 更多