Ответ 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(.....);
}