一、Servlet简介
Servlet是sun公司提供的一门用于开发动态web资源的技术。
Sun公司在其API中提供了一个servlet接口,用户若想用发一个动态web资源(即开发一个Java程序向浏览器输出数据),需要完成以下2个步骤:
1、编写一个Java类,实现servlet接口。
2、把开发好的Java类部署到web服务器中。
按照一种约定俗成的称呼习惯,通常我们也把实现了servlet接口的java程序,称之为Servlet
简而言之,Servlet其实就是一个遵循Servlet开发的java类。Serlvet是由服务器调用的,运行在服务器端。
二、Servlet的作用
Servlet带给我们最大的作用就是能够处理浏览器带来HTTP请求,并返回一个响应给浏览器,从而实现浏览器和服务器的交互。
三、实现Servlet接口编写Servlet程序
1、创建一个Servlet类,实现Servlet接口
2、在Servlet中一共有5个方法需要我们实现,分别为:
1 | public class Servlet01 implements Servlet{ |
3、在WebRoot/WEB_INF/web.xml中进行配置
1 | <servlet> |
当然,在以后的开发中都是使用的开发工具创建来Servlet类,创建完成之后也就自动在web.xml文件中配置好了,所以下面的实现都省去了这一步。
四、Servlet的生命周期
由第三点可以引出Servlet的生命周期方法共有三个:
1 | public void init(ServletConfig servletConfig) |
实际上Servlet生命周期可分为5个步骤:
- 加载Servlet:当Tomcat第一次访问Servlet的时候,Tomcat会负责创建Servlet的实例
- 初始化:当Servlet被实例化后,Tomcat会调用init()方法初始化这个对象
- 处理服务:当浏览器访问Servlet的时候,Servlet 会调用service()方法处理请求
- 销毁:当Tomcat关闭时或者检测到Servlet要从Tomcat删除的时候会自动调用destroy()方法,让该实例释放掉所占的资源。一个Servlet如果长时间不被使用的话,也会被Tomcat自动销毁
- 卸载:当Servlet调用完destroy()方法后,等待垃圾回收。如果有需要再次使用这个Servlet,会重新调用init()方法进行初始化操作。
简单总结:只要访问Servlet,service()就会被调用。init()只有第一次访问Servlet的时候才会被调用。 destroy()只有在Tomcat关闭的时候才会被调用。
五、Servlet的其他实现类
(一)GenericServlet类
由于有时候我们需要使用ServletConfig来获取项目的一些配置信息,即:读取web.xml中的一些信息,那么此时就还需要同时实现ServletConfig接口,这样就导致我们的Servlet类比较麻烦。
因此sun公司就定义了另外的一个类,GenericServlet类,该类同时继承了Servlet接口和ServletConfig接口,也就是说该类同时实现了这两个接口的方法:
1 | init(ServletConfig config) |
并且在该类重载了一个无参init()方法,部分源码如下:
1 |
|
这样就保证了我们可以405在往init()方法中添加代码的同时还不会重写有参init()方法,从而不会导致获取ServletConfig对象出现问题(这一方法非常值得学习)。
然后我们当我们需要创建Servlet类时,只需要继承GenericServlet类,实现service方法即可。
1 | public class Servlet02 extends GenericServlet { |
(二)HttpServlet类
但GenericServlet类并不能满足我们的需求,因为通常我们都会和HTTP打交道,所以就出现了HttpServlet类。
HttpServlet指能够处理HTTP请求的servlet,它继承了GenericServlet,并在原有Servlet接口上添加了一些与HTTP协议处理方法,它比Servlet接口的功能更为强大。因此开发人员在编写Servlet时,通常应继承这个类,而避免直接去实现Servlet接口。
HttpServlet在实现Servlet接口时,重写了service方法,该方法会自动判断用户的请求方式,如为GET请求,则调用HttpServlet的doGet方法,如为Post请求,则调用doPost方法。因此,开发人员在编写Servlet时,通常只需要重写doGet或doPost方法,而不要去重写service方法。
注意:如果没有重写doGet或doPost方法,但是浏览器发送的请求的方法又是这两种的一种,则会报出405错误(表示该方法不支持)。
1 | public class Servlet03 extends HttpServlet { |
(三)总结
实现Servlet有三种方式:
1、实现javax.servlet.Servlet接口;
2、继承javax.servlet.GenericServlet类;
3、继承javax.servlet.http.HttpServlet类;
通常我们会去继承HttpServlet类来完成我们的Servlet
Java新手,若有错误,欢迎指正!