什么是servlet?
servlet 是运行在 Web 服务器中的小型 Java 程序(即:服务器端的小应用程序)。servlet 通常通过 HTTP(超文本传输协议)接收和响应来自 Web 客户端的请求。
执行过程
selvet生命周期
生命周期是指容器如何创建servlet实例、分配资源、调用其方法,销毁实例的过程
阶段一: 实例化
(就是创建 servlet 对象,调用构造器)
在如下两种情况下会进行对象实例化。
第一种情况:
当请求到达容器时,容器查找该 servlet 对象是否存在,如果不存在,才会创建实例。
第二种情况:
容器在启动时,或者新部署了某个应用时,会检查 web.xml 当中,servlet 是否有load-on-starup 配置。如果有,则会创建该 servlet 实例。
load-on-starup 参数值越小,优先级越高(最小值为 0,优先级最高)。
<servlet>
<servlet-name>loginServlet</servlet-name>
<servlet-class>com.gezhi.controller.LoginServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
实验1:设置构造器,观察多次访问的时候和service方法执行先后
实验2:在配置文件中加入load-on-starup,观察实例化的时机
阶段二: 初始化
为 servlet 分配资源,调用 init(ServletConfig config);
方法config 对象可以用来访问 servlet 的初始化参数。
初始化参数是使用 init-param 配置的参数。
init 可以 override。
实验1:override init方法,观察执行实际(和上边的实验配合)
实验2:加入,并通过取值config
<init-param>
<param-name>name</param-name>
<param-value>zhangsan</param-value>
</init-param>
ServletConfig config=getServletConfig();
String add=config.getInitParameter("address");
、 ---------------------------------------------
如果是有参的init那么不需要获取ServletConfig
name=config.getInitParameter(“name”);
阶段三: 就绪/调用
有请求到达容器,容器调用 servlet 对象的 service()方法。
HttpServlet 的 service()方法,会依据请求方式来调用 doGet()或者 doPost()方法。
但是,这两个 do 方法默认情况下,会抛出异常,需要子类去 override。
阶段四: 销毁
容器依据自身的算法,将不再需要的 servlet 对象删除掉。
在删除之前,会调用 servlet 对象的 destroy()方法。
destroy()方法用于释放资源。
在 servlet 的整个生命周期当中,init,destroy 只会执行一次,而 service 方法会执行多次。
Servletconfig(待完善)
- 每个Servlet有一个Servletconfig对象
- 用于向Servlet传递部署时信息(例如,数据库或企业bean的查找名),而你不想把这个信息硬编码到servlet中(servlet初始化参数)
- 用于访问Servletcontext
- 参数在部署描述文件中配置
Servletcontext(待完善)
- 每个web应用有一个Servletcontext
- 用于访问web应用参数(也在部署文件中配置)
- 相当于应用中一个公共栏,可以在这里放消息(属性),应用的其他部分可以访问这些消息
- 用于得到服务器消息,包括容器的名字和版本,以及所支持的apl版本等