EmmmuaCode EmmmuaCode
首页​
导航🚀​
  • 数据结构
  • 计算机网络
  • Java基础

    • JavaSE
    • JVM虚拟机
    • JUC并发编程
  • JavaWeb

    • Servlet
    • MVC
    • filter|listener
  • HTML
  • CSS
  • JavaScript
  • Vue
  • uni-app
  • Spring5
  • SpringMVC
  • SpringBoot2
  • SpringCloud
  • SpringSecurity
  • 搜索引擎

    • ElasticSearch
  • 消息队列

    • RabbitMQ
  • 服务器

    • Nginx🌐
  • 服务框架

    • Dubbo
  • Python基础
  • 数据分析
  • Hadoop
  • SQL 数据库

    • MySQL
  • NoSQL 数据库

    • NoSQL数据库概论
    • Redis
    • MongoDB
    • HBase
  • 框架

    • MyBatis
    • MyBatis-Plus
    • ShardingSphere
  • 部署

    • Linux
    • Docker
  • 管理

    • Maven
    • Git
  • 友情链接
  • 优秀博客文章
  • 索引

    • 分类
    • 标签
    • 归档
  • 其他

    • 关于
Github (opens new window)

wufan

海内存知己,天涯若比邻。
首页​
导航🚀​
  • 数据结构
  • 计算机网络
  • Java基础

    • JavaSE
    • JVM虚拟机
    • JUC并发编程
  • JavaWeb

    • Servlet
    • MVC
    • filter|listener
  • HTML
  • CSS
  • JavaScript
  • Vue
  • uni-app
  • Spring5
  • SpringMVC
  • SpringBoot2
  • SpringCloud
  • SpringSecurity
  • 搜索引擎

    • ElasticSearch
  • 消息队列

    • RabbitMQ
  • 服务器

    • Nginx🌐
  • 服务框架

    • Dubbo
  • Python基础
  • 数据分析
  • Hadoop
  • SQL 数据库

    • MySQL
  • NoSQL 数据库

    • NoSQL数据库概论
    • Redis
    • MongoDB
    • HBase
  • 框架

    • MyBatis
    • MyBatis-Plus
    • ShardingSphere
  • 部署

    • Linux
    • Docker
  • 管理

    • Maven
    • Git
  • 友情链接
  • 优秀博客文章
  • 索引

    • 分类
    • 标签
    • 归档
  • 其他

    • 关于
Github (opens new window)
  • Java 基础

    • Java 概述
    • Java 变量
    • Java 运算符
    • Java 程序控制结构
    • Java 数组、排序和查找
    • Java 面向对象
    • Java 枚举和注解
    • Java 异常-Exception
    • Java 常用类
    • Java 集合
    • Java 泛型
    • Java 多线程
    • Java IO流
    • Java 网络编程
    • Java 多用户即时通信系统
    • Java 反射
    • Java JDBC和数据库连接池
    • Java 正则表达式
    • Java 8新特性
  • JVM

    • 基础篇
    • 实战篇
    • 高级篇
    • 原理篇
    • 面试篇
  • JUC 并发编程

    • 进程与线程
    • Java 线程
    • 共享模型之管程
    • 共享模型之内存
    • 无锁
    • 享元模式
    • 线程池
    • 同步器
    • 并发包
  • Servlet

    • IDEA的使用
    • HTTP协议与Tomcat服务器
    • Servlet 概论
      • 创建Web项目
      • Servlet的实现
        • 新建类
        • 实现Servlet规范
        • 重写service方法
        • 设置注解
        • 发布项目并启动服务
        • 访问并查看结果
        • service方法的另外两种实现方式(了解)
      • Servlet的工作流程
      • Servlet的生命周期
    • HttpServletRequest对象
    • HttpServletResponse对象
    • Cookie 对象
    • HttpSession对象
    • ServletContext对象
    • 文件的上传和下载
  • MVC 三层架构

    • MVC 三层架构
  • 拦截器|监听器

    • 过滤器|监听器
  • studynotes
  • JavaEE
  • JavaWeb
wufan
2022-01-11
目录

Servlet 概论

# Servlet 概论

Servlet 是 Server 与 Applet 的缩写,是服务端小程序的意思。使用 Java 语言编写的服务器端程序, 可以生成动态的 WEB 页,Servlet 主要运行在服务器端,并由服务器调用执行, 是一种按照 Servlet 标 准来开发的类。 是 SUN 公司提供的一门用于开发动态 Web 资源的技术。(言外之意:要实现 web 开发,需要实现 Servlet 标准)

Servlet 本质上也是 Java 类,但要遵循 Servlet 规范进行编写,没有 main()方法,它的创建、使用、 销毁都由 Servlet 容器进行管理(如 Tomcat)。(言外之意:写自己的类,不用写 main 方法,别人自动调用)

Servlet 是和 HTTP 协议是紧密联系的,其可以处理 HTTP 协议相关的所有内容。这也是 Servlet 应用广泛的原因之一。

