OSI模型
在计算机网络中,存在不同厂商、不同结构的网络产品。这些网络产品在进行互联时会遇到不兼容的问题。
国际标准化组织ISO 提出了 OSI(Open System Interconnection)开放系统互联的参考模型,为异构系统互联提供了概念性的框架。
OSI 网络模型 ,将网络分为七个层:应用层、表示层、会话层、传输层、网络层、数据链路层、物理层。
TCP/IP 协议对 OSI网络模型中的一些层进行了合并,将应用层、表示层、会话层,合并为应用层。传输层不变。网络层变成了网络互联层,数据链路层和物理层合并为网络接口层。
端口,就是应用程序用于数据交互的通道,用于实现程序间的通信。每个应用程序都有固定的端口。
注意 :两个应用程序如果使用同一个端口,那么会抛出端口异常冲突java.net.BindException。
常见端口:
tel 协议 --- 23
smtp 协议 --- 25
ftp 协议 --- 21
http 协议 --- 80
数据传输由 TCP/IP 分层模型中的传输层负责,该层包含 TCP 和 UDP 两种协议。
TCP 协议是一种比较可靠的传输协议,提供三次握手机制。信息在传输过程中,有遗失,有损耗,会要求发送方重新发送,从而保证信息的完整性。
UDP 协议是一种不可靠的传输协议,信息在传输过程中,有遗失,有损耗,不会要求发送方重新发送。特点是速度快。
html
超文本标记语言。超文本的意思是在html中不仅仅包含文本数据,而且可以通过一系列标记,链接各式各样的资源(图片、音频、视频、css、js等)。客户端在显示html网页,不仅仅需要下载文本数据,还需要发出一系列请求,将该网页链接资源一一下载。
http协议
HTTP 协议称为超文本传输协议,是客户端与服务器通信的一种标准。客户端和服务器都遵循HTTP 协议,就能从彼此发送的信息中提取自己想要的数据。
http协议的特点:
1、http协议遵循的是请求/响应模型
2、http协议是一种无状态的协议
当请求/响应完成以后,客户端和服务器的连接会断开。所以,服务器无法知道两次请求的用户是否为同一个用户。
3、http协议占用 80 端口
http协议的工作流程:
1、客户端和服务器建立连接
2、客户端发送 http 请求
3、服务器产生 http 响应
4、关闭连接
http协议的请求信息
http协议的请求信息分为:请求行、请求头、空行、消息体。
请求行:描述请求方式,请求URL路径、http协议版本
请求头:以键值对方式描述客户端相关的信息
空行:标识请求头的结束
消息体:(POST)描述客户端请求的表单数据
http协议请求方式有8种:
GET、POST、HEAD、OPTIONS、PUT、DELETE、TRACE、CONNECT
其中 GET、POST 是最常用的两种。
GET请求:1、浏览器输入URL路径为GET请求
2、用户点击超链接为GET请求
3、用户提交表单,默认为GET请求,method属性为GET时,也就是GET请求
POST请求:<form method="post" action="/land">
GET和POST的区别
1、流格式的区别
GET请求,只有请求行,请求头,空行。会将表单数据附加在URL后面。
POST请求,有请求行、请求头、空行、消息体。在消息体中附加表单数据。
2、传输性能的区别
GET 请求,不能传输大数据,只能传输小文本数据。
POST 请求,可以传输大数据,同时可以传输文本数据,以及二进制数据。数据的传输相对安全。
3、用户的区别
GET 请求用于服务器的资源查找。POST请求用于数据的传输。
http协议的响应信息
http协议的响应信息分为四个部分:状态行、响应头、空行、消息体。
状态行:描述http协议的版本、状态码、响应描述。
响应头:以键值对方式描述服务器相关的信息。
空行:标识响应头的结束。
消息体:服务器发送给客户端的具体数据。
http协议的状态码有五种
100 - 199 表示客户端请求服务器在进行中。
200 - 299 表示客户端请求成功
300 - 399 表示资源移走,请求新的地址
400 - 499 表示客户端引发的错误
500 - 599 表示服务器端引发的错误
MIME 类型
MIME 类型用于服务器端发送数据给客户端时,告诉客户端浏览器以什么格式来解析响应信息体内容。
常见的 MIME 类型:
text/html:html网页数据
image/jpeg:JPG 图片数据
application/json:json 格式数据
text/xml:xml格式数据
传统 的web服务器的缺陷
传统的web服务器在接收到客户端请求后,只能将静态的html信息发送给客户端,极大的影响了响应信息的灵活性。
解决方案是,在传统的web服务器接受到客户端请求后,交由辅助应用进行处理。辅助应用可以利用数据库作为存储介质,将请求信息进行处理后,动态的产生响应信息。
java 利用 web 容器 + Servlet 方式作为辅助应用解决方案的。
WEB容器
在java中, web容器完成底层操作。预留 Servlet 接口,交给开发者书写业务操作。WEB 容器调用 servlet 业务方法,动态产生响应信息。
WEB容器的作用
1、通讯支持
WEB 容器,需要将请求信息和响应信息封装成请求对象和响应对象,以便更好的接受和发送数据。
2、Servlet生命周期管理
Servlet是web容器预留给开发者的接口。开发者实现了 Servlet 接口后,可以书写相关的业务处理操作。Servlet实现类对象的产生、销毁、方法调用,全部由 web 容器管理。
3、线程支持
由于服务器需要接受多个客户端的同时访问,那么web容器采用多线程来进行多任务处理。线程的创建、运行、启动、同步等,都由web容器管理。
4、JSP 支持
主要由 web 容器编写 jsp 引擎对 jsp 页面进行翻译。
5、处理安全性
tomcat
tomcat 源自于 apache 软件基金会 jakkarta 项目。tomcat 是一款免费的、开源的、性能稳定、技术成熟的WEB容器产品
在maven 工程中,导入tomcat
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-core</artifactId>
<version>9.0.36</version>
</dependency>
Servlet 的API 结构
在Servlet 规范中,Servlet 是业务接口,预留 service 方法,交给开发者书写业务操作。ServletConfig为配置接口。GenericServlet 同时实现了Servlet、ServletConfig 两个接口,并重写了大部分方法,但是没有实现service()。该方法应该由GenericServlet 的子类,根据协议的特点分别实现。HttpServlet 继承了 GenericServlet,根据Http 协议的特点,重写了service(),根据不同的请求方式调用doXX();
创建Servlet
public class TestServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req,
HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req,
HttpServletResponse resp) throws ServletException, IOException {
//设置请求信息编码集,只对POST有效
req.setCharacterEncoding("utf-8");
//设置响应信息的MIME类型和编码集
resp.setContentType("text/html;charset=utf-8");
//根据表单名,得到表单值
String userName = req.getParameter("userName");
//向客户端输出文本信息
resp.getWriter().print("hello." + userName);
}
创建并启动tomcat,并注册Servlet
public class Main {
public Main(){
Tomcat tomcat = new Tomcat();
//设置tomcat端口
tomcat.setPort(8088);
//引导http引擎
tomcat.getConnector();
//定义上下文
Context context = tomcat.addContext("",null);
//注册servlet,第一个参数为上下文对象,
// 第二个参数为servlet的名称,
// 第三个参数为servlet实现类对象
Wrapper wp = Tomcat.addServlet(context,"test",new TestServlet());
//容器一启动就初始化
wp.setLoadOnStartup(1);
//配置servlet的访问路径
wp.addMapping("/abc");
try {
//启动tomcat
tomcat.start();
} catch (LifecycleException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
new Main();
}
}
servlet 映射路径有三种:
精确映射:/add 表示客户端以/add路径请求,就能找到对应的servlet
扩展映射:*.do 表示客户端以.do结尾的请求都能找到servlet
路径映射:/abc/* 表示客户端以/abc/路径的请求,都能找到对应的servlet
得到表单数据
//根据表单名,得到表单值
String value = req.getParameter(“表单名”)
//得到多个同名键值对的值,返回数组
String[ ] value = req.getParameterValues(“表单名”)
//得到表单数据中的表单名枚举
Enumeration<String> em = req.getParameterNames();
Servlet 的生命周期
1、容器加载并实例化 Servlet;
2、调用init(),完成初始化。loadOnStartup为0或者正数,表示容器一启动就初始化。如果为负数或不写,表示第一次访问容器再做初始化。
3、当请求到达,调用service()方法,处理请求,产生响应
4、销毁阶段,调用destoy()完成清理。
在整个生命周期中,1、2、4都只做一次。只有3步,才是每次请求都会执行。而servlet对象也是单实例多线程的对象。
web容器向客户端发送数据
有两种方式
1、向客户端发送文本数据
response.getWriter().print("hello");
2、向客户端发送二进制数据
OutputStream out = response.getOutputStream();