我有一些遗留的 Servlet 覆盖服务方法,
根据HttpServlet docs 服务方法不应被覆盖,仅在特定情况下:
有几乎没有理由来覆盖服务方法。服务通过将标准 HTTP 请求分派到每个 HTTP 请求类型的处理程序方法(上面列出的 doXXX 方法)来处理标准的 HTTP 请求。
我找到了几个关于调用 do 方法的服务方法的答案
对 doGet()、doPost() 和其他 do 方法的调用在 HttpServlet 类中
由于您的 servlet 覆盖了 service() 方法并提供了不同的实现,因此它不再这样做了。相反,它确实......方法中的代码所做的。
让 servlet 处理其他方法。
但是我没有任何有效的理由来覆盖此方法,是否有任何情况?
似乎它可能对应于DRY(不要重复自己)规则,因此所有 do 方法都会执行相同的方法。
你必须重写service,如果你需要处理一个非标准的HTTP方法,即一个还没有被分派给doXxx用方法HttpServlet。
正如RFC 2616 HTTP 文档所说:
HTTP/1.1 的常用方法集定义如下。虽然这个集合可以扩展,但不能假设额外的方法为单独扩展的客户端和服务器共享相同的语义。
你自己的报价甚至说同样的话,虽然只是含蓄地:
几乎没有理由覆盖该
service方法。通过将标准HTTP 请求分派到每个 HTTP 请求类型的处理程序方法(上面列出的方法)来service处理标准HTTP 请求doXXX。
隐式是非标准请求必须通过覆盖该方法来处理。