SSM_框架简答题

文章目录

  • 一:StringMVC
    • 1、讲一下MVC
    • 2、springmvc的执行流程
    • 3、什么是Spring MVC框架的控制器?
    • 4、SpringMVC跳转一个页面,怎么返回一个json数据?
    • 5、分层设计的优缺点
    • 6、SpringMVC和Spring的常用注解
    • 7、从页面传数据到后台的几种方式,以及后台如何接收
    • 8、SpringMVC是怎么处理Http请求的?
    • 9、@Controller 注解的作用
    • 10、@RequestMapping 注解的作用
    • 11、注解开发怎么返回集合数据
  • 二:StringCloud
    • 1、SpringCloud-微服务的解决方案(框架)中有哪些技术?
    • 2、你的项目是如何使用jwt的?
    • 3、比较shiro和jwt的区别
    • 4、电商专业术语
    • 5、什么是有状态?
    • 6、什么是无状态
    • 7、什么是单点登录
    • 8、elasticsearch的查询
    • 9、购物车的实现思路
    • 10、avtiveMQ
    • 11、SpringBoot和Spring cloud的区别
    • 12、Httplicent/RestTemplate和feign的区别
    • 13、什么是RestFul风格?
  • 三:MyBatis
    • 1、Mybatis是什么?
    • 2、Mybatis和JDBC的关系?
    • 3、什么是ORM?
    • 4、MyBatis的两种配置方式?
    • 5、Mybatis中#{}和${}的区别是什么?
    • 6、使用Mybatis过程中当实体类中的属性名和表中的字段名不一样 ,怎么解决?
    • 7、模糊查询like语句该怎么写?
    • 8、使用Mybatis时Dao接口里的方法能重载吗?
    • 9、Mybatis是如何进行分页的?
    • 10、Mybatis分页插件的原理是什么?
    • 11、Mybatis是如何将sql执行结果封装为目标对象的?
    • 12、Mybatis动态sql标签有那些?
    • 13、Mybatis与Hibernate区别在哪里?

一:StringMVC

SSM_框架简答题_第1张图片

1、讲一下MVC

MVC设计模式: Model-View-Controller简写。
MVC是软件工程中的一种软件架构模式,它是一种分离业务逻辑与显示界面的设计方法。它把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller)。

  • 控制器Controller:对请求进行处理,负责选择视图;
  • 视图View:用户与程序交互的界面;
  • 模型Model:用于业务处理

2、springmvc的执行流程

SpringMVC是一个MVC框架,springmvc的工作流程:

  1. 发送请求:在浏览器输入请求路径,发送请求,前端控制器连接所有的请求。
  2. 获得处理器:核心控制器(DispatcherServlet)接收到请求,通过处理器映射器(handlerMapping)获得对应的处理器(Handler)
    大白话:根据请求路径获得对应的controller。
  3. 执行处理器:通过处理器适配器(HandlerAdapter)执行处理器(Handler),并返回视图模型对象(ModelAndView)
    大白话:执行controller方法。如果方法返回的字符串,底层也会转换成ModelAndView。
  4. 解析视图:通过视图解析器(ViewResolver)解析ModelAndView中的视图,将逻辑视图解析成真正的视图。
  5. 渲染视图:将Model中的数据渲染到视图(View)中
  6. 响应结果
    大白话:将模型数据(查询结果)渲染到jsp页面中,并将处理结果响应给浏览器。

3、什么是Spring MVC框架的控制器?

Spring框架的核心控制器(前端控制器)是DispatherServlet
他的核心功能就是分发请求,请求会被分发给对应处理的类handler。

4、SpringMVC跳转一个页面,怎么返回一个json数据?

使用@ResponseBody注解,将返回json数据。
1.如果在方法使用该注解,当前方法返回json数据。
2.如果在类上使用该注解,当前类中所有的方法,都将返回json数据。

springmvc默认用jackson对json数据进行转换,但需要添加jackson的包

扩展阅读:

  • 消息转换器原理解析:https://blog.csdn.net/shadabing/article/details/84664402
  • SpringBoot配置Fastjson:https://blog.csdn.net/cjq2013/article/details/76421101
  • SpringMVC配置Fastjson:https://blog.csdn.net/do_bset_yourself/article/details/51324186

5、分层设计的优缺点

  • 优点:
    1、开发人员可以只关注整个结构中的其中某一层;
    2、可以很容易的用新的实现来替换原有层次的实现;
    3、可以降低层与层之间的依赖;
    4、有利于标准化;
    5、利于各层逻辑的复用
  • 缺点:
    1、降低了系统的性能。这是不言而喻的。如果不采用分层式结构,很多业务可以直接造访数据库,以此获取相应的数据,如今却必须通过中间层来完成。
    2、有时会导致级联的修改。这种修改尤其体现在自上而下的方向。如果在表示层中需要增加一个功能,为保证其设计符合分层式结构,可能需要在相应的业务逻辑层和数据访问层中都增加相应的代码。

