Servlet详解


Servlet 是一种 实现动态页面的技术. 是一组 Tomcat 提供给程序猿的 API, 帮助程序猿简单高效的开发一个 web app.

动态页面与静态页面:
静态页面也就是内容始终固定的页面. 即使用户不同/时间不同/输入的参数不同 , 页面内容也不会发生变化. (除非网站的开发人员修改源代码, 否则页面内容始终不变).
动态页面指的就是 用户不同/时间不同/输入的参数不同, 页面内容会发生变化。

Servlet 就是 Tomcat 这个 HTTP 服务器提供给 Java 的一组 API, 来完成构建动态页面这个任务。

一、第一个Servlet程序

1.1 创建项目

使用 IDEA 创建一个 Maven 项目.

  1. 菜单 -> 文件 -> 新建项目 -> Maven

1.2引入依赖

Maven 项目创建完毕后, 会自动生成一个 pom.xml 文件.我们需要在 pom.xml 中引入 Servlet API 依赖的 jar 包.
1)在中央仓库 https://mvnrepository.com/ 中搜索 “servlet”, 一般第一个结果就是:
在这里插入图片描述
2)选择版本. 一般我们使用 3.1.0 版本:
在这里插入图片描述

Servlet 的版本要和 Tomcat 匹配.如果我们使用 Tomcat 8.5, 那么就需要使用 Servlet 3.1.0
可以在 http://tomcat.apache.org/whichversion.html 查询版本对应关系.

3)把中央仓库中提供的 xml 复制到项目的 pom.xml 中.一定要把xml写入dependencies内.
在这里插入图片描述
修改后的pom.xml为:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>servlet_project</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

    <dependencies>
        <!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.0.1</version>
            <scope>provided</scope>
        </dependency>

    </dependencies>

    <packaging>war</packaging>
    <build>
        <finalName>hello102</finalName>
    </build>
</project>

<dependencies> 标签内部放置项目依赖的 jar 包. maven 会自动下载依赖到本地

1.3 创建目录

当项目创建好了之后, IDEA 会帮我们自动创建出一些目录.
此时,还需创建:

  1. 创建 webapp 目录
    在 main 目录下, 和 java 目录并列, 创建一个 webapp 目录。
    2)创建 web.xml
    然后在 webapp 目录内部创建一个 WEB-INF 目录, 并创建一个 web.xml 文件。
    在这里插入图片描述
  2. 编写 web.xml
    web.xml 中拷贝以下代码.
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Archetype Created Web Application</display-name>
</web-app>

webapp 目录就是未来部署到 Tomcat 中的一个重要的目录. 当前我们可以往 webapp 中放一些静态资源, 比如 html , css 等.
在这个目录中还有一个重要的文件 web.xml. Tomcat 找到这个文件才能正确处理 webapp 中的动态资源 .

1.4 编写代码

在 java 目录中创建一个类 HelloServlet, 代码如下:

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;

/**
 * Created With IntelliJ IDEA
 * Description:
 * Users: yyyyy
 * Date: 2022-05-20
 * Time: 9:57
 */
@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
   
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
   
        System.out.println("hello world");
        resp.getWriter().write("hello world"  + System.currentTimeMillis());
    }
}
  • 创建一个类 HelloServlet , 继承自 HttpServlet.
  • 在这个类上方加上 @WebServlet("/hello") 注解, 表示 Tomcat 收到的请求中, 路径为 /hello的请求才会调用 HelloServlet 这个类的代码. (这个路径未包含 Context Path)
  • 重写 doGet 方法. doGet 的参数有两个, 分别表示收到的 HTTP 请求 和要构造的HTTP 响应. 这个方法会在 Tomcat 收到 GET 请求时触发.
  • HttpServletRequest 表示 HTTP 请求. Tomcat 按照 HTTP 请求的格式把 字符串 格式的请求转成了一个 HttpServletRequest 对象. 后续想获取请求中的信息(方法, url, header, body 等) 都是通过这个对象来获取.
  • HttpServletResponse 表示 HTTP 响应. 代码中把响应对象构造好(构造响应的状态码, header,body 等)
    resp.getWriter() 会获取到一个流对象, 通过这个流对象就可以写入一些数据, 写入的数据会被构造成一个 HTTP 响应的 body 部分, Tomcat 会把整个响应转成字符串, 通过 socket 写回给浏览器.

1.5 打包程序

使用 maven 进行打包. 打开 maven 窗口 (一般在 IDEA 右侧就可以看到 Maven 窗口, 如果看不到的话,可以通过 菜单 -> View -> Tool Window -> Maven 打开),然后展开 Lifecycle , 双击 package 即可进行打包.
在这里插入图片描述
打包成功后, 可以看到在 target 目录下, 生成了一个 jar 包,这样的 jar 包并不是我们需要的, Tomcat 需要识别的是另外一种 war 包格式.

war 包和 jar 包的区别
jar 包是普通的 java 程序打包的结果. 里面会包含一些 .class 文件.
war 包是 java web 的程序, 里面除了会包含 .class 文件之外, 还会包含 HTML, CSS, JavaScript, 图片, 以及其他的 jar 包. 打成 war 包格式才能被 Tomcat 识别.

所以,需要在 pom.xml 中新增一个 packing 标签, 表示打包的方式是打一个 war 包,在 pom.xml 中再新增一个 build 标签, 内置一个 finalName 标签, 表示打出的 war 包的名字是hello102(完整代码如1.2中所示):
在这里插入图片描述
重新使用 maven 打包, 可以看到生成的新的 war 包的结果:
在这里插入图片描述

