Servlet基础(创建、运行原理、API)

news2024/11/18 22:41:07

目录

一、创建 Servlet 项目

1、创建项目

2、引入依赖

3、创建目录

4、编写代码

5、使用 Tomact 直接运行 (打包程序、部署程序、验证程序)

 二、Servlet 运行原理

1、接收请求

2、根据请求计算响应

3、返回响应

三、Servlet API

1、HttpServlet

2、HttpServletRequest

3、HttpServletResponse


 

         Servlet是一种实现动态页面的技术,是一组 Tomcat 提供给程序员的API (Tomcat 的 HTTP服务器给 Java 提供的一组 API),帮助程序员简单高效的开发一个 web app。

        其主要做的工作:

  • 允许我们注册一个类,当 Tomcat 收到某个特定的 HTTP请求时,就执行这个类中的代码。
  • 帮助我们解析HTTP请求,把HTTP请求从一个字符串解析成一个 HttpRequest 对象。
  • 帮助我们构造HTTP响应,我们只要给指定的 HttpResponse 对象填写一些属性字段,Servlet就会自动的安装 HTTP 协议的方式构造出一个 HTTP 响应字符串,并通过 Socket 写会给客户端。

一、创建 Servlet 项目

1、创建项目

        创建一个 Maven 项目。

821f569aaedc4018a829bdc7065555d7.png

         然后命名。项目创建完后,可能会出现这个。点击 Enable Auto-Import。

5f0450e2fc1d4caa9caa35b8789ef7d6.png

2、引入依赖

         在 pom.xml 中引入 Servlet API 依赖的 jar 包。

    <dependencies>
        <!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
            <scope>provided</scope>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.12.6.1</version>
        </dependency>


    </dependencies>

添加完之后的完整代码:

<?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>2023_4_30_Servlet</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.1.0</version>
            <scope>provided</scope>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.12.6.1</version>
        </dependency>


    </dependencies>
</project>

3、创建目录

9c94d6731617467cb644c7816db5402a.png

         上图中红框内是需要自己手动创建的。

  • src/main/java :放 java 代码。
  • src/main/resources :放一些依赖的资源。
  • src/test/java :放单元测试的代码。
  • pom.xml :是 maven项目的核心配置文件

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>

4、编写代码

        在 java 目录中创建一个类 HelloServlet。

@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("hello");
        resp.getWriter().write("hello");
    }
}

1f0b9ca6bfa941e1bc3d0c886fff2fa1.png  

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

1. 直接在地址栏里,输入 URL

2. 通过 a 标签跳转

3. 通过 img/link/script ... 

4. 通过 from 表单,method 指定为 GET

5. 通过 ajax,type 指定为 GET

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

1. 通过 from 表单,method 指定为 POST

2. 通过 ajax ,type 指定为 POST

5、使用 Tomact 直接运行 (打包程序、部署程序、验证程序)

(1)安装 Tomcat

        菜单 -> 文件 -> Settings

 262c34995d8a4828a8ffe0a8211f1915.png

         选择 Plugins, 选择 Marketplace, 搜索 "tomcat", 点击 "Install".

6451407fd99f49edbc0f543c6bde5f9a.png

         安装完成后重启 IDEA。

(2)配置 Smart Tomcat 插件

        点击右上角的 "Add Configuration"

0aa8be3de92b4fa08f4bdd98ff1edf9b.png

        选择左侧的 "Smart Tomcat"

2d68df7aa5094083b846e18ed737cfe0.png

469ad7d89d1a46a18beed3e84b6dc180.png

        部署成功后,直接点击运行即可。

(3)访问页面

086ff5c763ff47018cade20eeb7a2094.png

4e7af2ad81a84449a0daf832388fbcb1.png

 二、Servlet 运行原理

        通俗理解,Servlet是属于上层建筑,而下面的传输层、网络层、数据链路层...就属于经济基础。

06d27deaa76e4d6c9eda12c8f8986e72.png

         Tomcat 其实是一个应用程序,即运行在用户态的普通进程。用户写的代码(根据请求计算响应),通过 Servlet 和 Tomcat 进行交互。而 Tomcat 进一步的浏览器之间的网络传输,依然是和网络原理中是一样的(封装和分用)。

        当浏览器给服务器发送请求的时候,Tomcat作为 HTTP 服务器,就可以接收到这个请求。HTTP协议作为一个应用层协议,需要底层的协议栈来支持工作。

618c375bce004031996ac928392588a9.png

 更详细的过程:

1c4c0f1b8dbb4df29a2903704a284744.png

