SSM框架知识点

SSM框架

第一部分:Spring

1.简述什么是Spring框架

Spring 框架是一个主流的 Java Web 开发框架:

  • 基于POJO的轻量级和最小侵入性编程;

  • 通过依赖注入和面向接口实现松耦合;

  • 基于切面和惯例进行声明式编程;

  • 通过切面和模板减少样板式代码。

3.Spring中bean的作用域

Bean的作用域是指spring容器从创建Bean到销毁的整个过程

  1. singleton,每个Bean的实例只创建一次

  2. prototype,每次获取Bean实例时都会新创建一个实例对象。

  3. request,对于每次HTTP请求,Spring容器都会创建一个Bean实例,整个请求过程使用相同的bean实例。不同的请求创建新的实例

  4. session,对于HTTP Session,每次会创建一个Session作用域的Bean

  5. globalsession,每个全局的HTTP Session,使用session定义的Bean都将产生一个新实例

4.Spring框架中的Bean是线程安全的么?

Spring框架中的单例bean不是线程安全的

非线程安全:Singleton(默认): Spring容器只存在一个共享的bean实例。

线程安全: Prototype: 每次对bean的请求都会创建一个新的bean实例。

5.@Autowired和@Resource的区别

  1. @Autowired是Spring的,@Resource是javax包下的

  2. @Autowired默认按类型匹配,@Resource默认按名称匹配

6.Spring中bean的生命周期

bean的生命周期描述的是Spring中的一个bean的创建过程和销毁过程中所经历的步骤。

  1. BeanDefinition对象的创建(bean定义)

  2. 构造方法的推断:(选出一个构造方法)

  3. 实例化:(构造方法通过反射得到对象)

  4. 属性填充:给属性进行自动赋值

  5. 初始化对其他属性赋值,校验

  6. 初始化后:AOP生成代理对象

7.Spring的事务传播机制

  1. REQUIRED(Spring默认的事务传播类型): 如果当前没有事务,则自己新建一个事务,如果当前存在事务,则加入这个事务。

  2. SUPPORTS: 如果当前存在事务,则加入当前事务,如果当前不存在事务,则以非事务方法执行。

  3. MANDATORY: 如果当前存在事务,则加入当前事务,如果当前不存在事务,则抛出异常。

  4. REQUIRES_NEW: 创建一个新事务,如果当前存在事务,则挂起该事务。

  5. NOT_SUPPORTED: 以非事务方式执行,如果当前存在事务,则挂起该事务。

  6. NEVER: 不使用事务,如果当前存在事务,则抛出异常。

  7. NESTED: 如果当前存在事务,则在嵌套事务内执行,如果当前不存在事务,则新建一个事务。

8.Spring中的事务隔离级别

  1. DEFAULT 这是一个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别

  2. 未提交读(read uncommited):脏读,不可重复读,虚读都有可能发生

  3. 已提交读(read commite):避免脏读。但是不可重复读和虚读有可能发生

  4. 可重复读(repeatable read):避免脏读和不可重复读.但是虚读有可能发生

  5. 串行化的(serializable):避免以上所有读问题

第二部分:SpringMVC

1.什么是MVC,以及简述Springmvc。

MVC的全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写(编程模式),将众多的业务逻辑聚集到一个部件里面,在需要改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑,达到减少编码的时间.

SpringMVC是一个基于MVC编程模式的Web框架,也是Spring的子模块

2.SpringMVC的执行流程?

  1. 用户向服务器发送请求,请求被Spring 前端控制Servelt DispatcherServlet捕获

  2. DispatcherServlet对请求URL进行解析,得到请求资源标识符(URI)。然后根据该URI,调用HandlerMapping获得该Handler配置的所有相关的对象(包括Handler对象以及Handler对象对应的拦截器),最后以HandlerExecutionChain对象的形式返回;

  3. DispatcherServlet 根据获得的Handler,选择一个合适的HandlerAdapter。(附注:如果成功获得HandlerAdapter后,此时将开始执行拦截器的preHandler(…)方法)

  4. 提取Request中的模型数据,填充Handler入参,开始执行Handler(Controller)。 在填充Handler的入参过程中,根据你的配置,Spring将帮你做一些额外的工作: HttpMessageConveter: 将请求消息(如Json、xml等数据)转换成一个对象,将对象转换为指定的响应信息 数据转换:对请求消息进行数据转换。如String转换成Integer、Double等 数据根式化:对请求消息进行数据格式化。 如将字符串转换成格式化数字或格式化日期等 数据验证: 验证数据的有效性(长度、格式等),验证结果存储到BindingResult或Error中

  5. Handler执行完成后,向DispatcherServlet 返回一个ModelAndView对象;

  6. 根据返回的ModelAndView,选择一个适合的ViewResolver(必须是已经注册到Spring容器中的ViewResolver)返回给DispatcherServlet ;

  7. ViewResolver 结合Model和View,来渲染视图

  8. 将渲染结果返回给客户端。

3.什么是重定向和转发,在SpringMVC如何实现重定向和转发?

