JavaSSM框架精选50道面试题

JavaSSM框架精选50道面试题1 什么是 MVC 框架 传统 MVC 框架存在的问题是什么 MVC 框架是为了解决传统 MVC 模式 Jsp Servlet JavaBean 的一些问题而出现的框架 传统 MVC 模式存在问题 1 所有的 Servlet 和 Servlet 映射都要配置在 web xml 中 如果项目太大 web xml 就太庞大 并且不能实现模块化管理 2 Servlet 的主要功能就是接受参数 调用逻辑 跳转页面 比如像其

1.什么是MVC框架?传统MVC框架存在的问题是什么?

MVC框架是为了解决传统MVC模式(Jsp + Servlet + JavaBean)的一些问题而出现的框架。

2简单介绍下你对springMVC特点的理解?

3.简单的谈一下SpringMVC的工作流程?★★★★★

4.SpringMVC与Struts2的主要区别?

目前企业中使用SpringMvc的比例已经远远超过Struts2,那么两者到底有什么区别,是很多初学者比较关注的问题,下面我们就来对SpringMvc和Struts2进行各方面的比较:

  1. 核心控制器(前端控制器、预处理控制器):对于使用过mvc框架的人来说这个词应该不会陌生,核心控制器的主要用途是处理所有的请求,然后对那些特殊的请求 (控制器)统一的进行处理(字符编码、文件上传、参数接受、异常处理等等),spring mvc核心控制器是Servlet,而Struts2是Filter。

spring mvc处理ajax请求,直接通过返回数据,方法中使用注解@ResponseBody,spring mvc自动帮我们对象转换为JSON数据。而struts2是通过插件的方式进行处理

在SpringMVC流行起来之前,Struts2在MVC框架中占核心地位,随着SpringMVC的出现,SpringMVC慢慢的取代struts2,但是很多企业都是原来搭建的框架,使用Struts2较多。

5.如何解决POST请求中文乱码问题,GET的又如何处理呢?

6.说出SpringMVC常用的5个注解?如何使用 SpringMVC完成JSON操作?:

7. Spring 支持的事务管理类型有哪些?你在项目中使用哪种方式?怎么理解全局事务和局部事务?

Spring 支持编程式事务管理和声明式事务管理。许多 Spring 框架的用户选择声明式事务管理,因为这种方式和应用程序的关联较少,因此更加符合轻量级容器的概念。声明式事务管理要优于编程式事务管理,尽管在灵活性方面它弱于编程式事务管理,因为编程式事务允许你通过代码控制业务。声明式事务又分为两种: a、基于XML的声明式事务 b、基于注解的声明式事务

事务分为全局事务和局部事务。全局事务由应用服务器管理,需要底层服务器 JTA 支持(如 WebLogic、 WildFly等)。局部事务和底层采用的持久化方案有关,例如使用 JDBC 进行持久化时,需要使用 Connetion 对象来操作事务;而采用 Hibernate 进行持久化时,需要使用 Session 对象来操作事务

8.Spring 提供的事务管理器都有哪些?他们共同实现的父接口是什么?Spring 的事务管理机制体现了什么设计模式,请简单说说

Spring 提供了如下所示的事务管理器。

这些事务的父接口都是 PlatformTransactionManager。 Spring 的事务管理机制是一种典型的策略模式,PlatformTransactionManager 代表事务管理接口,该接口定义了三个方法,该接口并不知道底层如何管理事务,但是它的实现类必须提供 getTransaction()方法(开启事务)、 commit()方法(提交事务)、 rollback()方法(回滚事务)的多态实现,这样就可以用不同的实现类代表不同的事务管理策略。使用 JTA 全局事务策略时,需要底层应用服务器支持,而不同的应用服务器所提供的 JTA 全局事务可能存在细节上的差异,因此实际配置全局事务管理器是可能需要使用 JtaTransactionManager 的子类,如: WebLogicJtaTransactionManager( Oracle 的 WebLogic 服务器提供)、 UowJtaTransactionManager( IBM 的 WebSphere 服务器提供)等。

