java - 是否可以将所有请求路由到单个 servlet?

标签 java servlets

我刚开始使用 Java Servlet。从目前为止我所看到的来看,有很多方法可以对 url 进行初始路由,例如使用 @WebServlet url 模式以及使用 web.xml。

从我看来,web.xml 确实是路由器。或者,我可以通配符到单个 servlet 的所有路由,在某种程度上将其用作前端路由器,并在 Java 中使用类似 request.getPathInfo(); 的内容进行模式匹配。 ,然后从中调用其他 servlet。这意味着每个被调用的 servlet 都是一个新线程,对吗?

我的问题是,这样做有什么影响,比如如果这样做了,这是否意味着servlet每次都会重新启动并重新初始化?这就是 servlet 的设计使用方式吗?将所有请求路由到一个 servlet,然后使用该 servlet 作为路由器,这是一个好主意吗?

最佳答案

您可以使用 servlet 将请求发送到其他对象来处理它们,请参阅 Front Controller 模式(如 Kayaman 所描述),或 Spring 的 DispatcherServlet,它不会将请求路由到其他 servlet,而是路由到 Controller 。这个想法是 servlet 很笨重,难以测试,并且需要一个 servlet 容器来实例化它们,因此最好将 servlet 限制为单个调度程序并让 Controller 完成大部分工作。使用Spring, Controller 可以由容器管理,因此它们可以比servlet更容易地注入(inject)其他组件。

Servlet 在启动时初始化一次,同一个实例处理所有请求(或者从技术上讲,Servlet 容器可能被允许实例化多个实例,但您不应该指望它),您应该假设只有一个实例小服务程序。请参阅this question about the servlet lifecycle .

Servlet 不应包含任何可变状态,因为多个线程将同时调用同一实例上的方法。以前有一个选项可以创建单线程 servlet ( SingleThreadModel ),但它对吞吐量来说非常糟糕,因此已被弃用。每个 HTTP 请求都会从 servlet 容器的线程池中分配自己的线程,并且该线程会一直处理该请求,直到发送响应为止,线程并不特定于特定的 servlet。

关于java - 是否可以将所有请求路由到单个 servlet?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34342027/

相关文章:

java - Android 中 Dialog Builder 中的运行时异常

JSP包括: templating with jsp's so repeated code is included on every page

java.lang.IllegalStateException : Already using output stream 错误

java - 浏览器处理真实文件与 servlet 生成的文件不同

java - 使用请求范围的 bean 函数作为 JSF 中临时呈现按钮的操作

java - List<Dog> 是 List<Animal> 的子类吗?为什么 Java 泛型不是隐式多态的?

java - 无法在java中执行文件IO

java - 我的 PDF 中缺少一些阿拉伯字母

java - Jersey request.getInputStream()

java - Servlet 响应方法 addHeader 和 setHeader 有什么区别?