Java 访问正在运行的servlet实例

Java 访问正在运行的servlet实例,java,servlets,Java,Servlets,java新手,这个问题与典型的java工作流不同,需要非常有经验的架构师的帮助,他们来自node.js背景,试图基于我已经在node.js和PHP以及一些前端语言(包括java Swing)中实现的一些设计模式来实现一个架构我期待着为Java servlet实现同样的功能 我知道servlet doGet、doPost等是请求的入口点,servlet的单个实例被实例化,并通过多线程并发地用于所有传入请求 为了使这些设计模式(另一个主题,需要它自己的线程)能够工作,我需要有一个uber级别的访问权

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

我知道servlet doGet、doPost等是请求的入口点,servlet的单个实例被实例化,并通过多线程并发地用于所有传入请求

为了使这些设计模式(另一个主题,需要它自己的线程)能够工作,我需要有一个uber级别的访问权限来获取这些servlet实例,并将我的参与者设置为代理/侦听器

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

同样,这个问题是不同的,可能需要一些讨论来深入理解,以帮助我们交换关于彼此世界的东西

简言之,我需要以下两件事来让它工作

  • 一种定义我自己的类(比方说Uber)的方法,在容器加载时将其加载
  • 然后,Uber类可以获得加载的servlet的引用,或者servlet可以联系Uber

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

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

    由于我们不清楚您了解
    Servlet
    s实例的目的以及如何处理它们,因此我们无法提供更多帮助

    不过,在第1点中,由于创建了
    Uber
    的实例,因此可以将其作为属性存储在
    ServletContext
    中,然后使用在每个servlet中检索它


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

    这就是您的(古怪且不推荐的)设计的样子(基于:

    然后在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的想法。

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

    第2点不可能。不允许服务器向您提供有关其创建的Servlet实例的信息。获取这些实例的方法已被弃用。此外,应用程序服务器可能使用一个或多个
    Servlet
    实例,服务器将在运行时决定其行为

    由于我们不清楚您了解
    Servlet
    s实例的目的以及如何处理它们,因此我们无法提供更多帮助

    不过,在第1点中,由于创建了
    Uber
    的实例,因此可以将其作为属性存储在
    ServletContext
    中,然后使用在每个servlet中检索它


    从您的评论来看,您似乎想要/需要实现。为此,最好使用一个servlet来完成这项工作,并创建类来完成处理请求的真正工作。我建议您使用一个已经实现了这项工作的框架,如JSF或Spring MVC。如果您仍然想要/需要自己实现模式,请检查

    这就是您的(古怪且不推荐的)设计的样子(基于:

    然后在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的想法。

    感谢您解决了#1,对于#2,重点是将Servlet基本上用作路由器,它们拦截请求,然后将
    请求
    响应
    委托给
    优步
    (实际上是一组设计模式类)简单的servlet需要知道<代码> uber < /> >和<代码> uber 需要知道servlet才能相互交谈,并且我理解应用服务器可以使用单个实例或多个实际阻塞我的实例。如果您对这些servlet的源代码有控制,我会考虑使用观察者模式。例如,将
    Uber
    类存储到servlet上下文中(如Luiggi所述),然后每个servlet将自己注册到您的
    Uber
    类中。无论如何,您的设计在我看来有点过于复杂了。@JozefChocholacek您的想法很有趣,是的,我控制了这些servlet的源代码,所以现在我的问题是如何从servlet的构造函数扩展到我的
    Uber
    (根据Luiggi Mendoza的建议是Servlet CordExtListEnter),这将解决问题……(除此之外,我必须考虑servlet的多个实例)@user3610227您不能在serlvet的构造函数中执行此操作。请改用此方法。不过,我同意Jozef的观点,这种设计非常奇怪,应该避免,最好为所有非资源(js、css、图像或任何其他)请求使用一个控制器