9.Spring为什么要结合使用HandlerMapping以及HandlerAdapter来处理Handler?

符合面向对象中的单一职责原则,代码架构清晰,便于维护,最重要的是代码可复用性高。如HandlerAdapter可能会被用于处理多种Handler。

10.简单介绍下你对mybatis的理解?

1. mybatis配置 2. SqlMapConfig.xml,此文件作为mybatis的全局配置文件,配置了mybatis的运行环境等信息。 3. mapper.xml文件即sql映射文件,文件中配置了操作数据库的sql语句。此文件需要在SqlMapConfig.xml中加载。 4. 通过mybatis环境等配置信息构造SqlSessionFactory即会话工厂 5. 由会话工厂创建sqlSession即会话,操作数据库需要通过sqlSession进行。 6. mybatis底层自定义了Executor执行器接口操作数据库,Executor接口有两个实现,一个是基本执行器、一个是缓存执行器。 7. Mapped Statement也是mybatis一个底层封装对象,它包装了mybatis配置信息及sql映射信息等。mapper.xml文件中一个sql对应一个Mapped Statement对象,sql的id即是Mapped statement的id。 8. Mapped Statement对sql执行输入参数进行定义,包括HashMap、基本类型、pojo,Executor通过Mapped Statement在执行sql前将输入的java对象映射至sql中,输入参数映射就是jdbc编程中对preparedStatement设置参数。 9. Mapped Statement对sql执行输出结果进行定义,包括HashMap、基本类型、pojo,Executor通过Mapped Statement在执行sql后将输出结果映射至java对象中,输出结果映射过程相当于jdbc编程中对结果的解析处理过程。 

11.SpringMvc的控制器是不是单例模式,如果是,有什么问题,怎么解决?

是单例模式,所以在多线程访问的时候有线程安全问题,不要用同步,会影响性能的,解决方案是在控制器里面不能写字段。

12.SpingMvc中的控制器的注解一般用哪个,有没有别的注解可以替代?

一般用@Conntroller注解,表示是表现层,不能用用别的注解代替

13. (1)@RequestMapping注解用在类上面有什么作用?(2)怎么样把某个请求映射到特定的方法上面?

(1)@RequestMapping注解用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。

(2)如何把某个请求映射到特定的方法上面方案:直接在方法上面加上注解@RequestMapping,并且在这个注解里面写上要拦截的路径

14(1)如果在拦截请求中,我想拦截get方式提交的方法,怎么配置?

(2) 如果在拦截请求中,我想拦截提交参数中包含”type=test”字符串,怎么配置?

15(1)我想在拦截的方法里面得到从前台传入的参数,怎么得到?

(2)如果前台有很多个参数传入,并且这些参数都是一个对象的,那么怎么样快速得到这个对象?

16(1) 怎么样在方法里面得到Request,或者Session?(2)SpringMVC怎么样设定重定向和转发的?

17(1)SpringMvc中函数的返回值都有哪些?(2) SpringMvc怎么处理返回值的?

18(1)SpringMvc用什么对象从后台向前台传递数据的?(2)SpringMvc中有个类把视图和数据都合并的一起的,叫什么?

19(1)怎么样把ModelMap里面的数据放入Session里面?(2)SpringMvc怎么和AJAX相互调用的?

 MyBatis部分 

20 谈一下使用MyBatis(IBatis)的好处是什么?

21讲下对MyBatis的缓存的理解?

MyBatis的缓存分为一级缓存和二级缓存,一级缓存放在session里面,默认就有,二级缓存放在它的命名空间里,默认是打开的,使用二级缓存属性类需要实现Serializable序列化接口(可用来保存对象的状态),可在它的映射文件中配置

22(1)IBatis和MyBatis在核心处理类分别叫什么?(2)IBatis和MyBatis在细节上的不同有哪些?【扩展】

23 MyBatis里面的动态Sql是怎么设定的?用什么语法?

