我知道这通常不是这样做的,我在网络上找到了很多这个问题的例子,答案是:“如果你需要这样做,你的设计是错误的。”让我解释一下我的目标。
我有一个web应用程序,它在一个站点上以某种方式导致一个servlet的init()方法被重复调用。我不知道这是怎么发生的,我也不能重复。但是,从二进制堆转储(由内存不足异常引起)可以很清楚地看出,堆上的对象调用了大约10,000次特定servlet的init()方法,因为这是创建这些对象的唯一位置,并且存在应该不超过一个实例的对象的10,000+实例。
因为我不能重现在这个站点上发生的事情,所以我想在这个servlet上强制调用init()多次,最好是通过JSP文件,这样我就可以在应用修复之前和之后进行测试。测试"after“用例在理论上很容易,因为我可以更改代码(例如)将这个servlet放入上下文中,这样我就可以获得它并反复调用init()来证明这个对象没有泄漏。但这并不能帮助我用现有代码测试“之前”的情况。
我不能只在MyServlet中使用"(new JSP ()).init()“。这会失败,因为servlet是使用空上下文创建的,并且无法初始化。在Tomcat5.5中,似乎ServletContext.getServlets()总是返回一个空的枚举,而ServletContext.getServlet(String)总是返回null。
这似乎是最简单的测试方法,如果我能以某种方式(最好是从JSP)获得对所讨论的servlet实例的访问,或者以编程方式向同一个servlet类添加新的映射,这可能会创建新的实例。(?)
发布于 2011-06-06 05:35:27
您可以像创建任何其他类对象一样创建servlet实例。通过重写方法init(ServletConfig config)
来获取servlet配置。并创建任意数量的servlet类实例,并在创建的所有实例上调用init(ServletConfig config)
。
发布于 2011-06-04 04:14:45
您已经了解到,您正在尝试的内容非常不寻常,远不是最佳实践,因此我不会深入讨论该主题的任何细节。话虽如此,如果您想在Tomcat中运行的MyServlet
实例上多次调用MyServlet.init()
,您可以子类MyServlet
,覆盖doGet()
或doPost()
方法,添加一个简单地调用this.init();
1000次的循环,然后调用父类doGet()
/doPost()
。编辑WEB-INF/web.xml
以使用您的子类代替MyServlet
。然后,只需用web浏览器点击servlet,就会看到在正常提供页面之前,init()
被调用了1000次。而且您根本没有修改原始的MyServlet
类,从而保持了之前的测试的纯洁性。
https://stackoverflow.com/questions/6234618
复制