11.2总结

1.http的请求方法有哪些?

  • GET:获取资源

用来请求访问服务器上的资源,该资源由请求URI指定。

  • POST:传输实体主体

向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在POST请求体中。POST 请求可能会导致新的资源的建立或已有资源的修改。

  • PUT:传输文件

与POST相似,都是提交请求,但它们之间有一个重要区别,PUT通常指定了资源的存放位置,而POST则没有,POST的数据存放位置由服务器自己决定。

  • PATCH

PUT方法的补充,极少使用

  • HEAD:获得报文首部

常常判断资源是否存在, 向服务器获取某些易过期或丢失大型文件时,可用HEAD方式查询资源是否存在,或资源的有效性和更新的日期时间等。

  • TRACE:追踪路径

回显服务器收到的请求,客户端可以对请求消息的传输路径进行追踪,TRACE方法是让Web服务器端将之前的请求通信还给客户端的方法。主要用于测试或诊断
该方法容易引发XST(跨站追踪攻击),通常也不会使用。

  • OPTIONS:询问支持的方法

用于获取当前URL所支持的方法。若请求成功,则它会在HTTP头中包含一个名为“Allow”的头,值是所支持的方法,如“GET, POST”。

  • CONNECT:要求用隧道协议连接代理

HTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器。CONNECT方法要求在与代理服务器通信时建立隧道,实现用隧道协议进行TCP通信。主要使用SSL(安全套接层)和TLS(传输层安全)协议把通信内容加密后经网络隧道传输。也极少使用。

2.get与post请求的区别

1.get请求一般是去取获取数据(其实也可以提交,但常见的是获取数据);
post请求一般是去提交数据。

2.get因为参数会放在url中,所以隐私性,安全性较差,请求的数据长度是有限制的,
不同的浏览器和服务器不同,一般限制在 2~8K 之间,更加常见的是 1k 以内;
post请求是没有的长度限制,长度由浏览器搜索框限制,请求数据是放在请求体中;

3.get请求刷新服务器或者回退没有影响,post请求回退时会重新提交数据请求。

4.get请求可以被缓存,post请求不会被缓存。

5.get请求会被保存在浏览器历史记录当中,post不会。get请求可以被收藏为书签,因为参数就是url中,但post不能。它的参数不在url中。

6.get请求只能进行url编码(appliacation-x-www-form-urlencoded),post请求支持多种(multipart/form-data等)。

拓展

GET 和 POST都是http请求方式, 底层都是 TCP/IP协议;通常GET 产生一个 TCP 数据包;POST 产生两个 TCP 数据包(但firefox是发送一个数据包)

  1. 对于 GET 方式的请求,浏览器会把 http header 和 data 一并发送出去,服务器响应 200(返回数据)表示成功;
  2. 对于 POST,浏览器先发送 header,服务器响应 100, 浏览器再继续发送 data,服务器响应 200 (返回数据)。

3.IOC和DI定义

  1. IOC,全称为控制反转(Inversion of Control),是一种软件设计原则,用于解耦组件之间的依赖关系。在传统的程序设计中,组件之间通常需要显式地创建和管理彼此的依赖关系。而在IOC容器中,控制权被颠倒,容器负责管理组件之间的依赖关系。

    IOC的核心思想是将应用程序的控制权从应用代码中转移到容器中,容器负责实例化、组装和管理各种组件,并在需要时将它们注入到其他组件中。这种控制权的颠倒有以下几个关键特点:

    1. 依赖注入(Dependency Injection):IOC容器负责将依赖关系注入到组件中,而不是组件自己负责创建或查找依赖。这减少了组件之间的紧耦合。
    2. 松耦合:IOC通过解耦组件之间的依赖关系,使组件更容易被替换、扩展和测试。每个组件只需关注自身的功能,而不需要知道其他组件如何创建或组装。
    3. 配置驱动:IOC容器通常通过配置文件或注解来描述组件之间的依赖关系,这使得应用程序的配置更加灵活,可以在不修改代码的情况下进行配置更改。
    4. 可维护性:IOC提高了代码的可维护性,因为它减少了依赖关系的复杂性,并使应用程序更易于理解和修改。
  2. DI,全称为依赖注入(Dependency Injection),是面向对象编程中的一种设计模式,用于解决组件之间的依赖关系管理问题。DI的核心思想是将一个组件(通常是一个对象)所依赖的其他组件的实例(或依赖项)通过外部注入的方式提供,而不是由组件自身负责创建或查找依赖项。这种方式有助于降低组件之间的耦合度,提高代码的可维护性、可测试性和可扩展性。

    DI的关键概念包括以下几点:

    1. 依赖关系:DI强调组件之间的依赖关系,一个组件(被称为依赖方)需要另一个组件(被称为依赖项)来完成其工作。
    2. 注入:依赖项的实例是由外部注入到依赖方中的。注入可以通过构造函数、方法参数、属性或其他方式实现。
    3. 外部管理:依赖项的生命周期和创建由外部容器或管理器负责。依赖方不需要知道依赖项的创建和生命周期管理细节。
    4. 解耦:通过将依赖关系的管理外移,DI减少了依赖方与依赖项之间的耦合度。这使得依赖方更加独立、可复用,并更容易进行单元测试。
    5. 配置灵活性:DI通常支持通过配置文件或注解来指定依赖项的实例。这使得应用程序的配置更加灵活,可以在不修改代码的情况下进行依赖项的更改。

