一、Servlet简介

1、什么是Servlet

A servlet is a small Java program that runs within a Web server.

Servlet(Server Applet)是 Java Servlet 的简称,是采用 Java 编写并运行在 Web 服务器中的小程序,本质上就是一个接口(interface),该接口定义了初始化 Servlet、服务请求和从服务器中删除 Servlet 的方法。Servlet 具有独立于平台和协议的特性,主要功能在于交互式地浏览和生成数据,生成动态 Web 内容。

2、Servlet的作用

Servlet的作用

由上图可知,Servlet 实际上起到了一个制定规则和约束的作用(这也是Java中接口的作用)。

3、Servlet中的方法

在 Servlet 接口中定义了五个方法,下面用一张表格进行介绍:

方法 作用
void init() 由Servlet容器调用,以向Servlet指示Servlet正在投入服务
void service(HttpServletRequest req, HttpServletResponse res) 由Servlet容器调用以允许Servlet响应请求
String getServletInfo() 返回有关Servlet的信息,如作者、版本和版权
ServletConfig getServletConfig() 返回一个ServletConfig对象,其中包含此Servlet的初始化和启动参数
void destroy() 由Servlet容器调用,以向Servlet指示Servlet正在停止服务

实际上这些方法被称为生命周期方法(life-cycle methods),关于生命周期方法将会在后续的文章中进行详细介绍。

二、快速入门

前面我们对 Servlet 进行了简单介绍,下面将通过一个入门案例来了解 Servlet 的基本用法。

1、创建工程

我们以 IDEA 为例来创建一个 Java EE 工程:

创建工程-1

创建工程-2

创建工程-3

2、实现接口

创建完项目之后,在src目录下添加一个包cn.frankfang.servlet并在该包中添加一个ServletDemo1类,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
package cn.frankfang.servlet;

import javax.servlet.*;
import java.io.IOException;

/**
* Servlet快速入门
*/
public class ServletDemo1 implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {

}

@Override
public ServletConfig getServletConfig() {
return null;
}

@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {

}

@Override
public String getServletInfo() {
return null;
}

@Override
public void destroy() {

}
}

该类实现了javax.servlet.Servlet类,目前只需实现service方法即可,下面就来实现service方法:

1
2
3
4
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("Hello Servlet!");
}

以上代码可以实现在调用service方法时在控制台打印输出Hello Servlet!的功能。

3、配置Servlet

在实现了Servlet接口之后我们需要在web.xml中对Servlet进行配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">

<!-- 配置Servlet -->
<servlet>
<!-- Servlet名称 -->
<servlet-name>demo1</servlet-name>
<!-- 对应的Servlet实现类 -->
<servlet-class>cn.frankfang.servlet.ServletDemo1</servlet-class>
</servlet>

<!-- 配置Servlet映射 -->
<servlet-mapping>
<!-- Servlet名称 -->
<servlet-name>demo1</servlet-name>
<!-- 映射的URL -->
<url-pattern>/demo1</url-pattern>
</servlet-mapping>

</web-app>

3、部署项目

首先对Tomcat服务器进行配置:

配置Tomcat服务器

之后便可以启动项目,打开浏览器访问http://localhost:8080/servlet_war_exploded/demo1并查看运行结果:

启动项目

三、执行原理

通过上面的例子,我们已经知道了该如何使用Servlet,但令人比较困惑的是service方法是如何执行的,或者说是怎么调用service方法的。下面我们用一张图来介绍Servlet执行过程的基本原理:

执行原理

(1)当服务器接受到客户端浏览器的请求后,会解析请求的URL,获取访问的Servlet的资源路径

(2)服务器查找web.xml文件,是否有对应的<url-pattern>标签体内容

(3)如果有,则在找到对应的<servlet-class>全类名

(4)Tomcat利用反射机制将字节码文件加载进内存,并创建其对象

(5)调用其中的方法

以上就是Servlet执行过程的基本原理。