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,对于服务器来说,其接收从客户端传递过来的参数的过程是完全一样的。
- Servlet笔记——(2.2.3)继承HttpServlet
- Servlet学习笔记—继承HttpServlet类(创建Servlet的第二种方法)
- Servlet学习笔记3之通过继承HttpServlet开发Servlet
- Servlet学习笔记—Servlet接口和HttpServlet类
- Servlet—HttpServlet、Servlet线程安全
- Servlet笔记——(2.2.2)继承GenericServlet
- myeclipse实现Servlet实例(3) 通过继承HttpServlet接口实现
- Servlet--继承HttpServlet写自己的Servlet
- 【Servlet学习】继承HttpServlet简单示例
- 通过继承HttpServlet来开发Servlet
- Servlet,GenericServlet和HttpServlet的继承关系
- (2)使用myeclipse创建servlet步骤:继承HttpServlet开发servlet
- Java Web基础知识之Servlet(2):深入Servlet——HttpServlet
- Java Web基础知识之Servlet(2):深入Servlet——HttpServlet
- Servlet——通过GenericServlet和HttpServlet开发Servlet
- Servlet(9)—HttpServlet和改进Servlet实例
- JCreator工具三种方法(1.实现Servlet接口2.继承GenericServlet3.继承HttpServlet)开发Servlet
- JavaWeb学习笔记-servlet-03-HttpServlet
- VS2010 MFC中设置HotKey
- shell设置变量之单引号双引号的区别
- mybatis-mysql-添加返回主键id
- ExecutorService 的理解与使用
- 《Java编程思想》泛型中的策略设计模式
- Servlet笔记——(2.2.3)继承HttpServlet
- yolo训练时的训练数据读取代码注释!代码质量很高。
- 如何使用jstack分析线程状态
- 纯css写 选项卡
- 判断移动端类型及是否是微信内置浏览器 navigator.userAgent
- 单选按钮清空选中
- 关于事件
- mini2440采用minitools工具烧写系统或裸机程序方法
- 分布式消息队列详解