MyBatis里面的动态Sql一般是通过if节点来实现,通过OGNL语法来实现,但是如果要写的完整,必须配合where,trim节点,where节点是判断包含节点有内容就插入where,否则不插入,trim节点是用来判断如果动态语句是以and 或or开始,那么会自动把这个and或者or取掉

24 MyBatis实现一对多有几种方式?怎么操作的?

可以参考以下代码理解:

25 MyBatis实现一对一有几种方式?具体怎么操作的?

26什么是MyBatis的接口绑定?有什么好处?

接口映射就是在IBatis中任意定义接口,然后把接口里面的方法和SQL语句绑定,我们直接调用接口方法就可以,这样比起原来了SqlSession提供的方法我们可以有更加灵活的选择和设置.

27(1)接口绑定有几种实现方式,分别是怎么实现的? (2)什么情况下用注解绑定,什么情况下用xml绑定

(1)接口绑定有两种实现方式,一种是通过注解绑定,就是在接口的方法上面加上@Select @Update等注解里面包含Sql语句来绑定,另外一种就是通过xml里面写SQL来绑定,在这种情况下,要指定xml映射文件里面的namespace必须为接口的全路径名.

(2)当Sql语句比较简单时候,用注解绑定,当SQL语句比较复杂时候,用xml绑定,一般用xml绑定的比较多

28说一下orm与jdbc的区别?

29传统mvc模式存在什么问题?或者说为何要使用框架?

是为了解决传统MVC模式(Jsp + Servlet + JavaBean)的一些问题,才出现了后来的MVC框架。

30 mybatis与Hibernate有什么不同?

Hibername的好处:Hibernate是一个全自动的orm映射工具,它可以自动生成sql语句,并执行并返回java结果。

31 解释下MyBatis 中的动态SQL的理解?

对于一些复杂的查询,我们可能会指定多个查询条件,但是这些条件可能存在也可能不存在,例如在58同城上面找房子,我们可能会指定面积、楼层和所在位置来查找房源,也可能会指定面积、价格、户型和所在位置来查找房源,此时就需要根据用户指定的条件动态生成 SQL 语句。如果不使用持久层框架我们可能需要自己拼装 SQL 语句,还好 MyBatis 提供了动态 SQL 的功能来解决这个问题。 MyBatis 中用于实现动态 SQL 的元素主要有:

  • if
  • choose / when / otherwise
  • trim
  • where
  • set
  • foreach

32.JDBC编程有哪些不足之处,MyBatis是如何解决这些问题的?

33.MyBatis编程步骤是什么样的?

34.使用MyBatis的mapper接口调用时有哪些要求?

35.SqlMapConfig.xml中配置有哪些内容?

36.简单的说一下MyBatis的一级缓存和二级缓存?

37.Mapper编写有哪几种方式?

38 mybatis中${value}与#{} 的区别是什么?

39 JDBC 与数据库交互的流程是什么?

40 谈谈对mybatis中的sqlSession、sqlSessionFactoryBuild和sqlSessionFactory的理解。

sqlSessionFactoryBuild 是创建sqlSessionFactory时使用的.一旦创建成功后就不需要sqlSessionFactoryBuild的,因为sqlSession是通过sqlSessionFactory创建的,可以可以当做工具类使用

sqlSessionFactory是一个接口, 类里重载了opensession的不同的方法使用范围是在整个运行范围内,一旦创建可以重复使用.可以当做单实例对象来管理

sqlSession是面向用户的一个操作数据库的接口 每个线程都应该有自己的sqlSession 并且sqlSession不可以共享. 线程是不安全的,打开一个sqlSession用完之后就要关闭

41 谈下对mybatis中Sql片段的理解

Dao接口,就是人们常说的Mapper接口,接口的全限名,就是映射文件中的namespace的值,接口的方法名,就是映射文件中MappedStatement的id值,接口方法内的参数,就是传递给sql的参数。Mapper接口是没有实现类的,当调用接口方法时,接口全限名+方法名拼接字符串作为key值,可唯一定位一个MappedStatement,举例:com.mybatis3.mappers.StudentDao.findStudentById,可以唯一找到namespace为com.mybatis3.mappers.StudentDao下面id = findStudentById的MappedStatement。在Mybatis中,每一个、、、标签,都会被解析为一个MappedStatement对象。

