JavaWeb
Java 和 Web
基本概念
Web开发
- 静态Web
- HTML,CSS,一些模板引擎
- 提供给所有人看的数据始终不会发生变化
- 动态Web
- 提供给所有人看的数据在不同时间不同地点会发生变化
- 技术栈:Servlet、JSP、ASP、PHP
在java中,动态Web资源开发的技术统称为JavaWeb
Web应用程序
可以提供浏览器访问的程序
- a.html、b.html…多个Web资源可以被外部访问,对外界提供服务
- 能访问到的任何页面或资源都存在于世界某个角落的计算机上
- URL:统一资源定位符
- 这些统一的Web资源会被放在同一个文件夹下,是一个Web应用程序,依赖于Tomcat服务器
- 一个Web应用由多部份组成(静态Web,动态Web)
- html、css、js
- jsp、servlet
- java程序
- jar包
- 配置文件(Properties)
Web应用程序编写完后若想提供给外界访问,需要服务器来统一管理
静态Web
*.htm, *html都是网页的后缀,如果服务器上一直存在这些东西,我们就可以进行读取
静态Web的缺点:
-
Web无法动态更新,所有用户看到的都是同一个页面
- 伪动态:轮播图,点击特效;JavaScript、VB
-
无法和数据库交互(数据无法持久化,用户无法交互)
动态Web
页面会动态展示:Web的页面展示的效果因人而异
动态Web的缺点:
- 若服务器的动态Web资源出现错误,我们需要重新编写后台程序,重新发布
- 停机维护
动态Web的优点:
- 可以动态更新,所有用户看到的页面都不同
- 可以和数据库交互,数据持久化,用户交互
Web服务器
###技术讲解
ASP(微软)
- 在HTML中嵌入了VB脚本:ASP+COM
- ASP开发中,一个基本页面都有几千行业务逻辑代码,页面混乱,维护成本高
- 主要用C#
PHP
- PHP开发速度很快并且能跨平台
- 代码简单
- 无法承载大访问量的情况存在局限性
JSP/Servlet
- sun公司主推的B/S(浏览器和服务器)架构
- 基于java语言,所有互联网大公司或开源组件都是用java
- 可以承载高并发,高可用,高性能带来的影响
- 语法和ASP很像,加强市场强度
Web服务器
用以接受用户请求并作出响应,是一种被动操作
IIS(微软)
- 运行Windows中自带的
Tomcat
- 实际运行JSP页面和Servlet,同时具有处理HTML页面的功能
Tomcat
文件夹作用:
- bin:启动关闭
- conf:配置
- lib:依赖的jar包
- logs:日志
- webapps:发放、存放网站
Tomcat配置:
- conf/server.xml:服务器核心配置文件
可以配置启动的端口号
Tomcat的默认端口号为8080
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
配置主机名称
默认主机名为localhost
默认网站存放位置为:webapps文件夹
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
网站是如何访问的
- 输入域名;回车
- 检查本机的C:\Windows\System32\drivers\etc\hosts配置文件下有无该域名映射
- 有:直接返回对应的IP地址,这个地址中有我们需要的Web程序,可以直接访问
- 无:访问DNS服务器(全世界的域名都在这管理),找到的话就返回,找不到就返回报错
##发布一个Web网站
-
将自己写的网站放到服务器(Tomcat)中指定的Web文件夹(webapps)下,就可以访问了
--webapps:Tomcat服务器的web目录 -ROOT -Mood:网站的目录名 -WEB-INF -classes:Java程序 -lib:所依赖的jar包 -web.xml -index.html默认的首页 -static -css -style -js -img
-
运行Tomcat后,进入localhost:8080/examples/,是Tomcat的帮助文档,包括例子和源码
HTTP
超文本传输协议(Hyper Text Transfer Protocol,HTTP)是一个简单的请求-响应协议,它通常运行在TCP之上。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。请求和响应消息的头以ASCII形式给出;而消息内容则具有一个类似MIME的格式。
- 文本:html,字符串
- 超文本:图片,音乐,视频,定位,地图
- 默认端口:80
- https默认端口:443
HTTP1.0和HTTP1.1
-
HTTP/1.0
- 客户端可以与Web服务器连接后,只能获得一个Web资源,断开连接
-
HTTP/1.1
- 客户端能获得多个Web资源
HTTP请求
- 客户端–>发送请求–>服务器
Request URL: https://www.baidu.com/ //请求地址
Request Method: GET //get方法,post方法
Status Code: 200 OK //状态码
Remote Address: 180.101.49.12:443
Referrer Policy: unsafe-url
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9 语言设置
Cache-Control: max-age=0
Connection: keep-alive 连接
Cookie: BIDUPSID=ADFED4B46EAF1CE35D93B98A4D5666B8; PSTM=1643428279; BD_UPN=1a314753; __yjs_duid=1_d3176cee17b43831f3f57fa275a202ce1644024632379; BDUSS=TBoeHRwQlNxRlRxNFJTejZEZDRRQWNxdzhjM0pUc3NXfk55ZFBzRmdZY0hjR0ppSVFBQUFBJCQAAAAAAAAAAAEAAADU~4VuAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfjOmIH4zpia; BDUSS_BFESS=TBoeHRwQlNxRlRxNFJTejZEZDRRQWNxdzhjM0pUc3NXfk55ZFBzRmdZY0hjR0ppSVFBQUFBJCQAAAAAAAAAAAEAAADU~4VuAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfjOmIH4zpia; MCITY=-358%3A; BAIDUID=2F12F92FAB2B9824DB6D4A4A0B3A20A6:FG=1; BDORZ=FFFB88E999055A3F8A630C64834BD6D0; BAIDUID_BFESS=C3900F6047AC5F5DC70BFA5CD902BADE:FG=1; BA_HECTOR=20810l8ha08g8g0l8h2n4pep1hdev6917; ZFY=iRi57ZGgh6FcQUUEd8eY12EIxWtbIgZ3cGQkHTScRVg:C; BDRCVFR[S_ukKV6dOkf]=mk3SLVN4HKm; delPer=0; BD_CK_SAM=1; PSINO=5; B64_BOT=1; Hm_lpvt_aec699bb6442ba076c8981c6dc490771=1658298229; Hm_lvt_aec699bb6442ba076c8981c6dc490771=1658113641,1658192739,1658280031,1658298229; COOKIE_SESSION=414_0_9_9_9_15_1_0_8_8_12_6_179_0_4_0_1658298645_0_1658298641%7C9%23282_16_1658121372%7C9; H_PS_PSSID=36554_36465_36255_36820_36454_36414_36666_34812_36692_36167_36773_36746_36762_36770_36767_26350_36866; ab_sr=1.0.1_ZmUwMzE5OWI4NTA3ZTQ1N2Q1ZGFjYTZjODE0YjYzZmU4MGM1OGNiNTIzNzE3Y2JiZGJmYjViMmRhZmE3OTZmNzdjNDU2NTY4NTI0YWFhOGIxYzIxNWY5MDc1MmM1NjY5YTg2OWMyNzBjNDQzODliODE2MzM2ODE1YWMwNmJjZmQ1NzFhODJkNWU4ODA4YTVlOWMyNDdkM2I3OTM3NGE4MTQ0ZGY4ZmExMzUxNWVmZWYwMTNkNjg1ZGJmOGZiZGUw; RT="z=1&dm=baidu.com&si=dj81265r9d6&ss=l5tajwbz&sl=3&tt=55y&bcn=https%3A%2F%2Ffclog.baidu.com%2Flog%2Fweirwood%3Ftype%3Dperf&ld=4u7"; H_PS_645EC=d366EWv5yJooBEL3yAfUzpIYqa7OsvpJklUE2HcywihMpljd5P37Swvqy2AyF%2BwHwqk; __sec_t_key=bfba2f1a-e928-4a8c-83d3-c14584574619; baikeVisitId=df1c99a6-c50f-4b77-a77f-a054a863e3d5; BD_HOME=1; sugstore=0
Host: www.baidu.com 主机
Referer: https://www.baidu.com/link?url=nqJ_i8_gcwjCRj2UA3SBx6EsbNDCP33atEhPMpwKAhO&wd=&eqid=c13e42ff000438a50000000462d7b29f
sec-ch-ua: ";Not A Brand";v="99", "Chromium";v="94"
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: "Windows"
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: same-origin
Sec-Fetch-User: ?1
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36 Core/1.94.169.400 QQBrowser/11.0.5130.400
####请求行
- 请求方式:get,post…
- get:一次请求能够携带的参数比较少,有大小限制,会在浏览器的URL地址栏显示数据内容,不安全但高效
- post:请求能携带的参数无限制,大小无限制,不会在浏览器的URL地址栏显示参数,安全但不高效
消息头
Accept:告诉浏览器所支持的数据类型
Accept-Encoding:支持那种编码格式 GBK UTF-8 GB2312 ISO8859-1
Accept-Language:告诉浏览器语言环境
Cache-Control:缓存控制
Connection:告诉浏览器请求完成是保持连结还是断开
HOST:主机
HTTP响应
- 服务器–>响应–>客户端
Bdpagetype: 2
Bdqid: 0xe9d76ff80000eae7
Cache-Control: private //缓存控制
Connection: keep-alive //连接:保持链接
Content-Encoding: gzip //编码类型
Content-Type: text/html;charset=utf-8
Date: Wed, 20 Jul 2022 07:45:54 GMT
Expires: Wed, 20 Jul 2022 07:45:53 GMT
Server: BWS/1.1
Set-Cookie: BDSVRTM=304; path=/
Set-Cookie: BD_HOME=1; path=/
Set-Cookie: H_PS_PSSID=36554_36465_36255_36820_36454_36414_36666_34812_36692_36167_36773_36746_36762_36770_36767_26350_36866; path=/; domain=.baidu.com
Strict-Transport-Security: max-age=172800
Traceid: 1658303154064668877816850059641772632807
Transfer-Encoding: chunked
X-Frame-Options: sameorigin
X-Ua-Compatible: IE=Edge,chrome=1
响应体
Accept:告诉浏览器所支持的数据类型
Accept-Encoding:支持那种编码格式 GBK UTF-8 GB2312 ISO8859-1
Accept-Language:告诉浏览器语言环境
Cache-Control:缓存控制
Connection:告诉浏览器请求完成是保持连结还是断开
HOST:主机
Refresh:告诉客户端多久刷新
Location:让网页重写
####响应状态码
状态码 | 说明 | 详情 |
---|---|---|
100 | 继续 | 请求者应当继续提出请求。服务器已经收到请求的一部分,正在等待其余部分 |
101 | 切换协议 | 请求者已要求服务器切换协议,服务器已确认并准备切换 |
200 | 成功 | 服务器已成功处理了请求 |
201 | 已创建 | 请求成功并且服务器创建了新的资源 |
202 | 已接受 | 服务器已接受请求,但尚未处理 |
203 | 非授权信息 | 服务器已成功处理了请求,但返回的信息可能来自另一个源 |
204 | 无内容 | 服务器成功处理了请求,但没有返回任何内容 |
205 | 重置内容 | 服务器成功处理了请求,内容被重置 |
206 | 部分内容 | 服务器成功处理了部分请求 |
300 | 多种选择 | 针对请求,服务器可执行多种操作 |
301 | 永久移动 | 请求的网页已永久移动到新位置,即永久重定向 |
302 | 临时移动 | 请求的网页暂时跳转到其他页面,即暂时重定向 |
303 | 查看其它位置 | 如果原来的请求时POST,重定向目标文档应该通过GET提取 |
304 | 未修改 | 此次请求返回的网页未修改,继续使用上次的资源 |
305 | 使用代理 | 请求者应该使用代理访问该网页 |
307 | 临时重定向 | 请求的资源临时从其他位置响应 |
400 | 错误请求 | 服务器无法解析该请求 |
401 | 未授权 | 请求没有进行身份验证或验证未通过 |
403 | 禁止访问 | 服务器拒绝此请求 |
404 | 未找到 | 服务器找不到请求的网页 |
405 | 方法禁用 | 服务器禁用了请求中指定的方法 |
406 | 不接受 | 无法使请求的内容响应请求的网页 |
407 | 需要代理授权 | 请求者需要使用代理授权 |
408 | 请求超时 | 服务器请求超时 |
409 | 冲突 | 服务器在完成请求时发生冲突 |
410 | 已删除 | 请求的资源已永久删除 |
411 | 需要有效长度 | 服务器不接受不含有效内容长度标头字段的请求 |
412 | 未满足前提条件 | 服务器未满足请求者在请求中设置的其中一个前提条件 |
413 | 请求实体过大 | 请求实体过大,超出服务器的处理能力 |
414 | 请求URL过长 | 请求网址过长,服务器无法处理 |
415 | 不支持类型 | 请求格式不被请求页面支持 |
416 | 请求范围不符 | 页面无法提供请求的范围 |
417 | 未满足期望值 | 服务器未满足期望请求标头字段的要求 |
500 | 服务器内部错误 | 服务器遇到错误,无法完成请求 |
501 | 未实现 | 服务器不具备完成请求的功能 |
502 | 错误网关 | 服务器作为网关或代理,从上游服务器收到无效响应 |
503 | 服务不可用 | 服务器目前无法使用 |
504 | 网关超时 | 服务器作为网关或代理,但是没有及时从上游服务器收到请求 |
505 | HTTP版本不支持 | 服务器不支持请求中所有的HTTP协议版本 |
重定向:重新到所给的新位置
Maven
使用Maven帮我们自动导入大量jar包
Maven项目架构管理
Maven核心思想:约定大于配置
Maven会规定你该如何去编写Java代码
测试Maven是否安装成功:cmd中输入mvn -version
###阿里云镜像
搜索阿里云镜像代码,粘贴进settings.xml文件的mirror中
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>*,!jeecg,!jeecg-snapshots</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
本地仓库
在settings.xml文件中填入自己的地址:…
在IDEA中创建MavenWeb项目时可以勾选archetype选项,可以使用Maven的模板
环境变量
在高级系统设置的环境变量中加入:
M2_HOME:maven的bin目录
MAVEN_HOME:maven的目录
Path中新建引用:%MAVEN_HOME%\bin
IDEA中的Maven设置
SpringBoot中在Maven创建完成后,MavenHome可能会使用默认设置,我们需要手动改为本地
如果选择archetype选项,并选择其中的maven.webapp选项为模板
则在main文件夹中会出现wabapp文件夹
其中就是一个网站程序:WEB-INF中的web.xml属于Web配置,index.jsp是网页
这些只有在Web应用下才存在
如果不选择archetype选项,则如下所示
main中的java文件夹存放java源代码
resources放置配置文件
test文件夹中的java用来测试使用
右侧为初始的Maven文件
IDEA中配置Tomcat
找到并选择Tomcat,选择本地仓库
完成配置
解决警告
必须配置:为访问网站,需要制定一个文件夹的名字
点击确定后在右上方启动Tomcat
启动完成后得到网页显示如下
这里访问到的Hello World!就是根据默认的index.jsp中的内容
pom文件
pom.xml是Maven的核心文件
<?xml version="1.0" encoding="UTF-8"?>
<!--Maven版本和头文件-->
<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>
<!--初始配置的GAV,此处使用的是默认值-->
<groupId>org.example</groupId>
<artifactId>MavenWeb</artifactId>
<version>1.0-SNAPSHOT</version>
<!--项目的打包方式
jar:java应用
war:JavaWeb应用-->
<packaging>war</packaging>
<name>MavenWeb Maven Webapp</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>
<!--配置-->
<properties>
<!--项目的默认构建编码-->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!--编译版本-->
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
</properties>
<!--项目依赖-->
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>
<!--项目构建用的东西-->
<build>
<finalName>MavenWeb</finalName>
<pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
<plugins>
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>3.1.0</version>
</plugin>
<!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging -->
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.1</version>
</plugin>
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.2</version>
</plugin>
<plugin>
<artifactId>maven-install-plugin</artifactId>
<version>2.5.2</version>
</plugin>
<plugin>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.8.2</version>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
导入Spring Web MVC包
<?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>JavaWeb-02-Maven</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
</properties>
<dependencies>
<!--具体以来的jar包配置文件-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<!--Maven的高级之处在于,他会帮你导入这个JAR包依赖的其他JAR包 -->
<!--https://mvnrepository.com/artifact/org.springframework/spring-webmvc-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.22</version>
</dependency>
</dependencies>
</project>
导入包如下:junit包和Spring Web MVC包
由于在Maven中规定大于配置,我们之后可能会遇到自己写入的配置文件无法被导出或生效的问题
解决方案:在build下配置resource节点
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<excludes>
<exclude>**/*.properties</exclude>
<exclude>**/*.xml</exclude>
</excludes>
<filtering>false</filtering>
</resource>
<resource>
<directory>src/main/java</directory>
<includes><!--让src/main/java这个目录下能包含xml文件-->
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
</build>
IDEA操作
生成结构树
问题
由于依照archetype选项中的Web模板生成的Web版本较低,可以引入Tomcat的Web.xml文件中的Web版本进行替换,使Web版本和Tomcat保持一致
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee
https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd"
version="5.0"
metadata-complete="true">
</web-app>
Maven仓库的使用
如果本地的仓库中找不到Maven需要的类,就进入Maven仓库中寻找
观察使用人次等判断使用
如此时出现添加Maven依赖失败的问题,直接从Maven仓库中找到相关依赖的jar包进行导入
Servlet
Servlet是sun公司开发的一门动态Web的技术
Sun在这些API中提供一个接口叫做Servlet,开发一个Servlet程序只需要两步骤,编写一个类,实现Servlet接口,把开发好的Java类部署到Web服务器中
把实现了Servlet接口的Java程序称作Servlet
HelloServlet
构建一个普通的Maven项目,删掉里面的所有东西,在这个项目里建Moudel,此空的工程就是Maven主工程
关于Maven父子项目的理解:
父项目中会有
<modules>
<module>Servlet-01</module>
</modules>
子项目中会有
<parent>
<artifactId>JavaWeb-03-Servlet</artifactId>
<groupId>com.mood</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
父项目中的jar包子项目可以直接使用
son extends father
package com.mood.servlet;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException{
System.out.println("进入doGet方法");
//ServletOutputStream outputStream = resp.getOutputStream();
PrintWriter writer = resp.getWriter();//响应流
writer.print("Hello,Servlet");
}
@Override
protected void doPost(HttpServletRequest req,HttpServletResponse resp) throws ServletException,IOException{
doGet(req,resp);
}
}
###编写Servlet的映射:
我们编写的是Java程序,但需要通过浏览器访问,而连接浏览器需要连结Web服务,所以我们需要在Web服务中注册我们写的Servlet,还需要给他一个浏览器能够访问的路径;
<!--注册Servlet-->
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>com.mood.servlet.HelloServlet</servlet-class>
</servlet>
<!--Servlet请求路径-->
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
###配置Tomcat
注意发布时的Artifact项目配置
如若未出现Artifact选项,可能为Maven导入的jar包未更新,重新更新Maven的jar包目录即可
启动测试
点击启动Tomcat,输入先前配置的Servlet请求路径即可访问用Servlet编写的页面
Servlet运行原理
Servlet程序由Web服务器调用,Web服务器在收到浏览器请求之后,会:
Mapping
###一个Servlet可以指定一个映射路径
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
###一个Servlet可以指定多个映射路径
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello1</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello2</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello3</url-pattern>
</servlet-mapping>
###一个Servlet可以指定通用映射路径
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello/*</url-pattern><!--此处使用通配符,表示hello后的任何都会指向hello-->
</servlet-mapping>
###默认请求路径
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/*</url-pattern><!--此处使用通配符,表示任何都会指向hello-->
</servlet-mapping>
###指定后缀或者一些前缀
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>*.mood</url-pattern><!--此处使用通配符,表示任意前缀如abcd.mood,*前不能加映射路径-->
</servlet-mapping>
###优先级问题
制定了固有的映射路径优先级最高,如果找不到就会走默认的处理请求
免责声明:本问主要借鉴B站up主遇见狂神说的教学视频,本文属个人笔记,无商业用途