JavaWeb面试题2021

1.JDBC 技术

1.1 说下原生 JDBC 操作数据库流程?

第一步:Class.forName()加载数据库连接驱动;

//1.加载驱动(开发推荐的方式)
Class.forName("com.mysql.jdbc.Driver");
//1.加载驱动
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");

第二步:DriverManager.getConnection()获取数据连接对象;

1、数据库URL
URL用于标识数据库的位置,程序员通过URL地址告诉JDBC程序连接哪个数据库,URL的写法为:

jdbc:mysql:[]//localhost:3306/shen ?参数名:参数值

常用数据库URL地址的写法:

Oracle:jdbc:oracle:thin:@localhost:1521:shen

SqlServer:jdbc:microsoft:sqlserver://localhost:1433; DatabaseName=shen

MySql:jdbc:mysql://localhost:3306/shen

注意:如果是localhost:3306,mysql可以简写为jdbc:mysql:///sid(尽量不这样)

2、Connection
Jdbc程序中的Connection,它用于代表数据库的链接,Collection是数据库编程中最重要的一个对象,客户端与数据库所有交互都是通过connection对象完成的,创建方法为:

Connection conn = DriverManager.getConnection(url,user,pass);

String url = "jdbc:mysql://localhost:3306/shen";
String username = "shen";
String password = "Anxin062039";
Connection conn = null;
			
//2.获取与数据库的链接
conn = DriverManager.getConnection(url, username, password);

第 三 步 : 根 据 SQL 获 取 sql 会 话 对 象 , 有 2 种 方 式 Statement.PreparedStatement ;

1、Statement
Jdbc程序中的Statement对象用于向数据库发送SQL语句,创建方法为:

  Statement st = conn.createStatement();
Statement st = null;
//3.获取用于向数据库发送sql语句的statement
st = conn.createStatement();
//4.向数据库发sql
String sql = "select id,name,password,email,birthday from users";
st.executeQuery(sql);

2、PreperedStatement
PreperedStatement是Statement的孩子,它的实例对象可以通过调用:

     PreperedStatement st =  conn.preparedStatement()
PreperedStatement st = null;
String sql = "select * from users where name=? and password=?";
 
//3.获取用于向数据库发送sql语句的Preperedstatement
st = conn.preparedStatement(sql);//在此次传入,进行预编译
st.setString(1, username);
st.setString(2, password);
//4.向数据库发sql
st.executeQuery();//在这里不需要传入sql

比较:相对于Statement对象而言

PreperedStatement可以避免SQL注入的问题。
如:String sql=“select * from admin where loginname=’”+loginName+"’ and loginpwd=’"+loginPwd+"’";

    在应用中:

        -》请输入账号:

             333

        -》请输入密码:

              wer'or'1'='1



    实际上发送:select * from admin where loginname='333' and loginpwd='wer'or'1'='1',登录成功!

Statement会使数据库频繁编译SQL,可能造成数据库缓冲区溢出。PreparedStatement 可对SQL进行预编译,从而提高数据库的执行效率。
并且PreperedStatement对于sql中的参数,允许使用占位符的形式进行替换,简化sql语句的编写。

第四步:执行 SQL 处理结果集,执行 SQL 前如果有参数值就设置参数值 setXXX();

ResultSet rs = null;
//4.向数据库发sql,并获取代表结果集的resultset
String sql = "select id,name,password,email,birthday from users";
rs = st.executeQuery(sql);
			
//5.取出结果集的数据
rs.afterLast();
rs.previous();
System.out.println("id=" + rs.getObject("id"));
System.out.println("name=" + rs.getObject("name"));
System.out.println("password=" + rs.getObject("password"));
System.out.println("email=" + rs.getObject("email"));
System.out.println("birthday=" + rs.getObject("birthday"));

第五步:关闭结果集.关闭会话.关闭连接。
Jdbc程序运行完后,切记要释放程序在运行过程中,创建的那些与数据库进行交互的对象,这些对象通常是ResultSet, Statement和Connection对象。

注意:为确保资源释放代码能运行,资源释放代码也一定要放在finally语句中。