Dao接口里的方法,是不能重载的,因为是全限名+方法名的保存和寻找策略。

Dao接口的工作原理是JDK动态代理,Mybatis运行时会使用JDK动态代理为Dao接口生成代理proxy对象,代理对象proxy会拦截接口方法,转而执行MappedStatement所代表的sql,然后将sql执行结果返回。

43 mybatis是如何进行分页的?分页插件的原理是什么?

Mybatis使用RowBounds对象进行分页,它是针对ResultSet结果集执行的内存分页,而非物理分页,可以在sql内直接书写带有物理分页的参数来完成物理分页功能,也可以使用分页插件来完成物理分页。

分页插件的基本原理是使用Mybatis提供的插件接口,实现自定义插件,在插件的拦截方法内拦截待执行的sql,然后重写sql,根据dialect方言,添加对应的物理分页语句和物理分页参数。

44.Mybatis是如何将sql执行结果封装为目标对象并返回的?都有哪些映射形式?

第一种是使用标签,逐一定义列名和对象属性名之间的映射关系。第二种是使用sql列的别名功能,将列别名书写为对象属性名,比如T_NAME AS NAME,对象属性名一般是name,小写,但是列名不区分大小写,Mybatis会忽略列名大小写,智能找到与之对应对象属性名,你甚至可以写成T_NAME AS NaMe,Mybatis一样可以正常工作。

有了列名与属性名的映射关系后,Mybatis通过反射创建对象,同时使用反射给对象的属性逐一赋值并返回,那些找不到映射关系的属性,是无法完成赋值的。

45. Xml映射文件中,除了常见的select|insert|update|delete标签之外,还有哪些标签?

还有很多其他的标签,加上动态sql的9个标签,trim|where|set|foreach|if|choose|when|otherwise|bind等,其中为sql片段标签,通过标签引入sql片段,为不支持自增的主键生成策略标签。

46. 简述Mybatis的插件运行原理,以及如何编写一个插件

Mybatis仅可以编写针对ParameterHandler、ResultSetHandler、StatementHandler、Executor这4种接口的插件,Mybatis使用JDK的动态代理,为需要拦截的接口生成代理对象以实现接口方法拦截功能,每当执行这4种接口对象的方法时,就会进入拦截方法,具体就是InvocationHandler的invoke()方法,当然,只会拦截那些你指定需要拦截的方法。实现Mybatis的Interceptor接口并复写intercept()方法,然后在给插件编写注解,指定要拦截哪一个接口的哪些方法即可,记住,还需要在配置文件中配置你编写的插件。

47. 简述Mybatis一级、二级缓存

1)一级缓存: 基于 PerpetualCache 的 HashMap 本地缓存,其存储作用域为 Session,当 Session flush 或 close 之后,该 Session 中的所有 Cache 就将清空。

2)二级缓存与一级缓存其机制相同,默认也是采用 PerpetualCache,HashMap 存储,不同在于其存储作用域为 Mapper(Namespace),并且可自定义存储源,如 Ehcache。要开启二级缓存,你需要在你的 SQL 映射文件中添加一行:

3)对于缓存数据更新机制,当某一个作用域(一级缓存 Session/二级缓存Namespaces)的进行了C/U/D 操作后,默认该作用域下所有 select 中的缓存将被 clear。

48. Mybatis是否支持延迟加载?如果支持,它的实现原理是什么?

Mybatis仅支持association关联对象和collection关联集合对象的延迟加载,association指的就是一对一,collection指的就是一对多查询。在Mybatis配置文件中,可以配置是否启用延迟加载lazyLoadingEnabled=true|false。

