• Servlet(Server Applet):全称Java Servlet。是用Java编写的服务器端程序。其主要功能在于交互式地浏览和修改数据,生成动态Web内容。

    • 狭义的Servlet是指 Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类。
  • HttpServlet: 指能够处理 HTTP 请求的 servlet,它在原有 Servlet 接口上添加了一些与 HTTP 协议处理方法,它比 Servlet 接口的功能更为强大。因此开发人员在编写Servlet时,通常应继承这个类,而避免直接去实现Servlet接口。
    • HttpServlet 在实现 Servlet 接口时,覆写了 service 方法,该方法体内的代码会自动判断用户的请求方式,如为 GET 请求,则调用 HttpServlet 的 doGet 方法,如为 Post 请求,则调用 doPost 方法。因此,开发人员在编写 Servlet 时,通常只需要覆写 doGet 或 doPost 方法,而不要去覆写 service 方法。

  参考:https://blog.csdn.net/HeatDeath/article/details/79057168

  

转:https://blog.csdn.net/m0_38039437/article/details/75264012

一、HttpServlet简介

1、HttpServlet是GenericServlet的子类,又是在GenericServlet的基础上做了增强。

2、HttpServlet方法

二、HTTP实现doGet或doPost请求项目介绍

1、通过实现doGet请求和doPost请求实例来了解内部的工作原理。

2、doGet请求和doPost请求实例代码介绍:

  A:创建一个Servlet类继承HttpServlet类

  B:在index.jsp页面创建一个超链接请求

3、doGet请求和doPost请求实例实施介绍:

  A、创建一个webproject项目。

  

  B、创建一个Servlet类的名称为HttpServ继承HttpServlet类同时覆写doGet方法和doPost方法。

1、

2、

3、配置web.xml文件

4、创建Servlet代码展示

package httpserve;

import java.io.IOException;
import java.io.PrintWriter; import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class HttpServ extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { System.out.println("发送get请求。。。。。。。。。。。"); } protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// TODO Auto-generated method stub
resp.setContentType("text/html;charset=UTF-8");
System.out.println("发送post方法。。。。。。。。。。");
}

5、web.xml配置文件代码展示

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<servlet>
<description>This is the description of my J2EE component</description>
<display-name>This is the display name of my J2EE component</display-name>
<servlet-name>HttpServ</servlet-name>
<servlet-class>httpserve.HttpServ</servlet-class>
</servlet> <servlet-mapping>
<servlet-name>HttpServ</servlet-name>
<url-pattern>/http</url-pattern>
</servlet-mapping> </web-app>

C、在index.jsp页面创建一个超链接请求

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>"> <title>My JSP 'index.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head> <body>
This is my JSP page. <br>
<a href="http://localhost:8080/test06/http">get请求1</a><br/>
<!-- 对于一个html页面来说,如果没有以http开始,则默认的前面会加上
协议类型://目前这个页面所在的服务器:目前端口/目前项目/你给的这个名称 -->
<a href="http">get请求2</a><hr/>
<form method = "post" action="http">
<input type="submit" value="提交"/>
</form>
</body>
</html>

D、发送doGet请求和doPost请求

a、在浏览器中输入测试地址,http://127.0.0.1:8080/test06/

b、打开项目的首页后分别点击get请求1、get请求2、和 post请求(提交按钮)

c、在控制台可以观察到分别调用了doGet和doPost方法。

三、HTTP实现doGet或doPost请求原理介绍

  1、浏览器发送请求到HttpSevr类调用HttpServ的service(servletRequest, servletReponse)方法

  2、由于没有找到这个方法,去调用父类(HttpServlet) 的同名方法。

  3、父类的service方法将ServletRequest req请求转换成HttpServletRequest请求,再去调用service(request, response) 方法。

 将ServletRequest req请求转换成HttpServletRequest请求再调用service(request, response) 方法源码如下:

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);
}

4、 调用的service(request, response) 方法功能是判断用户发出是什么请求,如果是get则调用子类(HttpSevr)的doGet方法,如果是post则调用子类(HttpSevr)的doPost方法。

service(request, response) 方法源码如下:

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;
try {
ifModifiedSince = req.getDateHeader(HEADER_IFMODSINCE);
} catch (IllegalArgumentException iae) {
// Invalid date header - proceed as if none was set
ifModifiedSince = -1;
}
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);
}
} } 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);
}
}

5、调用关系图

四、注意事项:

1、如果在HttpServ中覆盖了service(ServletRequest,SerlvetResonse)方法则这个类的所实现的doGet/doPost都不会再执行了。

因为service(ServletRequest,SerlvetResonse)是最高接口Servlet定义规范。在tomcat调用时,一定会在最终的子类中去找这个方法且调用它。

如果最终的子类没有则会调用父的service(ServletRequest,SerlvetResonse)。

2、如果覆盖了serivce(HttpServletRequest,HtpServletResponse)则会执行httpServlet中的service(ServletRequest,SerlvetResonse),但是由于子类中已经覆盖了serivce(HttpServletRequest,HtpServletResponset)所以,httpServlet中的serivce(HttpServletRequest,HtpServletResponset)就不再执行了,而是直接执行子类中同名同参数方法,且doXxxx也不会执行了,因为子类的serivce(HttpServletRequest,HtpServletResponset)没有调用doXxxx.

3、如果继承了HttpServlet没有实现任何的doXxx方法则会抛出一个异常

 五:客户端请求和返回数据用到的常用方法 https://www.cnblogs.com/xdp-gacl/p/3798347.html