1.6 部署程序

把 war 包拷贝到 Tomcatwebapps 目录下.启动 Tomcat , Tomcat 就会自动把 war 包解压缩.

一种更方便的部署方式,直接利用Smart Tomcat插件也可以:
在这里插入图片描述

在这里插入图片描述

1.7 验证程序

此时通过浏览器访问 http://127.0.0.1:8080/hello102/hello,就可以看到结果了。
在这里插入图片描述
URL 中的 PATH 分成两个部分, 其中 hello102为 Context Path, hello 为 Servlet Path.

什么时候浏览器发的是GET请求?

  1. 直接在地址栏里,输入URL
  2. 通过a标签跳转~
  3. 通过img/link/script…
  4. 通过form表单, method指定为GET
  5. 通过ajax, type指定为GET

什么时候浏览器发的是POST请求?

  1. 通过form表单, method指定为POST
  2. 通过ajax, type指定为POST

二、Servlet 运行原理

在 Servlet 的代码中我们并没有写 main 方法, 那么对应的 doGet 代码是如何被调用的呢? 响应又是如何返回给浏览器的?

在这里插入图片描述
当浏览器给服务器发送请求的时候, Tomcat 作为 HTTP 服务器, 就可以接收到这个请求。
HTTP Server (Tomcat)在调用Servlet,尤其是在处理请求的时候。

HTTP 协议作为一个应用层协议, 需要底层协议栈来支持工作. 如下图所示

在这里插入图片描述
Tomcat其实是一个应用程序.运行在用户态的普通进程(Tomcat其实也是一个Java进程).
用户写的代码(根据请求计算相应),通过Servlet和Tomcat进行交互.Tomcat进一步的和浏览器之间的网络传输,仍然是之前学过的网络原理中的那一套(封装和分用).
在这里插入图片描述

  1. 接收请求:
  • 用户在浏览器输入一个 URL, 此时浏览器就会构造一个 HTTP 请求.
  • 这个 HTTP 请求会经过网络协议栈逐层进行 封装成二进制的 bit 流, 最终通过物理层的硬件设备转换成光信号/电信号传输出去.
  • 这些承载信息的光信号/电信号通过互联网上的一系列网络设备, 最终到达目标主机(这个过程也需要网络层和数据链路层参与).
  • 服务器主机收到这些光信号/电信号, 又会通过网络协议
  • 10
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
ServletJava Web 开发中最基础的组件之一,其主要作用是处理客户端(浏览器)发出的 HTTP 请求并返回响应结果。在 Servlet 中,有一些常用的方法,下面对这些方法进行详细介绍。 1. `init()` 方法 `init()` 方法是 Servlet 的生命周期方法之一,表示 Servlet 初始化时调用的方法。在 Servlet 对象被创建后,容器会自动调用 `init()` 方法,用来对 Servlet 进行初始化,例如读取配置文件、建立数据库连接等。`init()` 方法只会被调用一次。 2. `service()` 方法 `service()` 方法是 Servlet 的核心方法,用来处理客户端发送的请求并生成响应结果。在每次客户端请求时,容器都会调用 `service()` 方法,将请求信息封装为一个 `ServletRequest` 对象和一个 `ServletResponse` 对象,然后调用具体的 `doXXX()` 方法(如 `doGet()`、`doPost()` 等)来处理请求。 3. `destroy()` 方法 `destroy()` 方法也是 Servlet 的生命周期方法之一,表示 Servlet 被销毁时调用的方法。在 Servlet 对象被销毁前,容器会自动调用 `destroy()` 方法,用来释放资源、关闭数据库连接等。`destroy()` 方法只会被调用一次。 4. `doGet()` 方法 `doGet()` 方法是处理 HTTP GET 请求的方法。当客户端发送 GET 请求时,容器会自动调用 `doGet()` 方法,并将请求信息封装为一个 `HttpServletRequest` 对象和一个 `HttpServletResponse` 对象,然后在此方法中编写处理逻辑,并通过 `HttpServletResponse` 对象生成响应结果。 5. `doPost()` 方法 `doPost()` 方法是处理 HTTP POST 请求的方法。当客户端发送 POST 请求时,容器会自动调用 `doPost()` 方法,并将请求信息封装为一个 `HttpServletRequest` 对象和一个 `HttpServletResponse` 对象,然后在此方法中编写处理逻辑,并通过 `HttpServletResponse` 对象生成响应结果。 6. `doPut()` 方法 `doPut()` 方法是处理 HTTP PUT 请求的方法。当客户端发送 PUT 请求时,容器会自动调用 `doPut()` 方法,并将请求信息封装为一个 `HttpServletRequest` 对象和一个 `HttpServletResponse` 对象,然后在此方法中编写处理逻辑,并通过 `HttpServletResponse` 对象生成响应结果。 7. `doDelete()` 方法 `doDelete()` 方法是处理 HTTP DELETE 请求的方法。当客户端发送 DELETE 请求时,容器会自动调用 `doDelete()` 方法,并将请求信息封装为一个 `HttpServletRequest` 对象和一个 `HttpServletResponse` 对象,然后在此方法中编写处理逻辑,并通过 `HttpServletResponse` 对象生成响应结果。 以上是 Servlet 中常用的方法,了解这些方法可以帮助我们更好地理解 Servlet 的工作原理,并能够编写出符合规范的 Servlet 程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值