在介绍Tomcat之前,我们首先需要了解它的作用,简单的说,tomcat就是一个servlet容器。因此,本文首先从Web 应用程序开始讲起,逐步介绍servlet。
Web即表示网页的意思,它用于表示 Internet 主机上供外界访问的资源。
Web 应用程序是一种可以通过 Web 访问的应用程序,程序的最大好处是用户很容易访问应用程序,用户只需要有浏览器即可,不需要再安装其他软件。
Internet 上供外界访问的 Web 资源分为主要分为静态资源与动态资源:
常用的web服务器:
不过以上服务器只能处理静态的资源请求。网页要提前写好,不能动态生成。
早期在servelet出现之前,使用CGI(Common GateWay Interface-通用网关接口)程序来扩展。CGI程序开发复杂,移植性差,很少用了。
目录
前言
一、Servlet简介
1、什么是 Servlet
2、Servlet 生命周期如下
二、Servlet API
1、Servlet 接口
2、init() 方法
3、service() 方法
4、doGet() 方法
5、doPost() 方法
6、destroy() 方法
狭义的Servlet 是指 Java 实现的一个接口,定义的是一套处理网络请求的规范,所有实现servlet的类,都需要实现它那五个方法,其中最主要的是两个生命周期方法 init()和destroy(),还有一个处理请求的service(),也就是说,所有实现servlet接口的类,或者说,所有想要处理网络请求的类,都需要回答这三个问题:
你初始化时要做什么、你销毁时要做什么、你接受到请求时要做什么
而广义的Servlet 是指任何实现了这个 Servlet 接口的类,比如Spring MVC的核心组件DispatcherServlet。
Servlet 运行于支持 Java 的应用服务器中。从原理上讲,Servlet 可以响应任何类型的请求,但绝大多数情况下 Servlet 只用来扩展基于 HTTP 协议的 Web 服务器。
servlet是一个规范,那实现了servlet的类,就能处理请求了吗?答案是,不能。
因为servlet只定义了接收到请求后要做什么,至于端口监听,协议协议解析这些则完全不关系。那请求怎么来到servlet呢?答案是servlet容器,比如我们最常用的tomcat。
tomcat才是与客户端直接打交道的家伙,他监听了端口,请求过来后,根据url等信息,确定要将请求交给哪个servlet去处理,然后调用那个servlet的service方法,service方法返回一个response对象,tomcat再把这个response返回给客户端。
所谓生命周期,就是Servlet什么时候创建,调用了何种方法,最后在什么时候被销毁。我们之前学过的对象都是自己手动创建的,最后由JVM来销毁,而Servlet的整个生命周期,都是由tomcat服务器来控制的。
我们通过去实现Servlet接口的方式观察Servlet的生命周期。如图:
由上图所示,程序运行后得出结论,Servlet的生命周期是:
实例化 --》初始化 --》多次调用service服务 --》 tomcat容器关闭时销毁
除了默认情况,我们也可以通过load-on-startup来控制Servlet在服务器启动的时候就加载(实例化+初始化)。
Servlet 接口定义了下面五个方法:
public interface Servlet {
void init(ServletConfig var1) throws ServletException;
ServletConfig getServletConfig();
void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;
String getServletInfo();
void destroy();
}
init 方法被设计成只调用一次。它在第一次创建 Servlet 时被调用,在后续每次用户请求时不再调用。因此,它是用于一次性初始化,就像 Applet 的 init 方法一样。
Servlet 创建于用户第一次调用对应于该 Servlet 的 URL 时,但是您也可以指定 Servlet 在服务器第一次启动时被加载。
当用户调用一个 Servlet 时,就会创建一个 Servlet 实例,每一个用户请求都会产生一个新的线程,适当的时候移交给 doGet 或 doPost 方法。init() 方法简单地创建或加载一些数据,这些数据将被用于 Servlet 的整个生命周期。
public void init() throws ServletException {
// 初始化代码...
}
service() 方法是执行实际任务的核心方法。Servlet 容器(即 Web 服务器)调用 service() 方法来处理来自客户端(浏览器)的请求,并把格式化的响应写回给客户端。
service() 方法有两个参数:ServletRequest 和 ServletResponse。ServletRequest 用来封装请求信息,ServletResponse 用来封装响应信息,因此本质上这两个类是对通信协议的封装。
每次服务器接收到一个 Servlet 请求时,服务器会产生一个新的线程并调用服务。service() 方法检查 HTTP 请求类型(GET、POST、PUT、DELETE 等),并在适当的时候调用 doGet、doPost、doPut,doDelete 等方法。
public void service(ServletRequest request,
ServletResponse response)
throws ServletException, IOException{
}
service() 方法由容器调用,service 方法在适当的时候调用 doGet、doPost、doPut、doDelete 等方法。所以,您不用对 service() 方法做任何动作,您只需要根据来自客户端的请求类型来重写 doGet() 或 doPost() 即可。
doGet() 和 doPost() 方法是每次服务请求中最常用的方法。下面是这两种方法的特征。
GET 请求来自于一个 URL 的正常请求,或者来自于一个未指定 METHOD 的 HTML 表单,它由 doGet() 方法处理。
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
// Servlet 代码
}
POST 请求来自于一个特别指定了 METHOD 为 POST 的 HTML 表单,它由 doPost() 方法处理。
public void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
// Servlet 代码
}
destroy() 方法只会被调用一次,在 Servlet 生命周期结束时被调用。destroy() 方法可以让您的 Servlet 关闭数据库连接、停止后台线程、把 Cookie 列表或点击计数器写入到磁盘,并执行其他类似的清理活动。
在调用 destroy() 方法之后,servlet 对象被标记为垃圾回收。destroy 方法定义如下所示:
public void destroy() {
// 终止化代码...
}