JavaWeb面试题

1.JDBC

JDBC : Java DataBase Connectivity 直译:java数据库连接

即java语言中用来规范客户端程序如何访问数据库的应用程序接口

原生jdbc操作数据库的流程

① 连接驱动

Class.forName()     连接驱动

顺带一提:获取到类的方法有3种
1.Class.forName()
2.$instance.getClass() 使用了伪代码的方式来书写
3.$Class.class // 这种方法就可以舍弃掉

② 获取数据连接对象

Connection con  = DriverManager.getConnection(url,username,password)

③ 根据SQL获取sql会话对象

一般是有3种方式:
Statement、PreparedStatement、CallableStatement

我们一般使用第二种

String sql = select * from student where sid = ?;
PrepareStatement ps = con.prepareStatement(sql);

执行sql前设置参数值

ps.setInt(1,1);

④ 执行sql处理结果集

ResultSet rs = ps.executeQuery();
List<Student> studentList = null;
 // 遍历获取结果集中的值
while(rs.next()){
	String sid = rs.getString("sid");
	String sname = rs.getString("sname");
	studentList.add(new Student(sid,sname));
}

PreparedStatement中:
executeQuery:显示查询结果
executeUpdate:执行增删改的操作,返回的是影响的行数

most important
⑤ 关闭资源

// 最好是在finally块中释放资源
try{
}catch(Exception e){
	e.print();
}finally{
	if(rs != null) rs.close();
	if(ps != null) ps.close();
	if(con != null) con.close();
}

事务的概念

事务是单个逻辑单元执行的一系列操作
事务的四个属性

  1. 原子性:事务包含的所有操作要么全部成功,要么全部失败;
  2. 隔离性:多个并发事务之间要互相隔离;
  3. 持久性:事务一旦被提交了,那么对数据库中数据的改变就是永久性的;
  4. 一致性:一致性是指事务必须使数据库从一个一致性状态转换为另一个一致性状态;

脏读、不可重复读、幻读

脏读
脏读是指一个事务修改了一个数据,但并没提交事务;
这个时候另一个事务读取这个数据,因为事务还没有提交,有可能出现脏读的情况。

不可重复读
不可重复读是指一个事务在它的所有操作中进行了两次或多次读取,在两次读取中另一个事务修改了读取数据的值,导致两次读取的结果不同

幻读
幻读和不可重复读相似(侧重点:幻读侧重于删除和插入,不可重复读侧重于修改);
在一个事务读取了几行数据;再去读的时候,发现被另一个事务插入了几行其他的数据;(或者少了几行数据)

丢失修改
有两个事务同时修改某个值,其中一个修改丢失了

SQL定义了四个隔离级别:

READ-UNCOMMITED
读取未提交
READ-COMMITED
读取已提交
REPEATABLE-READ
可重复读
SERIALIZABLE
可串行化

网路通讯

UDP

  1. 面向无连接,将数据和源封装在数据包中;
  2. 每个数据报大小限制在64k内;
  3. 因为无连接,是不可靠协议;
  4. 不需要建立连接,速度快;

TCP

  1. 建立连接,形成传输数据的通道;
  2. 以字节流的方式在建立的连接中大数据量传输;
  3. 通过三次握手完成连接,是可靠的协议;
  4. 必须建立连接,效率会偏低;

TCP的三次握手

在这里插入图片描述
TCP四次握手

第一次握手:客户端发送请求到服务端,SYN=1,ACK=0,seq=x;进入SYN-SEND同步发送状态;此时服务端正处于LISTEN监听状态

第二次握手:接收到客户端发送的请求后;服务端发送响应给客户端,SYN=1,ACK=1,seq=y,ack=x+1;服务器进入SYN-RCVD同步收到的状态

第三次握手:接收到服务端的SYN+ACK包后,客户端进入ESTABLISHED建立连接的状态,同时发送响应ACK到客户端,ACK=1,seq=x+1,ack=y+1;

等到服务端接收到该响应时,也进入到ESTABLISHED状态;

为什么TCP客户端最后还要发送一次确认呢?

一句话,主要防止已经失效的连接请求报文突然又传送到了服务器,从而产生错误。

如果使用的是两次握手建立连接,假设有这样一种场景,客户端发送了第一个请求连接并且没有丢失,只是因为在网络结点中滞留的时间太长了,由于TCP的客户端迟迟没有收到确认报文,以为服务器没有收到,此时重新向服务器发送这条报文,此后客户端和服务器经过两次握手完成连接,传输数据,然后关闭连接。此时此前滞留的那一次请求连接,网络通畅了到达了服务器,这个报文本该是失效的,但是,两次握手的机制将会让客户端和服务器再次建立连接,这将导致不必要的错误和资源的浪费。

如果采用的是三次握手,就算是那一次失效的报文传送过来了,服务端接受到了那条失效报文并且回复了确认报文,但是客户端不会再次发出确认。由于服务器收不到确认,就知道客户端并没有请求连接。

