覆盖HttpServlet服务方法

M-D*_*M-D 15 tomcat servlets java-ee

我有一个servlet,看起来像:

public class MyServlet extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse response)
             throws IOException, ServletException {
    doTheJob(request, response);
}//method doGet

public void doPost(HttpServletRequest request, HttpServletResponse response)
              throws IOException, ServletException {
    doTheJob(request, response);
}//method doPost

private void doTheJob(.....) {
    ...........................
}

}
Run Code Online (Sandbox Code Playgroud)

由于我的应用程序的工作方式,我只需要从doGet()doPost()调用doTheJob ().所以我觉得,我应该更好地覆盖的方法service()方法中的HttpServlet的.

但我想知道这是否会制造任何问题或导致任何问题.

Tom*_*icz 23

这是service()通常实现的方式(非常简化):

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

正如你可以看到它几乎代表们doGet(),并doPost()根据HTTP方法.因此,从一只手更换doGet(),并doPost()service()罚款.在另一方面你的servlet还将处理PUT,DELETE,HEAD等多种方式,同时具有独立doGet()doPost()它将返回不允许的405方法.

这就是为什么我实际上建议分离doGet()doPost()委托你的代码,让servlet处理其他方法.如果这是代码中的重复模式,请考虑以下帮助程序servlet:

public class AbstractServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
                 throws IOException, ServletException {
        doGetOrPost(request, response);
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
                  throws IOException, ServletException {
        doGetOrPost(request, response);
    }

    abstract protected void doGetOrPost(.....);

}
Run Code Online (Sandbox Code Playgroud)


JB *_*zet 9

你最好保持原样.覆盖该service()方法也使得该方法回答了PUT,HEAD,DELETE等.它绕过了默认service()方法对最后修改的头文件所做的工作.