访问 Servlet 的运行实例

0 java servlets

java新手,这个问题与典型的java工作流程不同,需要非常有经验的架构师的一些帮助,来自node.js背景,试图基于我已经在node.js中实现的一些设计模式来实现一个架构和 PHP 以及一些前端语言(包括 Java Swing),我期待为 Java Servlet 实现相同的功能。

我知道在 Servlet 中 doGet、doPost 等是请求的入口点,并且通过多线程对所有传入请求同时实例化和重用 servlet 的单个实例。

为了让这些设计模式(另一个主题,需要它自己的线程)工作,我需要有一个超级级别的访问权限来获取这些 servlet 实例并将我的角色设置为代表/侦听器。

我已经读到 servlet 要么在第一个请求之后实例化,要么直接与容器一起加载,因此要实现这一点,我需要在启动时加载它们,以便我可以对它们执行操作。

同样,这个问题是不同的,可能需要进行一些讨论才能深入了解,以帮助我们交换有关彼此世界的事物。

简而言之,我需要以下两件事才能使其工作。

  1. 一种定义我自己的类(假设 Uber)以在容器加载时加载它的方法。
  2. Uber 类然后能够获得对加载的 servlet 的引用,或者 servlet 可以联系 Uber

Lui*_*oza 5

解决第 1 点很容易。创建一个实现ServletContextListener并在方法中contextInitialized创建您的实例的类Uber

第2点是不可能的。不允许服务器向您提供有关它创建的 Servlet 实例的信息。ServletContext#getServlet不推荐使用获得这些的方法。此外,应用程序服务器可能使用 的单个实例或多个实例Servlet,服务器将在运行时决定行为。

由于我们不完全了解您了解Servlets实例的目的以及如何处理它们,因此我们无法提供更多帮助。

尽管如此,在第 1 点中,由于您创建了 的实例Uber,您可以将其作为属性存储在 中ServletContext,然后在每个 servlet 中使用 检索它HttpServletRequest#getServletContext


从您的评论来看,您似乎想要/需要实现Front Controller。为此,最好使用一个单独的 servlet 来完成这项工作并创建将完成处理请求的真正工作的类。我建议您不要重新发明轮子,而是使用已经实现了这一点的框架,例如 JSF 或 Spring MVC。如果您仍然想要/需要自己实现该模式,请查看这里

这就是您的(奇怪且不值得推荐的)设计的样子(基于Jozef 的评论

@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) {
        //...
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在 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...
}
Run Code Online (Sandbox Code Playgroud)

不过,我不喜欢另一个类需要了解您的 Servlet 的想法。