介绍
Servlet(Server Applet),全称Java Servlet,未有中文译文。是用Java编写的服务器端程序。其主要功能在于交互式地浏览和修改数据,生成动态Web内容。狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类,一般情况下,人们将Servlet理解为后者。
Servlet运行于支持Java的应用服务器中。从实现上讲,Servlet可以响应任何类型的请求,但绝大多数情况下Servlet只用来扩展基于HTTP协议的Web服务器。
其实我们可以将servlet想简单一点,不用考虑那么多。
它就是用Java语言编写的一套接口,介于浏览器(HTTP客户端)和数据库(HTTP服务器)之间(实际存在服务器上),用于处理HTTP请求。
代码编写好之后,还不能直接使用,需要部署到一个servlet容器(比如tomcat)。由这个容器接收请求,并分发给对应的servlet去处理,最后再由容器响应。
生命周期
servlet部署在容器中,他的生命周期也是由容器管理的。需要注意的是容器启动的时候,servlet不一定被加载,servlet只在收到请求的时候才会被加载和实例化。而这之后,如果没有特殊情况(比如容器内存回收),那么servlet实例会直到服务器关闭才被销毁。
servlet可以由 javax.servlet 和 javax.servlet.http 包创建,它里面提供了五个方法:
- init(ServletConfig)
- getServletConfig()
- service(ServletRequest,ServletResponse)
- getServletInfo()
- destroy()
我们重点关注 1、3、5 三个方法。
init()是初始化方法,只在servlet第一次接受请求时执行一次,与之相似的是destroy()方法,只在servlet销毁时执行才执行一次,这两个方法在一个servlet实例中都只执行一次。
service()方法就是处理HTTP请求的方法,每次请求的时候都会调用这个方法,这个方法可以被执行多次。
创建方式
这里讲解三种创建servlet的方式
- 第一种:实现Servlet接口
public class ServletDemo1 implements Servlet {
//public ServletDemo1(){}
//当Servlet第一次被创建对象时执行该方法,该方法在整个生命周期中只执行一次
public void init(ServletConfig arg0) throws ServletException {
System.out.println("=======init=========");
}
//对客户端响应的方法,该方法会被执行多次,每次请求该servlet都会执行该方法
public void service(ServletRequest arg0, ServletResponse arg1)
throws ServletException, IOException {
System.out.println("hehe");
}
//当Servlet被销毁时执行该方法
public void destroy() {
System.out.println("******destroy**********");
}
//当停止tomcat时销毁的servlet。
public ServletConfig getServletConfig() {
return null;
}
public String getServletInfo() {
return null;
}
}
复制代码
- 第二种:继承GenericServlet 类
这种方法比较少用
public class ServletDemo2 extends GenericServlet {
@Override
public void service(ServletRequest arg0, ServletResponse arg1)
throws ServletException, IOException {
System.out.println("heihei");
}
}
复制代码
- 第三种:继承HttpServlet 类
最常用的方法
public class ServletDemo3 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
System.out.println("haha");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
System.out.println("ee");
doGet(req,resp);
}
}
复制代码
关于HttpServlet、GenericServlet 和 Servlet 的关系是这样的:
GenericServlet 是 Servlet 的一个子类抽象类,对其中的 init() 和 destroy() 提供了默认实现,可以直接调用 ServletConfig 中的方法。继承这个类必须重写service()方法。
HttpServlet 也是一个抽象类,它进一步继承并封装了 GenericServlet,由于这个类还扩展了HTTP的内容,因此还需要传入HttpServletRequest 和 HttpServletResponse两个参数。
这里需要了解的是,JSP也是HttpServlet的扩展,只不过是使用了HTML的书写格式,在其中加入Java代码。也就是说JSP也是一个servlet。