Переопределение метода обслуживания HttpServlet

У меня есть сервлет, который выглядит так:

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(.....) {
    ...........................
}

}

Из-за того, как работает мое приложение, мне нужно только вызвать doTheJob() как из doGet(), так и из doPost(), Поэтому я считаю, что лучше переопределить метод service() HttpServlet.

Но я хотел бы знать, будет ли это что-то тормозить или вызовет какие-либо проблемы.

Ответы

Ответ 1

Вот как обычно реализуется 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);
    }
}

Как вы видите, он едва ли делегируется doGet() и doPost() в зависимости от метода HTTP. Поэтому, с одной стороны, замена doGet() и doPost() на service() прекрасна. С другой стороны, ваш сервлет также будет обрабатывать PUT, DELETE, HEAD и другие методы, в то время как с отдельными doGet() и doPost() он вернет 405 Метод не разрешен.

Вот почему я бы на самом деле советовал отдельным doGet() и doPost() делегировать ваш код и позволить сервлет обрабатывать другие методы. Если это повторяющийся шаблон в вашем коде, рассмотрите следующий вспомогательный сервлет:

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(.....);

}

Ответ 2

Лучше сохрани его. Переопределение метода service() также заставляет этот метод отвечать на PUT, HEAD, DELETE и т.д. И он обходит работу, которую по умолчанию использует метод service() с последними измененными заголовками.