一、概念
在服务器上的Java类必须遵守一定的规范,这样才能被服务器(例如Tomcat)识别并执行。只有这样的类浏览器才可以访问到。Servlet就定义了这样的一套规范,Servlet本质上其实就是一个接口。在服务器上定义的Java类就需要实现Servlet接口并实现其中的所有抽象方法。我们常常也可以把一个实现了Servlet接口的实现类称作一个Servlet。
二、使用方式
- 创建Java EE项目,选择Servlet3.0及以上的版本(因为Servlet3.0及以上版本支持注解配置,这样就不再需要web.xml了)。
- 定义一个类实现Servlet接口并实现其中的所有抽象方法。
- 在类上使用@WebServlet注解,进行配置。举例:
@WebServlet("/demo1")
三、执行原理
- 当服务器接收到客户端浏览器的请求后,会解析请求的URL地址,获取要访问的类的资源路径。
- 在服务器中查找是否有类的注解能够对应上该资源路径。
- 若有,服务器会将该类的字节码文件加载进内存。自动创建该类的对象并调用方法。
四、Servlet中的生命周期方法
-
init()方法:
默认情况下,当第一次被访问时,Servlet被创建。Servlet中的init()方法只会执行一次,因此一个Servlet在内存中只存在一个对象,即Servlet是单例的。
【注】当多个用户同时访问该对象时,可能存在线程安全问题。因此,尽量不要在Servlet中定义成员变量。即使定义了成员变量,也不要有对其修改值的操作。
-
service()方法:
提供服务,可以被多次执行。当每次访问Servlet时,Service方法都会被自动调用一次。
-
destory()方法:
当服务器关闭时,Servlet被销毁。destory()方法在Servlet被销毁之前执行,一般用于释放资源,只会执行一次。
【注】只有当服务器正常关闭时,才会执行destroy方法。
五、Servlet的继承体系结构
Servlet —— 接口
|
GenericServlet —— 抽象类
|
HttpServlet —— 抽象类
-
GenericServlet抽象类将Servlet接口中的其他方法都做了默认空实现,只将service()方法作了抽象。因此当需要定义Servlet实现类时,可以继承GenericServlet抽象类,然后只需要实现service()方法即可。
-
HttpServlet抽象类是对HTTP协议的一种封装,更为常用。
// HttpServlet抽象类的service方法 // 判断请求方式 String method = req.getMethod(); if("GET".equals(method)){ doGet(); }else if("POST".equals(method)){ doPost(); }
我们在继承HttpServlet时,只需要重写doGet()方法和doPost()方法即可。