<svg xmlns="http://www.w3.org/2000/svg" style="display: none;"> <path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path> </svg> <p></p>
讯享网
是 的缩写,翻译过来就是可扩展标记语言。所以很明显,和 一样都是标记语言,也就是说它们的基本语法都是标签。
<?xml version="1.0" encoding="UTF-8"?>
- 这部分基本上就是固定格式,要注意的是文档声明一定要从第一行第一列开始写
- 根标签
- 根标签有且只能有一个
- 标签关闭
- 双标签:开始标签和结束标签必须成对出现。比如:
- 单标签:单标签要在标签内关闭。比如:
- 标签嵌套
- 可以嵌套,但是不能交叉嵌套。
讯享网
- 标签名、属性名建议使用小写字母
- 属性
- 属性必须有值
- 属性值必须加引号,单双都行
- XML 约束(了解)
将来我们主要就是根据XML约束中的规定来编写XML配置文件,而且会在我们编写XML的时候根据约束来提示我们编写, 而XML约束主要包括DTD和Schema两种。
- DTD
- Schema
例子
使用步骤
- 导入jar 包
- 创建解析器对象
- 解析xml 获得 对象
- 获取根节点
- 获取根节点下的子节点
DOM4J API
- 创建 对象
讯享网
- 解析 获取 对象:需要传入要解析的 字节输入流
- 获取文档的根标签
讯享网
- 获取标签的子标签
- 获取标签体内的文本
讯享网
- 获取标签的某个属性的值
例子
讯享网
域名
- https://www.baidu.com/ (网址)
- www.baidu.com 是一个域名
- 在浏览器地址栏上输入域名,回车之后,域名解析器会将域名解析出来一个具体的IP地址和端口号等。
- 解析结果也许是:http://110.242.68.3:80/index.html
ip 地址
- 计算机在网络当中的一个身份证号。在同一个网络当中,IP地址是唯一的。
- A计算机要想和B计算机通信,首先你需要知道B计算机的IP地址,有了IP地址才能建立连接。
端口号
- 一个端口代表一个软件(一个端口代表一个应用,一个端口仅代表一个服务)。
- 一个计算机当中有很多软件,每一个软件启动之后都有一个端口号。
- 在同一个计算机上,端口号具有唯一性
URL
统一资源定位符(http://www.baidu.com)
请求和响应
- 请求和响应实际上说的是数据的流向不同。
- 从Browser端发送数据到Server端,我们称为请求。英语单词:request
- 从Server端向浏览器Browser端发送数据,我们称为响应。英语单词:response
- B --> S (请求request)
- S --> B (响应response)
Web 通信原理
- 第一步:用户输入网址(URL)
- 第二步:域名解析器进行域名解析:http://110.242.68.3:80/index.html
- 第三步:浏览器软件在网络中搜索110.242.68.3这一台主机,直到找到这台主机。
- 第四步:定位110.242.68.3这台主机上的服务器软件,因为是80端口,可以很轻松的定位到80端口对应的服务器软件。
- 第五步:80端口对应的服务器软件得知浏览器想要的资源名是:index.html
- 第六步:服务器软件找到index.html文件,并且将index.html文件中的内容直接输出响应到浏览器上。
- 第七步:浏览器接收到来自服务器的代码(HTML CSS JS)
- 第八步:浏览器渲染,执行HTML CSS JS代码,展示效果。
- Tomcat(WEB服务器)
- jetty(WEB服务器)
- JBOSS(应用服务器)
- WebLogic(应用服务器)
- WebSphere(应用服务器)
应用服务器和 WEB 服务器的区别
- 应用服务器实现了JavaEE的所有规范。(JavaEE有13个不同的规范。)
- WEB服务器只实现了JavaEE中的 Servlet + JSP 两个核心的规范。
- 通过这个讲解说明了:应用服务器是包含WEB服务器的。
- 用过JBOSS服务器的同学应该很清楚,JBOSS中内嵌了一个Tomcat服务器。
- Tomcat官方网站:http://tomcat.apache.org/
下载
- 安装版:需要安装,一般不考虑使用。
- 解压版: 直接解压缩使用,我们使用的版本。

Tomcat 服务器的配置和使用
- 必须利用 JAVA_HOME 配置 JDK path变量
- bin 目录下有 startup.bat,通过它可以启动 Tomcat 服务器
- xxx.bat 是 windows 操作系统专用的,bat 是批处理文件,这种文件可以编写大量的 windows 的 dos 命令,然后执行 bat 文件就相当于批量的执行 dos 文件
- startup.sh 这个文件在 Linux 环境中使用,在 Linux 环境下能执行的是 shell 命令,大量的 shell 命令编写在 sh 文件当中,然后执行这个 shell 文件可以批量执行 shell 命令
- 执行 startup.bat 命令,实际上最后执行的是: catalina.bat 文件
- catalina.bat文件中有这样一行配置:MAINCLASS=org.apache.catalina.startup.Bootstrap (这个类就是main方法所在的类。)
- tomcat 服务器就是 java 写的,既然是 java 写的,那么启动 Tomcat 服务器就是执行 main 方法 (catalina.bat 中的配置)
- 配置 Tomcat 的 bin 路径到 path 变量 , 再把 Tomcat 根目录设成变量名为 CATALINA_HOME 的变量,然后写进 path 变量带上 bin 最后 dos 命令窗口中输入 startup.bat 启动 tomcat 服务器
- 关闭Tomcat:stop (shutdown.bat文件重命名为stop.bat,为什么?原因是shutdown命令和windows中的关机命令冲突。所以修改一下。)
- 测试 Tomcat 服务器
- 打开浏览器再浏览器输入 URL
- http://ip地址 : 端口号
- 本机地址:127.0.0.1 或者 localhost ,端口号 8080
解决 Tomcat 乱码
将 文件中的内容修改如下:
Tomcat 目录
- bin
该目录下存放的是二进制可执行文件,如果是安装版,那么这个目录下会有两个exe文件:tomcat10.exe、tomcat10w.exe,前者是在控制台下启动Tomcat,后者是弹出GUI窗口启动Tomcat;如果是解压版,那么会有startup.bat和shutdown.bat文件,startup.bat用来启动Tomcat,但需要先配置JAVA_HOME环境变量才能启动,shutdawn.bat用来停止Tomcat;
- conf:里面有四个重要文件
- server.xml
配置整个服务器信息。例如修改端口号。默认HTTP请求的端口号是:8080
- tomcat-users.xml
存储 tomcat用户 的文件,这里保存的是tomcat的用户名及密码,以及用户的角色信息。可以按着该文件中的注释信息添加tomcat用户,然后就可以在Tomcat主页中进入Tomcat Manager页面了;
- web.xml
部署描述符文件,这个文件中注册了很多MIME类型,即文档类型。这些MIME类型是客户端与服务器之间说明文档类型的,如用户请求一个html网页,那么服务器还会告诉客户端浏览器响应的文档是text/html类型的,这就是一个MIME类型。客户端浏览器通过这个MIME类型就知道如何处理它了。当然是在浏览器中显示这个html文件了。但如果服务器响应的是一个exe文件,那么浏览器就不可能显示它,而是应该弹出下载窗口才对。MIME就是用来说明文档的内容是什么类型的!
- context.xml
对所有应用的统一配置,通常我们不会去配置它。
- lib
Tomcat的类库,里面是一大堆jar文件。如果需要添加Tomcat依赖的jar文件,可以把它放到这个目录中,当然也可以把应用依赖的jar文件放到这个目录中,这个目录中的jar所有项目都可以共享之,但这样你的应用放到其他Tomcat下时就不能再共享这个目录下的jar包了,所以建议只把Tomcat需要的jar包放到这个目录下;
- logs
这个目录中都是日志文件,记录了Tomcat启动和关闭的信息,如果启动Tomcat时有错误,那么异常也会记录在日志文件中。【不用可以删掉】
- temp
存放Tomcat的临时文件,这个目录下的东西可以在停止Tomcat后删除!
- webapps
存放 web 项目的目录中,每个文件夹代表一个项目。如果该目录下已经存在一些目录,那么这些可能是 tomcat 自带的项目。“ROOT” 是一个特殊的项目,当在地址栏中输入 “http://127.0.0.1:8080” 且没有给出具体项目目录时,系统会自动对应到这个 ROOT 项目进行访问。
- work
运行时生成的文件,最终运行的文件都在这里。通过webapps中的项目生成的!可以把这个目录下的内容删除,再次运行时会生再次生成work目录。当客户端用户访问一个JSP文件时,Tomcat会通过JSP生成Java文件,然后再编译Java文件生成class文件,生成的java和class文件都会存放到这个目录下。【现在基本用不到了】
- LICENSE:许可证。
- NOTICE:说明文件。

注意:上下文路径不一定和项目的部署目录一样。上下文路径是可以改的
图示:

URL 的组成部分和项目中资源的对应关系

解释
- app 应用根目录
- static 非必要目录,约定俗成的名字,一般在此处放静态资源 ( css js img)
- WEB-INF 必要目录,必须叫WEB-INF,受保护的资源目录,浏览器通过url不可以直接访问的目录
- classes 必要目录, src下源代码,配置文件,编译后会在该目录下,web项目中如果没有源码,则该目录不会出现
- lib 必要目录, 项目依赖的jar编译后会出现在该目录下,web项目要是没有依赖任何jar,则该目录不会出现
- web.xml 必要文件, web项目的基本配置文件. 较新的版本中可以没有该文件,但是学习过程中还是需要该文件
- index.html 非必要文件,index.html/index.htm/index.jsp为默认的欢迎页
- 方式一
直接将编译好的项目放在webapps目录下
- 方式二
将编译好的项目打成war包放在webapps目录下,tomcat启动后会自动解压war包(其实和第一种一样)
- 方式三
可以将项目放在非webapps的其他目录下,在 tomcat 中通过配置文件指向 app 的实际磁盘路径
方式三操作步骤
- 在磁盘的自定义目录上准备一个 app目录
- 在tomcat的conf下创建Catalina/localhost目录,并在该目录下准备一个app.xml文件
第一步:IDEA关联本地 Tomcat
- IDEA 关联本地 Tomcat
可以在创建项目前设置本地tomcat,也可以在打开某个项目的状态下找到settings
找到 Build,Execution,Eeployment下的Application Servers ,找到+号
选择Tomcat Server
选择tomcat的安装目录
关联完毕
第二步:IDEA 创建 WEB 工程
- IDEA 创建 WEB 工程
推荐先创建一个空项目,这样可以在一个空项目下同时存在多个modules,不用后续来回切换之前的项目,当然也可以忽略此步直接创建web项目
检查项目的SDK,语法版本,以及项目编译后的输出目录
先创建一个普通的JAVA项目
检查各项信息是否填写有误
创建完毕后,为项目添加Tomcat依赖
选择modules,添加 framework support,新 IDEA 用搜索框搜索
选择Web Application 注意Version,勾选 Create web.xml
删除index.jsp ,替换为 index.html
处理配置文件
- 在工程下创建resources目录,专门用于存放配置文件(都放在src下也行,单独存放可以尽量避免文件集中存放造成的混乱)
- 标记目录为资源目录,不标记的话则该目录不参与编译
处理依赖 jar 包问题
- 在WEB-INF下创建lib目录
- 必须在WEB-INF下,且目录名必须叫lib!!!
- 复制jar文件进入lib目录
将lib目录添加为当前项目的依赖,后续可以用maven统一解决
环境级别推荐选择module 级别,降低对其他项目的影响,name可以空着不写
查看当前项目有那些环境依赖
在此位置,可以通过-号解除依赖。有需不要的可以解除
第三步:IDEA部署-运行WEB项目
- IDEA部署-运行WEB项目
检查idea是否识别modules为web项目并存在将项目构建成发布结构的配置
- 就是检查工程目录下,web目录有没有特殊的识别标记
- 以及artifacts下,有没有对应 _war_exploded,如果没有,就点击+号添加
点击向下箭头,出现 Edit Configurations选项
出现运行配置界面 , 点击+号,添加本地tomcat服务器
选择Deployment,通过+添加要部署到Tomcat中的artifact
applicationContext中是默认的项目上下文路径,也就是url中需要输入的路径,这里可以自己定义,可以和工程名称不一样,也可以不写,但是要保留 /,这个路径就是访问你项目目录的路径,就是第二张图里的 demp01_web01_war_exploded,这个目录也是放进 weapps 的目录,还构建成 out 前就是 web
点击apply 应用后,回到Server部分. After Launch是配置启动成功后,是否默认自动打开浏览器并输入URL中的地址,HTTP port是Http连接器目前占用的端口号
点击OK后,启动项目,访问测试
- 绿色箭头是正常运行模式
- "小虫子"是debug运行模式
- 点击后,查看日志状态是否有异常
- 浏览器自动打开并自动访问了index.html欢迎页
原理
工程结构和可以发布的项目结构之间的目录对应关系

IDEA部署并运行项目的原理
- idea并没有直接进将编译好的项目放入tomcat的webapps中
- idea根据关联的tomcat,创建了一个tomcat副本,将项目部署到了这个副本中
- idea的tomcat副本路径可以启动 tomcat 看命令行中的 LINA_BASE 查看
- idea的tomcat副本并不是一个完整的tomcat,副本里只是准备了和当前项目相关的配置文件而已
- idea启动tomcat时,是让本地tomcat程序按照tomcat副本里的配置文件运行
- idea的tomcat副本部署项目的模式是通过conf/Catalina/localhost/*.xml配置文件的形式实现项目部署的

目录原理


这个 demo01 就是 webapps 中的目录 我们在 中的目录就是访问它的,它在没构建成 out 前就是工程文件中的 web 目录
HTTP 超文本传输协议 (HTTP-Hyper Text transfer protocol),是一个属于应用层的面向对象的协议。它是一种详细规定了浏览器和万维网服务器之间互相通信的规则。通过因特网传送万维网文档的数据传送协议。客户端与服务端通信时传输的内容我们称之为报文。HTTP协议就是规定报文的格式。HTTP就是一个通信规则,这个规则规定了客户端发送给服务器的报文格式,也规定了服务器发送给客户端的报文格式。实际我们要学习的就是这两种报文。客户端发送给服务器的称为"请求报文",服务器发送给客户端的称为"响应报文"。
HTTP 协议的会话方式
- 浏览器与服务器之间通信要经历四个步骤
- 浏览器与WEB服务器的连接过程是短暂的,每次连接只处理一个请求和响应。对每一个页面的访问,浏览器与WEB服务器都要建立一次单独的连接。
- 浏览器到WEB服务器之间的所有通讯都是完全独立分开的请求和响应对。
HTTP 1.0 和 1.1 的区别
- 在HTTP1.0版本中,浏览器请求一个带有图片的网页,会由于下载图片而与服务器之间开启一个新的连接;但在HTTP1.1版本中,允许浏览器在拿到当前请求对应的全部资源后再断开连接,提高了效率。
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
浏览器抓包工具
- 几乎所有的PC端浏览器都支持了F12开发者工具,只不过不同的浏览器工具显示的窗口有差异
报文的格式
主体上分为报文首部和报文主体,中间空行隔开

报文部首部可以继续细分为 “行” 和 “头” 【请求行就是行,字段就是头】

请求报文
客户端发给服务端的报文
格式
- 请求首行(请求行):,,
- 请求头信息(请求头)
- 空行
- 请求体【POST 请求才往请求体放数据】
浏览器 f12 网络下查看请求数据包
第一个红框就是请求行,第二个红框就是请求头,请求体要在响应中看

FROM 表单发送 GET 请求的特点
- 由于请求参数在请求首行中已经携带了,所以没有请求体,也没有请求空行
- 请求参数拼接在url地址中,地址栏可见[url?name1=value1&name2=value2],不安全
- 由于参数在地址栏中携带,所以由大小限制[地址栏数据大小一般限制为4k],只能携带纯文本
- get请求参数只能上传文本数据
- 没有请求体。所以封装和解析都快,效率高, 浏览器默认提交的请求都是get请求比如:地址栏输入回车,超链接,表单默认的提交方式
GET 请求行组成部分
- 请求方式 GET
- 访问服务器的资源路径?参数1=值1&参数2=值2 … …
- 协议及版本 HTTP/1.1
讯享网
GET请求报文结构详细
- 请求行
- 请求方式 GET
- 访问服务器的资源路径?参数1=值1&参数2=值2 … …
- 协议及版本 HTTP/1.1
- 请求头
讯享网
- 请求空行
- 请求体
- GET请求数据不放在请求体
FROM 表单中 POST 请求的特点
- POST 请求有请求体,而 GET 请求没有请求体
- post请求数据在请求体中携带,请求体数据大小没有限制,可以用来上传所有内容[文件、文本]
- 只能使用post请求上传文件
- post请求报文多了和请求体相关的配置[请求头]
- 地址栏参数不可见,相对安全
- post效率比get低
POST请求报文结构
- 请求行
- 请求方式:POST
- 访问服务器的资源路径
- 协议及版本号
- 请求头
讯享网
- 请求空行
- 请求体:浏览器提交个提交给服务器的数据
响应报文
服务端发给客户端的报文
格式
- 响应首行(响应行): 协议/版本 状态码 状态码描述
- 响应头信息(响应头)
- 空行;
- 响应体;
第一行就是响应行,后面都是响应头


响应报文详细
- 响应行
- 协议及版本
- 响应状态码
- 状态描述 (缺省)
讯享网
- 响应头
- 响应体
讯享网
常见状态码
常见状态码
- 200: 请求成功,浏览器会把响应体内容(通常是html)显示在浏览器中;
- 302: 重定向,当响应码为302时,表示服务器要求浏览器重新再发一个请求,服务器会发送一个响应头Location指定新请求的URL地址;
- 304: 使用了本地缓存
- 404: 请求的资源没有找到,说明客户端错误的请求了不存在的资源;
- 405: 请求的方式不允许
- 500: 请求资源找到了,但服务器内部出现了错误;
其他的状态码
是运行在服务端(tomcat)的Java小程序,是sun公司提供一套定义动态资源规范; 从代码层面上来讲 就是一个接口。实现了这个接口
作用
用来接收、处理客户端请求、响应给浏览器的动态资源。在整个Web应用中,Servlet主要负责接收处理请求、协同调度功能以及响应数据。我们可以把Servlet称为Web应用中的控制器

大概流程

目标
校验注册时,用户名是否被占用,通过客户端向 Servlet 发送氢气球,携带 username,如果用户名是 atguigu,则向客户端响应 NO,如果是其他响应 YES
开发过程
- 配置一个 web 类型的 module
- 开发一个
- 自定义一个类,继承 类
- 重写 方法,该方法主要就是用于处理用户请求的服务方法
- 代表请求对象,是有请求报文经过 转换而来的,通过该对象可以获取请求中的信息
- 代表响应对象,该对象会被 转换为响应的报文,通过该对象可以设置响应中的信息
- 对象的生命周期(创建,初始化,处理服务,销毁)由 管理,无序我们自己 new
- 两个对象也是由 负责转换,在调用 方法时传给我们
- 在 为 配置请求的映射路径
- Servlet并不是文件系统中实际存在的文件或者目录,所以为了能够请求到该资源,我们需要为其配置映射路径
- servlet的请求映射路径配置在web.xml中
- servlet-name作为servlet的别名,可以自己随意定义,见名知意就好
- url-pattern标签用于定义Servlet的请求映射路径
- 一个servlet可以对应多个不同的url-pattern
- 多个servlet不能使用相同的url-pattern
- url-pattern中可以使用一些通配写法
- / 表示通配所有资源,不包括jsp文件
- /* 表示通配所有资源,包括jsp文件
- /a/* 匹配所有以a前缀的映射路径
- *.action 匹配所有以action为后缀的映射路径
讯享网
- 开发一个 表单,向 发送一个 请求并携带 参数
- 启动项目,访问 提交表单测试
- 使用debug模式运行测试
映射关系图

servlet-api jar 包导入问题
我们不单独建一个 lib 放 servlet-api 而是直接 project structure 中导入。
讯享网
Content-Type响应头问题
MIME 类型响应头 媒体类型,文件类型,响应的数据类型
MIME 类型用于告诉客户端响应数据是什么类型的数据,客户端以此类型决定用什么方式解析响应体
请求文件的时候,如果找不到这个类型的文件,就会把这个文件通过 io 流,放到 中的 中的 中,
@WebServlet 注解源码
讯享网
使用举例
- 是创建的,生命周期方法都是由容器 (目前我们使用的是Tomcat) 调用的。
- 不建议在 方法中修改成员变量,因为 在 中式单例的, 的成员变量在多个线程栈中式共享的。如果修改了可能引发线程安全问题
load-on-startup 问题
- 在 中配置或者在 中配置
- 默认是 表示第一次请求时加载
- 整数就是应用启动时就加载
如果配置的是正整数则表示容器在启动时就要实例化Servlet。不建议配置 1 到 5 因为,因为 的 文件中配置过了 1 到 5。数字表示的是实例化的顺序
Servlet 顶级接口
讯享网
GenericServlet 抽象模板类
HTTPServlet 抽象类
讯享网
HttpServlet 抽象类中的 this.service 调用的 service
我们需要重写的方法
- 继承 后, 要么重写 方法, 要么重写 方法
- 部分程序员推荐在 servlet 中重写 do* 方法处理请求 理由: service 方法中可能做了一些处理,如果我们直接重写 service 的话父类 service 方法处理的功能就失效的
- 如果 doGet 和 doPost 方法中, 我们定义的代码都一样, 可以让一个方法直接调用另一个方法就行
- 后续使用了 SpringMVC 框架后, 我们无序继承 HttpServlet, 处理请求的方法也无需 do* service
继承关系图解

ServletConfig
- 是为 提供初始配置参数的一种对象,每个 都有自己独立唯一的 对象。就是各自 在 中的配置信息
- 容器会为每个 实例化一个对象,并通过 生命周期的 方法传入给 作为属性
使用
接口
讯享网
获取 ServletConfig
继承了 。而 中有 方法我们自己的方法又继承了 所以 中的 方法可以在 中使用
Enumeration
使用
讯享网
ServletContext
- 对象有称呼为上下文对象,或者叫应用域对象
- 容器会为每个app创建一个独立的唯一的 对象,可以理解为
- 对象为所有的 所共享
- 可以为所有的 提供初始配置参数
获取 ServletContext 对象
- 第一种:先获取 对象,再获取 对象
- 第二种:直接调用
- 第三种:通过 调用
讯享网
ServletContext 获取配置参数
- 配置ServletContext参数
- 在 Servlet 中获取 ServletContext 并获取参数
讯享网
ServletContext 获得路径问题
获取资源的真实路径


获取资源的上下文路径
讯享网

ServletContext 域相关
主要作用就是跨 Servlet 传输数据
- 域对象:一些用于存储数据和传递数据的对象,传递数据不同的范围,我们称之为不同的域,不同的域对象代表不同的域,共享数据的范围也不同。
- 代表应用,所以域也叫作应用域,是 中最大的域,可以在本应用内实现数据的共享和传递
- webapp中的三大域对象:分别是应用域,会话域,请求域
是一个接口,其父接口是
是 Tomcat 将请求报文转换封装而来的对象,在 Tomcat 调用 service 方法时传入
代表客户端发来的请求,所有请求中的信息都可以通过该对象获得

常见 API
- 是一个接口,其父接口是``ServletResponse`
- 是Tomcat预先创建的,在Tomcat调用service方法时传入
- 代表对客户端的响应,该对象会被转换成响应的报文发送给客户端,通过该对象我们可以设置响应信息

常用API
请求转发

特点
- 请求转发通过 对象获取请求转发器实现
- 请求转发是服务器内部的行为,对客户端是屏蔽的
- 客户端只发送了一次请求, 客户端地址栏不变
- 服务端只产生了一对请求和响应对象, 这一对请求和响应对象会继续传递给下一个资源
- 因为全程只有一个对象,所以请求参数可以传递,请求域中的数据也可以传递
- 请求转发可以转发给其他动态资源,也可以转发给一些静态资源以实现页面跳转
- 请求转发可以转发给下受保护的资源
- 请求转发不能转发到本项目以外的外部资源
例子

讯享网
响应重定向

特点
- 响应重定向通过 对象的方法实现
- 响应重定向是服务端通过302响应码和路径,告诉客户端自己去找其他资源,是在服务端提示下的客户端的行为 就是重定向后,响应状态码为 302
- 客户端至少发送了两次请求, 客户端地址栏是要变化的
- 服务端产生了多对请求和响应对象,且请求和响应对象不会传递给下一个资源
- 因为全程产生了多个对象,所以请求参数不可以传递,请求域中的数据也不可以传递
- 重定向可以是其他动态资源,也可以是一些静态资源以实现页面跳转
- 重定向不可以到给下受保护的资源
- 重定向可以到本项目以外的外部资源
例子
讯享网
同样能够实现页面跳转,优先使用响应重定向
乱码产生的根本原因:
- 数据的编码和解码使用的不是同一个字符集
- 使用了不支持某个语言文字的字符集

HTML 乱码问题
- 查看当前文件的字符集
- 查看项目字符集 配置,将Global Encoding 全局字符集,Project Encoding 项目字符集, Properties Files 属性配置文件字符集设置为UTF-8
- 当前视图文件的字符集通过 来告知浏览器通过什么字符集来解析当前文件
讯享网
Tomcat 控制台乱码
- 在tomcat10.1.7这个版本中,修改 中修改
- sout 乱码问题,设置JVM加载.class文件时使用UTF-8字符集
GET 请求乱码问题
原因
- GET方式提交参数的方式是将参数放到URL后面,如果使用的不是UTF-8,那么会对参数进行URL编码处理
- HTML中的 影响了GET方式提交参数的URL编码
- tomcat10.1.7的URI编码默认为 UTF-8
- 当GET方式提交的参数URL编码和tomcat10.1.7默认的URI编码不一致时,就会出现乱码
乱码演示
- 浏览器解析的文档的
- GET方式提交时,会对数据进行URL编码处理 ,是将GBK 转码为 “百分号码”
- tomcat10.1.7 默认使用UTF-8对URI进行解析,造成前后端使用的字符集不一致,出现乱码
- 解决方式
- 方式1 :设置GET方式提交的编码和Tomcat10.1.7的URI默认解析编码一致即可 (推荐)
- 方式2 : 设置Tomcat10.1.7的URI解析字符集和GET请求发送时所使用URL转码时的字符集一致即可,修改conf/server.xml中 Connecter 添加 URIEncoding=“…” (不推荐)
POST 方式请求乱码
原因
- POST请求将参数放在请求体中进行发送
- 请求体使用的字符集受到了 的影响
- Tomcat10.1.7 默认使用UTF-8字符集对请求体进行解析
- 如果请求体的URL转码和Tomcat的请求体解析编码不一致,就容易出现乱码
乱码演示
- POST请求请求体受到了 的影响
- 请求体中,将GBK数据进行 URL编码
- 后端默认使用UTF-8解析请求体,出现字符集不一致,导致乱码
解决方式
- 方式1 : 请求时,使用UTF-8字符集提交请求体 (推荐)
- 方式2 : 后端在获取参数前,设置解析请求体使用的字符集和请求发送时使用的字符集一致 (不推荐)
响应乱码
原因
- 在Tomcat10.1.7中,向响应体中放入的数据默认使用了工程编码 UTF-8
- 浏览器在接收响应信息时,使用了不同的字符集或者是不支持中文的字符集就会出现乱码
乱码演示
- 服务端通过response对象向响应体添加数据
- 浏览器接收数据解析乱码
解决
- 方式1 : 手动设定浏览器对本次响应体解析时使用的字符集(不推荐)
- edge和 chrome浏览器没有提供直接的比较方便的入口,不方便
- 方式2: 后端通过设置响应体的字符集和浏览器解析响应体的默认字符集一致(不推荐)
- 方式3: 通过设置content-type响应头,告诉浏览器以指定的字符集解析响应体(推荐)
- 前端用…字符集解析
- 后端也可以用 设置对应的字符集
前端路径问题
- 相对路径
- 绝对路径
讯享网
- 相对原理原理
就是和当前的上下文路径拼接到一起,可以理解为 WEB 目录【除了 WEB-INF 里面的要通过请求转发访问】,用相对路径记得用 …/ 消去多余路径
- 绝对路径原理
http://localhost:8080 作为出发点 我们加上 / + 上下文路径就行
重定向 和 请求转发中的路径问题
原理

- 重定向的地址:
- 直接拼接到上下文路径 【相对路径】
- 用 / 直接 表示 http://localhost:8080 我们直接加上
- 请求转发
- 相对路径原理一致
- 请求转发 / 代表路径是 http://localhost:8080/demo05/ 我们不用加上下文路径,直接 路径就行`
- ServeltA
- servletB
讯享网
总结
总之我们用相对路径要观察,路径拼接到上下文路径后面的问题,很麻烦
我们可以用绝对路径,除了请求转发路径直接 + 要转发到路径,其他的都是 。但不是最好。
缺省项目上下文路径

设置为 所有的绝对路径中就不必填写项目的上下文了。直接 / 开头即可。以后我们所有路径都 就行
MVC(Model View Controller)是软件工程中的一种,它把软件系统分为、和三个基本部分。用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。
- M:Model 模型层,具体功能如下
- 存放和数据库对象的实体类以及一些用于存储非数据库表完整相关的VO对象
- 存放一些对数据进行逻辑运算操作的的一些业务处理代码
- V:View 视图层,具体功能如下
- 存放一些视图文件相关的代码 html css js等
- 在前后端分离的项目中,后端已经没有视图文件,该层次已经衍化成独立的前端项目
- C:Controller 控制层,具体功能如下
- 接收客户端请求,获得请求数据
- 将准备好的数据响应给客户端
MVC模式下,项目中常见的包
- M:
- 实体类包(pojo /entity /bean) 专门存放和数据库对应的实体类和一些VO对象
- 数据库访问包(dao/mapper) 专门存放对数据库不同表格CURD方法封装的一些类
- 服务包(service) 专门存放对数据进行业务逻辑运算的一些类
- C:
- 控制层包(controller)
- V:
- web目录下的视图资源 html css js img 等
- 前端工程化后,在后端项目中已经不存在了
非前后端分离 MVC


前后端分离的 MVC



- :配置文件
- :工具类
- :测试类
- :数据库实体类 - Model 层
- :针对数据库表格的 CRUD - Model 层
- :逻辑都写在 service 里面 - Model 层
- :前后端交互 - Controller 层
Resources 配置文件
Util 工具类

- :从数据库连接池获取连接,用完归还连接
- :用来个密码加密
JDBCUtil
讯享网
MD5Util
Pojo 包

每张表对应一个类
SyscheduleDaoimp
讯享网
SysUserDaoimp类
Dao 包

每张表对应一个 CRUD 类。
- BaseDao 用于存放所有 CRUD 的操作
- 两张表用接口制定规范,然后在 Impl 中集成 BaseDao 具体实现。
BaseDao
讯享网
SyscheduleDao 接口和实现类
讯享网
SysUserDao 接口和实现类
讯享网
Controller 包

因为 两个 Sys 要多写一层路径来区分调用的逻辑,所以多了一个 BaseController 用来执行反射。两个 Sys 集成 BaseController。不用一个个都写反射
BaseController
SysScheduleController
讯享网
SysUserController
Servlce 包

SysUserService 接口和实体类
讯享网
SyscheduleService 接口和实体类
讯享网
前端
login
讯享网
loginUsernameError
loginUserPwdError.html
讯享网
regist
registFail
讯享网
registSuccess
showSchedule
讯享网
无状态:
- 无状态是指在一个通信系统(这里以 HTTP 协议为例)中,每个请求都是独立的,不依赖于之前的请求或响应。
- 就好比每次通信都是一次全新的对话,没有记忆之前交互内容的能力。
有状态
- 就是和无状态反过来,可以记录浏览器的历史信息
会话管理实现的手段
- 是在客户端保留少量数据的技术,主要通过响应头向客户端响应一些客户端要保留的信息
- 是在服务端保留更多数据的技术,主要通过对象保存一些和客户端相关的信息
Cookie 概念
是一种客户端会话技术, 由服务端产生,它是服务器存放在浏览器的一小份数据,浏览器以后每次访问该服务器的时候都会将这小份数据携带到服务器去。
步骤
- 服务端创建,将放入响应对象中,容器将转化为响应头,响应给客户端
- 客户端在收到的响应头时,在下次请求该服务的资源时,会以请求头的形式携带之前收到的Cookie
- 是一种键值对格式的数据,从开始可以保存中文,但是不推荐
- 由于是存储于客户端的数据,比较容易暴露,一般不存储一些敏感或者影响安全的数据
应用场景
- 记录用户名
- 当我们在用户名的输入框中输入完用户名后,浏览器记录用户名,下一次再访问登录页面时,用户名自动填充到用户名的输入框.
- 保存电影播放进度
- 在网页上播放电影的时候,如果中途退出浏览器了,下载再打开浏览器播放同一部电影的时候,会自动跳转到上次退出时候的进度,因为在播放的时候会将播放进度保存到中
Cookie 使用
存 Cookie
- 第一步:用 创造 cookie 对象
- 第二步:将 用 放进 中
获取 Cookie
- 第一步:用 取出请求中的
举例

讯享网

Cookie 的时效性
默认情况下Cookie的有效期是一次会话范围内,我们可以通过cookie的setMaxAge()方法让Cookie持久化保存到浏览器上
- 会话级Cookie
- 服务器端并没有明确指定Cookie的存在时间
- 在浏览器端,Cookie数据存在于内存中
- 只要浏览器还开着,Cookie数据就一直都在
- 浏览器关闭,内存中的Cookie数据就会被释放
- 持久化Cookie
- 服务器端明确设置了Cookie的存在时间
- 在浏览器端,Cookie数据会被保存到硬盘上
- Cookie在硬盘上存在的时间根据服务器端限定的时间来管控,不受浏览器关闭的影响
- 持久化Cookie到达了预设的时间会被释放
使用
参数单位是秒,表示cookie的持久化时间,如果设置参数为0,表示将浏览器中保存的该cookie删除
例子

讯享网

Cookie 的提交路径
访问互联网资源时不能每次都需要把所有带上。访问不同的资源时,可以携带不同的,我们可以通过的 对的路径进行设置
举例

向ServletB请求时携带携带了 c1

向其他资源请求时就不携带c1了

HTTPSession 概述
是一种保留更多信息在服务端的一种技术,服务器会为每一个客户端开辟一块内存空间,即session对象. 客户端在发送请求时,都可以使用自己的. 这样服务端就可以通过来记录某个客户端的状态了
步骤
- 服务端在为客户端创建时,会同时将对象的,即以的形式放入响应对象
- 后端创建完后,客户端会收到一个特殊的,叫做
- 客户端下一次请求时携带,后端收到后,根据找到对应的对象
- 通过该机制,服务端通过就可以存储一些专门针对某个客户端的信息了
- 也是域对象(后续详细讲解)
应用场景
- 记录用户的登录状态
- 用户登录后,将用户的账号等敏感信息存入session
- 记录用户操作的历史
- 例如记录用户的访问痕迹,用户的购物车信息等临时性的信息
HttpSession 的使用
- 获取 Session 对象:
- 获取 Session 的 ID:
- 判断session是不是新创建的session:
- 向session对象中存入数据:
举例
讯享网
响应中收到了一个JSESSIONID的cookie

请求中携带了一个JSESSIONID的cookie

GetSeesion 方法处理逻辑

HttpSession 时效性
- 为什么要设置session的时效
- 用户量很大之后,Session对象相应的也要创建很多。如果一味创建不释放,那么服务器端的内存迟早要被耗尽。
- 客户端关闭行为无法被服务端直接侦测,或者客户端较长时间不操作也经常出现,类似这些的情况,就需要对session的时限进行设置了
- 默认的session最大闲置时间(两次使用同一个session中的间隔时间) 在tomcat/conf/web.xml配置为30分钟
- 我们可以自己在当前项目的web.xml对最大闲置时间进行重新设定
- 也可以通过的API 对最大闲置时间进行设定
讯享网
- 也可以直接让session失效
概述
域对象: 一些用于存储数据和传递数据的对象,传递数据不同的范围,我们称之为不同的域,不同的域对象代表不同的域,共享数据的范围也不同
- web项目中,我们一定要熟练使用的域对象分别是 请求域,会话域,应用域
- 请求域对象是HttpServletRequest ,传递数据的范围是一次请求之内及请求转发
- 会话域对象是HttpSession,传递数据的范围是一次会话之内,可以跨多个请求
- 应用域对象是ServletContext,传递数据的范围是本应用之内,可以跨多个会话
生活举例: 热水器摆放位置不同,使用的范围就不同
- 摆在张三工位下,就只有张三一个人能用
- 摆在办公室的公共区,办公室内的所有人都可以用
- 摆在楼层的走廊区,该楼层的所有人都可以用
域对象图解
- 请求域
- 会话域
- 应用域
- 所有域
域对象使用
例子
讯享网
注意
- 请求转发时,请求域可以传递数据
- 同一个会话内,不用请求转发,会话域可以传递数据
- 同一个APP内,不同的客户端,应用域可以传递数据
Filter, 即过滤器,是JAVAEE技术规范之一, 作用目标资源的请求进行过滤的一套技术规范,是Java Web项目中最为实用的技术之一
- Filter接口定义了过滤器的开发规范,所有的过滤器都要实现该接口
- Filter 的 方法可以控制请求是否继续, 如果放行, 则请求继续,如果拒绝,则请求到此为止,由过滤器本身做出响应
- Filter 不仅可以对请求做出过滤,也可以在目标资源做出响应前,对响应再次进行处理
- Filter 是GOF中责任链模式的典型案例
图示
开发中应用的场景
- 日志的记录
- 性能的分析
- 乱码的处理
- 事务的控制
- 登录的控制
- 跨域的处理
- … …
- 先通过 注解 或者 xml 方式配置过滤器
- 实现 filter 重写 dofilter
- 写过滤条件
讯享网
说明
说明
- 方法中的请求和响应对象是以父接口的形式声明的,实际传入的实参就是和子接口级别的,可以安全强转
- ; 这行代码的功能是放行请求,如果没有这一行代码,则请求到此为止
- ;在放行时需要传入和,意味着请求和响应对象要继续传递给后续的资源,这里没有产生新的request和response对象
配置过滤器有以及过滤器的过滤范围
说明
- filter-mapping标签中定义了过滤器对那些资源进行过滤
- 子标签通过映射路径确定过滤范围
- 精确匹配,表示对servletA资源的请求进行过滤
- 表示对以结尾的路径进行过滤
- 表示对所有资源进行过滤
- 一个下可以配置多个
- 子标签通过servlet别名确定对那些进行过滤
- 使用该标签确定目标资源的前提是已经起了别名
- 一个下可以定义多个
- 一个下,和子标签可以同时存在
一个web项目中,可以同时定义多个过滤器,多个过滤器对同一个资源进行过滤时,工作位置有先后,整体形成一个工作链,称之为过滤器链
- 过滤器链中的过滤器的顺序由 顺序决定
- 每个过滤器过滤的范围不同,针对同一个资源来说,过滤器链中的过滤器个数可能是不同的
- 如果某个Filter是使用 进行匹配规则的配置,那么这个Filter 执行的优先级要更低
图示

过滤器作为web项目的组件之一,和Servlet的生命周期类似,略有不同,没有 的 的配置,默认就是系统启动立刻构造
举例
讯享网
- 和 使用和 配置 servlet 一样
一个比较完整的 Filter 的 XML 配置
讯享网
注解方式
监听器:专门用于对域对象对象身上发生的事件或状态改变进行监听和相应处理的对象
- 监听器是GOF设计模式中,观察者模式的典型案例
- 观察者模式: 当被观察的对象发生某些改变时, 观察者自动采取对应的行动的一种设计模式
- 监听器使用的感受类似JS中的事件,被观察的对象发生某些情况时,自动触发代码的执行
- 监听器并不监听web项目中的所有组件,仅仅是对三大域对象做相关的事件监听
监听器分类
web中定义八个监听器接口作为监听器的规范,这八个接口按照不同的标准可以形成不同的分类
按监听的对象划分
- application域监听器 ,
- session域监听器 , , ,
- request域监听器 ,
按监听的事件分
- 域对象的创建和销毁监听器 , ,
- 域对象数据增删改事件监听器 , ,
- 其他监听器 ,
application 域监听器
ServetContextListener
监听 对象的创建与销毁
注意
对象代表从 对象身上捕获到的事件,通过这个事件对象我们可以用 获取到 对象.
ServletContextAttributeListener
监听 中属性的添加、移除和修改
注意
对象代表属性变化事件,它包含的方法如下:
方法名作用获取修改或添加的属性名获取被修改或添加前的属性值获取 对象
举例
- 定义监听器
讯享网
- 定义触发监听器的代码
Session 域监听器
HttpSessionListener
HttpSessionListener 监听HttpSession对象的创建与销毁
注意
对象代表从对象身上捕获到的事件,通过这个事件对象我们可以通过 获取到触发事件的 对象。
HttpSessionBindingEvent
代表属性变化事件,
举例
- 定义监听器
讯享网
- 定义触发监听器的代码
request 域监听器
ServletRequestListener
监听 对象的创建与销毁
注意
对象代表从 对象身上捕获到的事件,通过这个事件对象我们可以通过 获取到触发事件的 对象。另外还可以通过 获取到当前Web应用的 对象。
ServletRequestAttributeListener
监听 中属性的添加、移除和修改
注意
对象代表属性变化事件,它包含的方法如下:
方法名作用获取修改或添加的属性名获取被修改或添加的属性值获取触发事件的 对象
举例
- 定义监听器
讯享网
- 定义触发监听器的代码
Session 绑定监听器
HttpSessionBindingListener
监听当前监听器对象在Session域中的增加与移除。【就是这个对象放到 Session 里或从 Session 移除】
注意
对象代表属性变化事件,它包含的方法如下:
方法名作用获取当前事件涉及的属性名获取当前事件涉及的属性值获取触发事件的 对象
举例
- 定义监听器
讯享网
- 定义触发监听器的代码
钝化监听器和活化监听器
HttpSessionActivationListener
监听某个对象在Session中的序列化与反序列化。
注意
对象代表事件对象,通过方法获取事件涉及的 对象。
钝化和活化
- session对象在服务端是以对象的形式存储于内存的,session过多,服务器的内存也是吃不消的
- 而且一旦服务器发生重启,所有的session对象都将被清除,也就意味着session中存储的不同客户端的登录状态丢失
- 为了分摊内存 压力并且为了保证session重启不丢失,我们可以设置将session进行钝化处理
- 在关闭服务器前或者到达了设定时间时,对session进行序列化到磁盘,这种情况叫做session的钝化
- 在服务器启动后或者再次获取某个session时,将磁盘上的session进行反序列化到内存,这种情况叫做session的活化
如何配置钝化
- 在web目录下,添加 META-INF下创建Context.xml
- 文件中配置钝化
讯享网
- 请求servletA,获得session,并存入数据,然后重启服务器
- 请求servletB获取session,获取重启前存入的数据
讯享网
如何配置活化
- 定义监听器
- 定义触发监听器的代码
讯享网







































































版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/192704.html