1. 前置学习知识
2. Tomcat介绍
前端App的运行环境:
服务器 --> JRE --> Tomcat --> App
Tomcat目录文件介绍
- bin:该目录下存放的是二进制可执行文件,如果是安装版,那么这个目录下会有两个exe文件:tomcat10.exe、tomcat10w,exe,前者是在控制台下启动Tomcat,后者是弹出GU川窗口启动Tomcat;,如果是解压版,那么会有startup.bat和shutdown.bat文件,startup.bat用来启动Tomcat,但需要先配置JAVA_HOME环境变量才能启动,shutdawn.bat用来停止Tomcat;
- conf : 配置文件
- lib : jar包
- logs : 日志文件,可删除
- temp :临时文件,可删除
- webapps : 存放web项目
- WEB-INF文件夹(不可以直接访问的资源文件)
- classes目录(字节码根路径)
- lib目录(外部资源文件)
- web.xml
- static
- WEB-INF文件夹(不可以直接访问的资源文件)
- work : jsp相关,现在不常用了
标准的可以部署在Tomcat中的app如上图中webapps的文件目录结构所示
URL的组成部分和项目资源的对应关系
http://127.0.0.1:8080/app/idnex.html
URL组成部分 | 项目中资源 |
---|---|
协议(http://) | |
ip地址(127.0.0.1) | 服务器-硬件 --> 操作系统 |
端口号(8080) | 服务器-服务软件 --> webapps |
项目的上下文路径(/app) | app |
具体资源路径(index.html) | 具体资源路径 |
idea配置部署tomcat并成功运行一个app-web项目
详情见连接
3. HTTP协议介绍(很重要)
HTTP协议和HTTPS的区别
在HTTP1.1到HTTP2.0之间出现了 HTTPS(安全超文本传输协议)。它是使用 SSL/TLS 进行安全加密通信的 HTTP 的安全版本。
HTTP协议的发展
-
最初阶的http协议:HTTP/0.9,只能返回一个网页
-
后续发展:HTTP/1.0,支持三种请求方式,有状态码、包含报文头、能够传输HTML以外的文件
-
HTTP/1.1:支持七种请求,另外有以下三个特性:
- 虚拟主机允许从单个 IP 地址提供多个域。
- 持久连接 和流水线连接允许 Web 浏览器通过单个持久连接发送多个请求。
- 缓存支持节省了带宽并使响应速度更快。
-
HTTP2和HTTP3,已经发布了,但是整体的使用并不突出
理解HTTP协议
- 客户端和服务端交互的方式
请求-响应模式
请求:永远是
客户端向服务端发送
响应:永远是
服务端向客户端发送
- 客户端和服务端交互数据的格式
报文(请求报文):请求时发送的数据
响应(响应报文):响应时返回的数据
报文的格式:
报文首部:行信息 + 头信息
报文主体
- HTTP的长链接和短链接问题
前置知识
网络信息传递过程:
TCP协议下的数据通信(三次握手和四次分手):
长链接和短链接分解:
html中存在<link>``<script>
之类的标签
客户端需要通过这些标签中的地址重新向Tomcat抓取路径,所以需要重新经历三次握手和四次分手的过程。
报文格式
见资料
常见的请求头:
http
-主机虚拟地址
Host: localhost:8080
-长连接
Connection: keep-alive
-请求协议的自动升级[http的请求,服务器却是https的,浏览器自动会将请求协议升级为https的]
Upgrade-Insecure-Requests: 1
- 用户系统信息
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.75 Safari/537.36
- 浏览器支持的文件类型
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
- 当前页面的上一个页面的路径[当前页面通过哪个页面跳转过来的]: 可以通过此路径跳转回上一个页面, 广告计费,防止盗链
Referer: http://localhost:8080/05_web_tomcat/login.html
- 浏览器支持的压缩格式
Accept-Encoding: gzip, deflate, br
- 浏览器支持的语言
Accept-Language: zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7
注意:
-
如果是发送加密的信息最好是使用POST请求发送数据
-
如果是发送非加密数据且不携带信息,最好是使用GET请求
常见的相应体:
http
Server: Apache-Coyote/1.1 服务器的版本信息
Accept-Ranges: bytes
ETag: W/"157-1534126125811"
Last-Modified: Mon, 13 Aug 2018 02:08:45 GMT
Content-Type: text/html 响应体数据的类型[浏览器根据类型解析响应体数据]
Content-Length: 157 响应体内容的字节数
Date: Mon, 13 Aug 2018 02:47:57 GMT 响应的时间,这可能会有8小时的时区差
报文响应的状态码
状态码 | 状态码英文描述 | 中文含义 |
---|---|---|
1** | ||
100 | Continue | 继续。客户端应继续其请求 |
101 | Switching Protocols | 切换协议。服务器根据客户端的请求切换协议。只能切换到更高级的协议,例如,切换到HTTP的新版本协议 |
2** | ||
200 | OK | 请求成功。一般用于GET与POST请求 |
201 | Created | 已创建。成功请求并创建了新的资源 |
202 | Accepted | 已接受。已经接受请求,但未处理完成 |
203 | Non-Authoritative Information | 非授权信息。请求成功。但返回的meta信息不在原始的服务器,而是一个副本 |
204 | No Content | 无内容。服务器成功处理,但未返回内容。在未更新网页的情况下,可确保浏览器继续显示当前文档 |
205 | Reset Content | 重置内容。服务器处理成功,用户终端(例如:浏览器)应重置文档视图。可通过此返回码清除浏览器的表单域 |
206 | Partial Content | 部分内容。服务器成功处理了部分GET请求 |
3** | ||
300 | Multiple Choices | 多种选择。请求的资源可包括多个位置,相应可返回一个资源特征与地址的列表用于用户终端(例如:浏览器)选择 |
301 | Moved Permanently | 永久移动。请求的资源已被永久的移动到新URI,返回信息会包括新的URI,浏览器会自动定向到新URI。今后任何新的请求都应使用新的URI代替 |
302 | Found | 临时移动。与301类似。但资源只是临时被移动。客户端应继续使用原有URI |
303 | See Other | 查看其它地址。与301类似。使用GET和POST请求查看 |
304 | Not Modified | 未修改。所请求的资源未修改,服务器返回此状态码时,不会返回任何资源。客户端通常会缓存访问过的资源,通过提供一个头信息指出客户端希望只返回在指定日期之后修改的资源 |
305 | Use Proxy | 使用代理。所请求的资源必须通过代理访问 |
306 | Unused | 已经被废弃的HTTP状态码 |
307 | Temporary Redirect | 临时重定向。与302类似。使用GET请求重定向 |
4** | ||
400 | Bad Request | 客户端请求的语法错误,服务器无法理解 |
401 | Unauthorized | 请求要求用户的身份认证 |
402 | Payment Required | 保留,将来使用 |
403 | Forbidden | 服务器理解请求客户端的请求,但是拒绝执行此请求 |
404 | Not Found | 服务器无法根据客户端的请求找到资源(网页)。通过此代码,网站设计人员可设置"您所请求的资源无法找到"的个性页面 |
405 | Method Not Allowed | 客户端请求中的方法被禁止 |
406 | Not Acceptable | 服务器无法根据客户端请求的内容特性完成请求 |
407 | Proxy Authentication Required | 请求要求代理的身份认证,与401类似,但请求者应当使用代理进行授权 |
408 | Request Time-out | 服务器等待客户端发送的请求时间过长,超时 |
409 | Conflict | 服务器完成客户端的 PUT 请求时可能返回此代码,服务器处理请求时发生了冲突 |
410 | Gone | 客户端请求的资源已经不存在。410不同于404,如果资源以前有现在被永久删除了可使用410代码,网站设计人员可通过301代码指定资源的新位置 |
411 | Length Required | 服务器无法处理客户端发送的不带Content-Length的请求信息 |
412 | Precondition Failed | 客户端请求信息的先决条件错误 |
413 | Request Entity Too Large | 由于请求的实体过大,服务器无法处理,因此拒绝请求。为防止客户端的连续请求,服务器可能会关闭连接。如果只是服务器暂时无法处理,则会包含一个Retry-After的响应信息 |
414 | Request-URI Too Large | 请求的URI过长(URI通常为网址),服务器无法处理 |
415 | Unsupported Media Type | 服务器无法处理请求附带的媒体格式 |
416 | Requested range not satisfiable | 客户端请求的范围无效 |
417 | Expectation Failed | 服务器无法满足Expect的请求头信息 |
5** | ||
500 | Internal Server Error | 服务器内部错误,无法完成请求 |
501 | Not Implemented | 服务器不支持请求的功能,无法完成请求 |
502 | Bad Gateway | 作为网关或者代理工作的服务器尝试执行请求时,从远程服务器接收到了一个无效的响应 |
503 | Service Unavailable | 由于超载或系统维护,服务器暂时的无法处理客户端的请求。延时的长度可包含在服务器的Retry-After头信息中 |
504 | Gateway Time-out | 充当网关或代理的服务器,未及时从远端服务器获取请求 |
505 | HTTP Version not supported | 服务器不支持请求的HTTP协议的版本,无法完成处理 |
4. Servlet简介
动态资源和静态资源
静态资源:在代码运行之前已经写好的资源文件
动态资源:在代码运行过程中动态生成的资源文件
注意:动态资源的过程需要java代码生成需要响应的数据并且转换为响应的报文(参数如果不一样,响应的请求也不一样)
Tomcat接收到请求后的处理过程
- tomcat接收到请求后,会将请求报文信息转换为一个
HttpServletRequest
对象- 包含了请求中的所有信息 --> 请求头、请求行、请求体
- tomcat同时创建一个
HttpServletResponse
对象,该对象用于盛装要响应给客户端的信息,并且之后会被转换成响应的报文- 包含了响应中的所有信息 --> 响应行、响应头、响应体
- 创建自己的
Servlet类
并且要使其实现Servlet接口
- 重写抽象方法:service(HttpServletRequest request,HttpServletResponse,response)
- 从request参数中获取所有请求信息
- 生成响应给客户端的数据
- 将响应数据传入response参数
- 重写抽象方法:service(HttpServletRequest request,HttpServletResponse,response)
- tomcat根据请求中的资源路径找到对应的servlet,将servlet实例化,调用servlet()方法,同时将HttpServletRequest对象和HttpServletResponse对象传入
Tomcat对数据进行验证
略
Servlet API jar包导入问题
具体见Tomcat导入过程
Content-Type问题
java
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
public class UserServlet extends HttpServlet {
resp.setContentType("text/html");// 设置Content-Type类型
}
url-parttern特别说明
一个
servlet-name
可以映射多个url-parttern
;但是每一个url-parttern
只能对应一个servlet-name
在xml标签中表示为:一个
servlet-mapping
标签可以拥有多个url-pattern
标签
url-parttern的精确匹配和模糊匹配
- 精确匹配
一般使用/
作为通配符
- 模糊匹配
一般使用*
作为通配符
xml文件映射路径 vs 注解映射路径
xml
<servlet>
<servlet-name>servlet1</servlet-name>
<servlet-class>com.itchen.servlet.Servlet1</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>servlet1</servlet-name>
<url-pattern>/servlet1</url-pattern>
<url-pattern>/s1</url-pattern>
</servlet-mapping>
java
@WebServlet("/s2")
通用类
java
public class Servlet1 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("servlet执行了");
}
}
Servlet的生命周期(了解)
生命周期 | 对应方法 | 执行时机 | 执行次数 |
---|---|---|---|
构造对象 | 构造器 | 第一次请求或者容器启动 | 1 |
初始化 | init() | 构造完毕后 | 1 |
处理服务 | service(HttpServletRequest req,HttpServletResponse resp) | 每次请求 | 多次 |
销毁 | destory() | 容器关闭 | 1 |
Servlet接口的继承结构(了解)
Servlet接口中存在的一些方法:
- void init(ServletConfig var1)
- ServletConfig getServletConfig();
- void service(ServletRequest var1, ServletResponse var2)
- String getServletInfo();
- void destroy();
GenericServlet类:实现一些基本的Tomcat配置
HttpServlet类:1. 主要的Service方法,方便调用子类的API(相较于父类的API更丰富)
2. 重载的Service方法,获取请求的方式;根据请求方式调用响应的方法(请求的分发 状态码:405 )。
自己的Servlet类:重新实现Service方法 或者 重写doGet()方法和doPost()方法
1. 接收用户的请求信息
2. 做出响应( 状态码:200 )
ServletConfig对象(了解)
作用:为某一个Servlet提供独立的配置参数;表现形式为:获取init-param参数。(可以有多个)
方式:xml配置文件和注解两种方式
ServletContext对象(掌握)
作用:为所有Servlet提供信息(唯一)
java
// 示例
ServletContext servletContext = getServletContext();
// 获取不同电脑的文件路径
String path = servletContext.getRealPath("upload");
System.out.println(path);
// 获取项目的上下文路径
String contextPath = servletContext.getContextPath();
System.out.println(contextPath);
通过ServletContext对象进行数据的交互(Service方法中)
java
// 发送数据
ServletContext servletContext = getServletContext();
servletContext.setAttribute("ka","va");
//servletContext.removeAttribute("ka")
// 接收数据
ServletContext servletContext1 = getServletContext();
String ka = (String)servletContext1.getAttribute("ka");
System.out.println(ka);
HttpServletRequest对象
各种API见阿里网盘-备份盘-大学经历-java Web文档
通过URI和URL了解 ip锁定 和 代理服务器
HttpServletResponse对象
各种API见阿里网盘-备份盘-大学经历-java Web文档
请求转发
通过HttpServletRequest对象
实现,服务端内部将请求发送给另一个处理类
请求转发特点(基础,重要)
- 请求转发通过HttpServletRequest对象获取请求转发器实现
- 请求转发是服务器内部的行为,对客户端是屏蔽的
- 客户端只发送了一次请求,客户端地址栏不变
- 服务端只产生了一对请求和响应对象,这一对请求和响应对象会继续传递给下一个资源
- 因为全程只有一个HttpServletRequset对象,所以请求参数可以传递,请求域中的数据也可以传递
- 请求转发可以转发给其他Servlet动态资源,也可以转发给一些静态资源以实现页面跳转
- 请求转发可以转发给WEB-INF下受保护的资源
- 请求转发不能转发到本项目以外的外部资源
响应重定向
通过HttpServletResponse对象
实现,服务端先返回一个响应,让客户端再发送一个请求,然后服务端的处理类再处理之后发送的请求,并返回响应。
乱码和路径问题
产生原因:
- 数据的编码和解码不属于一个字符集
- 使用了不支持某种语言的字符集
乱码问题1
对于使用Tomcat中参数获取的时候的因为编码的字符集和解码的字符集有差异,所以会导致Tomcat乱码问题
解决:
- get请求:在Tomcat
配置中
对解码字符集进行修改 - post请求:在
源码
调用参数前对请求体内的参数的编码方式进行修改
乱码问题2
在页面显示的时候,前端的编码方式不一定和后端的相同。
解决:
- 在响应头中设置编码方式(甩锅给前端)
java
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html;charset=UTF-8");
}
请求转发时的编码问题
受保护的资源需要通过请求转发来获取,但是请求转发时不会改变资源的访问路径。这造成了资源的字节码文件路径和在编码中的磁盘结构路径不一致,最终导致了资源访问失败。
重定向中的路径问题
和上面文档中的一致
请求转发时的路径问题
相对路径和上面文档一致,
绝对路径不需要再添加项目的上下文
绝对路径通解:将项目的上下文环境设置为/
出现hamcrest错误是因为Test测试的问题,老版本mysql记得在连接url上加上设置
5. 会话管理
客户端和服务端之间的多次请求和响应
会话管理是服务器端通过客户端的状态来对客户端进行管理和记录
技术手段:通过cookie和session配合记录请求状态
cookie的使用
cookie是一个键值型的对象,它在服务器产生,随着响应传会浏览器,如果浏览器对软件中的地址再次访问,cookie将在每次请求中携带。除非浏览器关闭过后再次使用,这个cookie才会消失。
cookie的分类
会话级cookie 直到浏览器关闭结束
持久化cookie 自定义最大时效时间
Session的使用先获取session对象
HttpSession session = req.getSession();
向Session中存入数据
session.setAttribute("username",username);
注意: Session被用于存储在浏览器中,如果打开另一个客户端,将不会存储原客户端中的Session
客户端每次申请Session对象,服务器都会产生并发送给服务器端
Session每次请求的时效性只有30分钟,可以在web-config中修改
三大域对象
-
web项目中,我们一定要熟练使用的域对象分别是请求域,会话域,应用域
-
请求域对象是HttpServletRequest,传递数据的范围是一次请求之内及请求转发
-
会话域对象是HttpSession,传递数据的范围是一次会话之内,可以跨多个请求
-
应用域对象是ServletContext,传递数据的范围是本应用之内,可以跨多个会话
API 功能 void setAttribute(String name,String value)
向域对象中添加、修改数据 Object getAttribute(String name)
从域对象中获取数据 removeAttribute(String name)
移除域对象中的数据
三大域对象 | 一般存放数据 |
---|---|
请求域 | 本次业务有关数据 |
会话域 | 本次会话客户端有关数据 |
应用域 | 本程序有关数据,eg.Spring框架的IOC容器 |
6. 过滤器
过滤器是作用目标资源请求的技术规范。javaEE技术规范,javaWeb项目中最最使用的技术之一。
应用场景:登录......
对于一个请求过滤器不止能有一个,多个过滤器会形成过滤器链
生命周期
- 构造(X)
- 初始化
- 过滤
- 销毁
注意:filter和servlet不同点在于:filter不能由java控制构造和初始化;而servlet可以
过滤器链
在web.xml中配置filter-mapping的顺序决定了过滤器的工作顺序
使用注解的形式取代xml配置文件
java
@WebFilter(
filterName = "loggingFilters",
initParams = {@WebInitParam(name="dateTimePattern",value="yyyy-MM-dd HH:mm:ss")},
urlPatterns = {"/servletA","*.html"},
servletNames = {"servletBName"}
)
7.监听器
在域对象中发生一些事件的时候自动触发一些代码的执行
ServletContextListener
监听器在spring
和springMVC
中使用最多
监听对象 | 作用域的相应类或接口 |
---|---|
域对象本身变化 | ServletContextListener |
域对象中数据的变化 | ServletContextAttributeListener |
监听Session域的变化 | HttpSessionListener |