今天开始对Servlet进行一个较为全面深入的学习,并将学习所得记录于此,与君共勉。
思维导图如下:
接下来开始对各部分进行介绍总结。
1.什么是servlet
定义:Servlet是小服务程序或服务连接器,用Java编写的服务器端程序,具有独立于平台和协议的特性 。狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类。
功能:交互式地浏览和生成数据,生成动态Web内容。接受客户端请求,处理并生成响应数据发送给客户端。
基本介绍:servlet是JavaWeb三大组件之一,三大组件为:servlet程序,filter过滤器,listener监听器。从原理上讲,Servlet可以响应任何类型的请求,但绝大多数情况下Servlet只用来扩展基于HTTP协议的Web服务器。servlet本质上也是Java类,但是要遵循servlet规范(接口)编写,没有main()方法,它的创建,使用,销毁有servlet容器进行管理。
提供servlet功能的服务器叫做servlet容器,常见的容器有:Tomcat,Jetty,Oracle Application server,JBoss等。
2.实现过程
客户端发送请求至服务器端;
服务器将请求信息发送至 Servlet;
Servlet 生成响应内容并将其传给服务器。响应内容动态生成,通常取决于客户端的请求;
服务器将响应返回给客户端
3.工作过程
1.Web Client 向Servlet容器(Tomcat)发出Http请求
2.Servlet容器接收Web Client的请求
3.Servlet容器创建一个HttpRequest对象,将Web Client请求的信息封装到这个对象
4.Servlet容器创建一个HttpResponse对象
5.Servlet容器调用HttpServlet对象的service方法,把HttpRequest对象 与 HttpResponse对象作为参数传给 HttpServlet对象
6.HttpServlet调用HttpRequest对象的有关方法,获取Http请求信息
7.HttpServlet调用HttpResponse对象的有关方法,生成响应数据
8.Servlet容器把HttpServlet的响应结果传给Web Client
4.生命周期
1.加载阶段
Tomcat从文件系统,远程文件系统或其他网络服务中通过类加载器来加载Servlet类到内存,并调用Servlet的默认构造方法(不带参构造器)
2.初始化阶段
在获得servlet实例后调用init()方法初始化该实例
3.响应请求阶段
调用service()方法,根据请求方式的不同,调用doGet() 或者 doPost()
4.终止阶段
servlet摧毁时调用destroy()方法
5.其他补充
针对客户端的多次Servlet请求,通常情况下,服务器只会在第一次请求的时候创建一个Servlet实例对象,并驻留在内存中,为后续的其他请求服务,直至Servlet容器退出,Servlet实例对象才会销毁。
在Servlet的整个生命周期内,Servlet的init()方法只被调用一次,而对于每一个请求都会调用一次Servlet的service()方法service根据请求方式调用doGet或doPost方法。
这里用动图演示一下整个生命周期,以tomcat为例
5.Servlet API
1.javax.servlet 其中包含定义servlet和servlet容器之间契约的类和接口。
2.javax.servlet.http 其中包含定义HTTP Servlet 和Servlet容器之间的关系。
3.javax.servlet.annotation 其中包含标注servlet,Filter,Listener的标注。它还为被标注元件定义元数据。
4.javax.servlet.descriptor,其中包含提供程序化登录Web应用程序的配置信息的类型。
6.Servlet体系结构
6.1servlet接口
看下servlet接口的源码
接口总共定义了五个方法,其中init() service() destroy()是servlet的生命周期方法,代表了servlet从初始化到响应请求再到摧毁的过程。上文已经介绍,这里不再赘述。
getServletConfig() 方法
返回一个 ServletConfig 对象,该对象用来返回初始化参数和 ServletContext。ServletContext 接口提供有关 servlet 的环境信息。
getServletInfo() 方法
是一个可选的方法,它提供有关 servlet 的信息,如作者、版本、版权。
6.2其他接口待补充
7.HttpServlet类
在实际开发中,一般都是通过继承HttpServlet类的方式去实现Servlet程序。这里对其进行简单介绍
Serclet接口有两个实现类,GenerricServlet和HttpServlet,其中后者是前者的子类,它在原有基础上添加了一些HTTP协议处理方法,它比GenerricServlet功能更强大,所以我们一般将自己的类继承自HttpServlet,并重写doGet方法和doPost方法,不需要重写Service方法。
8.参考资料
https://www.cnblogs.com/rocomp/p/4808924.html
https://baike.baidu.com/item/servlet/477555?fr=aladdin#9
https://blog.csdn.net/qq_19782019/article/details/80292110
https://blog.csdn.net/CSDN_GIA/article/details/53452710