提供了 Servlet 功能的服务器,叫做 Servlet 容器,其常见容器有很多,如 Tomcat, Jetty, WebLogicServer, WebSphere, JBoss 等等。

# 创建Web项目

  1. 选择"File"->"New"->Project
  2. 设置项目的相关信息,选择"Next"

01

02

03

# Servlet的实现

# 新建类

  1. 点击 "src" —> "new" —> "package",创建一个文件包
  2. 在包下面创建 Java 类文件,点击包名 —> "New" —> "Java Class"

04

# 实现Servlet规范

实现 Servlet 规范,即继承 HttpServlet 类,并到如响应的包,该类中已经完成了通信的规则,我们只 需要进行业务的实现即可。

package com.frx01.servlet01;

import javax.servlet.http.HttpServlet;

/**
 * @author frx
 * @version 1.0
 * @date 2022/1/11  11:15
 */
public class Servlet01 extends HttpServlet {
}

1
2
3
4
5
6
7
8
9
10
11
12

# 重写service方法

满足 Servlet 规范只是让我们的类能够满足接收请求的要求,接收到请求后需要对请求进行分析,以 及进行业务逻辑处理,计算出结果,则需要添加代码,在规范中有一个叫做 service的方法,专门用来做 请求处理的操作,业务代码则可以写在该方法中。

/**
 * @author frx
 * @version 1.0
 * @date 2022/1/11  11:15
 */
public class Servlet01 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("Hello servlet!");
        resp.getWriter().write("Hello World");
    }
}

1
2
3
4
5
6
7
8
9
10
11
12
13

# 设置注解

在完成好了一切代码的编写后,还需要向服务器说明,特定请求对应特定资源。

开发servlet项目,使用@WebServlet将一个继承于javax.servlet.http.HttpServlet 的类定义为Servlet 组件。在Servlet3.0中 , 可以使用@WebServlet注解将一个继承于javax.servlet.http.HttpServlet的类 标注为可以处理用户请求的 Servlet。

/**
 * @author frx
 * @version 1.0
 * @date 2022/1/11  11:25
 * 实现Servlet
 * 1.创建普通Java类
 * 2.实现Servlet的规范,继承HttpServlet类
 * 3.重写service方法,用来处理请求
 * 4.设置注解,指定访问的路径
 */
@WebServlet("/ser01")
public class Servlet01 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //打印内容在控制台
        System.out.println("Hello Servlet!");
        //通过流输出数据到浏览器
        resp.getWriter().write("Hello Servlet!");
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
  • 用注解配置 Servlet
@WebServlet(name="Servlet01",value="/ser01")
1
@WebServlet(name="Servlet01",urlPatterns = "/ser01")  //跟上面效果一样
1
  • 也可以配置多个访问路径
@WebServlet(name="Servlet01",value={"/ser01","/ser001"})
1
@WebServlet(name="Servlet01",urlPatterns={"/ser01","/ser001"})
1

# 发布项目并启动服务

到此,需要编写和配置的地方已经完成,项目已经完整了,但是如果需要外界能够访问, 还需要将项 目发布到服务器上并运行服务器。

  1. 设置项目的站点名(项目对外访问路径)

05

06

  1. 设置项目的Tomcat配置

07

  1. 启动服务器

08

# 访问并查看结果

在项目正确发布到服务器上之后,用户即可通过浏览器访问该项目中的资源。注意 url 的 格式正确,tomcat 的端口为 8080。

浏览器访问地址:http://localhost:8080/s0/ser01

  • 页面效果

09

  • 后台结果

10

到这里我们的第一个 Servlet 就实现了!

# service方法的另外两种实现方式(了解)

  • 继承GenericServlet类
/**
 * @author frx
 * @version 1.0
 * @date 2022/1/11  13:18
 * 继承GenericServlet类
 */
@WebServlet("/ser02")
public class Servlet02 extends GenericServlet{
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("继承GenericServlet类...");
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
  • 实现Servlet接口
/**
 * @author frx
 * @version 1.0
 * @date 2022/1/11  13:19
 * 实现Servlet接口
 */
@WebServlet("/ser03")
public class Servlet03 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 {
        System.out.println("实现Servlet接口...");
    }

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

    @Override
    public void destroy() {

    }
}

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
  • 调用doGet和doPost方法
/**
 * @author frx
 * @version 1.0
 * @date 2022/1/11  13:26
 */
@WebServlet("/ser04")
public class Servlet04 extends HttpServlet {
//    @Override
//    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        System.out.println("hello servlet...");
//    }

    /**
     * Get请求调用
     * @param req
     * @param resp
     * @throws ServletException
     * @throws IOException
     */

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("Get请求....");
        //业务代码
    }

    /**
     * Post请求调用
     * @param req
     * @param resp
     * @throws ServletException
     * @throws IOException
     */
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("Post请求...");
        //调用Get请求
        doGet(req,resp);
    }
}

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
35
36
37
38
39
40
41

