4

我知道通常不会这样做,并且我在网络上发现了许多有关此问题的实例,答案如下:“如果您需要这样做,您的设计就是错误的。” 让我解释一下我的目标。

我有一个 Web 应用程序,它在一个站点上以某种方式导致一个 servlet 的 init() 方法被重复调用。我不知道这是怎么发生的,我不能重复。但是,从二进制堆转储(由内存不足异常引起)中,从堆上的对象可以清楚地看出,特定 servlet 的 init() 方法被调用了大约 10,000 次,因为这是这些对象的唯一位置被创建并且有 10,000+ 个对象的实例应该不超过一个实例。

因为我无法重现在这个站点上发生的事情,所以我想在这个 servlet 上多次强制调用 init(),最好是通过 JSP 文件,这样我就可以在应用修复之前和之后进行测试。测试“之后”的情况在理论上很容易,因为我可以将代码更改为(例如)将这个 servlet 粘贴到上下文中,这样我就可以得到它并重复调用 init() 来证明这个对象没有泄漏。但这并不能帮助我用现有代码测试“之前”的情况。

我不能只在 JSP 中使用“(new MyServlet()).init()”。这会失败,因为 servlet 是使用空上下文创建的并且无法初始化。在 Tomcat 5.5 中,似乎 ServletContext.getServlets() 总是返回一个空枚举,而 ServletContext.getServlet(String) 总是返回 null。

似乎最简单的测试方法是我是否可以以某种方式以编程方式(最好是从 JSP)访问相关的 servlet 实例,或者以编程方式将新映射添加到可能创建新实例的同一个 servlet 类。(?)

4

2 回答 2

2

您已经发现您正在尝试的内容非常不同寻常,并且远非最佳实践,因此我不会详细介绍该主题。话虽如此,如果您想在 TomcatMyServlet.init()中运行的实例上多次调用,您可以子类化,覆盖or方法,添加一个简单调用1000 次的循环,然后调用父类/ 。编辑以使用您的子类代替. 然后只需使用您的 Web 浏览器点击 servlet 并在正常提供页面之前查看 1000 次调用。而且你根本没有修改原始类,保持你之前的测试纯粹。MyServletMyServletdoGet()doPost()this.init();doGet()doPost()WEB-INF/web.xmlMyServletinit()MyServlet

于 2011-06-04T04:14:44.760 回答
1

您可以像创建任何其他类对象一样创建 servlet 实例。通过覆盖方法来获取 servlet 配置init(ServletConfig config)。并根据需要创建 servlet 类实例,并调用init(ServletConfig config)所有创建的实例。

于 2011-06-06T05:35:27.010 回答