我应该覆盖service()或doPost()吗?

我正在阅读一本关于servlet的书,在那本书中给出了关于servlet类以及HttpServlet类的简要解释。

有一个示例用于填充表单 – 该表单,servlet的doPost()方法被类重写。 但是对于登录表单的另一个示例,将覆盖service()方法。

我想知道为什么这两种不同的方法 – 我认为通常我们将自定义代码放入doPost() (或doGet() )并让service()保持不变。 使用这两种方法中的任何一种是否有任何原因,或者我可以在任何情况下使用这两种方法吗?

不要覆盖service()方法。 首选方法是使用doPost()进行post,使用doGet()进行get。 这是一篇关于每项工作的优秀文章。 http://www.jguru.com/faq/view.jsp?EID=47730

如果必须响应未使用HTTP协议的客户端发出的请求,则必须使用service()。

我认为你需要了解流程才能自己决定。 HttpServletservice()的默认实现只是为请求方法调用适当的处理程序(GET,POST,等等)。

当你想要相同的方法来处理所有传入的方法时,你需要覆盖service() (无论是GET,PUT还是POST请求,你都会回答所有传入方法)。 如果您对单独处理每个方法感到满意,请使用默认的service()实现并覆盖特定的处理程序。

您最有可能覆盖doXXX()方法,其中XXX代表HTTP方法,如GET,POST等。 容器调用的service()方法将决定调用哪个doXXX()。

service()方法属于Genericservlet ,可以重载以支持任何类型的协议,如Http,Ftp等。

然后你有专门的servlet来处理HttpProtocol,我们称之为HttpServlet 。 HttpServlet还为service()和doGet()以及doPost()方法提供默认实现。

为什么我们不应该覆盖service()方法?

因为覆盖服务方法不是一个好习惯。 如果我们在内部调用任何doxxx方法,它将调用HttpServlet的服务方法。 因此,您无需明确地调用它。

服务执行顺序():

服务(ServletRequest中,ServletResponse的) – >

– >电话

– > service(HttpServletRequest req,HttpServletResponse res)

– >电话

– > doGet / doPost(HttpServletRequest req,HttpServletResponse res)

这是您可以在以下情况下覆盖服务的方式:

 protected void service(HttpServletRequest req, HttpServletResponse resp) { String method = req.getMethod(); if (method.equals(METHOD_GET)) { doGet(req, resp); } else if (method.equals(METHOD_HEAD)) { doHead(req, resp); } else if (method.equals(METHOD_POST)) { doPost(req, resp); } else if (method.equals(METHOD_PUT)) { doPut(req, resp); } else if (method.equals(METHOD_DELETE)) { doDelete(req, resp); } else if (method.equals(METHOD_OPTIONS)) { doOptions(req,resp); } else if (method.equals(METHOD_TRACE)) { doTrace(req,resp); } else { resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED, errMsg); }} 

Tomasz Nurkiewicz给出的实施代码仅来自SO社区覆盖服务方法

如果您必须响应HTTP协议客户端(通常是浏览器)发出的GET或POST请求,请不要犹豫,扩展HttpServlet并使用其便捷方法。 如果必须响应未使用HTTP协议的客户端发出的请求,则必须使用service()