HttpServlet
2017-06-21 11:34
381 查看
HttpServlet是用HTTP协议实现的Servlet基类,我们在写servlet时直接继承它就可以,不需再从头要实现servlet接口。
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);
}
}
}
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);
}
}
}
相关文章推荐
- 用kindeditor 报:org.apache.catalina.connector.RequestFacade cannot be cast to org.springframework.web.multipart.MultipartHttpServletRequest
- HttpServletRequest对象方法的用法
- tomcat启动问题:[org.directwebremoting.log.startup]-[WARN] Clash of converters for javax.servlet.http.HttpServletRequest. Using org.d
- 新建jsp报错“The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path”
- struts常见问题1:HTTP Status 404 - Servlet action is not available
- 解决Expected MultipartHttpServletRequest: is a MultipartResolver configured问题。
- 采用android客户端+Servlet(HttpServletRequest)进行文件批量上传
- SEVERE: Error configuring application listener of class com.sun.xml.ws.transport.http.servlet.WSServletContextListener java.lang.ClassNotFoundExceptio
- 过滤敏感词汇---HttpServletRequest对象增强
- ubuntu下eclipse遇到The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path
- Eclipse中新建Maven Web项目报错:The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path
- java开发eclipse常见问题(一)The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path
- Filter中使用 HttpServletResponseWrapper修改response内容
- HttpServletRequest和HttpServletResponse详解
- HttpServletResponse.sendRedirect方法和RequestDispatcher.forward方法区别
- Java-HttpServletRequest
- 理解javax.servlet.http.HttpSession
- HttpServletRequest 的各种方法的返回值
- No mapping found for HTTP request with URI [/xxx] in DispatcherServlet with name 'despatcherServlet'
- The import javax.servlet.http.HttpServletRequest cannot be resolved