TCP四次挥手
在这里插入图片描述

第一次挥手:客户端发送释放连接的请求,进入终止等待1状态(FIN-WAIT-1),FIN=1,seq=u

第二次挥手:服务端收到释放连接的报文,同时发送确认报文,ACK=1,seq=v,ack=u+1;此时服务进入到等待关闭状态(CLOSE-WAIT)

这个时候处于半关闭的状态,客户端已经没有数据发送给服务端了,但是服务端还有一些数据发送给客户端,这段时间就是发送数据的时间;

客户端收到服务端的确认请求后,就会进入到终止等待2状态(FIN-WAIT-2),等待服务器发送释放连接的报文;(在此期间要接收服务端发送的数据)

第三次挥手:服务端将所有的数据发送完毕后,向客户端发送释放连接报文,FIN=1,seq=w,ack=u+1,ACK=1;此时服务器进入了最后等待的阶段(LAST-WAIT),等待客户端的响应

第四次挥手:客户端收到服务器释放连接报文后,必须发送响应请求,ACK=1,seq=u+1,ack=w+1;这里客户端就进入了时间等待状态(TIME-WAIT),此时tcp连接还没有释放,等待2s过后,客户端撤销相应的TCP后,才进入CLOSED状态,

服务器只要收到了客户端发出的确认,立即进入CLOSED状态。同样,撤销TCB后,就结束了这次的TCP连接。可以看到,服务器结束TCP连接的时间要比客户端早一些。
TCP的概述

TCP把连接作为最基本的对象,每一条TCP连接都有两个端点,这种断点我们叫作套接字(socket),它的定义为端口号拼接到IP地址即构成了套接字,例如,若IP地址为192.3.4.16 而端口号为80,那么得到的套接字为192.3.4.16:80。

TCP把连接作为最基本的对象,每一条TCP连接都有两个连接点,这种断点我们叫做套接字(socket),它的定义为端口号拼接到IP地址后构成套接字,比如说
套接字
192.168.25.134:8080

确认ACK:占1位,仅当ACK=1时,确认号字段才有效。ACK=0时,确认号无效
同步SYN:连接建立时用于同步序号。当SYN=1,ACK=0时表示:这是一个连接请求报文段。
若同意连接,则在响应报文段中使得SYN=1,ACK=1。
因此,SYN=1表示这是一个连接请求,或连接接受报文。
SYN这个标志位只有在TCP建产连接时才会被置1,握手完成后SYN标志位被置0。
终止FIN:用来释放一个连接。FIN=1表示:此报文段的发送方的数据已经发送完毕,并要求释放运输连接
PS:ACK、SYN和FIN这些大写的单词表示标志位,其值要么是1,要么是0;ack、seq小写的单词表示序号。

序列号seq:4个字节,用来标记数据段的顺序

确认号ack:4个字节,期待收到对方下个报文的第一个数据字节的seq

为什么客户端最后还要等待2MSL?
MSL(Maximum Segment Lifetime),TCP允许不同的实现可以设置不同的MSL值。

第一,保证客户端发送的最后一个ACK报文能够到达服务器,因为这个ACK报文可能丢失,站在服务器的角度看来,我已经发送了FIN+ACK报文请求断开了,客户端还没有给我回应,应该是我发送的请求断开报文它没有收到,于是服务器又会重新发送一次,而客户端就能在这个2MSL时间段内收到这个重传的报文,接着给出回应报文,并且会重启2MSL计时器。

第二,防止类似与“三次握手”中提到了的“已经失效的连接请求报文段”出现在本连接中。客户端发送完最后一个确认报文后,在这个2MSL时间中,就可以使本连接持续的时间内所产生的所有报文段都从网络中消失。这样新的连接中不会出现旧连接的请求报文。

为什么建立连接是三次握手,关闭连接确是四次挥手呢?

建立连接的时候, 服务器在LISTEN状态下,收到建立连接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。
而关闭连接时,服务器收到对方的FIN报文时,仅仅表示对方不再发送数据了但是还能接收数据,而自己也未必全部数据都发送给对方了,所以己方可以立即关闭,也可以发送一些数据给对方后,再发送FIN报文给对方来表示同意现在关闭连接,因此,己方ACK和FIN一般都会分开发送,从而导致多了一次。

Servlet的总结

在这里插入图片描述

拦截器和监听器

在这里插入图片描述
在这里插入图片描述
Spring的拦截器和Servlet的过滤器有相似之处,都是AOP思想的体现,都能实现权限检查,日志记录

两者的作用范围不同、

package com.tensquare.friend.config;

import com.tensquare.friend.interceptor.JwtInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class JwtInterceptorConfig implements WebMvcConfigurer {
    @Autowired
    private JwtInterceptor jwtInterceptor;
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry
                .addInterceptor(jwtInterceptor).addPathPatterns("/**")
                .excludePathPatterns("/**/login");
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值