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, WebLogic Server, WebSphere, JBoss 等等。

创建Web项目

  1. 选择 "File" —> "New" —> "Project"

    Servlet的实现

  1. 设置项目的相关信息,选择 "Next"

    Servlet的实现

  1. 设置项目名称及工作空间

    Servlet的实现

  1. web项目目录结构如下

    Servlet的实现

Servlet的实现

新建类

  1. 点击 "src" —> "new" —> "package",创建一个文件包

    Servlet的实现

  2. 在包下面创建 Java 类文件,点击包名 —> "New" —> "Java Class"

    Servlet的实现

  3. 创建一个普通的 Java 类

    Servlet的实现

  4. 如下

    package com.xxxx.servlet;
    
    public class Servlet01 {
        
    }

实现 Servlet 规范

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

package com.xxxx.servlet;

import javax.servlet.http.HttpServlet;

public class Servlet01 extends HttpServlet {

}

重写 service 方法

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

package com.xxxx.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

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");
    }
}

设置注解

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

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

package com.xxxx.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@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 World");
    }
}

用注解配置 Servlet

@WebServlet(name="Servlet01",value="/ser01")
@WebServlet(name="Servlet01",urlPatterns = "/ser01")

也可以配置多个访问路径

@WebServlet(name="Servlet01",value={"/ser01",'/ser001'})
@WebServlet(name="Servlet01",urlPatterns={"/ser01",'/ser001'})

发布项目并启动服务

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

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

    Servlet的实现

    Servlet的实现

  2. 设置项目的Tomcat配置

    Servlet的实现

  3. 启动服务器

    Servlet的实现

访问并查看结果

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

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

页面效果

Servlet的实现 后台结果

Servlet的实现

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

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("实例创建了...");
}

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

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

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

public void destroy() {
    System.out.println("实例销毁了...");
}

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

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

Servlet的实现

​ 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

加VX了解 点我扫码领取

学习更多知识,请加入QQ群:1080355292,入群暗号(33)

原文 

https://segmentfault.com/a/1190000023131953

本站部分文章源于互联网,本着传播知识、有益学习和研究的目的进行的转载,为网友免费提供。如有著作权人或出版方提出异议,本站将立即删除。如果您对文章转载有任何疑问请告之我们,以便我们及时纠正。

PS:推荐一个微信公众号: askHarries 或者qq群:474807195,里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

转载请注明原文出处:Harries Blog™ » Servlet的实现

赞 (0)
分享到:更多 ()

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址