1. 数据库中主键约束和唯一约束有什么区别?
主键约束包含了唯一约束和非空约束。而唯一约束可以为空值
索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结构,
它是表中一列或多列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。
索引的作用
* 保证数据的准确性
* 提高检索速度
* 提高系统性能
存储过程是一组为了完成特定功能而存储在数据库中的`SQL `语句集,一次编译后永久有效
事务( Transaction)是访问并可能操作各种数据项的一个数据库操作序列,
这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位。事务由事务开始与事务结束之间执行的全部数据库操作组成。
实体就是软件开发过程中所涉及到的事物,通常都是一类数据对象的个体
2. 你是如何来理解数据库交互的?(ORM = Object Relational Mapping 对象关系映射)
数据库交互不外乎就是将数据库中的每一条数据转换为Java的中一个对象,数据转换为
对象的时候,数据中的字段与对象中的属性必须匹配。
3. session和cookie的实现原理?
在Java的web设计中,采用的是HTTP协议进行交互,而HTTP是一种无状态协议,无法追踪
用户信息,为了能够追踪到用户信息,于是设计了session,当用户第一次访问的时候,
就会为这个用户创建一个session,然后将这个session的ID传回前端,前端使用cookie
将session的ID存储起来,以后每次新的请求都会携带cookie中的信息,这样后端就能够
感知到是否是同一个用户在访问
4. POST请求和GET请求有什么区别?
GET请求请求参数会在URL地址中展示,这样降低了安全性,同时浏览器或者服务器为了保
证性能问题,对GET请求的参数长度做出限制。而POST请求参数在请求体中,这样就保证了
数据的安全性,同时,POST请求没有参数长度限制
使用GET方式发送的请求,只能通过getParameter 方法获取;使用POST方式发送的请求,只能使用流来获取。
这是因为使用GET方式发送的请求,参数在URL地址中,解析这些参数的时候将其存放在一个Map集合中,因此可以直接获取。
而POS方式发送的请求,参数在请求体中,这部分内容只能通过流来读取,然后再进行处理。
5. JSP中有哪些域对象?
page、request、session、application
6. 转发和重定向的区别?
转发发生在服务器端,重定向发生在客户端。因为转发发生在服务器端,所以,地址栏信息
不会改变,而重定向发生在客户端,表示重新定位新的资源,因此,地址栏信息会发生变化
转发可以访问WEB-INF下面的资源,因为是服务器自己访问自己的资源。而重定向不能够访问
WEB-INF下的资源
7. 当接收的请求信息中出现乱码的时候,有哪些处理方式?
可以设置请求的字符集编码,也可以使用new String(bytes, "字符集编码")
8. Servlet的生命周期?
Servlet 是在服务器上运行的能够对客户端请求进行处理,并返回处理结果的程序
Servlet在第一次接收请求的时候被创建,然后调用init方法进行初始化,随后调用service
方法处理请求,并给出响应,然后在容器关闭之前会调用destory方法销毁Servlet实例
9. JSP和Servlet有什么区别?
从本质上来说,它们没有区别,因为JSP本质就是Servlet,只是随着技术的发展,JSP更
注重于页面展示,而Servlet更注重于业务逻辑处理。
10. 谈谈你对Servlet中的监听器的看法
我们通常使用的监听器就是ServletContextListener,这个监听器的主要作用就是监听器
上下文环境的变化,一般用于完成系统所需的初始化配置。比如数据源的初始化、邮件信息
的初始化。
11. 线程池在哪些场景下使用?
凡是需要处理大量数据而又不需要立刻做出反馈的地方都可以使用线程池,比如:Excel导入
以及邮件的发送(后续学习过程中会使用MQ来做)
12. 前后端分离开发的交互流程
前端必须使用AJAX发送异步请求,然后通过反向代理将请求代理至后端服务器,后端服务器
接收到请求后会寻找匹配的Servlet来处理请求,然后将处理的结果反馈给前端。
13. 数据库多表查询的原理
多表联查的关键就是主外键关联关系,链表查询是在笛卡尔积的基础上通过主外键关联关系
筛出一部分满足条件的数据,这些数据就是多表联查的结果
14. 为什么开发中我们需要使用三层结构?
三层结构:控制层(controller)、业务层(service)和数据访问层(dao Data Access Object)
分层可以使各层只专注于自己所做的事,能够提高作业效率,方便维护,哪一层出问题
就在哪一层去解决即可。
15. 谈谈你对RESTful风格的理解
RESTful风格就是用请求的方法来表述操作的意义,比如GET请求表示查询,POST请求表示
增加,PUT表示修改,DELETE请求表示删除
/user/admin => RESTful子资源的表述,这里表述的意义局势user中的admin这个用户
/exam/1 => 这里表述的就是考试中ID为1的考试
16.反射的理解
我们编写的程序从本质上来说也是文件,`JVM`加载类的过程相当于对文件内容进行解析,解析内容就需要找到共有特征( Class 类定义),
然后再将这特征(使用 Class 对象)存储起来,在使用的时候再取出来。通过 Class 对象反向推到我们编写的类的内容,然后再进行操作,这个过程就称为反射。
内置对象 request
获取客户端的参数和数据流
//返回一个RequestDispatcher对象,该对象的forward()方法用于转发请求
RequestDispatcher getRequestDispatcher(String path);
内置对象 response
对客户端请求做出响应
//重新定位新的资源,也叫重定向
void sendRedirect(String url);
session 就是浏览器与服务器之间的一次通话
内置对象 application
实现用户数据共享,将信息保存在服务器中,直到服务器关闭
Cookie 是 Web 服务器保存在客户端的一系列文本信息。
Session 机制采用的是在服务端保持状态的方案,而Cookie 机制则是在客户端保持状态的方案,Cookie 又叫会话跟踪机制,用来弥补HTTP无状态协议的不足
监听器顾名思义就是监听某种事件的发生,一旦监听的事件触发,那么监听器就将开始执行
RBAC全称为Role-Based Access Control,表示基于角色的访问控制。在RBAC中,有三个最常用的术语:
* 用户:系统资源的操作者
* 角色:具有一类相同操作权限的用户的总称
* 权限:能够访问资源的资格
### 为什么要使用ajax
`Servlet` 进行网页的变更往往是通过请求转发或者是重定向来完成,这样的操作更新的是整个网页,
如果我们只需要更新网页的局部内容,就需要使用到AJAX来处理了。
因为只是更新局部内容,因此,`Servlet` 传输的数据量就减少了,这不仅有效的利用了带宽,提高效率的同时还增加了用户的体验度,操作起来更为方便。
代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式,即通过代理对象访问目标对象.
这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能
代理模式分为静态代理和动态代理两种
IOC全称为 Inverse Of Control,表示控制反转。
指的是程序员使用硬编码创建的对象转为由Spring容器来创建,对于对象生命周期的控制交给Spring容器来管理。
控制反转解决了具有依赖关系的组件之间的强耦合,使得项目形态更加稳健
DI表示依赖注入。指的是在Spring创建对象的同时,为其属性赋值
注入方式
设值注入
指的是通过set方法为属性注入值。设值注入必须保证存在无参构造,否则将报错。
构造注入指的是通过构造放入为属性注入值。
JDK 动态代理是基于接口实现的,因此只能为实现了接口的类做代理。
其实现原理是:在内存中生成一个代理类继承与 Proxy, 同时实现代理接口,然后在内存中进行编译,编译后使用类加载器将该代理类加载进来,从而创建一个代理对象。
CGLIB 动态代理是基于继承实现的,因此可以为任何类做代理。
如果一个类实现了接口,通常会使用 JDK 动态代理,但也可以强制使用 CGLIB 动态代理。
区别
JDK 动态代理只能为实现了接口的类做代理, CGLIB 动态代理能够为所有的类做代理。
JDK 动态代理的创建代理从效率上来说要比 CGLIB 动态代理快。Cglib不能对声明final的方法进行代理,因为final关键字修饰的方法不可被重写。
### Spring MVC 核心组件
* DispatcherServlet 前置控制器
负责接收请求、分发请求
* Handler 处理器
处理器包括了拦截器、控制器中的方法等,主要负责处理请求
* HandlerMapping 处理器映射器
解析配置文件、扫描注解,将请求与处理器进行匹配
* HandlerAdpter 处理器适配器
根据请求来找到匹配的处理器,这个过程称为适配
* ViewResolver 视图解析器
处理器执行后得到的结果可能是一个视图,但这个视图属于逻辑视图(页面中存在逻辑代码,比如循环、判断),需要使用视图解器行处理,这个过程称为渲染视图
springmvc工作原理
客户端发送请求-> 前端控制器 DispatcherServlet 接受客户端请求 -> 找到处理器映射 HandlerMapping 解析请求对应的 Handler-> HandlerAdapter 会根据 Handler 来调用真正的处理器开处理请求,并处理相应的业务逻辑 -> 处理器返回一个模型视图 ModelAndView -> 视图解析器进行解析 -> 返回一个视图对象->前端控制器 DispatcherServlet 渲染数据(Moder)->将得到视图对象返回给用户
1. 用户发送的请求由DispatcherServlet来接收
2. DispatcherServlet接收到请求后会去询问HandlerMapping,
当前是否存在匹配的HandlerExecutionChain处理器执行链
3. 如果没有匹配的处理器执行链,那么就返回一个404
4. 如果存在匹配的处理器执行链,那么我们就询问HandlerAdapter,
当前是否存在匹配的适配器
5. 拿到处理器的适配器后,会先执行拦截器中的前置拦截,如果没有通过,那么直接返回。
如果通过了,那么就会执行处理器,得到一个
ModelAndView
6. 然后执行拦截器中的后置拦截
7. 将ModelAndView交给视图解析器进行渲染,得到真正的视图
8. 最后将视图传回前端展示