//6.关闭链接,释放资源
	if(rs!=null){
		try{
			rs.close();
		}catch (Exception e) {
			e.printStackTrace();
		}
		rs = null;
	
	}
	if(st!=null){
		try{
			st.close();
		}catch (Exception e) {
			e.printStackTrace();
		}
				
	}	
	if(conn!=null){
		try{
			conn.close();
		}catch (Exception e) {
			e.printStackTrace();
		}
}

总结:
第一步:Class.forName()加载数据库连接驱动;
第二步:DriverManager.getConnection()获取数据连接对象;
第 三 步 : 根 据 SQL 获 取 sql 会 话 对 象 , 有 2 种 方 式 Statement.PreparedStatement
第四步:执行 SQL 处理结果集,执行 SQL 前如果有参数值就设置参数值 setXXX();
第五步:关闭结果集.关闭会话.关闭连接。

1.2 说说事务的概念,在 JDBC 编程中处理事务的步骤。

  1. 事务是作为单个逻辑工作单元执行的一系列操作。
  2. 一个逻辑工作单元必须有四个属性,称为原子性、一致性、隔离性和持久性 (ACID) 属性,只有这样才能成为一个事务处理步骤:

原子性(atomicity)。一个事务是一个不可分割的工作单位,事务中包括的诸操作要么都做,要么都不做。

一致性(consistency)。事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。

隔离性(isolation)。一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。

