HttpServlet是用HTTP协议实现的Servlet基类,我们在写servlet时直接继承它就可以,不需再从头要实现servlet接口。
springMVC中的DispatcherServlet就是继承的HttpServlet
HttpServlet主要关心的是如何处理请求,所以它主要是重写了service方法,
在service方法中先将ServletRequest和ServletResponse转换为HttpServletRequest和HttpServletResponse
springMVC中的DispatcherServlet就是继承的HttpServlet
HttpServlet主要关心的是如何处理请求,所以它主要是重写了service方法,
在service方法中先将ServletRequest和ServletResponse转换为HttpServletRequest和HttpServletResponse
然后根据http请求类型的不同将请求路由到了不同的处理方法。
public abstract class HttpServlet extends GenericServlet {
...篇幅问题,省略部分代码
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
HttpServletRequest request;
HttpServletResponse response;
try {
//类型转换
request = (HttpServletRequest) req;
response = (HttpServletResponse) res;
} catch (ClassCastException e) {
//如果请求类型不相符,则抛出异常
throw new ServletException("non-HTTP request or response");
}
//调用方法
service(request, response);
}
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;
try {
ifModifiedSince = req.getDateHeader("If-Modified-Since");
} catch (IllegalArgumentException iae) {
ifModifiedSince = -1L;
}
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);
}
}
}