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

时间:2011-07-25 20:33:41

标签: java servlets

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

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

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

5 个答案:

答案 0 :(得分:13)

不要覆盖service()方法。首选方法是使用doPost()进行发布,使用doGet()进行获取。这是一个关于每个人的优秀帖子。 http://www.jguru.com/faq/view.jsp?EID=47730

  

如果您必须回复未使用该客户端的客户提出的请求   HTTP协议,必须使用service()。

答案 1 :(得分:4)

我认为您需要了解流程才能自行决定。 service()的{​​{1}}的默认实现只是为请求方法调用适当的处理程序(GET,POST,等等)。

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

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

然后你有专门用于处理HttpProtocol的servlet,我们称之为 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);
}}

仅来自SO社区的 Tomasz Nurkiewicz 提供的实施代码 Overriding Service Method

答案 4 :(得分:0)

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