访问正在运行的Servlet实例

时间:2015-07-02 15:39:48

标签: java servlets

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

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

对于这些设计模式(另一个主题,需要它自己的线程)才能工作我需要有一个超级级访问来获取这些servlet实例并将我的actor设置为代理/侦听器。

我已经读过servlet在第一个请求之后被实例化或者直接加载容器,所以为了实现这个,我需要在启动时加载它们以便我可以对它们执行操作

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

简而言之,我需要以下两件事来使它发挥作用。

  1. 一种定义我自己的类的方法(让他们说优步)让它在装载容器时加载。
  2. Uber类然后能够引用加载的servlet或servlet可以联系Uber

1 个答案:

答案 0 :(得分:4)

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

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

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

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

根据您的评论,您似乎希望/需要实施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的类的想法。