service()和doGet()和doPost()
从前看李刚的书,书中许多都是直接用service()的。但其实这样是不好的。因为虽然一般情况下我们的doGet和doPost方法是一样的,但其实http能提交的方法有许多,不一定只有这两个,可以看tomcat中实现的service();
protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException
{
String method = req.getMethod();
if(method.equals("GET"))
{
long lastModified = getLastModified(req);
if(lastModified == -1L)
{
doGet(req, resp);
}
else
{
long ifModifiedSince = req.getDateHeader("If-Modified-Since");
if(ifModifiedSince < (lastModified / 1000L) * 1000L)
{
maybeSetLastModified(resp, lastModified);
doGet(req, resp);
}
else
{
resp.setStatus(304);
}
}
}
else if(method.equals("HEAD"))
{
long lastModified = getLastModified(req);
maybeSetLastModified(resp, lastModified);
doHead(req, resp);
}
else if(method.equals("POST"))
doPost(req, resp);
else if(method.equals("PUT"))
doPut(req, resp);
else if(method.equals("DELETE"))
doDelete(req, resp);
else if(method.equals("OPTIONS"))
doOptions(req, resp);
else if(method.equals("TRACE"))
{
doTrace(req, resp);
}
else
{
String errMsg = lStrings.getString("http.method_not_implemented");
Object errArgs[] = new Object[1];
errArgs[0] = method;
errMsg = MessageFormat.format(errMsg, errArgs);
resp.sendError(501, errMsg);
}
}
可以看到这里通过反射机制识别的提交方式有许多,还有put、head很多方法。如果你重写了service方法,那么就不会调用其他的doGet和doPost以及PUT方法。这里的service是种代理模式,我们最好还是只写doGet和doPost方法。

浙公网安备 33010602011771号