6、SpringMVC和Spring的常用注解

1.Spring相关注解
1.1)声明bean的注解
@Component 通用注解,用于声明bean。可以配置任意组件。
@Repository 派生注解,与@Component等效,Dao实现类推荐使用的注解,不仅可以声明bean,而且提高可读性。 
@Service 派生注解,与@Component等效,Service实现类推荐使用的注解,不仅可以声明bean,而且提高可读性。
@Controller 派生注解,与@Component等效,Controller实现类推荐使用的注解,不仅可以声明bean,而且提高可读性。 

1.2)bean注入的相关注解
@Autowired:按类型注入,
@Resource(name=""):按名称注入
@Resource():先按名称注入,如果没有再按照类型。

1.3)配置类相关注解
@Bean 注解在方法上,声明当前方法的返回值为一个bean。
@Configuration 声明当前类为配置类,内部常使用@Bean进行详细配置。取代了xml文件配置。
@ComponentScan 用于对Component进行扫描,可以配置扫描的包路径

1.4@Value注解:为属性注入简单值

2.SpringMVC相关注解
@RequestMapping 修饰方法,将请求路径映射到Controller对应的处理方法上。
                              修饰类,给请求路径添加访问前缀(二级路径)
@ResponseBody 将返回值转换成json数据,并响应给浏览器。
@RequestBody 将json格式的请求参数,封装到指定的JavaBean中。
@PathVariable 用于接收路径参数,比如@RequestMapping(/hello/{
     name})申明的路径,参数前使用注解@PathVariable("name"),就可以获取name对应的值。
@RestController 该注解为一个组合注解,相当于@Controller@ResponseBody的组合,注解在类上,意味着,该Controller的所有方法都响应JSON格式数据。

7、从页面传数据到后台的几种方式,以及后台如何接收

1.地址栏参数或普通表单请求,如:age=18&gender=man,SpringMVC方法参数需要使用@RequestParam(“参数名”)获得参数值。
2.提交json类型数据,SpringMVC 方法参数需要使用@RequestBody 将数据封装到java对象中。
3.路径占位符:如 http://localhost:8080/user/findById/1,使用@RequestMapping(“findById/{id}”)匹配路径,使用@PathVariable(“id”)获得对应的参数值。
4.文件上传,修改表单请求为"multipart/form-data"方式,SpringMVC采用MultipartFile参数类型接收数据

8、SpringMVC是怎么处理Http请求的?

其实问题相当于SpringMVC的执行流程,DispatcherServlet用来处理所有的HTTP请求和请求响应,回答SpringMVC的执行流程即可。

9、@Controller 注解的作用

@Controller 是@Component的派生注解,功能就是将被修饰的类添加到spring容器。
字面意思,用于修饰Controller层的组件,提高可读性。

10、@RequestMapping 注解的作用

修饰方法,将请求路径映射到Controller对应的处理方法上。
修饰类,给请求路径添加访问前缀(二级路径)

11、注解开发怎么返回集合数据

使用 @ResponseBody 注解将Java集合转换json数组,并将结果响应给浏览器。

二:StringCloud

1、SpringCloud-微服务的解决方案(框架)中有哪些技术?

  1. Eureka注册中心
  2. Ribbon负载均衡器
  3. Hystrix熔断器
  4. Feign远程调用技术
  5. zuul网关
    • 动态路由–只需要在yml中配置即可
    • 权限控制–过滤器
    • 负载均衡

2、你的项目是如何使用jwt的?

总:在项目中,我们使用jwt的场景有:

  场景一:登录的时候,生成jwt

 场景二:请求的时候,验证jwt 

分:场景一:当用户输入用户名和密码之后,会将信息传送到服务器,服务器派发auth服务器进行处理,验证用户名和密码是否正确,如果正确,则创建jwt,返回给客户端

   场景二:客户端每次请求的时候,在请求头header中携带jwt,请求到达zuul的时候,对jwt进行校验,如果校验通过,则放心,如果校验失败,则拦截

3、比较shiro和jwt的区别

相同点:都是进行权限校验
不同点:1 shiro是一个功能齐全的认证、授权、加密、会话管理的框架,而jwt只是一个生成token的机制

2 shrio提供的是散列算法进行加密,而jwt采用base64编码/ 加密,可以解密
两者可以结合使用!SpringBoot+shiro+jwt进行权限校验

