Java 我应该重写service()还是doPost()?

Java 我应该重写service()还是doPost()?,java,servlets,Java,Servlets,我在读一本关于servlet的书,书中简要介绍了servlet类以及HttpServlet类 有一个填充表单的示例-对于该表单,servlet的doPost()方法被类重写。但对于登录表单的另一个示例,将覆盖service()方法 我想知道为什么有两种不同的方法——我认为通常我们会将自定义代码放入doPost()(或doGet())中,让service()保持原样。使用这两种方法中的任何一种都有什么原因,或者在任何情况下我都可以使用这两种方法吗?不要覆盖service()方法。首选方法是对pos

我在读一本关于servlet的书,书中简要介绍了servlet类以及
HttpServlet

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


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

不要覆盖
service()
方法。首选方法是对post使用
doPost()
,对get使用
doGet()
。这里有一篇关于每个人的工作的精彩文章

如果您必须响应未使用 HTTP协议,您必须使用service()


您很可能会重写doXXX()方法,其中XXX表示GET、POST等HTTP方法<代码>服务()。
HttpServlet
service()
的默认实现只是调用请求方法的相应处理程序(GET、POST等)


当您希望相同的方法处理所有传入的方法时,您需要重写
service()
(无论是GET、PUT还是POST请求,您都将对所有方法做出相同的回答)。如果您喜欢单独处理每个方法,请使用默认的service()实现并覆盖特定的处理程序。

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

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

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

为什么不重写service()方法?

因为重写服务方法不是一个好的实践。如果我们调用任何doxxx方法,那么它将在内部调用HttpServlet的服务方法。所以你没有必要显式地调用它

服务()的执行顺序:

服务(ServletRequest、ServletResponse)-->

-->召唤

-->服务(HttpServletRequest-req、HttpServletResponse-res)

-->召唤

-->doGet/doPost(HttpServletRequest请求,HttpServletResponse请求)

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

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);
}}
仅SO社区的Tomasz Nurkiewicz提供的实现代码

如果这本书只是试图展示使用servlet的不同方式的示例,而不是说“你应该这样做,或者那样做”,我不会感到惊讶。因为如果你真的在开发一个严肃的应用程序,你最终会想研究和实现一个MVC框架(如Struts、Spring或Wicket)而不是在servlet级别实现。(只是给以后阅读的建议。)