java新手,这个问题与典型的java工作流程不同,需要非常有经验的架构师的一些帮助,来自node.js背景,试图基于我已经在node.js中实现的一些设计模式来实现一个架构和 PHP 以及一些前端语言(包括 Java Swing),我期待为 Java Servlet 实现相同的功能。
我知道在 Servlet 中 doGet、doPost 等是请求的入口点,并且通过多线程对所有传入请求同时实例化和重用 servlet 的单个实例。
为了让这些设计模式(另一个主题,需要它自己的线程)工作,我需要有一个超级级别的访问权限来获取这些 servlet 实例并将我的角色设置为代表/侦听器。
我已经读到 servlet 要么在第一个请求之后实例化,要么直接与容器一起加载,因此要实现这一点,我需要在启动时加载它们,以便我可以对它们执行操作。
同样,这个问题是不同的,可能需要进行一些讨论才能深入了解,以帮助我们交换有关彼此世界的事物。
简而言之,我需要以下两件事才能使其工作。
解决第 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 的想法。
| 归档时间: |
|
| 查看次数: |
585 次 |
| 最近记录: |