1、接收请求

  1. 用户在浏览器输入一个 URL,浏览器自动通过 URL 构造一个 HTTP 请求。
  2. 这个HTTP请求会经过网络协议栈逐层进行 封装 成二进制的 bit 流,最后通过物理层硬件设备转成 光信号/电信号 传输出去。
  3. 经过一系列设备,最终到达目标主机。
  4. 服务器主机收到这些 光信号/电信号 ,再通过网络协议栈逐层进行 分用,层层解析。最终还原成 HTTP 请求,并交给 Tomcat 进程处理(根据端口号确定进程)。
  5. Tomcat 通过 Socket 读取到这个请求(一个字符串),并按照 HTTP 请求的格式来解析这个请求,根据 请求中的 Context Path 确定一个 webapp,在通过 Servlet Path 确定一个具体的类,再根据当前请求中的方法(GET/POST...)决定调用这个类的 doGet 或者是 doPost 等方法,此时我们代码中的 doGet / doPost 方法的第一个参数 HttpServletRequest 就包含了这个 HTTP 请求的详细信息。

2、根据请求计算响应

  1. 在 doGet / doPost 方法中,就需要我们自己实现代码,来规定根据这个请求来响应什么。即根据请求对象 HttpServletRequest 中的一些信息,来给HttpServletResponse 对象设置一些属性, 例如状态码、header、body.....

3、返回响应

  1.  doGet / doPost 方法执行完之后,Tomcat 就会自动把 HttpServletResponse 这个我们刚设置好的对象转换成一个符合 HTTP 协议的字符串,通过 Socket 把这个响应发送出去。
  2. 这个响应也会通过网络协议栈逐层封装,最终得到一个二进制 bit 流,通过物理层硬件设备转换成 光信号 / 电信号 传输出去。
  3. 经过一系列设备,最终到达浏览器所在的主机。
  4. 服务器主机收到这些 光信号/电信号 ,再通过网络协议栈逐层进行 分用,层层解析。最终还原成 HTTP 响应,并交给 浏览器 处理。
  5. 浏览器也通过 Socket 读到这个响应(一个字符串),按照 HTTP 响应的格式来解析这个响应,并且把 body 中的数据按照一定的格式显示在浏览器的界面上。

三、Servlet API

1、HttpServlet

        当我们写 Servlet 代码时,第一步就是创建类,并且继承自 HttpServlet 类,并重写其中的某些方法,来被 Tomcat 执行到。

核心方法:

方法名称

调用时机
init在 HttpServlet 实例化之后被调用 一次
destroy在 HttpServlet 实例不再使用的时候调用 一次
service

收到 HTTP 请求的时候调用

doGet收到 GET 请求的时候调用 (由 service 方法调用)
doPost

收到 POST 请求的时候调用(由 service 方法调用)

doPut / doDelete / doOptions / ...

收到其他请求的时候调用(由 service 方法调用)

2、HttpServletRequest

        当 Tomcat 通过 socket API 读取 HTTP 请求(字符串),并且 按照 HTTP 协议的格式吧字符串解析成 HttpServletRequest 对象。

核心方法:

        通过这些方法,可以获取到一个请求中的各个方面的信息。

方法描述
String getProtocol( )返回请求协议的 名称 和 版本
String getMethod( )返回请求的 HTTP 方法的 名称(GET、POST或 PUT)
String getRequestURL( )从协议名称直到 HTTP 请求的第一行的查询字符串中,返回该请求的 URL 的一部分
String getContextPath( )返回指示请求上下文的请求 URL 部分
String getQueryString( )

返回包含在路径后的请求 URL 中的 查询字符串

Enumeration getParameterNames( )返回一个 String 对象的枚举,包含在该请求中包含的参数名称
String getParameter( String name )以字符串形式返回请求参数的值,或者如果参数不存在则返回 null
String[] getParameterValues( String name )返回一个字符串对象的数组,包含所欲给定的请求参数的值,如果参数不存在则返回 null
Enumeration getHeaderNames( )返回一个枚举,包含在该请求中包含的所有的头名
String getHeader( String name )以字符串形式返回指定的请求头的值
String getCharacterEncoding( )返回请求主题中使用的字符编码的名称
String getContentType( )返回请求主体的 MIME 类型,如果不知道类型则返回 null
int getContentLength( )以字节为单位返回请求主体的长度,并提供输入流,或者如果长度未知则返回 -1 
InputStream getInputStream( )用于读取请求的 body 内容,返回一个 InputStream 对象