4.MyBatis中 #{}${} 的区别?

1.#{} 用于预编译语句,它可以有效防止SQL注入,确保参数值被正确转义和处理。这种语法主要用于传递字符串类型的参数.

使用时如果同时传递多个参数,需要使用@param绑定

2.${} 则直接将参数值替换到SQL语句中,这种方式可能会导致SQL注入的风险,因此它主要用于传递非字符串类型的参数,或者已知的、安全的字符串参数。

5.线程的状态有哪些?

1.新建(new)

一个尚未启动的线程的状态。也称之为初始状态、开始状态。

线程刚被创建,但是并未启动。还没调用start方法。MyThread t = new MyThread()只有线程象,没有线程特征。

2.就绪(runnable)

在Java虚拟机中执行的线程(可以运行的线程)处于此状态。

3.阻塞(block)

当一个线程试图获取一个对象锁,而该对象锁被其他的线程持有,则该线程进入Blocked状态;当该线程持有锁时,该线程将变成Runnable状态。

阻塞又分为三种:

​ **1)等待阻塞:**运行状态的线程执行wait方法,JVM会把线程放在等待队列中,使本线程进入阻塞状态。

​ **2)同步阻塞:**线程在获得synchronized同步锁失败,JVM会把线程放入锁池中,线程进入同步阻塞。对于锁池和等待池,可以看这篇文章

​ **3)其他阻塞:**调用线程的sleep()或者join()后,线程会进入道阻塞状态,当sleep超时或者join终止或超时,线程重新转入就绪状态

4.等待(waiting)

等待状态,*没有超时时间(无限等待)*,要被其他线程或者有其他的中断操作

造成线程等待的原因有两种,分别是调用Object.wait() join()方法。处于等待状态的线程,正在等待其他线程去执行一个特定的操作。

例如:因为wait()而等待的线程正在等待另一个线程去调用notify()notifyAll();一个因为join()而等待的线程正在等待另一个线程结束。

5.超时等待 (TIMED_WAITING) (很多地方会将这个状态列为waiting内)

与等待不同的是,不是无限等待,超时后自动返回

例如: ( sleep(1000) , join(1000) )

等待状态的原因有三种,分别是:

  • Thread.sleep(long)
  • Object.wait(long)
  • join(long)

6.死亡(TERMINATED )

一个完全运行完成的线程的状态。也称之为终止状态、结束状态

死亡的线程不可再次复生

附图:

image-20231102120550870

image-20231102120635099

6.mybatis中resultMapresultType区别?

mybatis中在查询进行select映射的时候,返回类型可以用resultType,也可以用resultMap。

不同

  1. resultType对应的是java对象中的属性,大小写不敏感;resultMap对应的是对已经定义好了id的resultTupe的引用,key是查询语句的列名,value是查询的值,大小写敏感;
  2. 使用resultType的时候,要保证结果集的列名与java对象的属性相同,而resultMap则不用。
  3. 另外,resultMap 元素,它是 MyBatis 中最重要最强大的元素,它能提供级联查询,缓存等功能。
  4. resultType是直接表示返回类型的,而resultMap则是对外部ResultMap的引用,也就是可以自己定义映射规则

但是注意resultType跟resultMap不能同时使用。