我是使用Java Servlets的新手。从我到目前为止看到的,有很多方法可以对URL进行初始路由,例如使用@WebServlet
url模式以及使用web.xml。
从我看来,web.xml就是路由器。或者,我可以将所有路由通配符到单个servlet,在某种程度上将其用作前端路由器,并在Java中使用类似request.getPathInfo();
的模式匹配,然后从中调用其他servlet。这意味着被调用的每个servlet都是一个新线程,对吗?
我的问题是,这样做的含义是什么,例如,如果这样做,这是否意味着servlet每次都重新启动并重新初始化?这是servlet的设计方式吗?将所有请求路由到一个servlet,然后将servlet用作路由器是否可以?
答案 0 :(得分:3)
您可以使用servlet将请求发送到其他对象来处理它们,请参阅Front Controller模式(如Kayaman所述)或Spring的DispatcherServlet,它不会将请求路由到其他servlet而是路由到控制器。这个想法是servlet很笨重,很难测试,并且需要一个servlet容器来实例化它们,因此最好将servlet限制为单个调度程序并让控制器完成大部分工作。使用Spring,控制器可以由容器管理,因此可以比servlet更容易地注入其他组件。
servlet在启动时被初始化一次,同一个实例处理所有请求(或者从技术上讲,servlet容器可能被允许实例化多个实例但你不应该依赖它),你应该假设只有一个实例servlet。请参阅this question about the servlet lifecycle。
Servlet不应包含任何可变状态,因为多个线程将同时调用同一实例上的方法。之前有一个选项可以制作单线程servlet(SingleThreadModel),但它的吞吐量非常糟糕。每个HTTP请求都从servlet容器的线程池中分配了自己的线程,并且同一个线程一直保留在请求中,直到发送响应为止,线程并不特定于特定的servlet。
答案 1 :(得分:2)
有一种名为Front Controller
的设计模式就是这样做的。所有请求都被路由到一个servlet(例如DispatcherServlet
中的Spring
),然后将请求定向到处理实际业务逻辑的非servlet类。
前端控制器通常执行其他有助于编写非servlet类的东西。