Servlet详细讲解(一篇就够)

目录

一、Servlet

1.1 Servlet介绍

1.2 HTTP

1.2.1 在http请求中有请求报文

1.2.2 在http响应中有响应报文

1.3 GET和POST

1.3.1 GET

1.3.2 POST

二、第一个Servlet程序[重点]

2.1 创建web项目

2.2 pom依赖

2.3 编写Servlet

2.4 配置Servlet

2.5 部署项目

2.6 启动

2.7 访问

2.8 解决控制台中文乱码

2.9 解决JSP页面乱码

三、 执行流程分析【理解】

四、使用细节

4.1 web.xml中url-partten写错

4.2 首页问题

4.3 访问路径问题[重点]

4.4 修改端口

4.5 多个请求路径可以映射到同一个servlet的!!!

4.6 url-partten的其他写法

五、使用注解改造


一、Servlet

1.1 Servlet介绍

javaweb开发,就是需要服务器接收前端发送的请求,以及请求中的数据,经过处理(jdbc操作),然后向浏览器做出响应.


我们要想在服务器中写java代码来接收请求,做出响应,我们的java代码就得遵循tomcat开发规范


因此Tomcat提供了开发的规范,就是servlet.

Servlet就是运行在服务器上的程序,可交互式的接收服务器的请求,并可以做出响应


总结Servlet的作用:

  • 运行在服务器,是一个服务器端的程序

  • 接收客户端请求,向客户端做出响应

  • 动态网页(jsp)

1.2 HTTP

Servlet主要做的事情:接收请求,做出响应

  • 接收请求

    • 请求是什么? 浏览器通过网络发出的一些请求资源动作(a标签的href,from表单的action)

    • 哪里发出的请求? a标签href路径,form表单action路径

    • 请求都有什么东西可以接收? 数据,协议,端口,ip等等

  • 做出响应

    • 什么是响应? 响应什么东西?服务器返回给浏览器的内容(html页面,json数据等等)

    • 响应给谁? 前端(浏览器)

1.2.1 在http请求中有请求报文

通过浏览器的开发者工具(F12)监听任何一个网站的请求响应过程,就可以看到请求报文和响应报文

image-20221125172607680

请求行内有请求方式(GET),和请求路径(/s?wd=java)

image-20221125172859447

ps: 后续就可以通过servlet获得这些数据

1.2.2 在http响应中有响应报文

image-20221125173053058

响应行中有协议(http/1.1) ,响应状态码(200) ,响应信息(OK)

image-20221125173227397

1.3 GET和POST

HTTP中常见的请求方式

  • get

  • post

1.3.1 GET

GET请求特点:

  • 数据会通过浏览器地址栏发送

  • 数据量大小有限制,最多4kb

  • 请求数据不安全

  • 效率相对较高

什么时候用GET请求?

  • 一般用于查询数据

前端技术中,如何发送一个get请求?

  • form表单指定method=get

  • a标签

  • 地址栏手动输入

  • ajax中指定get请求

  • axios中指定get请求

1.3.2 POST


POST请求

  • 数据是隐藏的,在地址栏看不见,但是是在请求体中

  • 数据量大小不限(上传资料)

  • 数据相对安全

  • 效率相对较低


开发中建议,使用POST向服务器发送数据,登录,注册,更新,上传文件等

前端技术中,如何发送一个POST请求?

  • form表单的method=post

  • ajax中指定post请求

  • axios中指定post请求

二、第一个Servlet程序[重点]

2.1 创建web项目

image-20240329143800295

目录

image-20240329143913171

2.2 pom依赖

<?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>com.qf</groupId><artifactId>day46_servlet</artifactId><version>1.0-SNAPSHOT</version><!-- java项目打包方式是jar包 --><!-- web项目打包方式是war包 --><packaging>war</packaging>
​
​<properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target></properties>
​<dependencies><!-- 引入servlet依赖 --><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version></dependency><!-- 引入jsp依赖 --><dependency><groupId>javax.servlet.jsp</groupId><artifactId>javax.servlet.jsp-api</artifactId><version>2.3.1</version></dependency></dependencies>
</project>

2.3 编写Servlet

  • 继承javax.servlet.HttpServlet

  • 重写方法

    • 浏览器发出get请求,那么就重写doGet方法处理get请求

    • 浏览器发出post请求,那么就重写doPost方法处理post请求

  • 在核心方法doGet/doPost里面完成接收请求,做出响应

public class Demo1Servlet extends HttpServlet {
​// - 浏览器发出get请求,那么就重写doGet方法处理get请求@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("Demo1Servlet ... 接收请求" );
​}
​// - 浏览器发出post请求,那么就重写doPost方法处理post请求@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
​}
}

