目录
spring的比较多,单独拿出来写了一篇了spring框架面试题总结_巴啦啦小刺猬的博客-CSDN博客
一、springMVC工作流程
- 用户发送请求到前端控制器DispatcherServlet
- 前端控制器调用处理器映射器HandlerMapper
- 处理器映射器生成处理器对象,返回给前端控制器
- 前端控制器调用处理器适配器HandlerAdapter
- 处理器适配器经过适配调用具体的控制器Controller执行
- Controller处理完成后,生成ModelAndView返回
- 前端控制器收到ModelAndView后传给视图解析器ViewResolver
- 视图解析器解析后返回View
- 前端控制器再根据model渲染view(模型数据填充到视图中)
- 前端控制器响应客户
二、SpringMVC和Struts2的区别
SpringMVC的核心控制器(也叫前端控制器是Servlet),而Struts2是filter
SpringMVC是基于方法设计,一个类(其实是一个单例对象)可以处理多个请求,Struts2是基于对象,每次请求都会产生一个action
三、SpringMVC是不是单例模式
是,所以在多线程访问的时候,会有线程安全问题,但是最好不要加同步,会影响性能,解决方案就是,在Controller层中不要有变量
四、如何指定拦截的是GET请求还是POST请求
在requestMapping中指定method = requestMethod.GET
post同理
五、mybatis和hibernate的区别
1、区别总览
1)sql 优化方面
- Hibernate 不需要编写大量的 SQL,就可以完全映射,提供了日志、缓存、级联(级联比 MyBatis 强大)等特性,此外还提供 HQL(Hibernate Query Language)对 POJO 进行操作。但会多消耗性能。
- MyBatis 手动编写 SQL,支持动态 SQL、处理列表、动态生成表名、支持存储过程。工作量相对大些。
2)开发方面
- MyBatis 是一个半自动映射的框架,因为 MyBatis 需要手动匹配 POJO、SQL 和映射关系。
- Hibernate 是一个全表映射的框架,只需提供 POJO 和映射关系即可。
3)Hibernate 优势
- Hibernate 的 DAO 层开发比 MyBatis 简单,Mybatis 需要维护 SQL 和结果映射。
- Hibernate 对对象的维护和缓存要比 MyBatis 好,对增删改查的对象的维护要方便。
- Hibernate 数据库移植性很好,MyBatis 的数据库移植性不好,不同的数据库需要写不同 SQL。
- Hibernate 有更好的二级缓存机制,可以使用第三方缓存。MyBatis 本身提供的缓存机制不佳。
4)Mybatis优势
- MyBatis 可以进行更为细致的 SQL 优化,可以减少查询字段。
- MyBatis 容易掌握,而 Hibernate 门槛较高。
总的来说,MyBatis 是一个小巧、方便、高效、简单、直接、半自动化的持久层框架,Hibernate 是一个强大、方便、高效、复杂、间接、全自动化的持久层框架。
所以对于性能要求不太苛刻的系统,比如管理系统、ERP 等推荐使用 Hibernate,而对于性能要求高、响应快、灵活的系统则推荐使用 MyBatis。
2、缓存机制
访问数据顺序是:一级缓存——》二级缓存——》数据库
(1)hibernate(默认一级缓存)
hibernate是持久层框架,经常访问物理数据库。为了较少对数据库的访问,提高数据库访问性能,加入了hibernate缓存机制
- 一级缓存 : 自带的不可卸载的.一级缓存的生命周期与session一致.一级缓存称为session级别的缓存.
- 二级缓存 : 默认没有开启,需要手动配置才可以使用的.二级缓存可以在多个session中共享数据,二级缓存称为是sessionFactory级别的缓存.
SessionFactory的缓存分为内置缓存和外置缓存。内置缓存中存放的是SessionFactory对象的一些集合属性包含的数据(映射元素据及预定SQL语句等),对于应用程序来说,它是只读的。外置缓存中存放的是数据库数据的副本,其作用和一级缓存类似.二级缓存除了以内存作为存储介质外,还可以选用硬盘等外部存储设备。二级缓存称为进程级缓存或SessionFactory级缓存,它可以被所有session共享,它的生命周期伴随着SessionFactory的生命周期存在和消亡。
(2)mybatis(默认一级缓存)
一级缓存为 SqlSession
缓存,缓存的数据只在 SqlSession 内有效。在操作数据库的时候需要先创建 SqlSession 会话对象,在对象中有一个 HashMap 用于存储缓存数据,此 HashMap 是当前会话对象私有的,别的 SqlSession 会话对象无法访问
二级缓存是 mapper
级别的缓存,也就是同一个 namespace 的 mapper.xml ,当多个 SqlSession 使用同一个 Mapper 操作数据库的时候,得到的数据会缓存在同一个二级缓存区域
二级缓存默认是没有开启的。需要在 setting 全局参数中配置开启二级缓存
(3)关于sql
MyBatis :可以自由书写SQL、支持动态SQL、处理列表、动态生成表名,支持存储过程
Hibernate:hql能自动生成sql,数据库移植性很好,MyBatis的数据库移植性不好,不同的数据库需要写不同SQL
(4)延迟加载
Hibernate对实体关联对象的抓取有着良好的机制。对于每一个关联关系都可以详细地设置是否延迟加载,并且提供关联抓取、查询抓取、子查询抓取、批量抓取四种模式。 它是详细配置和处理的。
而Mybatis的延迟加载是全局配置的。
六、Ajax
1、介绍
通过在后台与服务器进行少量数据交换,来使网页异步更新
通过异步模式,提升了用户体验
2、请求的步骤
- 创建XMLHttpRequest 对象(Ajax的核心就是XMLHttprequest),即创建一个异步调用对象。
- 创建一个新的HTTP 请求,并指定该HTTP 请求的方法(GET、POST或者delete、put),URL及验证信息
- 设置响应HTTP请求状态变化的函数
- 发送HTTP 请求
- 获取异步调用返回的数据
- 使用JavaScript和DOM 实现局部刷新