问题描述
|
我知道通常不会这样做,而且我在网上发现了许多该问题的实例,并给出了以下答案:“如果您需要这样做,您的设计是错误的。”让我解释一下目标。
我有一个Web应用程序,该Web应用程序在某个站点上以某种方式导致重复调用了一个servlet的init()方法。我不知道这是怎么发生的,我无法重复。但是,从二进制堆转储(由内存不足异常引起)来看,从堆上的对象很明显,特定的servlet的init()方法被调用了大约10,000次,因为这是唯一的放置这些对象后,一个对象的10,000+个实例应该最多包含一个实例。
由于我无法重现在此站点上发生的事情,因此,我希望最好通过JSP文件在此Servlet上强制多次调用init(),因此可以在应用修订之前和之后进行测试。从理论上讲,测试“ after”情况很容易,因为我可以更改代码以(例如)将该servlet粘贴到上下文中,这样我就可以获取它并反复调用init()以证明该对象没有泄漏。但这并不能帮助我使用现有代码测试“之前”情况。
我不能在JSP中只是\“(new MyServlet())。init()\”。这会失败,因为使用空上下文创建了Servlet,并且无法初始化。在Tomcat 5.5中,似乎ServletContext.getServlets()始终返回空的Enumeration,而ServletContext.getServlet(String)始终返回null。
似乎最简单的测试方法是,我是否可以通过编程方式(最好是从JSP)以某种方式获取所讨论的servlet实例,或者以编程方式将新的映射添加到同一servlet类中,这可能会创建新的实例。 (?)
解决方法
您可以像创建任何其他类对象一样创建servlet实例。通过覆盖方法“ 0”来获取servlet配置。并根据需要创建Servlet类实例,并在所有创建的实例上调用
init(ServletConfig config)
。
, 您已经发现您尝试的内容与众不同,并且与最佳实践相去甚远,因此我不会在此主题上进行任何详细说明。话虽如此,如果您想在Tomcat中运行的MyServlet
实例上多次调用MyServlet.init()
,则可以子类ѭ3sub,重写doGet()
或doPost()
方法,添加一个简单地调用this.init();
1000次的循环,然后调用父类doGet()
/ doPost()
。编辑WEB-INF/web.xml
以使用子类代替in3ѭ。然后,只需使用您的Web浏览器访问servlet,然后在正常投放该页面之前,先查看12次调用了12次。而且您根本没有修改原始的MyServlet
类,从而使您的测试前纯净。