转发是服务器行为, 重定向是客户端行为,如果请求是跳转页面,重定向和转发都可以做到,但如果需要回传消息的时候只有转发能做到:

  1. 转发使用的是request对象,等待处理完成之后继续跳转一次页面,因为request是一个作用域,故可以将信息携带到指定的参数到指定的页面中去

  2. 重定向就是我们客户端服务器发出请求,请求直接返回了另一个请求地址,然后浏览器会自动再次用返回的地址来向服务器发出返回的的请求。这里我们可以发现重定向的过程,因为URL变成了请求B。

4.@RestController和 @Controller区别是什么?

@RestController注解,相当于@Controller+@ResponseBody两个注解的结合,返回json数据不需要在方法前面加@ResponseBody注解了,但使用@RestController这个注解,就不能返回jsp,html页面,视图解析器无法解析jsp,html页面

5.SpringMVC中拦截器如何实现?

  1. 用户发送请求,经过前端控制器Dispacherservlet(Controller的核心)将url交给处理器映射器HandlerMapping处理

  2. 处理器映射器HandlerMapping处理url,返回HandlerExecutionChain(可能包含拦截器,一定包含自定义的Controller(handler))

  3. 前端控制器将Controller交给处理器适配器HandlerAdapter处理,处理完成后,返回MV对象(ModelAndView)

  4. 前端控制器将MV交给视图解析器处理ViewResolver,处理的过程:将MV拆分成Model和view两个对象,并且将model渲染到view视图上,并且将view返回给前端控制器。

  5. 最后,前端控制器将视图响应给用户.

6.拦截器和过滤器的区别?

  1. 拦截器(Interceptor)只对action请求起作用 即对外访问路径 而过滤器(Filter)则可以对几乎所有的请求都能起作用 包括css js等资源文件

  2. 拦截器(Interceptor)是在Servlet和Controller控制器之间执行 而过滤器(Filter)是在请求进入Tomcat容器之后 但是在请求进入Servlet之前执行

7.什么是RESTFUL?

restful 就是一个资源定位及资源操作的风格。不是标准也不是协议,相当于freestyle。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制

第三部分:MyBatis

1.什么是MyBatis?

  1. MyBatis 是一款优秀的持久层框架

  2. 它支持自定义 SQL、存储过程以及高级映射

  3. MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录

2. #{} 和 ${} 的区别?

  1. #{}是预编译处理,是占位符,${}是字符串替换,是拼接符

  2. Mybatis在处理#{}的时候会将sql中的#{}替换成?号,调用PreparedStatement来赋值

  3. Mybatis在处理${}的时候就是把${}替换成变量的值,调用Statement来赋值\

  4. #{}的变量替换是在DBMS中、变量替换后,#{}对应的变量自动加上单引号

  5. ${}的变量替换是在DBMS外、变量替换后,${}对应的变量不会加上单引号

  6. 使用#{}可以有效的防止sql注入,提高系统的安全性

3.简述MyBatis一级和二级缓存?

  1. 一级缓存作用域是sqlsession级别的,同一个sqlsession中执行相同的sql查询(相同的sql和参数),第一次会去查询数据库并写到缓存中,第二次从一级缓存中取。一级缓存是基于 PerpetualCache 的 HashMap 本地缓存,默认打开一级缓存。

  2. 它指的是Mybatis中SqlSessionFactory对象的缓存。由同一个SqlSessionFactory对象创建的SqlSession共享其缓存。二级缓存是 mapper 映射级别的缓存,多个 SqlSession 去操作同一个 Mapper 映射的 sql 语句,多个SqlSession 可以共用二级缓存,二级缓存是跨 SqlSession 的。

4.如何获取自增的主键?

  1. 通过JDBC2.0提供的insertRow()方式

  2. 通过JDBC3.0提供的getGeneratedKeys()方式

  3. 通过SQL select LAST_INSERT_ID()函数

  4. 通过SQL @@IDENTITY 变量

5. resultType 和 resultMap的区别?

  1. resultType直接表示返回类型,包括基础数据类型和复杂数据类型

  2. resultMap是对外部resultMap定义的引用,对应外部resultMap的id,表示返回结果到哪一个resultMap上。

  3. MyBatis的每个查询映射的返回类型都是 resultMap,只是当我们提供的返回类型属性是resultType 的时候,MyBatis 会自动把对应的值赋给resultType所指定对象的属性;而当我们提供的返回类型属性是 resultMap 的时候,因为 Map不能很好地表示领域模型,就需要通过进一步的定义把它转化为对应的实体对象

6.当实体类属性名和表中字段名不一致时如何处理?

  1. 通过在查询的 sql 语句中定义字段名的别名,让字段名的别名和实体类

的属性名一致.

  1. 通过<resultMap>来映射字段名和实体类属性名的一一对应的关系

7.Mybatis接口中传递多个参数时如何处理?

  1. 接口中传多个参数,在 xml 中使用 #{param0}、#{param1}...

  2. 使用 @param 注解指定名称,在 xml 中使用 #{名称}

  3. 、多个参数封装到 Java bean 中

  4. 多个参数指定 key,put 到 Map 中

8.写出你知道的动态sql标签?

  1. if标签(逻辑判断)

  2. where标签(SQL判断)

  3. choose,when,otherwise(Java中的switch)

  4. set (sql修改)

  5. trim(截断 添加)

  6. bind(模糊查询)

  7. foreach(循环)

  8. sql (复用)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值