2.4 配置Servlet

因为服务器中会有很多servlet处理多个请求,浏览器发请求如何确定访问哪一个servlet类来处理呢?

此时就需要做一个映射: 前端请求路径和后端servlet类的映射(一一对应),即发出的请求由哪个servlet类来处理


配置需要写在webapp/WEB-INF/web.xml

<?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_3_1.xsd"
version="3.1"><!-- 在这里写路径和servlet映射 --><servlet><!-- servlet的名字,任意 --><servlet-name>servlet1</servlet-name><!-- servlet的路径 --><servlet-class>com.qf.servlet.MyServlet1</servlet-class></servlet>
​<!-- 请求路径映射 --><servlet-mapping><!-- 该路径映射的servlet名 --><servlet-name>servlet1</servlet-name><!-- 请求路径的模板,一定要/开头 --><url-pattern>/s1</url-pattern></servlet-mapping>
</web-app>

浏览器发出请求,经过web.xml中配置的信息,

  • 匹配url-pattern>/s1</url-pattern,有该路径则正常访问,无该路径报404

  • 通过servlet-name找到servlet类

  • 再通过servlet-class,找到servlet类路径

  • 该servlet就可以执行doGet/doPost

2.5 部署项目

web项目已经开发完毕,将项目部署到服务器Tomcat

配置Tomcat

image-20221125103951611

部署项目

image-20221125104134483

image-20221125104144365

image-20221125104255911

2.6 启动

启动项目

image-20240625153626250

2.7 访问

发出http请求进行访问

http://localhost:8080/day30/s1

image-20240329144212226

2.8 解决控制台中文乱码

image-20240329144017626

-Dfile.encoding=utf-8

2.9 解决JSP页面乱码

JSP页面头部加入如下代码即可

<%@ page contentType="text/html;charset=UTF-8" language="java"%>

image-20240329144055204

三、 执行流程分析【理解】

  1. 启动服务器

  2. 立即加载解析web.xml文件

    1)服务器内就会知道当前服务器能接收哪些请求路径

    2)也知道请求路径被哪个servlet处理

    3)如果web.xml中有错,启动会失败,要及时查看控制台日志

    4)常见的错误就是url-partten写错了

  3. 启动成功,跳转至index.jsp页面(如果没有该页面,报错404)

  4. 浏览器发出请求

    1)发出请求路径,根据ip找到服务器,再根据8080找到服务器中的程序

    http://localhost:8080

    2)然后再通过名字找到服务器中的项目,默认访问首页(index.jsp),找不到报错404

    http://localhost:8080/day29

    3)然后发出具体的请求路径 http://localhost:8080/day29/a

  5. 发出的请求会经过web.xml中配置的路径去匹配

    1)web.xml中没有匹配到路径,报错404

    2)web.xml中有匹配的路径,就找对应的servlet让其执行

  6. servlet执行doGet或者doPost方法,完成接收请求,和做出响应的动作

    1)前端发送get请求,如果后端没有doGet方法会报错405

    2)即前端发送的请求方法,后端没有对应的doXxx方法结束就会报405

  1. 如果后台出问题,主要是指java代码报错,页面会报错500

四、使用细节

4.1 web.xml中url-partten写错

  <!-- 请求路径映射 --><servlet-mapping><!-- 该路径映射的servlet名 --><servlet-name>servlet1</servlet-name><!-- 请求路径的模板,一定要/开头 --><!-- 没有/开头,启动报错 --><url-pattern>s1</url-pattern></servlet-mapping>
Caused by: java.lang.IllegalArgumentException: Invalid <url-pattern> s1 in servlet mapping

4.2 首页问题

项目启动,默认访问webapp/index.jsp页面

没有该页面,启动报404

也可以通过web.xml文件来修改默认启动访问页面

<web-app ><!-- 设置欢迎页(如果报错,可以更改在web.xml上下位置) --><welcome-file-list><welcome-file>login.html</welcome-file></welcome-file-list><!-- ... -->
</web-app>

4.3 访问路径问题[重点]

现在的访问路径是

http://localhost:8080/day29/

这个访问路径,是在配置Tomcat时给设置的

image-20240329154420208

image-20240329154434089

再访问就是http://localhost:8080/day30_web_war

因为发请求时容易丢失项目名,索性在设置时直接不设置项目名

ps

<%--a标签,form等前端路径以/开头发请求的话,会从浏览器根路径,即从端口出发去请求,如果有项目名的话,就会丢失项目名----------所以,建议在部署项目时,直接不要项目名
--%>
<a href="/a">/a-发/a请求</a><br>

image-20231116160223396

4.4 修改端口

启动项目时,idea报错

image-20231116160630472

提示端口占用

方案1: 查杀端口

