首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在Tomcat5.5中,如何以编程方式定位特定的servlet实例或添加新的映射?

在Tomcat5.5中,如何以编程方式定位特定的servlet实例或添加新的映射?
EN

Stack Overflow用户
提问于 2011-06-04 12:06:00
回答 2查看 445关注 0票数 4

我知道这通常不是这样做的,我在网络上找到了很多这个问题的例子,答案是:“如果你需要这样做,你的设计是错误的。”让我解释一下我的目标。

我有一个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类添加新的映射,这可能会创建新的实例。(?)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-06-06 13:35:27

您可以像创建任何其他类对象一样创建servlet实例。通过重写方法init(ServletConfig config)来获取servlet配置。并创建任意数量的servlet类实例,并在创建的所有实例上调用init(ServletConfig config)

票数 1
EN

Stack Overflow用户

发布于 2011-06-04 12:14:45

您已经了解到,您正在尝试的内容非常不寻常,远不是最佳实践,因此我不会深入讨论该主题的任何细节。话虽如此,如果您想在Tomcat中运行的MyServlet实例上多次调用MyServlet.init(),您可以子类MyServlet,覆盖doGet()doPost()方法,添加一个简单地调用this.init(); 1000次的循环,然后调用父类doGet()/doPost()。编辑WEB-INF/web.xml以使用您的子类代替MyServlet。然后,只需用web浏览器点击servlet,就会看到在正常提供页面之前,init()被调用了1000次。而且您根本没有修改原始的MyServlet类,从而保持了之前的测试的纯洁性。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6234618

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档