4、电商专业术语

  • PV:page views ,页面的浏览量
  • UV:unique vistors ,独立访客
  • QPS:服务器秒杀处理请求的数量
  • 带宽:由PV计算得到带宽
  • 计算服务器数量 :根据二八原则,80%的请求集中在20%的时间内处理完成,然后在结合QPS,估算出服务器数量

5、什么是有状态?

答:使用session和cookie登录的时候,用户的登录信心保存在服务器的session中,然后将sessionId送到客户端,保存到cookie中,此时服务端通过session标记当前的请求,这就是有状态。

缺点:

  • 服务器需要更多的内存空间存储数据
  • 当集群之后,需要实现tomcat之间的session共享,否则每次都只能请求某一个tomcat
  • 无法实现节点的动态扩展、水平扩展

6、什么是无状态

  • 特点
    1. 服务器不保存任何用户的信息以及客户端信息
    2. 客户端每次请求的时候,都将token带到服务器进行身份校验
  • 实现方式:token–jwt是token的标准解决方案
  • 优点
    1. 节约了服务器空间
    2. 方便节点的动态扩展
  • 缺点
    1. 服务器无法注销token,设置了存活多久,就会一直存活
    2. 需要手动刷新token,操作繁琐–作业

7、什么是单点登录

  • 概念:多套系统只需要登录一次,就可以访问其他系统
  • 注意:单点登录一定需要一个独立的认证授权中心
  • 单点登录就是无状态登录,单点登录的流程是:
  1. 用户登录的时候,将用户名和密码提交到认证授权中心
  2. 认证授权中心校验用户名和密码,如果正确,颁发jwt凭证,返回客户端,保存到localStorage中
  3. 如果不正确,返回错误信息
  4. 客户端每次请求都会携带token,到服务器进行认证

8、elasticsearch的查询

  1. 自定义方法:findByXXX
  2. 自定义查询:
    • matchQuery:先分词再查找,底层调用的是termQuery
    • termQuery:不分词直接查找
    • rangeQuery:范围查找
    • fuzzyQuery:模糊搜索
    • wildcardQeuery:通配符匹配
    • booleanQuery:布尔查询

9、购物车的实现思路

  • 未登录:直接保存到本地localStorage中
  • 已登录:保存到redis中
    1. 获取token,解析token
    2. 从redis中取出当前用户的购物车信息
    3. 取不出:直接保存数据到redis中
    4. 取出了,判断当前商品是否已经在购物车中
    5. 如果当前商品已经在购物车中了,就修改数量
    6. 如果当前商品不在购物车中,则追加到购物车中

10、avtiveMQ

  • 是什么?答:消息队列
    • 应用场景是什么?答:流量削峰、应用解耦、异步通信、日志处理、消息通讯

    • 几种消息模型?答:Queue队列消息、Topic广播模型

    • 这些消息模型的区别?
      答:queue队列消息一定要被成功消费才可以退出消息队列;
      queue队列消息只能被消费一次;
      queue队列消息没有时间要求;
      topic广播模型可以拥有多个消费者,不管消息被消费多少次,也不管消息是否被成功消费,都会退出队列
      对时间要求比较严格,先有消费者,再有生产者

    • 消息队列和队列消息是同一个东西吗?答:不是,消息队列指的是MQ,而队列消息指的是Queue消息模型

11、SpringBoot和Spring cloud的区别

1.springboot可以单独使用,它不依赖于springcloud
而springcloud必然依赖于springboot,属于依赖关系。
2. Springboot专注于快速方便的开发单个个体服务。
3. SpringCloud是关注全局的微服务协调整理治理框架,它将SpringBoot开发的一个个单体微服务整合并管理起来,为各个微服务之间提供,配置管理、服务发现、断路器、路由、等集成服务。

12、Httplicent/RestTemplate和feign的区别

1 相同点:都是远程调用技术,都是系统间相互调用的技术
2 不同点:

  • Feign属于SpringCloud中的技术,HttpClient属于apache的技术
  • 使用方式不同:HttpClient得手动写很多代码,发送请求,而Feign只需要定义接口即可访问远程服务

13、什么是RestFul风格?

就是一套编程风格,URI是固定的,根据请求的方式调用不同的方法进行处理

三:MyBatis

1、Mybatis是什么?

mybatis是一个持久层ORM框架。它内部封装了jdbc,使得开发更简洁,更高效。
Mybatis使开发者只需要关注sql语句本身,简化JDBC操作,不需要在关注加载驱动、创建连接、处理SQL语句等繁杂的过程。
MyBatis可以通过xml或注解完成ORM映射关系配置。

2、Mybatis和JDBC的关系?