持久性(durability)。持续性也称永久性(permanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。

(1) conn.setAutoComit(false);设置提交方式为手工提交
(2) conn.commit()提交事务
(3) 出现异常,回滚 conn.rollback();

1.3 JDBC 的脏读是什么?哪种数据库隔离级别能防止脏读?

当我们使用事务时,有可能会出现这样的情况,有一行数据刚更新,与此同 时另一个查询读到了这个刚更新的值。这样就导致了脏读,因为更新的数据还没 有进行持久化,更新这行数据的业务可能会进行回滚,这样这个数据就是无效的。 数据库的
TRANSACTION READCOMMITTED ,
TRANSACTION REPEATABLE READ
TRANSACTION_SERIALIZABLE
隔离级别可以防止脏读。

脏读是指一个事务读取了未提交事务执行过程中的数据。
当一个事务的操作正在多次修改数据,而在事务还未提交的时候,另外一个并发事务来读取了数据,就会导致读取到的数据并非是最终持久化之后的数据,这个数据就是脏读的数据。
最典型的例子就是银行转账,从A账户转账100到B账户,脚本命令为

update account set money = money + 100 where username = 'B';
update account set money = money - 100 where username = 'A';

在这个事务执行过程中,另外一个事务读取结果发现B账户中的钱已经到账,提示B钱已到账,B就进行了下一步的操作。但是最终转账事务失败,导致操作回滚。实际上B并未收到钱,但是进行了下一步的操作,造成了损失,这就是脏读。

隔离级别说明
MySQL定义了四种隔离级别,包括一些具体规则,用于限定事务内外哪些改变是可见的,哪些改变是不可见的。低级别的隔离一般支持更高的并发处理,并且拥有更低的系统开销。

REPEATABLE READ Repeatable Read 可重复读
MySQL数据库默认的隔离级别。该级别解决了READUNCOMMITTED隔离级别导致的问题。它保证同一事务的多个实例在并发读取事务时,会“看到同样的”数据行。不过,这会导致另外一个棘手问题“幻读”。InnoDB和Falcon存储引擎通过多版本并发控制机制解决了幻读问题。

READ COMMITTED Read Committed 读取提交内容
大多数数据库系统的默认隔离级别(但是不是MySQL的默认隔离级别),满足了隔离的早先简单定义:一个事务开始时,只能“看见”已经提交事务所做的改变,一个事务从开始到提交前,所做的任何数据改变都是不可见的,除非已经提交。这种隔离级别也支持所谓的“不可重复读”。这意味着用户运行同一个语句两次,看到的结果是不同的。

READ UNCOMMITTED Read UnCommitted 读取未提交内容
在这个隔离级别,所有事务都可以“看到”未提交事务的执行结果。在这种级别上,可能会产生很多问题,除非用户真的知道自己在做什么,并有很好的理由选择这样做。本隔离级别很少用于实际应用,因为它的性能也不必其他性能好多少,而别的级别还有其他更多的优点。读取未提交数据,也被称为“脏读”

SERIALIZABLE Serializable 可串行化
该级别是最高级别的隔离级。它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简而言之,SERIALIZABLE是在每个读的数据行上加锁。在这个级别,可能导致大量的超时Timeout和锁竞争Lock
Contention现象,实际应用中很少使用到这个级别,但如果用户的应用为了数据的稳定性,需要强制减少并发的话,也可以选择这种隔离级

补充:

虚读(幻读)
幻读是事务非独立执行时发生的一种现象,例如事务T1批量对一个表中某一列列值为1的数据修改为2的变更,但是在这时,事务T2对这张表插入了一条列值为1的数据,并完成提交。此时,如果事务T1查看刚刚完成操作的数据,发现还有一条列值为1的数据没有进行修改,而这条数据其实是T2刚刚提交插入的,这就是幻读。
幻读和不可重复读都是读取了另一条已经提交的事务(这点同脏读不同),所不同的是不可重复读查询的都是同一个数据项,而幻读针对的是一批数据整体(比如数据的个数)。

不可重复读
不可重复读是指对于数据库中的某个数据,一个事务执行过程中多次查询返回不同查询结果,这就是在事务执行过程中,数据被其他事务提交修改了。
不可重复读同脏读的区别在于,脏读是一个事务读取了另一未完成的事务执行过程中的数据,而不可重复读是一个事务执行过程中,另一事务提交并修改了当前事务正在读取的数据。

1 网路通讯部分

1.1 TCP 与 UDP 区别?

UDP:
a.是面向无连接, 将数据及源的封装成数据包中,不需要建立连接
b.每个数据报的大小在限制 64k 内
c.因无连接,是不可靠协议
d.不需要建立连接,速度快
TCP:
a.建立连接,形成传输数据的通道.
b.在连接中进行大数据量传输,以字节流方式
c.通过三次握手完成连接,是可靠协议
d 必须建立连接效率会稍低.聊天.网络视频会议就是 UDP

补充:

【问题1】为什么连接的时候是三次握手,关闭的时候却是四次握手?

答:因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,“你发的FIN报文我收到了”。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。

1.2 说一下什么是 Http 协议?

客户端和 服务器端之间数据传输的格式规范,格式简称为“超文本传输协 议”。是一个基于请求与响应模式的.无状态的.应用层的协议,基于 TCP 的连接 方式。

1.3 get 与 post 请求区别?

区别 1: get 重点在从服务器上获取资源,post 重点在向服务器发送数据;
区别 2:get 传输数据是通过 URL 请求,以 field(字段)= value 的形式,置于 URL 后,并用"?“连接,多个请求数据间用”&"连接,如 http://127.0.0.1/Test/LogI n.action?name=admin&password=admin,这个过程用户是可见的; post 传输数据通过 Http 的 post 机制,将字段与对应值封存在请求实体中 发送给服务器,这个过程对用户是不可见的;
区别 3:Get 传输的数据量小,因为受 URL 长度限制,但效率较高; Post 可以传输大量数据,所以上传文件时只能用 Post 方式;
区别 4:Get 是不安全的,因为 URL 是可见的,可能会泄露私密信息,如密码等; Post 较 get 安全性较高;
区别 5:get 方式只能支持 ASCII 字符,向服务器传的中文字符可能会乱码。 post 支持标准字符集,可以正确传递中文字符。

1.4 http 中重定向和请求转发的区别?

本质区别:转发是服务器行为,重定向是客户端行为。
重定向特点:两次请求,浏览器地址发生变化,可以访问自己 web 之外的资源,传输的数据会丢失。
请求转发特点:一次请求,浏览器地址不变,访问的是自己本身的 web 资源,传输的数据不会丢失。

转发过程:客户浏览器发送http请求——》web服务器接受此请求——》调用内部的一个方法在容器内部完成请求处理和转发动作——》将目标资源发送给客户;在这里,转发的路径必须是同一个web容器下的url,其不能转向到其他的web路径上去,中间传递的是自己的容器内的request。在客户浏览器路径栏显示的仍然是其第一次访问的路径,也就是说客户是感觉不到服务器做了转发的。转发行为是浏览器只做了一次访问请求。

重定向过程:客户浏览器发送http请求——》web服务器接受后发送302状态码响应及对应新的location给客户浏览器——》客户浏览器发现是302响应,则自动再发送一个新的http请求,请求url是新的location地址——》服务器根据此请求寻找资源并发送给客户。在这里location可以重定向到任意URL,既然是浏览器重新发出了请求,则就没有什么request传递的概念了。在客户浏览器路径栏显示的是其重定向的路径,客户可以观察到地址的变化的。重定向行为是浏览器做了至少两次的访问请求的。

2.1 Cookie 和 Session

Cookie 是 web 服务器发送给浏览器的一块信息,
浏览器会在本地一个文 件中给每个 web 服务器存储 cookie。以后浏览器再给特定的 web 服务器发送请求时,同时会发送所有为该服务器存储的 cookie。
Session 是存储在 web 服务器端的一块信息。
session 对象存储特定用 户会话所需的属性及配置信息。当用户在应用程序的 Web 页之间跳转时,存储在 Session 对象中的变量将不会丢失,而是在整个用户会话中一直存在下 去。
Cookie 和 session 的不同点:
1.无论客户端做怎样的设置,session 都能够正常工作。当客户端禁用 cookie 时将无法使用 cookie。
2.在存储的数据量方面:session 能够存储任意的 java 对象,cookie 只 能存储 String 类型的对象。

3.1 Jsp 和 Servlet

3.1.1 Servlet 的执行流程

Servlet 的执行流程也就是 servlet 的生命周期,当服务器启动的时候生命周期开始,然后
1、通过 init()《启动顺序根据 web.xml 里的 startup-on-load 来 确定加载顺序》方法初始化 servlet,
2、再根据不同请求调用 doGet 或 doPost 方 法,也就是多次调用service()方法
3、最后再通过 destroy()方法进行销毁。

3.1.2 Jsp 和 Servlet 的区别

你可以将 JSP 当做一个可扩充的 HTML 来对待。 虽然在本质上 JSP 文件会被服务器自动翻译为相应的 Servlet 来执行。 可以说 Servlet 是面向 Java 程序员而 JSP 是面向 HTML 程序员的,除此 之外两者功能完全等价。

3.1.3 JSP 九大内置对象

pageContext :只对当前 jsp 页面有效,里面封装了基本的 request 和 session 的对象
Request :对当前请求进行封装
Session :浏览器会话对象,浏览器范围内有效
Application :应用程序对象,对整个 web 工程都有效
Out :页面打印对象,在 jsp 页面打印字符串
Response :返回服务器端信息给用户
Config :单个 servlet 的配置对象,相当于 servletConfig 对象
Page :当前页面对象,也就是 this
Exception :错误页面的 exception 对象,如果指定的是错误页面,这个就 是异常对象

3.1.4 JSP 的三大指令

Page :指令是针对当前页面的指令
Include :用于指定如何包含另一个页面
Taglib :用于定义和指定自定义标签

3.1.5 七大动作

Forward,执行页面跳转,将请求的处理转发到另一个页面
Param :用于传递参数 Include :用于动态引入一个 jsp 页面
Plugin :用于下载 javaBean 或 applet 到客户端执行
useBean :使用 javaBean set
Property :修改 javaBean 实例的属性值 get
Property :获取 javaBean 实例的属性值

4.1 Ajax

4.1.1 谈谈你对 Ajax 的认识?(了解)

Ajax 是一种创建交互式网页应用的的网页开发技术;“Asynchronous JavaScript and XML”的缩写。

4.1.2 Ajax 创建的过程?(了解)

1.创建 XMLHttpRequest 对象,也就是创建一个异步调用对象
2.创建一个新的 HTTP 请求,并指定该 HTTP 请求的方法、URL 及验证信息
3.设置响应 HTTP 请求状态变化的函数
4.发送 HTTP 请求
5.获取异步调用返回的数据
6.使用 JavaScript 和 DOM 实现局部刷新

4.1.3 阐述一下异步加载 JS?(了解)

1.异步加载的方案: 动态插入 script 标签
2.通过 ajax 去获取 js 代码,然后通过 eval 执行
3.script 标签上添加 defer 或者 async 属性
4.创建并插入 iframe,让它异步执行 js

4.1.4 ajax 请求时,如何解释 json 数据?(了解)

使 用 eval() 或 者 JSON.parse() 鉴 于 安 全 性 考 虑 , 推 荐 使 用 JSON.parse()更靠谱,对数据的安全性更好.

4.1.5 Ajax 提交请求 默认是 异步还是同步,怎么改成同步?(了解)

控制 ajax 请求参数 async 属性的值可以切换成同步请求或异步请求。 同步请求:(false)同步请求即是当前发出请求后,浏览器什么都不能做,必 须得等到请求完成返回数据之后,才会执行后续的代码,相当于是排队,前一个 人办理完自己的事务,下一个人才能接着办。也就是说,JS 代码加载到当前 AJAX 的时候会把页面里所有的代码停止加载,页面处于一个假死状态,当这 个 AJAX 执行完毕后才会继续运行其他代码页面解除假死状态。 异步请求:(true) 异步请求就当发出请求的同时,浏览器可以继续做任何事, Ajax 发送请求并不会影响页面的加载与用户的操作,相当于是在两条线上,各 走各的,互不影响。
在这里插入图片描述

4.1.6 如何解决 ajax 跨域问题?(了解)

    跨域问题来源于 JavaScript 的"同源策略",即只有 协议+主机名+端口号 (如存在)相同,则允许相互访问。也就是说 JavaScript 只能访问和操作自己域 下的资源,不能访问和操作其他域下的资源。跨域问题是针对 JS 和 ajax 的, html 本身没有跨域问题。

跨域问题解决方案
1.响应头添加 Header 允许访问
跨域资源共享(CORS)Cross-Origin Resource Sharing
这个跨域访问的解决方案的安全基础是基于"JavaScript 无法控制该 HTTP 头"它需要通过目标域返回的 HTTP 头来授权是否允许跨域访问
具体如下:
response.addHeader(‘Access-Control-Allow-Origin:*’);//允许所有 来源访问
response.addHeader(‘Access-Control-Allow-Method:POST,GET’);// 允许访问的方式
2、jsonp (只支持 get 请求不支持 post 请求)
用法:
①dataType 改为 jsonp
②jsonp : “jsonpCallback”(发送到后端实际例子: http://a.a.com/a/FromServlet?userName=644064&jsonpCallback=j Queryxxx) ③后端获取 get 请求中的 jsonpCallback
④构造回调结构
3、httpClient 内部转发
实现原理例子:若想在 B 站点中通过 Ajax 访问 A 站点获取结果,固然
有 ajax 跨域问题,但在 B 站点中访问 B 站点获取结果,不存在跨域问题, 这种方式实际上是在 B 站点中 ajax 请求访问 B 站点的 HttpClient,再通过 HttpClient 转发请求获取 A 站点的数据结果。但这种方式产生了两次请求,效 率低,但内部请求,抓包工具无法分析,安全
4、使用接口网关——nginx、springcloud zuul (互联网公司常规解决方案)

4.1.7 Ajax 的优势(了解)

通过异步模式,提升了用户体验。
优化了浏览器和服务器之间的传输,减少不必要的数据往返,减少了带宽占用。
Ajax 引擎在客户端运行,承担了一部分本来由服务器承担的工作,从而减 少了大用户量下的服务器负载。

4.1.8 请介绍下 Jsonp 原理(了解)

jsonp 的最基本的原理是:动态添加一个

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值