互联网通信
系统架构
C/S结构
优点:大量的数据都是集成在客户端软件当中,服务器只需要传送少量数据,速度快、服务器压力小、安全(数据在客户端)。
缺点:升级一次,每一个客户端都需要升级
B/S架构
优点:升级维护方便,成本比较低。只需要升级服务器端即可。不需要安装特定的客户端软件,只需要打开浏览器,输入网址即可。
缺点:速度慢,因为所有的数据都是在服务器上,用户发送的每一个请求都是需要服务器返回大量数据。数据都在服务器上,不安全。
B/S结构的系统通信原理
域名
在浏览器地址栏上输入域名,回车之后,域名解析器(DNS)会将域名解析,返回一个具体的IP地址和端口号。
IP地址:IP地址是主机的标识,通过IP来定位主机
端口号:一个端口号代表一个进程,通过端口号定位程序
如上图:百度服务器的主机IP是:14.215.177.38,可以通过该ip和http协议的80端口号访问该主机,请求主机上的资源。
一个WEB系统的通信原理
- 输入网址
- 域名解析,定位主机和服务程序
- 建立TCP连接
- 发起请求,请求服务下的资源
- Web服务器Nginx反向代理
- servlet处理请求并响应回结果
- 关闭TCP连接
- 将结果渲染到浏览器页面上
servlet
模拟Servlet本质
角色:sun公司、webapp开发者、tomcat服务器开发者
sun公司:制定servlet规范 javax.servlet.Servlet
webapp开发者:编写Java类实现Servlet接口,提供服务
package javax.servlet;
/**
* @author : [Alex2ice]
* @version : [v1.0]
* @className : [Servlet]
* @description : [TODO 模拟SUN公司制定Servlet接口/规范]
* @createTime : [2022/10/11 22:49]
*/
public interface Servlet {
//一个专门提供服务的方法
public void service();
}
package com.library.servlet;
import javax.servlet.Servlet;
/**
* @author : [Alex2ice]
* @version : [v1.0]
* @className : [UserListServlet]
* @description : [TODO 模拟WebApp开发人员实现Servlet]
* @createTime : [2022/10/11 22:54]
*/
public class UserListServlet implements Servlet {
@Override
public void service() {
System.out.println("UserListServlet service...");
}
}
public class UserLoginServlet implements Servlet {
@Override
public void service() {
System.out.println("UserLoginServlet service...");
}
}
package org.apache;
import javax.servlet.Servlet;
import java.io.FileReader;
import java.util.Properties;
import java.util.ResourceBundle;
import java.util.Scanner;
/**
* @author : [Alex2ice]
* @version : [v1.0]
* @className : [Tomcat]
* @description : [TODO 模拟Tomcat服务器开发者]
* @createTime : [2022/10/11 22:58]
*/
public class Tomcat {
public static void main(String[] args) throws Exception{
System.out.println("Tomcat服务器启动成功,开始接收用户的访问。");
/*
* 需求:
* TODO 简单的使用Scanner来模拟一下用户的请求
用户访问服务器是通过浏览器上的“请求路径”
也就是说用户请求路径不同,后台执行的Servlet不同。
也就是说,servlet实现类和路径之间有一定的映射关系,
通过这种关系,tomcat服务器可以根据路径确定new的Servlet实现类
我们会将这种映射关系直接写在properties文件中
*/
System.out.print("请输入您的访问路径:");
Scanner s = new Scanner(System.in);
// 用户的请求路径
String key = s.nextLine(); // Tomcat服务器已经获取到了用户的请求路径了。
// Tomcat服务器应该通过用户的请求路径找对应的XXXServlet
// 请求路径和XXXServlet之间的关系应该由谁指定呢?
// 对于Tomcat服务器来说需要解析配置文件
// 我们在模拟的过程中只需要解析properties文件就可以获取映射关系
// 解析映射文件
ResourceBundle bundle = ResourceBundle.getBundle("web");
String className = bundle.getString(key);
// FileReader reader = new FileReader("web.properties");
// Properties pro = new Properties();
// pro.load(reader);
// reader.close();
// 通过key获取value
// String className = pro.getProperty(key);
// 通过反射机制创建对象
Class clazz = Class.forName(className);
Object obj = clazz.newInstance();
// Tomcat服务器开发人员不知道obj的类型。
// 但是Tomcat服务器的开发人员知道,XXXXServlet类一定实现了Servlet接
Servlet servlet = (Servlet)obj;
servlet.service();
}
}
web.properties配置文件
/userList=com.library.servlet.UserListServlet
/userLogin=com.library.servlet.UserLoginServlet
Tomcat对于配置文件的路径和名称都有相关规定。
servlet规范中规定了:
一个合格的webapp应该是一个怎样的目录结构。
一个合格的webapp应该有一个怎样的配置文件。
一个合格的webapp配置文件路径放在哪里。
一个合格的webapp中java程序放在哪里。
这些都是Servlet规范中规定的。
Tomcat服务器要遵循Servlet规范。JavaWEB程序员也要遵循这个Servlet规范。这样Tomcat服务器和webapp才能解耦合。
开发一个带有Servlet的webapp
- 配置Tomcat服务器环境变量
CATALINA_HOME=D:\environment\apache-tomcat-10.0.26
PATH=%CATALINA_HOME%\bin - 在webapps下建立文件夹
webapproot 项目名字
|------WEB-INF
· |------classes(存放字节码)
· |------lib(第三方jar包)
· |------web.xml(注册Servlet)
|------前端内容
web.xml文件
解决Tomcat服务器在DOS命令窗口中的乱码问题<?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"> <!--servlet描述信息--> <!--任何一个servlet都对应一个servlet-mapping --> <servlet> <servlet-name>HelloServlet</servlet-name> <!--这个位置必须是带有包名的全限定类名--> <servlet-class>com.library.servlet.HelloServlet</servlet-class> </servlet> <!--servlet映射信息--> <servlet-mapping> <!--这里的内容要和上面servlet-name的一样--> <servlet-name>HelloServlet</servlet-name> <!--这里需要一个路径--> <!--这个路径唯一的要求是必须以 / 开始--> <url-pattern>/HelloServlet</url-pattern> </servlet-mapping> </web-app>
将CATALINA_HOME/conf/logging.properties文件中的内容修改如下:
java.util.logging.ConsoleHandler.encoding = GBK - 编写并编译一个java程序(必须实现Servlet接口)
java源代码你愿意在哪里就在哪里,位置无所谓,你只需要将java源代码编译之后的class文件放到classes目录下即可。
将编译生成的class文件放到classes文件夹中package com.library.servlet; import jakarta.servlet.*; import java.io.IOException; import java.io.PrintWriter; /** * @author : [Alex2ice] * @version : [v1.0] * @className : [HelloServlet] * @description : [TODO Servlet实现类] * @createTime : [2022/10/11 23:27] */ public class HelloServlet implements Servlet { @Override public void init(ServletConfig servletConfig) throws ServletException { } @Override public ServletConfig getServletConfig() { return null; } @Override public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { PrintWriter out = servletResponse.getWriter(); out.println("hello servlet"); } @Override public String getServletInfo() { return null; } @Override public void destroy() { } }
- 启动
启动tomcat服务器: startup.bat
关闭tomcat服务器:stop.bat
Http://localhost:8080/webapproot/servlet
webapproot与项目名一致、servlet与url-pattern一致
使用集成工具IDEA开发
- 搭建环境
创建一个新工程
创建一个新模块
模块右击---->Add Framework Support…(添加框架支持)------>选择Web Application
搭建一个符合Servlet规范的webpp目录结构。 - 编写Servlet
导包
实现Seervlet类
在service方法中编写业务代码 - 注册Servlet
- 写一个index.html文件
- 配置Tomcat服务器部署webapp
- 启动(和前面一致)
Http协议
- HTTP协议:是W3C制定的一种超文本传输协议。(通信协议:发送消息的模板提前被制定好。)
- HTTP协议包括:
请求协议:浏览器 向 WEB服务器发送数据的时候,这个发送的数据需要遵循一套标准,这套标准中规定了发送的数据具体格式。
响应协议:WEB服务器 向 浏览器发送数据的时候,这个发送的数据需要遵循一套标准,这套标准中规定了发送的数据具体格式。
Http请求协议
HTTP的请求协议包括:4部分
请求行、请求头、空白行、请求体
请求行:请求方式、URL、Http协议版本号
请求头:主机端口、浏览器、cookie等信息
空白行:用来区分“请求头”和“请求体”
请求体:向服务器发送的具体数据。
Http响应协议
HTTP的响应协议包括:4部分
状态行、响应头、 空白行、 响应体
状态行:协议版本号、状态码
响应头:响应的内容类型、响应的内容长度、响应的时间
空白行:用来分隔“响应头”和“响应体”的。
响应体:响应体就是响应的正文,这些内容是一个长的字符串,这个字符串被浏览器渲染,解释并执行,最终展示出效果。
响应状态码
1)组成100---599;分为5个大类
2)1XX:
最有特征 100; 通知浏览器本次返回的资源文件并不是一个独立的资源文件,需要浏览器在接收响应包之后,继续向Http服务器所要依赖的其他资源文件
3) 2XX:
最有特征200,通知浏览器本次返回的资源文件是一个完整独立资源文件,浏览器在接收到之后不需要索要其他关联文件
4)3xx:
最有特征302,通知浏览器本次返回的不是一个资源文件内容而是一个资源文件地址,需要浏览器根据这个地址自动发起请求来索要这个资源文件。response.sendRedirect("资源文件地址")写入到响应头中的location中。而这个行为导致Tomcat将302状态码写入到状态行
5)4XX:
404:通知浏览器,由于在服务端没有定位到被访问的资源文件,因此无法提供帮助
405:通知浏览器,在服务端已经定位到被访问的资源文件(Servlet),但是这个Servlet对于浏览器采用的请求方式不能处理
5xx:
500:通知浏览器,在服务端已经定位到被访问的资源文件(Servlet)。这个Servlet可以接收浏览器采用请求方式,但是Servlet在处理请求期间,由于Java异常导致处理失败
get 和 post有什么区别
- 请求时发送数据的位置不一样,get请求数据会直接挂在URL后面,如如https://editor.csdn.net/md?not_checkout=1&articleId=val;而post在请求体里发送数据,不会直接显示在URL中。
- get请求只能发送普通的字符串。并且发送的字符串长度有限制,不同的浏览器限制不同。而post请求可以发送任何类型的数据,包括普通字符串,流媒体等信息:视频、声音、图片,可以发送大数据量,理论上没有长度限制。
- W3C中说:get请求比较适合从服务器端获取数据。post请求比较适合向服务器端传送数据。
- get请求是安全的。get请求是绝对安全的。为什么?因为get请求只是为了从服务器上获取数据。不会对服务器造成威胁。post请求是危险的。为什么?因为post请求是向服务器提交数据,如果这些数据通过后门的方式进入到服务器当中,服务器是很危险的。另外post是为了提交数据,所以一般情况下拦截请求的时候,大部分会选择拦截(监听)post请求。
- get请求支持缓存。实际上,你只要发送get请求,浏览器做的第一件事都是先从本地浏览器缓存中找,找不到的时候才会去服务器上获取。这种缓存机制目的是为了提高用户的体验。而post请求不支持缓存。POST是用来修改服务器端的资源的。
怎么向服务器发送GET/POST请求
到目前为止,只有一种情况可以发送POST请求:使用form表单,并且form标签中的method属性值为:method=“post”。其它方式都是get请求,如URL、超链接等。