3、HttpServletResponse

        Servlet 中的 do××× 方法中的就是根据请求计算得到响应,然后把响应的数据设置到 HttpServletResponse 对象中。

        然后 Tomcat 就会把这个 HttpServletResponse 对象按照 HTTP 协议的格式,转成一个字符串,并通过 Socket 写回给浏览器。

核心方法:

方法描述
void setStatus( )为该响应设置状态码
void setHeader( String name, String value )设置一个带有给定的名称和值的 header,如果 name 已经存在,则覆旧的值
void addHeader( String name, String value )添加一个带有给定的名称和值的 header,如果 name 已经存在,不覆盖就的值,并列添加新的键值对
void setContentType( String type )设置被发送到客户端的响应的内容的类型
void setCharacterEncoding( String charset )设置被发送到客户端的响应的字符编码(MIME 字符集)例如:UTF-8
void sendRedirect( String location )使用指定的重定向位置 URL 发送临时重定向响应到客户端
PrintWriter getWriter( )用于往 body 中写入 文本格式 的数据
OutputStream getOutputStream( )用于往 body 中写入 二进制格式 的数据

        

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/492417.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

惩治标题党,vue2监听父组件传过来的值,el-tree一键全选多个树形

vue2监听父组件传过来的值 父组件使用的动态组件&#xff0c;然后父传子 <component :is"checkedIt" :riskQuarterriskQuarter :riskYearriskYear></component> 子组件打印 console.log(riskQuarter :>> , this.$props.riskQuarter); 监听 pr…

BOM概述

目录 什么是BOM 浏览器对象模型&#xff08;Browser Object Model (BOM)&#xff09; Window对象 一些常用方法 JavaScript Window Screen Window Screen Window Screen 高度 Window Screen 可用宽度 Window Screen 可用高度 Window Screen 色深 Window Screen 像素深…

【AI实战】训练一个自己的ChatGPT

【AI实战】训练一个自己的ChatGPT 准备环境代码模型 数据集Belle下载 Belle 的开源中文数据集&#xff08;仅限研究使用&#xff0c;禁止商用&#xff01;&#xff09;清洗自己的数据集上述工作完成后&#xff0c;大概是这样子的 训练测试参考 本文使用 Alpaca-LoRA 来训练一个…

Linux_top命令

top命令是Linux系统下常用的性能分析工具&#xff0c;能够实时显示系统中各个进程的资源占用状况&#xff0c;类似于Windows的任务管理器。它是一个动态显示过程,执行该命令后,它展示的信息会将独占前台,直到用户终止该程序为止&#xff08;可以用Ctrl C终止&#xff09;。 t…

汇编仿真 — 比较大小

项目文件 文件 关于项目的内容知识点可以见专栏单片机原理及应用 的第三章 汇编 题目&#xff1a;编程实现如下功能:比较片内 RAM的30H和40H单元中两个无符号数的大小&#xff0c;并将大数存入50H&#xff0c;小数存入51H&#xff0c;若两数相等&#xff0c;则使位单元7FH置1…

内网:域内信息收集

一&#xff0c;判断是否有域 ipconfig /all systeminfo workgroup net config workstation net time /domain&#xff08;该命令有三种情况&#xff09; 1&#xff0c;存在域&#xff0c;当前用户不是域用户。 2&#xff0c;存在域&#xff0c;当前用户是域用户。 3&#xff0c…

使用dataFEED OPC Suite将西门子PLC数据转发至REST API

一 背景 在工业4.0或工业物联网的项目方案中&#xff0c;逐渐紧密融合的OT&IT技术给工业制造带来了新活力。与此同时&#xff0c;利用IT级别的协议和应用来对制造数据进行收集和分析也成为了指导工业生产和优化流程的重要力量&#xff0c;尤其是基于HTTP的轻量级协议REST …

Python---学生管理系统、hashlib模块

1. 学生管理系统 学生管理系统的数据结构设置: 一个学生信息对应一个字典 整个系统的所有学生&#xff1a;所有学生对应一个列表&#xff0c;列表中的元素全是字典 整个系统&#xff1a;一个字典, 字典中有一个key(all_student) 对应的值是所有学生; 这个字典需要做数据持久化…

从传统Java应用到现代微服务,SpringBoot入门的基础指南

目录 一. 创建SpringBoot项目1.1 使用Spring Initializr快速构建项目1.2 手动创建springboot项目 二. SpringBoot入门案例解析2.1 依赖管理特性2.2 starter场景启动器2.3 引导类自动配置 三. REST风格四. 配置文件4.1 配置文件类型4.2 YAML文件的简介与使用4.3 Value与Configur…

VSCode 开发flutter 实现安卓设备远程调试