JDBC是Java提供的一个操作数据库的API; MyBatis是一个持久层ORM框架,底层是对JDBC的封装。
MyBatis对JDBC操作数据库做了一系列的优化:
(1) mybatis使用已有的连接池管理,避免浪费资源,提高程序可靠性。
(2) mybatis提供插件自动生成DAO层代码,提高编码效率和准确性。
(3)mybatis 提供了一级和二级缓存,提高了程序性能。
(4) mybatis使用动态SQL语句,提高了SQL维护。(此优势是基于XML配置)
(5) mybatis对数据库操作结果进行自动映射

3、什么是ORM?

ORM的全称是Object Relational Mapping,即对象关系映射。
描述的是对象和表之间的映射。操作Java对象,通过映射关系,就可以自动操作数据库。
在ORM关系中,数据库表对应Java中的类,一条记录对应一个对象,一个属性对应一个列。
常见的ORM框架:Mybatis、Hibernate

4、MyBatis的两种配置方式?

注解、XML

5、Mybatis中#{}和${}的区别是什么?

1.#{}实现的是sql语句的预处理参数,之后再sql中用?号代替,使用时不需要关注数据类型,Mybatis自动实现数据类型的转换,并且可以防止SQL注入;
2. 实 现 的 是 s q l 语 句 的 直 接 拼 接 , 不 做 数 据 类 型 转 换 , 需 要 自 行 判 断 数 据 类 型 , 不 能 防 止 S Q L 注 入 ; 3. 在 某 些 特 定 情 况 下 必 须 使 用 {}实现的是sql语句的直接拼接,不做数据类型转换,需要自行判断数据类型,不能防止SQL注入; 3.在某些特定情况下必须使用 sqlSQL3.使{},如:在分表存储的情况下,对哪张表的查询是不确定的,也就是sql语句不能写死,表明是动态的,查询条件是固定的,此时表明只能使用${}方式进行字符串拼接,这样:slect * from ${tableName} where id = #{id}

总结:#{}占位符,用于参数传递; ${}用于SQL拼接

6、使用Mybatis过程中当实体类中的属性名和表中的字段名不一样 ,怎么解决?

  1. 通过在查询的sql语句中定义字段名的别名,让字段名的别名和实体类的属性名一致
    2.使用通用Mapper时,可以通过@Column注解设置
    3.如果进行自定义查询,可以通过@Result进行设置
    【了解】4.如果使用的xml配置,通过进行配置

7、模糊查询like语句该怎么写?

1.使用通用Mapper的Criteria进行like语句的拼凑
2.使用#{}占位符方式,参数前后拼凑%。(select * from t_user where username like #{username} ,username数据为"%jack%")
【了解】3.使用 字 符 串 拼 接 方 式 , 可 能 引 发 s q l 注 入 问 题 : s e l e c t ∗ f r o m t u s e r w h e r e u s e r n a m e l i k e ′ {}字符串拼接方式,可能引发sql注入问题:select * from t_user where username like '% sqlselectfromtuserwhereusernamelike{username}%’

8、使用Mybatis时Dao接口里的方法能重载吗?

不能重载的,
因为是全限定名+方法名的必须唯一。

9、Mybatis是如何进行分页的?

使用第三方分页助手:PageHelper
使用方式:
在将要执行查询sql语句之前使用分页助手:PageHelper.startPage(pageNum:页码, pageSize:每页显示数量);

10、Mybatis分页插件的原理是什么?

使用MyBatis插件(也称为拦截器)机制,对需要使用分页的功能进行增强。也就是重写SQL,根据不同的数据库生产不同的分页语句。
Mysql生成limit语句,Oracle借助rownum生产对应子查询语句。

11、Mybatis是如何将sql执行结果封装为目标对象的?

提供POJO和表之间的映射关系,查询结果就可以完成封装。
1.使用通用Mapper,需要在POJO上字段上使用@Column注解
2.如果是自定义查询,需要通过Dao接口里使用@Result注解
3.如果是xml,需要使用配置映射关系

12、Mybatis动态sql标签有那些?

动态SQL标签主要是基于XML进行配置的,在校主要学习的是注解,没有使用过XML。
不过注解也支持部分动态标签,@Select("")

13、Mybatis与Hibernate区别在哪里?

Hibernate是全自动的ORM框架,也就是使用hibernate不用编写任何SQL语句。关联对象直接调用对应方法,可以自动完成数据的查询。
MyBatis封装了JDBC基本操作,但仍需要编写SQL语句,也称为半自动ORM框架。使用通过Mapper可以简化MyBatis单表操作,多表仍需要自己编写SQL语句。

你可能感兴趣的:(简答题,简答题)