对于java来说,这个问题不同于典型的java工作流,需要来自node.js背景的非常有经验的架构师的帮助,试图实现基于我已经用node.js和PHP实现的一些设计模式以及一些前端语言(包括Java )的体系结构,我期待着为Java实现同样的架构。
我理解在servlet中,doGet、doPost等是请求的入口点,一个servlet的单个实例被实例化,并通过多线程并发地重用所有传入请求。
对于这些设计模式(另一个主题,需要它自己的线程),我需要有一个uber级别的访问权限来获取这些servlet实例,并将我的参与者设置为委托/侦听器。
我读到servlet要么在第一个请求之后实例化,要么直接与容器一起加载,因此要实现这一点,我需要在启动时加载它们,以便对它们执行操作。
同样,这个问题是不同的,可能需要一些讨论,以深入了解,以帮助我们交换关于彼此世界的东西。
简而言之,我需要以下两件事情来使它发挥作用。
发布于 2015-07-02 15:44:57
解决第一点很容易。创建一个实现ServletContextListener的类,并在方法contextInitialized中创建Uber实例。
第二点是不可能的。服务器不允许向您提供有关它创建的Servlet实例的信息。不推荐获取这些信息的方法( ServletContext#getServlet )。此外,应用服务器可能使用一个或多个Servlet实例,服务器将在运行时决定行为。
由于我们不太清楚您了解Servlet实例的目的以及如何处理它们,所以我们不能提供更多的帮助。
不过,在第1点中,由于您创建了Uber实例,您可以将它作为属性存储在ServletContext中,然后使用HttpServletRequest#getServletContext在每个servlet中检索它。
从您的评论来看,您似乎希望/需要实现前控制器。为此,最好使用单个servlet来完成这项工作,并创建类来完成处理请求的真正工作。与其重新发明轮子,我建议您使用一个已经实现了这个功能的框架,比如JSF或Spring。如果您仍然希望/需要自己实现该模式,请检查这里。
这就是(奇数和不值得推荐的)设计的样子(基于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) {
//...
}
}然后在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的想法。
https://stackoverflow.com/questions/31188987
复制相似问题