1&#xff0c;首先安装 ADB Commanads for VSCode扩展 并且必须确保ADB已经添加到系统环境变量中 如未添加请按照下面的方式添加&#xff0c;如添加请直接跳到下面。 2&#xff0c;添加环境变量&#xff08;windows可参考&#xff0c;mac忽略此项&#xff09; 我将ADB安装到这…

3分钟快速实现mysql全量增量备份

需求说明&#xff1a; mysql数据库ip地址为192.168.1.100&#xff0c;端口3306&#xff0c;root密码111111&#xff0c; 服务器cantos7中ip地址192.168.1.101 利用xtrabackup每周六进行全量备份&#xff0c;每天进行增量备份&#xff0c;保留2个礼拜的备份&#xff0c;并且保存…

睡眠经济2.0时代来了,老巨头们有护城河吗?

在第23个世界睡眠日&#xff0c;中国睡眠研究会等机构发布了《中国睡眠研究报告2023》&#xff0c;近半数人每晚平均睡眠时长不足8小时&#xff0c;“失眠”已成为了当代人的生活常态。 越是睡不好&#xff0c;越要想办法。年轻人纷纷求助于好的寝具、好的助眠产品乃至保健品&…

【C语言进阶C++】 C++基础--让你丝滑的从C语言进阶到C++

目录 前言 正文 1. 面向过程、面向对象 面向过程思维 面向对象思维 面向过程语言优缺点 面向对象语言优缺点 C面向对象特点 2. 输入、输出 C中的输入输出 总结C和C输入输出 3. 命名空间 作用域 命名空间 4. 动态申请空间 C动态申请空间&#xff08;new、delete&…

Leetcode刷题之回文链表和交换链表中的结点

竭力履行你的义务&#xff0c;你应该就会知道&#xff0c;你到底有多大的价值。 --列夫.托尔斯泰 目录 &#x1fab4;一.回文链表 &#x1f33b;1.快慢指针 &#x1f341;2.把值存入数组中&#xff0c;然后使用双指针 &#x1f33c;二.交换链表中的结点 &#x1…

经典论文解读 — 端到端的VL预训练网络SOHO

来源&#xff1a;投稿 作者&#xff1a;摩卡 编辑&#xff1a;学姐 论文标题&#xff1a; Seeing Out of tHe bOx :End-to-End Pre-training for Visual-Language Representation Learning》 Motivation 本文针对目前大量Visual-Language(VL) tasks使用由Faster-RCNN提取出的…

余弦相似度公式推导及代码实现

余弦相似度公式推导 1. 为什么使用余弦值相似度&#xff1f;2. 公式推导2.1 三角函数余弦公式推导2.2 三角函数向量余弦公式推导 3. 余弦相似度代码实现 1. 为什么使用余弦值相似度&#xff1f; 空间维度上两个点之间相似定义 在空间维度上两个点之间是有夹角和方向&#xff0…

计算机操作系统实验:页面置换算法的实现

目录 前言实验目的实验内容实验过程最佳置换算法代码实现算法流程流程图设计思路运行结果 先进先出算法代码实现算法流程流程图设计思路运行结果 最近最久未使用算法代码实现算法流程流程图设计思路运行结果 总结 前言 本实验的目的是通过编程模拟不同的页面置换算法&#xff…

基于思科模拟器的路由与交换实训报告(单臂路由、三层交换机实现vlan通信、ospf、rip、dhcp、acl、nat技术总结)

本博客是路由与交换实训报告&#xff0c;基于思科模拟器分别做了单臂路由、三层交换机实现vlan间通信、ospf、rip、dhcp、nat的实验&#xff0c;最后的nat综合实验是本次实训的大拓扑&#xff0c;综合了上述的几个技术。 大家可以当作一些思科小实验的总结&#xff0c;供网络工…

数据库管理-第七十二期 复盘(20230505)

数据库管理 2023-05-05 第七十二期 复盘1 再测试2 对照分析&#xff1a; 3 如何解决总结 第七十二期 复盘 上一期的内容&#xff0c;我承认主要是在放假&#xff0c;分析过程还是水了一点&#xff0c;SR转回国内之后&#xff0c;处理效率还是提升了一大截。 1 再测试 在客户…

Linux - 第11节 - 网络基础(一)

1.计算机网络背景 1.1.网络发展 独立模式&#xff1a;计算机之间相互独立 在早期的时候&#xff0c;计算机之间是相互独立的&#xff0c;此时如果多个计算机要协同完成某种业务&#xff0c;那么就只能等一台计算机处理完后再将数据传递给下一台计算机&#xff0c;然后下一台计…