它的原理是,使用CGLIB创建目标对象的代理对象,当调用目标方法时,进入拦截器方法,比如调用a.getB().getName(),拦截器invoke()方法发现a.getB()是null值,那么就会单独发送事先保存好的查询关联B对象的sql,把B查询上来,然后调用a.setB(b),于是a的对象b属性就有值了,接着完成a.getB().getName()方法的调用。这就是延迟加载的基本原理。

49. Mybatis映射文件中,如果A标签通过include引用了B标签的内容,请问,B标签能否定义在A标签的后面,还是说必须定义在A标签的前面?

虽然Mybatis解析Xml映射文件是按照顺序解析的,但是,被引用的B标签依然可以定义在任何地方,Mybatis都可以正确识别。

原理是,Mybatis解析A标签,发现A标签引用了B标签,但是B标签尚未解析到,尚不存在,此时,Mybatis会将A标签标记为未解析状态,然后继续解析余下的标签,包含B标签,待所有标签解析完毕,Mybatis会重新解析那些被标记为未解析的标签,此时再解析A标签时,B标签已经存在,A标签也就可以正常解析完成了。

50. 简述Mybatis的Xml映射文件和Mybatis内部数据结构之间的映射关系?

Mybatis将所有Xml配置信息都封装到All-In-One重量级对象Configuration内部。在Xml映射文件中,标签会被解析为ParameterMap对象,其每个子元素会被解析为ParameterMapping对象。标签会被解析为ResultMap对象,其每个子元素会被解析为ResultMapping对象。每一个、、、标签均会被解析为MappedStatement对象,标签内的sql会被解析为BoundSql对象。





版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/205617.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 下午5:36
下一篇 2026年3月19日 下午5:36


相关推荐

  • Lunix_UNIX/LINUX

    Lunix_UNIX/LINUXlinux关机和重启命令(转)Lunix/Unix1.shutdownshutdown命令用于安全关闭Linux系统。shutdown命令的部分参数如下:[-t]指定在多长时间之后关闭系统[-r]重启系统[-k]并不真正关机,只是给每个登录用户发送警告信号[-h]关闭系统(halt)shutdown命令的工作实质是给ini…

    2022年10月4日
    3
  • pta 列车调度_PTA 7-10 列车调度

    pta 列车调度_PTA 7-10 列车调度火车站的列车调度铁轨的结构如下图所示。两端分别是一条入口(Entrance)轨道和一条出口(Exit)轨道,它们之间有N条平行的轨道。每趟列车从入口可以选择任意一条轨道进入,最后从出口离开。在图中有9趟列车,在入口处按照{8,4,2,5,3,9,1,6,7}的顺序排队等待进入。如果要求它们必须按序号递减的顺序从出口离开,则至少需要多少条平行铁轨用于调度?输入格式:输入第一行给出一个整数N(2…

    2022年7月26日
    11
  • vue遍历渲染数组「建议收藏」

    vue遍历渲染数组「建议收藏」<divv-for=”iteminuserAllInfo.adevarUserSkills”:key=”item.id”>{{item}}</div>v-for=”单个数据in数组”:key=“单个数据.主键”(主键唯一)不是对象无需主键

    2022年10月7日
    4
  • Ajax 原理总结

    Ajax 原理总结Ajax

    2026年3月16日
    2
  • Linux中添加路由_linux添加临时路由命令

    Linux中添加路由_linux添加临时路由命令一:使用route命令添加使用route命令添加的路由,机器重启或者网卡重启后路由就失效了,方法://添加到主机的路由#routeadd–host192.168.1.11deveth0#routeadd–host192.168.1.12gw192.168.1.1//添加到网络的路由#routeadd–net192.168.1.11netmask255.255.255.0eth0#routeadd–net192.168.1.11netm

    2022年10月5日
    6
  • python激活码全家桶(注册激活)

    (python激活码全家桶)好多小伙伴总是说激活码老是失效,太麻烦,关注/收藏全栈君太难教程,2021永久激活的方法等着你。https://javaforall.net/100143.htmlIntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,上面是详细链接哦~MLZPB5EL5Q-eyJsaWNlbnNlSWQiOi…

    2022年3月21日
    397

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号