Servlet--HttpServlet实现doGet和doPost请求的原理(转)的更多相关文章

  1. Servlet--HttpServlet实现doGet和doPost请求的原理

    转:https://blog.csdn.net/m0_38039437/article/details/75264012 一.HttpServlet简介 1.HttpServlet是GenericSe ...

  2. 1.2(学习笔记)Servlet基础(doGet、doPost、生命周期、页面跳转)

    一.doGet()与doPost() 我们在TestServlet类中重写doGet().doPost().service(). import javax.servlet.ServletExcepti ...

  3. SERVLET中的doGet与doPost两个方法之间的区别

    get和post是http协议的两种方法,另外还有head, delete等 这两种方法有本质的区别,get只有一个流,参数附加在url后,大小个数有严格限制且只能是字符串.post的参数是通过另外的 ...

  4. servlet中的doGet()与doPost()以及service()的用法

    doget和dopost的区别 get和post是http协议的两种方法,另外还有head, delete等 1.这两种方法有本质的区别,get只有一个流,参数附加在url后,大小个数有严格限制且只能 ...

  5. Servlet学习二——doGet和doPost

    1.get和post是http协议中的两种方法,还有其它,读写一般数据还能满足: 2.get只有一个流,参数附加在url后,且大小个数有严格限制,这个限制因浏览器而有所不同,get传递数据,实际上是将 ...

  6. 自定义servlet重写doGet或doPost方法是如何实现多态的

    我们知道,如果我们自定义一个servlet继承HttpServlet,并且重写HttpServlet中的doGet或doPost方法,那么从浏览器发送过来的request请求将调用HttpServle ...

  7. 去除myeclipse中doget和dopost方法中的注释

    当我们使用myeclipse新建servlet时发现doget和dopost方法中有一些无用的注释,每次新建一个servlet时都要手动删除特别麻烦. 下面就教大家如何去除这些注释! 以myeclip ...

  8. 简单的Servlet结合Jsp实现请求和响应以及对doGet和doPost的浅析

    1.新建jsp,创建表单 <body> <form action="/MyfirstWeb/login"> username:<input type= ...

  9. servlet中service() 和doGet() 、doPost() 学习笔记

    Sevlet接口定义如下: 与Sevlet接口相关的结构图: service() 方法是 Servlet 的核心.每当一个客户请求一个HttpServlet 对象,该对象的service() 方法就要 ...

  10. servlet 中 service ,doGet , doPost 关系

    web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app version="2 ...

随机推荐

  1. 【转载】Linux虚拟化KVM-Qemu分析(六)之中断虚拟化

    原文信息 作者:LoyenWang 出处:https://www.cnblogs.com/LoyenWang/ 公众号:LoyenWang 版权:本文版权归作者和博客园共有 转载:欢迎转载,但未经作者 ...

  2. DevOps | 产研协同效能提升之评审、审批流、质量卡点

    研发过程中有各种需求的评审.审批流和质量卡点,有的是为了质量把关,有的是为了彰显权力,还有一些是为了信息告知.本文主要讨论在软件开发过程中涉及的评审.审批和质量卡点三种情况,同时探讨对研发流程的影响, ...

  3. 基于Taro开发京东小程序小记

    一.小程序基础模型 这里要从微信小程序的历史说起,从前身到现在大概分为3个阶段: 阶段1: 微信网页需要用到app的原生能力,微信官方推出了js-sdk 阶段2: 解决移动端白屏问题,采用微信web资 ...

  4. C++子类的构造函数

    子类的构造函数 子类可以有自己的构造函数 子类没有构造函数,默认系统会调用父类的构造函数 子类有自己的构造函数,系统会先运行父类的构造函数,随后运行子类的构造函数,对子类对象进行覆盖和拓展 即不论子类 ...

  5. 【pandas小技巧】--按类型选择列

    本篇介绍的是pandas选择列数据的一个小技巧.之前已经介绍了很多选择列数据的方式,比如loc,iloc函数,按列名称选择,按条件选择等等. 这次介绍的是按照列的数据类型来选择列,按类型选择列可以帮助 ...

  6. 【工具】-Reverse-DIE(Detect-It-Easy)

    关于 Detect It Easy,或缩写为"DIE"是一个用于确定文件类型的程序.Detect It Easy 是一个多功能的 PE 检测工具,基于 QT 平台编写,主要用于 P ...

  7. [信息安全] 加密算法:md5摘要算法 / sha256算法

    1 MD5 1.1 算法定义 MD5的全称为 Message-Digest Algorithm,是一种被广泛使用的单向散列函数.属于Hash算法中一种比较重要算法--具有单项加密.加密结果唯一.安全性 ...

  8. 国标GB28181视频平台EasyGBS视频监控平台无法播放,抓包返回ICMP排查过程

    国标GB28181视频平台EasyGBS是基于国标GB/T28181协议的行业内安防视频流媒体能力平台,可实现的视频功能包括:实时监控直播.录像.检索与回看.语音对讲.云存储.告警.平台级联等功能.国 ...

  9. IDEA使用@Autowired注解为什么会提示不建议?

    ​在使用IDEA编写Spring相关的项目时,当在字段上使用@Autowired注解时,总会出现一个波浪线提示:"Field injection is not recommended.&qu ...

  10. 【HCDG城市行东莞站】松山湖开发者村助力企业释放数字新动能

    本文分享自华为云社区<[HCDG城市行东莞站]从"数据治理"洞察"数字化运营之道",松山湖开发者村助力企业释放数字新动能!>,作者:华为云社区精选. ...