【问题标题】:Is it okay to route all requests to a single servlet? [closed]可以将所有请求路由到单个 servlet 吗? [关闭]
【发布时间】:2016-03-24 08:39:06
【问题描述】:

我是使用 Java Servlet 的新手。就我目前所见,有许多方法可以进行 url 的初始路由,例如使用 @WebServlet url 模式以及使用 web.xml。

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

我的问题是,这样做的含义是什么,例如,如果这样做了,这是否意味着 servlet 每次都会重新启动和重新初始化?这是 servlet 的设计使用方式吗?将所有请求路由到一个 servlet,然后将该 servlet 用作路由器是否可行?

【问题讨论】:

  • 您的许多附带问题都不清楚,但没有什么能阻止您使用单个 servlet 进行路由,并且有许多框架可以做到这一点。
  • 我投票结束,因为这个问题主要是基于意见的。

标签: java servlets


【解决方案1】:

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

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

Servlet 不应包含任何可变状态,因为多个线程将同时调用同一实例上的方法。以前可以选择制作单线程 servlet (SingleThreadModel),但它对吞吐量非常不利,因此被弃用。每个 HTTP 请求都从 servlet 容器的线程池中分配到自己的线程,并且在发送响应之前,同一个线程与请求保持一致,线程并不特定于特定的 servlet。

【讨论】:

    【解决方案2】:

    有一个名为Front Controller 的设计模式正是这样做的。所有请求都被路由到单个 servlet(例如 Spring 中的 DispatcherServlet),然后将请求定向到处理实际业务逻辑的非 servlet 类。

    前端控制器通常执行有助于编写非 servlet 类的附加操作。

    【讨论】:

      猜你喜欢
      • 2012-04-03
      • 2017-07-16
      • 1970-01-01
      • 1970-01-01
      • 2013-02-18
      • 2012-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多