java的新手,这个问题与典型的java工作流不同,需要来自非常有经验的架构师的帮助,来自node.js背景,尝试实现基于我已经实现的一些设计模式的架构node.js和PHP以及一些前端语言(包括Java Swing),我期待为Java Servlets实现相同的功能。
我理解在Servlet中,doGet,doPost等是请求的入口点,并且实例化servlet的单个实例,并通过多线程同时重用所有传入请求。
对于这些设计模式(另一个主题,需要它自己的线程)才能工作我需要有一个超级级访问来获取这些servlet实例并将我的actor设置为代理/侦听器。
我已经读过servlet在第一个请求之后被实例化或者直接加载容器,所以为了实现这个,我需要在启动时加载它们以便我可以对它们执行操作
同样,这个问题是不同的,可能需要进行一些深入理解的讨论,以帮助我们交换关于彼此世界的事情。
简而言之,我需要以下两件事来使它发挥作用。
答案 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的类的想法。