首先什么是Servlet:html
Servlet本质就是一个继承了HttpServlet的一个类文件,功能是在容器(服务器)根据客户端不一样请求给予相应的响应服务.java
Servlet的运行环境是Tomcatweb
Servlet提供服务的过程原理(Servlet生命周期):数据库
生命全过程:触发: URL请求触发编程
加载: ClassLoader 加载相关须要用到的类 tomcat
实例化: init()传递配置参数,为服务作准备安全
初始化: 调用构造方法,建立servlet类的对象服务器
服务: doGet() doPost() servlet()方法,提供服务多线程
退出服务: destroy()死亡/销毁消除内存中的无用数据app
从服务器开机开始,若是没有请求触发的话,就不会有相应的servlet对象
建立之后到结束,一直都只有一个servlet对象,而后以多线程的形式执行,多个请求到同一个servlet类
API中的过程:init()//只执行一次, 第一次初始化的时候public void init(ServletConfig config) throws ServletException
service()public void service(ServletRequest req, ServletResponse res) throws ServletException, java.io.IOException
destroy()//webapp 退出的时候public void destroy()
如下为Servlet生命周期图:
Servlet 编程接口 :
GenericServlet是全部Servlet的鼻祖
用于HTTP的Servlet编程都经过继承 javax.servlet.http.HttpServlet 实现
请求处理方法(应对Http协议请求):一、doGet 响应Get请求,经常使用
二、doPost 响应Post请求,经常使用
实例的个数:在非分布的状况下,一般一个Servlet在服务器中有一个实例
Servlet的多线程机制 :
Servlet体系结构是创建在Java多线程机制之上的,它的生命周期是由Web容器负责的。
当客户端第一次请求某个Servlet时,Servlet 容器将会根据web.xml配置文件实例化这个Servlet类。当有新的客户端请求该Servlet时,通常不会再实例化该Servlet类,也就是有 多个线程在使用这个实例。
Servlet容器会自动使用线程池等技术来支持系统的运行
转自:https://www.cnblogs.com/lwxalxy/p/4674951.html
1.servlet的工做过程以及容器的做用
Servlet没有main()方法,他们受控与另一个java应用,这个java应用称为容器(Container)。Tomcat就是这么一个容器,web服务器应用(如Apache)获得一个指向Servlet的请求时,服务器不是把这个请求交给Servlet自己,而是交给部署该servlet的容器。要由容器向servlet提供HTTP请求和响应,并且是由容器调用servlet的方法(doGet()和doPost())。容器运行多个servlet线程来处理对同一servlet的多个请求。(对每一个请求分配一个线程,而不是每一个客户)
容器的做用:
1)通讯支持。利用容器提供的方法,web服务器能轻松的与servlet进行通讯。
2)生命周期管理。容器控制着servlet的生与死。它会负责加载类,实例化,初始化,调用servlet的方法以及使servlet可以被垃圾回收。
3)多线程支持。容器会自动的接受每一个servlet请求,建立一个新的java线程。针对每一个请求,若是servlet已经运行完相应的HTTP方法,线程就会结束。可是咱们同时也得考虑线程的安全性。
4)JSP支持。负责将JSP翻译成真正的java。
容器是如何处理用户请求的了?
1)用户点击一个连接,指向一个servlet而不是一个静态页面。
2)web服务器接到这个请求后转发给容器。容器接着建立两个对象:HttpServletRequest和HttpServletResponse。
3)容器根据请求中的URL找到相应的servlet,为这个请求建立一个线程,并把请求对象HtttpServletRequest和响应对象HttpServletResponse传递给这个servlet线程。
4)线程接下来调用service()方法,根据请求的不一样,service()方法调用doGet()和doPost()方法。
5)doGet()方法生成动态页面,并把这个页面塞到响应对象里。
6)service()方法结束,随之线程结束,容器把响应对象装换为一个HTTP相应,发送给客户,而后删除请求和响应对象。
2.Servlet的生命周期
注意他的一辈子都是由容器控制的。servlet一辈子中只有一个实例出现,可是有多个线程出现。
加载类 Servlet .class文件
实例化 构造函数运行
初始化 容器调用 init() 方法(一辈子只调一次)
service方法? servlet一辈子主要在这里度过
销 毁? 销毁实例以前调用 destroy() 方法
可回收? 等待垃圾回收等待垃圾回收
3.Servlet一辈子中的三大重要时刻
1)init()方法:在servlet实例被建立后调用,能够覆盖此方法作一些初始化的工做,比方说获得一个数据库链接。
2)service()方法:当客户请求到来时,容器会建立一个新的线程,调用servlet的service()方法。servlet的一辈子基本都在这里度过。咱们通常不要覆盖此方法。
3)doGet或者doPost()方法:service方法根据请求的HTTP方法,来调用doGet()或者doPost()方法。咱们在开发servlet时确定要覆盖此方法。每次运行doGet()或者doPost()方法,它都在一个单独的线程
中。
4.容器(tomcat)在启动时会作什么?容器在启动时,会根据相应的部署文件去寻找servlet文件。5.为何要有init方法了?难道不能将init代码放在构造函数中么?由于让一个普通的java类成为servlet文件时容器付出的代价也挺大,好比说内存分配。在没有调用init方法时他仍是一个普普统统的java对象,只有在用户使用时才再让他称为servlet这样对资源的利用比较合理,注意:init方法是在第一个用户调用此servlet时被触发。