我有一个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(.....) {
...........................
}
}
由于我的应用程序的工作方式,我只需要从doGet()和doPost()调用doTheJob()。所以我认为,我最好覆盖 HttpServlet 的方法 service()。
但我想知道这是否会阻止任何事情或会导致任何问题。
这是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方法。因此,一方面用service()
代替doGet()
和doPost()
就可以了。另一方面,你的 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(.....);
}
你最好保持原样。覆盖 service()
方法也使此方法回答 PUT、HEAD、DELETE 等。它绕过了默认 service()
方法对上次修改的标头所做的工作。