Servlet的工作原理:
1、浏览器依据IP port建立连接;
2、浏览器要将要请求的输数据打包并发送;
3、Servlet容器解析请求数据包,将解析之后的结果封装到request对象中,并且同时创建一个response对象,用来封装响应信息;
4、Servlet容器创建Servlet对象,然后调用service方法,容器会事先将创建好的request,response对象作为参数传入。
注意:此处的创建的 servlet 对象不是单例,在默认情况下,容器收到请求的时候创建;在特殊的情况下,配置有<load-on-startup>参数的 servlet,容器在启动后机会自动创建。该参数是一个大于等于 0 的参数,这个值越小,优先级就越高,高度注意:Servlet 在容器中有一个实例对象,而且只要 request 就会被创建。
5.servlet 可以访问 request 对象获得请求的参数,也可以将处理的结果写到 response 对象上。
6.容器中 response 中获得处理结果,然后打包发送给浏览器
7.浏览器解析服务器响应的结果,生成新的页面输出Servlet
生命周期Servlet:
容器如何创建 Servlet 对象、如何为 Servlet 对象分配、准备资源、如何调用对应的方法来处理请求以及如何销毁 Servlet 对象的整个过程即Servlet 的生命周期。
Servlet 的生命周期的四个阶段:
阶段一、实例化
1.什么是实例化?
容器在调用 servlet 的构造器来创建相应的对象
2.什么时候实例化?
默认情况下,容器一旦受到 request 请求,servlet 对象就会被创建;但是在特殊的情况下,在 web.xml 文件中配置有<load-on-startup>参数的servlet,容器在启动后就会自动创建。
注意该参数是一个大于等于 0 的参数,这个值越小,优先级就越高。
高度注意:Servlet 在容器中有一个实例对象,而且只要 request 就会被创建。
阶段二、初始化
1.什么是初始化?
实例化以后,容器就会立即调用 servlet 对象的 init 方法,注意:init 方法只会执行一次。一般情况下不用写 init 方法,因为 GenericServlet 已经提供了该方法的实现方法。 (将容器传递来的 ServletConfig 对象保存起来)
2.如何实现自己的初始化逻辑呢?
只需要覆盖/重写 override init()方法即可
阶段三、就绪/调用
1.什么是就绪?
容器收到请求后调用 Servlet 对象的 service 方法;
2.HttpServlet 的 service 方法是如何实现的?
依据请求的方式(get、post)调用对应当的 doGet 和 doPost 方法。
注意:我们写 Servlet 可以选择 override HttpServlet 提供的 doGet 和doPost 方法,也可以选择 override HttpServlet 的 service 方法。
阶段四、销毁Servlet
容器在销毁 Servlet 对象时会调用 destroy 方法来释放资源。该方法只会执行一次;Servlet 容器也有自身管理 Servlet 对象的准则,整个生命周期并不需要人为进行干预。destroy 方法的作用是用来释放资源。
(init 方法获得的资源如果需要在这里释放即可)
Servlet 生命周期中的接口:
Servlet 接口init(ServletConfig config)service(ServletRequest req,ServletResponse res)destroy( )GenericServlet 抽象类实现了 Servlet 接口中的几个方法:service、destroyHTTPServlet 抽象类继承自 GenericServlet 抽象类注意:HttpServlet 又是在继承 GenericServlet 的基础上进一步的扩展,一个是 public voidinit(ServletConfig config),另一个是 public void init()。他们有如下的关系: init(ServletConfig config)方法由 tomcat 自动调用,它读取 web 工程下的 web.xml,将读取的信息打包传给此参数,此方法的参数同时将接收的信息传递给 GenericServlet 类中的成员变量 config,同时调用init()。以后程序员想重写 init 方法可以选择 init(ServletConfig config)或者init(),但是选择 init(ServletConfig config)势必会覆盖此方法已实现的内容,没有为 config 变量赋值,此后若是调用 getServletConfig()方法返回 config时会产生空指针异常的,所以想重写 init(ServletConfig config)方法,必须在方法体中第一句写上 super.init(config) ,为了防止程序员忘记重写super.init(config)方法 sun 公司自动为用户生成一个 public void init()的方法。