Servlet第一篇【Servlet简介、作用、生命周期、实现】
一、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个方法需要我们实现,分别为:
public class Servlet01 implements Servlet{
/**
* 生命周期方法
* 在Servlet被销毁之前调用,并且只会调用一次
*/
@Override
public void destroy() {
System.out.println("destroy()");
}
/**
* 获取Servlet配置信息
*/
@Override
public ServletConfig getServletConfig() {
System.out.println("getServletConfig()");
return null;
}
/**
* 获取Servlet信息
*/
@Override
public String getServletInfo() {
System.out.println("getServletInfo()");
return null;
}
/**
* 生命周期方法
* 在Servlet对象创建之后马上执行,并且只执行一次
*/
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("init()");
}
/**
* 生命周期方法
* 会被调用多次
* 每次处理请求都是调用这个方法
*/
@Override
public void service(ServletRequest request, ServletResponse response)
throws ServletException, IOException {
System.out.println("service()");
}
}
3、在WebRoot/WEB_INF/web.xml中进行配置
<servlet>
<servlet-name>servlet01</servlet-name>
<servlet-class>com.zuobiao.servlet.Servlet01</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>servlet01</servlet-name>
<url-pattern>/Servlet01</url-pattern> <!-- 表示在浏览器中输入的访问路径 -->
</servlet-mapping>
当然,在以后的开发中都是使用的开发工具创建来Servlet类,创建完成之后也就自动在web.xml文件中配置好了,所以下面的实现都省去了这一步。
四、Servlet的生命周期
由第三点可以引出Servlet的生命周期方法共有三个:
public void init(ServletConfig servletConfig)
public void service(ServletRequest request, ServletResponse response)
public void destroy()
实际上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接口,也就是说该类同时实现了这两个接口的方法:
init(ServletConfig config)
destroy()
getServletInfo()
getServletConfig(ServletConfig config)
getInitParameter(String name)
getInitParameterNames()
getServletContext()
getServletName()
并且在该类重载了一个无参init()方法,部分源码如下:
@Override
public void init(ServletConfig config) throws ServletException {
this.config = config;
this.init();
}
/**
*这个方法是GenericServlet自己的方法,而不是从Servlet继承下来的。当我们自定义Servlet时,如果想完成初始化作用就不要再重复init(ServletConfig)方法了,而是应该去重写init()方法。因为在GenericServlet中的init(ServletConfig)方法中保存了ServletConfig对象,如果覆盖了保存ServletConfig的代码,那么就不能再使用ServletConfig了。
*/
public void init() throws ServletException {
// NOOP by default
}
这样就保证了我们可以405在往init()方法中添加代码的同时还不会重写有参init()方法,从而不会导致获取ServletConfig对象出现问题(这一方法非常值得学习)。
然后我们当我们需要创建Servlet类时,只需要继承GenericServlet类,实现service方法即可。
public class Servlet02 extends GenericServlet {
@Override
public void service(ServletRequest req, ServletResponse res)
throws ServletException, IOException {
}
}
(二)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错误(表示该方法不支持)。
public class Servlet03 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
System.out.println("doGet()...");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
System.out.println("doPost()...");
}
}
(三)总结
实现Servlet有三种方式:
1、实现javax.servlet.Servlet接口;
2、继承javax.servlet.GenericServlet类;
3、继承javax.servlet.http.HttpServlet类;
通常我们会去继承HttpServlet类来完成我们的Servlet
Java新手,若有错误,欢迎指正!