C:\Users\qiush>netstat -ano | findstr 8080  // 查8080所使用的进程号,24504TCP    0.0.0.0:8080           0.0.0.0:0              LISTENING       24504TCP    [::]:8080              [::]:0                 LISTENING       24504
​
C:\Users\qiush>taskkill /F /PID 24504  // 杀死进程
成功: 已终止 PID 为 24504 的进程。

image-20240329155633837

方案2: 改变端口

image-20240329155713685

4.5 多个请求路径可以映射到同一个servlet的!!!

image-20240329160406998

注意!!! 一个请求映射多个Servlet是不行的,会报错!!!

4.6 url-partten的其他写法

  <!-- 映射路径,可以写成模糊匹配的 --><servlet-mapping><servlet-name>demo1</servlet-name><!-- /* 匹配所有路径 --><!-- *.do 匹配任何后缀是.do的请求 --><!-- /a/*  匹配请求时/a/ 开头的,--><url-pattern>*.do</url-pattern></servlet-mapping>

五、使用注解改造

现在的问题是: 每加一个功能,就加一个请求,就需要对应的再web.xml配置一个映射,随着项目功能变多,web.xml配置的映射就会很多,不方便


以后,就可以使用注解来简化

1)将注解加在对应的Servlet类上 2)注解中设置对应的请求路径 3)用来注解,记得将web.xml中关于映射的删除

image-20240625165436171

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

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

相关文章

C++进阶知识2 多态

多态 1. 多态的概念2. 多态的定义及实现2.1 多态的构成条件2.1.2 虚函数2.1.3 虚函数的重写/覆盖2.1.5 虚函数重写的⼀些其他问题2.1.6 override和final关键字2.1.7 重载/重写/隐藏的对⽐ 3. 多态的原理3.2 多态的原理3.2.1 多态是如何实现的3.2.2 动态绑定与静态绑定3.2.3 虚函…

PL/SOL 连接提示 Initialization error 解决方法

问题 测试连接数据库报错&#xff0c;提示如下 解决方法 1、OCI 库输入的时候&#xff0c;路径两遍有" " 2、Instant Client 和 PL/SOL Developer 位数版本不一致 要么都是x64位&#xff0c;要么都是x86位&#xff08;32位&#xff09;&#xff0c;以下为下载链接…

算力运力解决方案:构建未来智算新生态

中国联通国际有限公司产品之算力运力解决方案&#xff1a;构建未来智算新生态 在当今这个数据爆炸、技术日新月异的时代&#xff0c;算力已成为推动社会进步和产业升级的关键力量。中国联通国际有限公司紧跟时代步伐&#xff0c;依托其强大的网络资源和深厚的技术积累&#xf…

63.5 注意力提示_by《李沐:动手学深度学习v2》pytorch版

系列文章目录 文章目录 系列文章目录注意力提示生物学中的注意力提示查询、键和值注意力的可视化使用 show_heatmaps 显示注意力权重代码示例 代码解析结果 小结练习 注意力提示 &#x1f3f7;sec_attention-cues 感谢读者对本书的关注&#xff0c;因为读者的注意力是一种稀缺…

此连接非私人连接

当你手机浏览器输入网站打开提示“此连接非私人连接&#xff0c;此网站可能在冒充来窃取你的个人或财务信息。你应回到之前的页面”这是因为该网站的SSL数字证书到期导致&#xff0c;需要此网站的管理员重新申请数字证书替换之前的文件才可以实现。 注意&#xff1a;如果你不是…

java 洛谷题单【数据结构1-1】线性表

P3156 【深基15.例1】询问学号 解题思路 很简单的一道题&#xff0c;但是由于n、m的数据很大&#xff0c;要用Java的I/O流读入和输出。 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.StreamTokenizer; impo…

二维数组的存放

今天我水的文章是二维数组的存放 二维数组的存放方式其实和一维数组没有区别&#xff0c;但如果想要更直观的了解&#xff0c;我们可以把它们的地址打印出来。 代码如下&#xff1a; #include <stdio.h> int main() {int arr[3][3];//二维数组&#xff0c;int数组类型…

企业级移动门户的多样化选择:为数字化转型赋能

在当今数字化转型的浪潮中&#xff0c;企业级移动门户&#xff08;Enterprise Mobile Portal&#xff09;被广泛应用于企业的日常运营中。它们为企业提供了一个集中、统一的移动应用与数据访问平台&#xff0c;帮助提升工作效率、增强实时沟通并改善员工体验。随着企业对灵活性…

Datawhale Leecode基础算法篇 task05:位运算

官方学习文档&#xff1a;datawhalechina 往期task01&#xff1a;枚举算法链接&#xff1a;Datawhale Leecode基础算法篇 task01&#xff1a;枚举算法 往期task02&#xff1a;递归算法and分治算法&#xff1a;Datawhale Leecode基础算法篇 task02&#xff1a;递归算法and分治…

STM32编码器接口笔记

1. 引言 在现代控制系统中&#xff0c;编码器扮演着非常重要的角色。它就像一个精密的测量工具&#xff0c;可以告诉我们机械部件的位置和运动状态。在STM32微控制器中&#xff0c;编码器接口可以轻松地与各种编码器连接&#xff0c;实现精确的控制。我将在这里探讨STM32编码器…

【FaceFusion3.0.0】全新升级,重磅发布!

FaceFusion 3.0.0 版本引入了许多新特性和改进&#xff0c;其中包括&#xff1a; 重新设计架构&#xff0c;使所有操作都作为“任务”进行处理。在面部交换功能中引入像素增强(pixel boost)。向面部检测器添加多角度处理功能。引入年龄修正处理器(age modifier processor)。引…

Kafak入门技术详解

抱歉&#xff0c;没有太多的时间进行详细校对 目录 一、Kafka简介 1.消息队列 1.1为什么需要消息队列 1.2消息队列 1.3消息队列的分类 1.4P2P和发布订阅MQ的比较 1.5消息系统的使用场景 1.6常见的消息系统 2.Kafka简介 2.1简介 2.2设计目标 2.3 kafka核心的概念 二…

Grafana指标汉化

1、Grafana解压 目录 conf 2、找到&#xff1a;defaults.ini 3、打开defaults.ini &#xff0c;搜索&#xff1a;en-US 4.重新运行 &#xff1a;grafana-server.exe

js中的深拷贝与浅拷贝 手写深拷贝代码

1 什么是深拷贝和浅拷贝&#xff1f; 深拷贝和浅拷贝都是复制对象时常用的两种方式&#xff0c;区别在于对于嵌套对象的处理&#xff0c;浅拷贝只复制属性的第一层属性&#xff0c;双方修改嵌套对象将会互相影响。深拷贝会递归复制每一层的属性&#xff0c;修改任意一方互不影响…

谷歌地图 | 3D 地图新功能:开发更简单,体验更丰富

今年早些时候在 Google I/O 大会上推出了地图 JavaScript API 中的逼真 3D 地图。从那时起&#xff0c;谷歌地图一直受到大家对 3D 地图的热烈反响&#xff0c;并从中汲取了大量灵感。9月25日&#xff0c;谷歌地图宣布实验性 3D 地图迎来了重大更新&#xff0c;这将使开发者更轻…

深度学习模型可视化工具 Netron 使用教程

Netron 介绍 Netron 是一个用于可视化机器学习模型、深度学习模型、神经网络、图模型&#xff08;例如用于计算机视觉的 ONNX、Caffe、TensorFlow Lite、TensorFlow.js、Keras、Darknet、TVM、PyTorch、TorchScript、Core ML、ML.NET、NNEF、PaddlePaddle、OpenVINO、Arm NN等…

2024年9月25日--- Spring-IOC 1

一 Spring的概要 1.1 简介 Spring&#xff0c;春天的意思&#xff0c;意指给软件行业带来春天。2002年&#xff0c;Rod Jahnson首次推出了Spring框架雏形interface21框架。2004年3月24日&#xff0c;Spring框架以interface21框架为基础&#xff0c;经过重新设计&#xff0c;发…

广州数字孪生工业互联网可视化技术,赋能新型工业化智能制造工厂

在广州&#xff0c;特别是在工业互联网领域&#xff0c;数字孪生技术正逐步成为赋能新型工业化智能制造工厂的重要驱动力。数字孪生工业互联网技术的引入&#xff0c;不仅为传统制造业带来前所未有的变革&#xff0c;更为广州的工业发展注入新的活力与可能。 在智能制造工厂的…

Linux 基础IO(个人笔记)

Linux基础 IO 1.C文件IO操作1.1 hello.c写文件1.2 hello.c读文件1.3 stdin&stdout&stderr 2.系统文件I/O2.1 hello.c写文件2.2 hello.c读文件2.3 open函数介绍2.4 文件描述符 fd2.4.1 文件描述符的分配规则2.4.2 重定向2.4.3 dup2系统调用2.4.4 C文件结构体FILE2.4.5 C…

了解输出电源优先级

主要又SUB&#xff0c;SBU以及USB三种模式。 调试10kW逆变器存在的输出电源优先级的问题&#xff0c;当优先级为SUB时&#xff0c;利用电压源模拟电池&#xff0c;当电池电压超过58.4V&#xff0c;即过压&#xff0c;在接入市电&#xff0c;市电继电器仍然闭合&#xff0c;仍然…