# Servlet的工作流程

  1. 通过请求头获知浏览器访问的是哪个主机
  2. 再通过请求行获取访问的是哪个一个web应用
  3. 再通过请求行中的请求路径获知访问的是哪个资源
  4. 通过获取的资源路径在配置中匹配到真实的路径,
  5. 服务器会创建servlet对象,(如果是第一次访问时,创建servlet实例,并调用init方法进行初始化 操作)
  6. 调用service(request, response)方法来处理请求和响应的操作
  7. 调用service完毕后返回服务器 由服务器讲response缓冲区的数据取出,以http响应的格式发送给 浏览器

# Servlet的生命周期

Servlet没有 main()方法,不能独立运行,它的运行完全由 Servlet 引擎来控制和调度。 所谓生命周期,指的是 servlet 容器何时创建 servlet 实例、何时调用其方法进行请求的处理、 何时并销毁其实例的整个过程。

  • 实例和初始化时机

    当请求到达容器时,容器查找该 servlet 对象是否存在,如果不存在,则会创建实例并进行初始化。

  • 就绪/调用/服务阶段

    有请求到达容器,容器调用 servlet 对象的 service()方法,处理请求的方法在整个生命周期中可以被多次调用; HttpServlet 的 service()方法,会依据请求方式来调用 doGet()或者 doPost()方法。但是,这两个 do 方法默认情况下,会抛出异常,需要子类去 override。

  • 销毁时机 当容器关闭时(应用程序停止时),会将程序中的 Servlet 实例进行销毁。

    上述的生命周期可以通过 Servlet 中的生命周期方法来观察。在 Servlet 中有三个生命周 期方法,不由用户手动调用,而是在特定的时机有容器自动调用,观察这三个生命周期方法 即可观察到Servlet 的生命周期。

init 方法,在 Servlet 实例创建之后执行(证明该 Servlet 有实例创建了)

public void init(ServletConfig config) throws ServletException {
	System.out.println("实例创建了...");
}
1
2
3

service 方法,每次有请求到达某个 Servlet 方法时执行,用来处理请求(证明该Servlet 进行服务了)

protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
	System.out.println("服务调用了...");
}
1
2
3

destroy 方法,Servlet 实例销毁时执行(证明该 Servlet 的实例被销毁了)

public void destroy() {
	System.out.println("实例销毁了...");
}
1
2
3
Click me to view the code
/**
 * @author frx
 * @version 1.0
 * @date 2022/1/11  13:42
 */
@WebServlet("/ser05")
public class Servlet05 extends HttpServlet {

    //就绪/服务方法(处理请求数据)
    //系统方法,服务器自动调用
    //当有请求到达Servlet时,就会调用该方法
    //方法可以被多次调用
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("Servlet被调用了...");
    }

    //初始化方法
    //系统方法,服务器自动调用
    //当请求到达Servlet容器时,Servlet容器会判断Servlet对象是否存在.如果不存在,则创建实例并初始化
    //方法只会执行一次
    @Override
    public void init() throws ServletException {
        System.out.println("Servlet被创建了...");
    }

    //销毁方法
    //系统方法,服务器自动调用
    //当服务器关闭或应用程序停止时,调用该方法
    //方法只会执行一次
    @Override
    public void destroy() {
        System.out.println("Servlet被销毁了...");
    }
}

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
35
36

Servlet 的生命周期,简单的概括这就分为四步:servlet 类加载-->实例化-->服务-->销毁。

下面我们描述一下 Tomcat 与 Servlet 是如何工作的,看看下面的时序图:

11

  1. Web Client 向 Servlet 容器(Tomcat)发出 Http 请求
  2. Servlet 容器接收 Web Client 的请求
  3. Servlet 容器创建一个 HttpServletRequest 对象,将 Web Client 请求的信息封装到这个对象中
  4. Servlet 容器创建一个 HttpServletResponse 对象
  5. Servlet 容器调HttpServlet 对象service 方法,把 Request 与 Response 作为参数,传给HttpServlet
  6. HttpServlet 调用 HttpServletRequest 对象的有关方法,获取 Http 请求信息
  7. HttpServlet 调用 HttpServletResponse 对象的有关方法,生成响应数据
  8. Servlet 容器把 HttpServlet 的响应结果传给 Web Client
#JavaWeb
上次更新: 2024/04/21, 09:42:22
HTTP协议与Tomcat服务器
HttpServletRequest对象

← HTTP协议与Tomcat服务器 HttpServletRequest对象→

最近更新
01
微信支付功能的实现与流程
11-21
02
购物车与结算区域的深入优化与功能完善
11-21
03
购物车与结算区域的功能实现与优化
11-21
更多文章>
Theme by Vdoing | Copyright © 2023-2024 EmmmuaCode | 黔ICP备2022009864号-2
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式