Servlet笔记——(2.2.3)继承HttpServlet

来源:互联网 发布:华中数据交易所 编辑:程序博客网 时间:2024/05/22 17:30

2.2.3.1 原理

HttpServlet类是GenericServlet的子类,它提供了对HTTP请求的特殊支持,所以通常我们都会通过继承HttpServlet来完成自定义的Servlet。



2.2.3.2 HttpServlet覆盖了service(ServletRequest, ServletResponse)方法

HttpServlet类提供了service(HttpServletRequest, HttpServletResponse)方法,这个方法是HttpServlet自己的方法,不是从Servlet继承下来的。在HttpServlet的service(ServletRequest, ServletResponse)方法中,会把ServletReqest和ServletResponse强转成HttpServletRequest和HttpServletResponse,然后调用service(HttpServletRequest, HttpServletResponse)方法,这说明子类只需重写service(HttpServletRequest, HttpServletResponse)方法,而不用自己去强转请求和响应对象了。

实际应用中其子类也不用去覆盖service(HttpServletRequest, HttpServletResponse)方法,因为HttpServlet还要做另一步简化操作,后面会介绍。下面是HttpServlet的部分源码:

public abstract class HttpServlet extends GenericServlet {    /* 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 / 1000 * 1000)) {            // 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);          }       } elseif (method.equals(METHOD_HEAD)) {long lastModified = getLastModified(req);            maybeSetLastModified(resp, lastModified);            doHead(req, resp);        } elseif (method.equals(METHOD_POST)) {            doPost(req, resp);        } elseif (method.equals(METHOD_PUT)) {            doPut(req, resp);                } elseif (method.equals(METHOD_DELETE)) {            doDelete(req, resp);        } elseif (method.equals(METHOD_OPTIONS)) {            doOptions(req,resp);        } elseif (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);        }}@Overridepublicvoid service(ServletRequest req, ServletResponse res)throws ServletException, IOException {        HttpServletRequest  request;        HttpServletResponse response;try {// 强转            request = (HttpServletRequest) req;            response = (HttpServletResponse) res;        } catch (ClassCastException e) {thrownew ServletException("non-HTTP request or response");        }          // 调用        service(request, response);}……}

2.2.3.3 doGet()和doPost()

在HttpServlet的service(HttpServletRequest, HttpServletResponse)方法会去判断当前请求是GET还是POST,如果是GET请求,那么会去调用本类的doGet()方法;如果是POST请求,会去调用doPost()方法,这说明我们在子类中只需去覆盖doGet()或doPost()方法即可。



2.2.3.4 什么情况下发出GET/POST请求

下面四种情况会发出GET请求:

(1) 直接在浏览器地址栏输入URL地址,然后回车访问地址;

(2) 页面上有一个<a href=”http://......”>XXX</a>链接,点击这个链接访问;

(3) 页面上有一个FORM,明确定义method=”GET”;

(4) 通过javascript代码:window.location.href=”http://......”来刷新当前页面;

只有下面一种情况会发出POST请求:页面上有一个FORM表单,明确定义method=”POST”。

2.2.3.5 GET和POST请求的区别

GET请求通过在URL地址后面附加参数的形式来向后台递交数据,格式为:(http://localhost:8080/servlet/TestServlet01?username=zs&password=123)。即URL?参数名1=参数值1&参数名2=参数值2......。(注意:=两侧不要加空格)

POST请求则通过HTTP HEAD来递交数据(即不会出现在URL地址的后面)。

由于GET请求是将参数附加在URL地址的后面,所以,它的长度可能会受到浏览器的限制(在HTTP协议中,没有参数长度上限的说法,如果参数长度受限,那是由于特定的浏览器或服务决定的,一般IE浏览器4000byte);

POST请求的数据长度一般不会受限;

在客户端,GET与POST的主要区别在于是否是通过URL地址来传参,GET使用起来很方便,但不适合大批数据的传输;POST则需要定义一个FORM表单才可以使用,稍微麻烦些,所以:大批量数据提交使用POST;数据量少使用GET;

服务器端:一般情况下无需关注是GET还是POST方法提交的数据。无论是GET还是POST,对于服务器来说,其接收从客户端传递过来的参数的过程是完全一样的。


阅读全文
0 0