一 HttpServlet
HttpServlet类覆盖了javax.servlet.GenericServlet类。
类结构如下图:
使用HttpServlet时,需要借助HttpServletRequest和HttpServletResponse对象,
这两个对象分别集成于ServletRequest和ServletResponse。
HttpServlet覆盖了GenericServlet中的Service方法,HttpServlet中service方法签名如下:
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String method = req.getMethod(); if (method.equals(METHOD_GET)) { long lastModified = getLastModified(req); if (lastModified == -1) { // servlet doesn't support if-modified-since, no reason // to go through further expensive logic doGet(req, resp); } else { long ifModifiedSince = req.getDateHeader(HEADER_IFMODSINCE); if (ifModifiedSince < lastModified) { // If the servlet mod time is later, call doGet() // Round down to the nearest second for a proper compare // A ifModifiedSince of -1 will always be less maybeSetLastModified(resp, lastModified); doGet(req, resp); } else { resp.setStatus(HttpServletResponse.SC_NOT_MODIFIED); } } } else if (method.equals(METHOD_HEAD)) { long lastModified = getLastModified(req); maybeSetLastModified(resp, lastModified); 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 { // // Note that this means NO servlet supports whatever // method was requested, anywhere on this server. // String errMsg = lStrings.getString("http.method_not_implemented"); Object[] errArgs = new Object[1]; errArgs[0] = method; errMsg = MessageFormat.format(errMsg, errArgs); resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED, errMsg); } }
新的service方法和javax.servlet.Servlet中的service方法的区别在于,
HttpServlet中的service方法接受HttpServletRequest和HttpServletResponse作为参数,
而javax.servlet.Servlet中的service方法接受ServletRequest和ServletResponse作为参数。
在HttpServlet中的方法中重写了Servlet种的service方法,签名如下:
@Override public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException { HttpServletRequest request; HttpServletResponse response; if (!(req instanceof HttpServletRequest && res instanceof HttpServletResponse)) { throw new ServletException("non-HTTP request or response"); } request = (HttpServletRequest) req; response = (HttpServletResponse) res; service(request, response); }
也就是说,在HttpServlet中有两个service方法,
一个接受HttpServletRequest和HttpServletResponse作为参数,
另外一个接受ServletRequest和ServletResponse作为参数。
在调用第二个service方法时,将ServletRequest和ServletResponse参数
强转为HttpServletRequest和HttpServletResponse对象重载的service方法。
在HttpServlet中的service方法会校验用于发送请求的HTTP方式,
通过request.getMethod()获取,根据判断调用不同的方法。
Http处理请求主要有以下几种方法:
doGet, doPost, doHead, doPUt, doTrace, doOptions, doDelete。
每一种方法表示一个HTTP方法。其中doGet和doPost是我们最常用的。
所以,我们不需要在覆盖Service方法了,只需要覆盖对应的doGet和doPost就可以处理请求。
HttpServlet主要有以下优点:
(1)因为我们又不同请求方法,可以覆盖常用的doGet和doPost。
在少数情况下,我们才会需要覆盖doHead等请求方法。
(2)使用HttpServletRequest和HttpServletResponse更强大的接受请求和返回响应,
因为它们分别扩展自ServletRequest和ServletResponse,功能更强大。
二 HttpServletRequest
HttpServletRequest表示HTTP环境中的Servlet请求。它扩展javax.servlet.ServletRequest接口,
并添加了几个方法。新增的部分方法如下:
java.lang.String getContextPath();
返回表示请求上下文的请求URI部分。
Cookie[] getCookies();
返回一个Cookie对象数组。
java.lang.String getHeader(java.lang.String name);
返回指定HTTP标题的值。
java.lang.String getMethod();
返回生成这个请求的HTTP方法名称。
java.lang.String getQueryString();
返回请求URL中的查询字符串。
HttpSession getSession();
返回与这个请求相关的会话对象。如果没有,将创建一个新的会话对象。
HttpSession getSession(boolean create);
返回与这个请求相关的会话对象。如果有,并且create参数为True,将创建一个新的会话对象。
三 HttpServletResponse
HttpServletResponse表示HTTP环境中的Servlet响应。下面是它里面定义的部分方法:
void addCookie(Cookie cookie);
给这个响应对象添加一个cookie。
void addHeader(java.lang.String name, java.lang.String value);
给这个响应对象添加一个header。
void sendRedirect(java.lang.String location);
发送一条响应码,将浏览器跳转到指定的位置。