解决第 1 点很容易。创建一个实现ServletContextListener 的类,并在contextInitialized 方法中创建Uber 的实例。
第 2 点不可能。服务器不允许向您提供有关它创建的 Servlet 实例的信息。获取这些的方法ServletContext#getServlet 已弃用。此外,应用服务器可以使用Servlet 的单个实例或多个实例,服务器将在运行时决定行为。
由于我们不完全了解您了解Servlets 实例的目的以及如何处理它们,因此我们无法提供更多帮助。
不过,在第 1 点中,由于您创建了 Uber 的实例,您可以将其作为属性存储在 ServletContext 中,然后使用 HttpServletRequest#getServletContext 在每个 servlet 中检索它。
根据您的评论,您似乎想要/需要实现Front Controller。为此,最好使用一个单独的 servlet 来完成这项工作,并创建真正处理请求的类。与其重新发明轮子,我建议您使用已经实现此功能的框架,如 JSF 或 Spring MVC。如果您仍想/需要自己实现该模式,请查看here。
这就是你的(奇怪和不推荐)设计的样子(基于Jozef's comment:
@WebListener
public class AppListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent e) {
Uber uber = new Uber();
/* configure uber */
//store it in ServletContext
e.getServletContext().setAttribute("uber", uber);
}
@Override
public void contextDestroyed(ServletContextEvent e) {
//...
}
}
然后在一个 servlet 中,将其注册到 Uber 的实例中:
@WebServlet(value="/myServlet", name="myServlet")
public class MyServlet extends HttpServlet {
@Override
public void init(ServletConfig config) {
Uber uber = (Uber)config.getServletContext().getAttribute("uber");
uber.registerServlet("myServlet", this);
}
//more code...
}
不过,我不喜欢其他类需要了解您的 Servlet 的想法。