使用Tomcat 5.5,如何以编程方式找到特定的servlet实例或添加新的映射?

问题描述

| 我知道通常不会这样做,而且我在网上发现了许多该问题的实例,并给出了以下答案:“如果您需要这样做,您的设计是错误的。”让我解释一下目标。 我有一个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
类,从而使您的测试前纯净。     

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...