标题HTML5里面有哪些特殊的标签
<section>定义一个区域</section>
定义导航链接<nav></nav>
定义命令的列表或菜单<menu>
JSP和Servlet的区别
- 相同:JSP和Servlet都是WEB开发技术,它们都可以书写Java代码
- 不同:Servlet适合处理请求和业务逻辑,却不适合输出一个完整的网页;JSP可以输出一个完整的网页
为什么说JSP本质上是一个Servlet
第一次访问JSP时,JSP会自动翻译成Servlet
JSP执行过程
浏览器 ——> JSP文件 ——> 翻译成Servlet ——> 编译为class文件 ——> 执行class文件 ——> 输出网页
JSP语法
- 模板元素:除了JSP特有的元素外,其他的元素都称为模板元素
- JSP表达式:
<%= 常量/变量/表达式 %> 计算表达式的结果,将结果原封不动的输出给浏览器,浏览器负责解析以及显示
<% Java语句 %> 在JSP中执行Java代码
JSP、HTML、Java的注释有什么区别
JSP注释:<%-- --%>:不会参与翻译与执行,也不会发送给浏览器
HTML注释:<!-- -->:参与了翻译与执行,会发送给浏览器,但是不会显示
Java注释:<% %>:参与了翻译,但是不会执行,也不会发送给浏览器
JSP标签技术
EL表达式:${表达式/常量/变量}:从四大作用域(pageContext、request、session、application)中获取数据,也可以将常量的值/表达式的计算结果输出
JSTL标签库:专门为JavaWEB开发提供的一套标椎通用的标签库
什么是会话
会话:可以认为是服务端和客户端之间的一次对话(从客户端与服务端连接开始,到服务端和客户端断开结束),它们中产生的多次请求、响应被统称为会话。
Cookie的工作原理
获取客户端请求 ——> 创建Cookie对象 ——> 将数据存入Cookie中 ——> 将Cookie响应给浏览器
接收客户端的Cookie请求 ——> 逻辑处理 ——> 响应给浏览器
Session的工作原理
获取客户端请求 ——> 创建Session对象 ——> 将数据存入Session中 ——> 将Session响应给浏览器
接收客户端的Session请求 ——> 获取Session对象 ——> 逻辑处理 ——> 响应给浏览器
Cookie和Session之间的区别
- Session是客户端技术,Cookie是服务端技术
- Session是将数据保存到服务端中,Cookie是将数据保存到客户端中
- Cookie适合保存安全性不高但长期使用的数据,Session适合保存安全性高但短时间使用的数据
- 性能上Cookie可能高于Session,因为访问量增多时会降低访问效率
- Cookie最多不能保存超过4KB的数据,并且浏览器对Cookie的数量也会有限制,但是Session没有这些问题
- Cookie的默认生命周期是直到浏览器关闭,Session是30min内没有访问则销毁
Session获取失败的原因
Session是基于Cookie工作的,但是Cookie默认的生命周期是直到会话结束就会关闭,所以当Cookie销毁时Session也会跟着销毁,所以当你重新打开浏览器时,无法获取到Session对象。
解决:可以创建一个Cookie,保存其中Session的id值,并且设置其生命周期,让数据保存到硬盘中。
什么是事务
就是将一堆SQL语句绑定在一起执行,要么全部执行,要么全部失败,不可能存在一部分成功,一部分失败。
事务的四大特征
- 原子性:事务的执行,要么全部成功,要么全部失败
- 隔离性:一个执行中的事务的执行不能被另一个执行中的事务进行干扰,也就是说一个事务只能接到另一个事务执行前或者执行后的数据,不可能接收到执行中的数据。
- 持久性:执行成功的事务,其数据必须持久的保存到数据库中
- 一致性:无论事务执行前后,数据都应该是一致的;既转账前后,总金额不变
事务并发读问题
两个事务对相同的数据进行操作,这叫事务并发
事务并发时,如果没有采取必要的隔离措施,可能会导致各种并发问题,它们可以细分为三类:
幻读:一个事务对同一记录连续两次读取不一致,因为有另一个事务对数据进行修改(仅针对insert操作)
脏读:当一个事务读取到另一个事务未提交的数据,即为脏读
不可重复读:一个事务对同一记录连续两次读取不一致,因为有另一个事务对数据进行修改(仅针对update操作)
数据库给出了4个隔离等级,来防范这些问题:
- READ UNCOMMITTED(读未提交数据):隔离级别最低,什么并发问题都可能出现,但是它的效率最高
- READ COMMITTED(读已提交数据):隔离级别第三,只能防止脏读,效率第二,Oracle数据库默认的隔离等级
- REPEATABLE READ(可重复读):隔离级别第二,能防止脏读以及不可重复读,MySQL数据库默认隔离等级
- SERIALIZABLE(串行化):不会出现任何并发问题,因为它不是并发访问的,性能最差
业务层的事务控制
Spring提供了两种事务控制,声明式事务控制 和 编程式事务控制
声明式事务控制:声明式事务基于AOP,将核心业务逻辑与事务处理进行拆分;声明式事务管理将开发者从繁杂的事务管理代码中解脱出来,专注于业务的开发上;实现的方法是基于XML配置实现 或者 @Transactional注解进行实现
@Transactional注解方法:
- timeout:超时时间
- Isolation:隔离级别
- rollbackFor:出现xxx异常回滚
- noRollbackFor:xxx异常不回滚
- readOnly:是否是只读事物
@Transactional底层实现:DefaultSqlSession中的无参的commit方法,然后调用DataSourceTransactionManager中的事物方法进行事务控制
业务层事务控制的优点:在业务层保证了事物的原子性,要么全部成功,要么全部失败;底层只会调用一次SqlSession对象以及一次commit方法
Spring中事物传播特性:指不同业务对象中的事物方法之间互相调用时,事物的传播方式
关于事务的SQL代码
Start transaction —— 开启事务
Rollback —— 回滚事务
Commit —— 提交事务
数据表与数据表之间的关系
主键(pk):不可重复,一般设置为主表
外键(f k):可以重复,一般设置为从表
————————————————————————
- 一对一:是两个表之间的关系
- A表中的一个数据 对应 B表中的一个数据
- B表中的一个数据 对应 A表中的一个数据
- A表和B表之间要有一个相互对应的字段,既主表中的主键(pk)与从表中的外键(fk),并且从表的外键可以与主键合并
- 一对多:是两个表之间的关系
- A表中的一个数据 对应 B表中的一个数据.
- B表中的一个数据 对应 A表中的多个数据
- A表和B表之间要有一个相互对应的字段,既主表中的主键(pk)与从表中的外键(fk),并且从表的外键不能与主键合并
- 多对多:是三个表之间的关系,也就是双向一对多
- 在A表与B表之间会有一个C表,可以将C表看为一个从表,A表和B表都是主表,A表与C表、B表与C表都是一对多的关系
- 如果A表想要关联B表,那么 A表中的一个数据 对应 C表中的多个数据,然后 C表中的一个数据 对应 B表中的一个数据
- 如果B表想要关联A表,那么 B表中的一个数据 对应 C表中的多个数据,然后 C表中的一个数据 对应 A表中的一个数据
- A表和B表要有一个主键(pk),分别对应C表的外键(fk),并且C表中的主键(pk)与外键(fk)不能合并
什么是Mybatis
Mybatis它是一个优秀的持久层框架,他对JDBC的操作数据库的过程进行了封装,让开发者只需要关注SQL语句,不需要去处理其他的事务如:注册驱动手动设置参数等。
总之,Mybatis对JDBC访问数据库的过程进行了封装,简化了JDBC代码。
使用传统的JDBC访问数据库和Mybatis访问数据库之间的区别
- JDBC访问数据库会频繁的创建,关闭连接,效率低
- JDBC每次访问同一个数据时都会从数据库中提取
- JDBC访问数据库时有大量的重复代码
- Mybatis内部有连接池,省去了创建连接的步骤,提高了效率
- Mybatis内部有缓存,当提取重复数据时不必再去访问数据库,而是直接从缓存中获取
- Mybatis对JDBC进行了封装,简化了JDBC的代码
- 可以说,JDBC中的大部分问题(代码繁琐,太多重复代码,释放资源,结果处理太麻烦等)在Mybatis中都得到了解决。
Mybatis框架架构图
- SQLMapConfig.xml是Mybatis的核心配置文件,通过其中的配置可以生成SQLSessionFactory对象,也就是SQLSession工厂
- SQLSessionFactory创建一个SQLSession对象
- SQLSession获取Mapper.xml中的SQL语句,并发送给Executor
- Executor执行SQL语句
- MappedStatement对象用于接收输入映射(SQL中的参数),并做输出映射(SQL执行后的结果)
调用数据库的顺序
API的使用架构
Mybatis执行SQL语句的的运行顺序
Mybatis框架里执行:
- 先创建SQLSessionFactory工厂
- 在创建SQLSession对象
- 执行SQL方法
- 获取连接对象
- 通过Driver接口的connect方法创建连接,或者从连接池中获取连接
- 注:步骤五 是在连接对象执行GetConnection方法时才会运行,没有执行是是不会生效的
- 提交事务
- 释放资源
Mybatis在运行时会创建几个代理对象
答:一共两个,一个是@Mapper注解创建的代理对象,用于创建SQLSession对象,另一个则是SQLSession对象的代理对象,用于处理SQl语句与参数
HikariCP为什么性能好,在那些方面做了优化
- HikariCP舍弃了ArrayList,使用了自己FastList,在ArrayList中的Get方法会对Index做范围检查,而在FastList中范围检查是不必要的。
- HikariCP还提供了一个自定义的无锁ConcurrentBag,实现类高度的并发和极端的低延迟
@Mapper运行过程以及如何实现接口方法
- 由该注解修饰的接口,在运行时,会由Mybatis创建(代理对象)实例,然后交给Spring容器进行管理和对象的创建
- 由Mybatis创建实例的具体过程如下:
创建SQLSessionFactory工厂
获取SQLSession对象
执行使用Session方法
提交事务
释放资源 - 因为@Mapper注解中有一个@Target注解,在@Target注解中的参数有(类型、方法、字段以及参数),依靠这些参数来重写接口方法
SQL语句中 #{ } 和 ${ } 之间的区别
- #{ }:
一般是在获取动态数值时使用
如果值的类型是日期或者字符串,会在值的两边加上单引号
#{ }可以允许一个参数没有进行封装 - ${ }:
一般是在获取数据名称时使用
不管获取的值类型是什么,都是直接代替掉占位符,不会加单引号
${ } 占位符的参数不管有几个,都必须 全部封装到Map集合中
MySQL语言
MySQL语言分为两种,DDL、DML、DCL。
DDL:数据库定义语言,其中有Create、Drop等
DML:数据库操作语言,其中有Select、Updata、Delete、Insert等
DCL:数据库事物语言/事务代码,其中有Rollback、Commit等
Spring框架
- Spring是一个开源的轻量级框架,目的是为了简化企业级应用程序开发,降低开发者的开发难度
- Spring提供了IOC(控制反转,将创建和管理对象的权利交给Spring容器)和AOP(面向切面编程)应用,可以将组件之间的耦合度降至最低(解耦),便于升级或者是维护。
- Spring还可以与第三方框架和技术进行整合,可以自由选择采用那种技术进行发开。
为什么使用Spring框架
- 方便解耦,简化开发,通过IOC容器,降低了组件与组件之间的耦合
- AOP编程支持,方便面向切面编程,如事务管理,日志记录等
- 声明式事物的支持
- 方便集成各种优秀框架
- 降低Java EE API的使用难度,对一些重复枯燥的代码进行了封装,降低了开发难度
Spring IOC
控制反转,底层是一个Map集合,将创建和管理对象的权利交给Spring容器。
Spring AOC
- Spring AOOP底层基于代理机制实现功能扩展
- 假如目标对象(被代理对象)实现接口,则底层可以采用JDK动态代理机制为目标对象创建代理对象(目标类和代理类会实现共同接口)
- 假如目标对象(被代理对象)没有实现接口,则底层可以采用CGLIB代理机制为目标创建代理对象(默认创建的代理类会继承目标对象类型)
注:CGLIB代理机制要比JDK动态代理机制更加的灵活。
- AOP相关术语分析
- 切面:横切面对象,一般为一个具体类对象,用于在业务核心代码之前或之后执行(可以借助@Aspect声明)
- 通知:在切面的某个特定连接点(核心业务方法)上执行的动作(扩展方法),例如Before、After、Around等
- @Before(前置通知)
- @AfterReturning(返回通知)
- @AfterThrowing(异常通知)
- @After(后置通知)
- @Around(环绕通知)
- 切入点:对连接点拦截内容的一种定义,一般可以理解为多个连接点的集合
- bean:用于匹配指定切面的所有方法
- within:用于匹配指定包下所有类中的所有方法
- execution:按指定语法规则匹配到具体方法
- @annotation:用于匹配指定注解修饰的方法
- 连接点:是指切入点集合中正在被调用的一个方法
异步AOP操作实现
在AOP操作中,往往会将两个或两个以上的不同业务对象方法连接在一起,这会导致串行的缺陷,所以需要AOP异步操作将串行改并行(异步)
- 实现AOP异步的步骤
- 在启动类上添加@EnableAsync
- 在业务对象方法上添加@Async
- @Async中有(核心线程,最大线程,任务队列,线程名称,拒绝策略,执行异常)
依赖注入
即容器动态的将某种依赖关系的目标对象实例注入到应用系统中的各个关联组件之中。
简单来说就是:在创建对象之前或者之后 如何给对象的属性赋值。
依赖注入的方法有二种,Set注入 和 构造方法注入
MVC设计模式
MVC设计模式是一种通用的编程思想,在该模式下,任何软件都分为三个部分
控制程序流转的控制器(controller)
封装处理数据的模型(Model)
负责展示页面的视图(View)
在该涉及思想当中,每个部分都应该相互独立,互不干扰,并且只做自己擅长的部分,如果某一个部分发生变化,都尽量不影响到其他部分,这样有利于后期的升级或维护。
SpringMVC
SpringMVC是Spring框架的一个模块,Spring和SpringMVC无需中间整合层整合
SpringMVC是一个基于MVC的WEB框架
SpringMVC执行原理
JavaEE经典架构
这里有五个组件,分别为Controller、Service、Dao、POJO、JSP
- Controller为控制程序流转的控制器(controller)
- JSP为负责展示页面的视图(View)
- Service、Dao、POJO为封装处理数据的模型(Model)
JavaEE:
用来开发B/S架构软件,可以说是一个框架或者规范,其中包含了Spring全家桶(Spring、SpringMVC、Mybatis),后来逐渐成为了JavaWEB开发的标椎
它与JavaSE之间的区别在于JavaEE是对JavaSE的基础上做了扩展
JavaEE的主要技术有:JDBC、Servlet、JSP等
Web Client(网页客户端)向Web Server(服务端发起请求)的请求响应过程
- 从线程池中获取线程
- 用IO从Web Client中读取数据
- 将数据解析成String字符串
- 创建请求响应对象以及储存数据
- 在Servlet中进行过滤和处理数据
- 给响应对象Set value值以及发送给Web Client
Web Client(网页客户端)向Web Server(服务端发起请求)的过程
- 客户端请求先经过过滤器
- Servlet接受请求
- Servlet交给Service、Dao处理
- Service、Dao根据SQL访问数据库
- 数据库根据TCP协议返回数据给Dao、Service
- 将数据封装到POJO中,并交给Servlet
- Servlet找到对应的JSP,并将POJO中的数据交给JSP
- 输出JSP
整体的软件分层架构
- 软件接入层(网关、负载均衡、CDN)
- 软件应用层(程序员编写的系统,比如说MVC等)
- 中间件平台(Tomcat、MySQL)
- 操作系统(Windows、Linux、IOS)
- 基础设施层(CUP、存储/网络设备)
软件应用层架构图
SpringBoot概述以及和新特性
在传统的Spring应用中,配置复杂,依赖冲突严重,扩展麻烦
SpringBoot是在企业更注重技术的开箱即用,更注重轻量级运维的情况下诞生
SpringBoot构建于Spring框架基础之上进行了优化(类似于工具),其核心主要有:起步依赖、自动配置、监控
如何确定是否是一个启动类
先确定时候有SpringApplication.run(xxx.class,args); 在确定这个类是否有@SpringBootApplication注解
@SpringBootApplication执行原理
由Spring IOC容器创建的多个同一对象时,是单实例还是多实例,它们之间的优缺点有哪些?
默认情况下是单实例,也可以更改Scope属性的值变成多实例
- 单实例:同一个对象的实例只会有一个存在,可以节省很多资源浪费,但是如果有多人同时访问同一个对象,那么会造成线程安全问题;创建单例对象时Spring框架会将其存储到BeanPool中,当对象是单例时是支持Lazy
- 多实例:同一个对象可以创建多个实例,每次创建的实例都是新的一个对象,不会引发线程问题,缺点都是资源浪费;创建多例对象Spring框架不会将其存储到BeanPool中,当对象是多例时不支持Lazy
@Lazy注解原理
懒加载,不会在第一时间创建实例,在调用方法时在进行实例创建,一般运用在占资源大却又不常使用的对象。
生命周期
分为@PreDestroy和@PostConstruct
- @PostConstruct:被该注解修饰的方法,会在方法初始化之前(init)执行。
- @PreDestroy:被该注解修饰的方法,会在方法被销毁之前执行
@autowried注解的运行步骤
首先,要想运行@Autowried,就需要该类的对象交由Spring容器进行管理。
当Spring框架运行到@Autowried时,会从BeanPool中查找到是否有相匹配的对象,这里还会分为两种情况:
- 一种是BeanPool中只有一个相对应属性,那么会直接注入
- 一种是BeanPool中有多个相对应的属性,那么会根据属性名在对应的属性中查找到相同名称的属性来进行注入
SpringMVC架构图
当项目中pom.xml文件报错有几个原因,怎么解决?
- 工具的版本太老
- Maven私服没有配置成功
Window —> preferences —> maven —> user settings如果有问题,检查Settings.xml文件。 - pom.xml中的一些配置没有下载完成
右键项目 —> maven —> update maven project —> 勾选Force…… —> 点击OK
什么是Maven,Maven的作用
Maven是一个开源项目,可以管理企业级Java项目开发以及依赖管理;Maven可以简化配置,统一项目结构,让开发变得更加简单
PO
PO:持久化对象、与数据表中字段有映射关系
POJO:普通的Java对象
VO:View+Object / Value+Object
- Value+Object:值对象、用于封装业务数据(可能在层与层之间进行传递、一般与数据表没有映射关系)
DTO:数据传输对象,
BO:业务对象