JavaSSM框架精选50道⾯试题
1.什么是MVC框架?传统MVC框架存在的问题是什么?
MVC框架是为了解决传统MVC模式(Jsp + Servlet + JavaBean)的⼀些问题⽽出现的框架。
传统MVC模式存在问题:
1.所有的Servlet和Servlet映射都要配置在l中,如果项⽬太⼤,l就太庞⼤,并且不能实现模块化管理。
2.Servlet的主要功能就是接受参数、调⽤逻辑、跳转页⾯,⽐如像其他字符编码、⽂件上传等功能也要写在Servlet中,不能让Servlet主要功能⽽需要做处理⼀下特例。
3、接受参数⽐较⿇烦(String name = Parameter(“name”),User user=new User user.setName(name)),不能通过model接收,只能单个接收,接收完成后转换封装model.
4、跳转页⾯⽅式⽐较单⼀(forword,redirect),并且当我的页⾯名称发⽣改变时需要修改Servlet源代码.
2简单介绍下你对springMVC特点的理解?
Spring MVC Framework有这样⼀些特点:
1.它是基于组件技术的.全部的应⽤对象,⽆论控制器和视图,还是业务对象之类的都是java组件.并且和Spring提供的其他基础结构紧密集成.
2.不依赖于Servlet API(⽬标虽是如此,但是在实现的时候确实是依赖于S.ervlet的)
3.可以任意使⽤各种视图技术,⽽不仅仅局限于JSP
4.⽀持各种请求资源的映射策略
5.它应是易于扩展的
3.简单的谈⼀下SpringMVC的⼯作流程?★★★★★
流程
1、⽤户发送请求⾄前端控制器DispatcherServlet
2、DispatcherServlet收到请求调⽤HandlerMapping处理器映射器。
3、处理器映射器到具体的处理器,⽣成处理器对象及处理器(如果有则⽣成)⼀并返回给DispatcherServlet。
4、DispatcherServlet调⽤HandlerAdapter处理器适配器
5、HandlerAdapter经过适配调⽤具体的处理器(Controller,也叫后端控制器)。
6、Controller执⾏完成返回ModelAndView
7、HandlerAdapter将controller执⾏结果ModelAndView返回给DispatcherServlet
8、DispatcherServlet将ModelAndView传给ViewReslover视图解析器
9、ViewReslover解析后返回具体View
el表达式执行结果为10、DispatcherServlet根据View进⾏渲染视图(即将模型数据填充⾄视图中)。
11、DispatcherServlet响应⽤户
4.SpringMVC与Struts2的主要区别?
⽬前企业中使⽤SpringMvc的⽐例已经远远超过Struts2,那么两者到底有什么区别,是很多初学者⽐较关注的问题,下⾯我们就来对SpringMvc和Struts2进⾏各⽅⾯的⽐较:
1. 核⼼控制器(前端控制器、预处理控制器):对于使⽤过mvc框架的⼈来说这个词应该不会陌⽣,核⼼控制器的主要⽤途是处理所有
的请求,然后对那些特殊的请求 (控制器)统⼀的进⾏处理(字符编码、⽂件上传、参数接受、异常处理等等),spring mvc核⼼控制器是Servlet,⽽Struts2是Filter。
2.控制器实例:Spring Mvc会⽐Struts快⼀些(理论上)。Spring Mvc是基于⽅法设计,⽽Sturts是基于对象,每次发⼀次请求都会实例⼀个action,每个action都会被注⼊ 属性,⽽Spring更像Servlet⼀样,只有⼀个实例,每次请求执⾏对应的⽅法即可(注意:由于是单例实例,所以应当避免全局变量的修改,这样会产⽣线程安全问题)。
3. 管理⽅式:⼤部分的公司的核⼼架构中,就会使⽤到spring,⽽spring mvc⼜是spring中的⼀个模块,所以spring对于spring mvc的控制器管理更加简单⽅便,⽽且提供了全 注解⽅式进⾏管理,各种功能的注解都⽐较全⾯,使⽤简单,⽽struts2需要采⽤XML很多的配置参数来管理(虽然也可以采⽤注解,但是⼏乎没有公司那 样使⽤)。
4.参数传递:Struts2中⾃⾝提供多种参数接受,其实都是通过(ValueStack)进⾏传递和赋值,⽽SpringMvc是通过⽅法的参数进⾏接收。
5.学习难度:Struts更加很多新的技术点,⽐如、值栈及OGNL表达式,学习成本较⾼,springmvc ⽐较简单,很较少的时间都能上⼿。
6.intercepter 的实现机制:struts有以⾃⼰的interceptor机制,spring mvc⽤的是独⽴的AOP⽅式。这样导致struts的配置⽂件量还是⽐spring mvc⼤,虽然struts的配置能继承,所以我觉得论使⽤上来讲,spring mvc使⽤更加简洁,开发效率Spring MVC确实⽐
struts2⾼。spring mvc是⽅法级别的拦截,⼀个⽅法对应⼀个request上下⽂,⽽⽅法同时⼜跟⼀个url对应,所以说从架构本⾝上spring3 mvc就容易实现restful url。struts2是类级别的拦截,⼀个类对应⼀个request上下⽂;实现restful url要费劲,因为struts2 action的⼀个⽅法可以对应⼀个url;⽽其类属性却被所有⽅法共享,这也就⽆法⽤注解或其他⽅式标识其所属⽅法了。spring3 mvc的⽅法之间基本上独⽴的,独享request response数据,请求数据通过参数获取,处理结果通过ModelMap交回给框架⽅法之间不共享变量,⽽struts2搞的就⽐较乱,虽然⽅法之间 也是独⽴的,但其所有Action变量是共享的,这不会影响程序运⾏,却给我们编码,读程序时带来⿇烦。
spring mvc处理ajax请求,直接通过返回数据,⽅法中使⽤注解@ResponseBody,spring mvc⾃动帮
我们对象转换为JSON数据。⽽struts2是通过插件的⽅式进⾏处理
在SpringMVC流⾏起来之前,Struts2在MVC框架中占核⼼地位,随着SpringMVC的出现,SpringMVC慢慢的取代struts2,但是很多企业都是原来搭建的框架,使⽤Struts2较多。
5.如何解决POST请求中⽂乱码问题,GET的⼜如何处理呢?
在l中加⼊:
.
. CharacterEncodingFilter
. org.springframework.web.filter.CharacterEncodingFilter
.
. encoding
. utf-8
.
.
.
. CharacterEncodingFilter
. /*
.
以上可以解决post请求乱码问题。
对于get请求中⽂参数出现乱码解决⽅法有两个:
修改tomcat配置⽂件添加编码与⼯程编码⼀致,如下:
.
另外⼀种⽅法对参数进⾏重新编码:
. String userName = new Paramter(“userName”).getBytes(“ISO8859-1”),“utf-8”)
ISO8859-1是tomcat默认编码,需要将tomcat编码后的内容按utf-8编码
6.说出SpringMVC常⽤的5个注解?如何使⽤ SpringMVC完成JSON操作?:
常⽤的 5 个注解
@RequestMapping 、 @PathVariable 、 @RequestParam 、 @RequestBoy 、
@ResponseBody
如何使⽤ SpringMVC 完成 JSON 操作:
①. 配置 MappingJacksonHttpMessageConverter
②. 使⽤ @RequestBody 注解或 ResponseEntity 作为返回值
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. l,此⽂件作为mybatis的全局配置⽂件,配置了mybatis的运⾏环境等信息。
3. l⽂件即sql映射⽂件,⽂件中配置了操作数据库的sql语句。此⽂件需要在l中加载。
4. 通过mybatis环境等配置信息构造SqlSessionFactory即会话⼯⼚
5. 由会话⼯⼚创建sqlSession即会话,操作数据库需要通过sqlSession进⾏。
6. mybatis底层⾃定义了Executor执⾏器接⼝操作数据库,Executor接⼝有两个实现,⼀个是基本执⾏器、⼀个是缓存执⾏器。
7. Mapped Statement也是mybatis⼀个底层封装对象,它包装了mybatis配置信息及sql映射信息等。l⽂件中⼀个sql对应⼀个Mapped Statement对象,sql的id即是Mapped statement的id。
8. Mapped Statement对sql执⾏输⼊参数进⾏定义,包括HashMap、基本类型、pojo,Executor通过Mapped Statement在执⾏sql前将输⼊的java对象映射⾄s ql中,输⼊参数映射就是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"字符串,怎么配置?
可以在@RequestMapping注解⾥⾯加上method=RequestMethod.GET
可以在@RequestMapping注解⾥⾯加上params=“type=test”
15(1)我想在拦截的⽅法⾥⾯得到从前台传⼊的参数,怎么得到?
(2)如果前台有很多个参数传⼊,并且这些参数都是⼀个对象的,那么怎么样快速得到这个对象?
直接在形参⾥⾯声明这个参数就可以,但必须名字和传过来的参数⼀样
直接在⽅法中声明这个对象,SpringMvc就⾃动会把属性赋值到这个对象⾥⾯
16(1)怎么样在⽅法⾥⾯得到Request,或者Session?(2)SpringMVC怎么样设定重定向和转发的?
17(1)SpringMvc中函数的返回值都有哪些?(2) SpringMvc怎么处理返回值的?
(1)返回值可以有很多类型,有String, ModelAndView,当⼀般⽤String⽐较好
(2) SpringMvc根据配置⽂件中InternalResourceViewResolver的前缀和后缀,⽤前缀+返回值+后缀组成完整的返回值
18(1)SpringMvc⽤什么对象从后台向前台传递数据的?(2)SpringMvc中有个类把视图和数据都合并的⼀起的,叫什么?
通过ModelMap对象,可以在这个对象⾥⾯⽤put⽅法,把对象加到⾥⾯,前台就可以通过el表达式拿到
SpringMvc中有个类把视图和数据都合并的⼀起的叫ModelAndView
19(1)怎么样把ModelMap⾥⾯的数据放⼊Session⾥⾯?(2)SpringMvc怎么和AJAX相互调⽤的?
可以在类上⾯加上@SessionAttributes注解,⾥⾯包含的字符串就是要放⼊session⾥⾯的key
通过Jackson框架就可以把Java⾥⾯的对象直接转化成Js可以识别的Json对象
具体步骤如下
1.加⼊Jackson.jar
2.在配置⽂件中配置json的映射
3.在接受Ajax⽅法⾥⾯可以直接返回Object,List等,但⽅法前⾯要加上@ResponseBody注解
MyBatis部分
20 谈⼀下使⽤MyBatis(IBatis)的好处是什么?
ibatis把sql语句从Java源程序中独⽴出来,放在单独的XML⽂件中编写,给程序的维护带来了很⼤便利。
ibatis封装了底层JDBC API的调⽤细节,并能⾃动将结果集转换成Java Bean对象,⼤⼤简化了Java数据库编程的重复⼯作。
因为Ibatis需要程序员⾃⼰去编写sql语句,程序员可以结合数据库⾃⾝的特点灵活控制sql语句,
因此能够实现⽐hibernate等全⾃动orm框架更⾼的查询效率,能够完成复杂查询。
21讲下对MyBatis的缓存的理解?
MyBatis的缓存分为⼀级缓存和⼆级缓存,⼀级缓存放在session⾥⾯,默认就有,⼆级缓存放在它的命名空间⾥,默认是打开的,使⽤⼆级缓存属性类需要实现Serializable序列化接⼝(可⽤来保存对象的状态),可在它的映射⽂件中配置
22(1)IBatis和MyBatis在核⼼处理类分别叫什么?(2)IBatis和MyBatis在细节上的不同有哪些?【扩展】
(1)IBatis⾥⾯的核⼼处理类交SqlMapClient,MyBatis⾥⾯的核⼼处理类叫做SqlSession
变量
(2)细节上的不同:在sql⾥⾯变量命名有原来的#变量# 变成了#{变量} 原来的变成了${变量},
原来在sql节点⾥⾯的class都换名字交type
原来的queryForObject queryForList 变成了selectOne selectList
原来的别名设置在映射⽂件⾥⾯放在了核⼼配置⽂件⾥
23 MyBatis⾥⾯的动态Sql是怎么设定的?⽤什么语法?
MyBatis⾥⾯的动态Sql⼀般是通过if节点来实现,通过OGNL语法来实现,但是如果要写的完整,必须配合where,trim节点,where节点是判断包含节点有内容就插⼊where,否则不插⼊,trim节点是⽤来判断如果动态语句是以and 或or开始,那么会⾃动把这个and或者or取掉
24 MyBatis实现⼀对多有⼏种⽅式?怎么操作的?
有联合查询和嵌套查询,
联合查询是⼏个表联合查询,只查询⼀次,通过在resultMap⾥⾯配置collection节点配置⼀对多的类就可以完成;
嵌套查询是先查⼀个表,根据这个表⾥⾯的结果的外键id,去再另外⼀个表⾥⾯查询数据,也是通过配置collection,但另外⼀个表的查询通过select节点配置
可以参考以下代码理解:
25 MyBatis实现⼀对⼀有⼏种⽅式?具体怎么操作的?
有联合查询和嵌套查询,
联合查询是⼏个表联合查询,只查询⼀次,通过在resultMap⾥⾯配置association节点配置⼀对⼀的类就可以完成;
嵌套查询是先查⼀个表,根据这个表⾥⾯的结果的外键id,去再另外⼀个表⾥⾯查询数据,也是通过association配置,但另外⼀个表的查询通过select属性配置
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的区别?
jdbc只是⼀个java操作数据库的规范接⼝⽽已
orm不过是⼀种思想,对象关系映射。
ORM:是对象关系模型,如hibernate,让你以⾯向对象的⽅式去编程。封装了JDBC.
JDBC:是从底层访问数据库服务器。⼀般银⾏,⾦融⾏业为了安全起见,直接⽤JDBC访问
29传统mvc模式存在什么问题?或者说为何要使⽤框架?
传统MVC模式存在问题
(1)所有的Servlet和Servlet映射都要配置在l中,如果项⽬太⼤,l就太庞⼤,并且不能实现模块化管理。
(2)Servlet的主要功能就是接受参数、调⽤逻辑、跳转页⾯,⽐如像其他字符编码、⽂件上传等功能也要写在Servlet中,不能让Servlet主要功能⽽需要做处理⼀下特例。
(3)接受参数⽐较⿇烦(String name = Parameter(“name”),User user=new User user.setName(name)),不能通过model接收,只能单个接收,接收完成后转换封装model.
(4)跳转页⾯⽅式⽐较单⼀(forword,redirect),并且当我的页⾯名称发⽣改变时需要修改Servlet源代码.
是为了解决传统MVC模式(Jsp + Servlet + JavaBean)的⼀些问题,才出现了后来的MVC框架。
30 mybatis与Hibernate有什么不同?
相同点:都是java中orm框架、屏蔽jdbc api的底层访问细节,使⽤我们不⽤与jdbc api打交道,就可以完成对数据库的持久化操作。jdbc api编程流程固定,还将sql语句与java代码混杂在了⼀起,经常需要拼凑sql语句,细节很繁琐。
ibatis的好处:屏蔽jdbc api的底层访问细节;将sql语句与java代码进⾏分离;提供了将结果集⾃动封
装称为实体对象和对象的集合的功能.queryForList返回对象集合,⽤queryForObject返回单个对象;提供了⾃动将实体对象的属性传递给sql语句的参数。
Hibername的好处:Hibernate是⼀个全⾃动的orm映射⼯具,它可以⾃动⽣成sql语句,并执⾏并返回java结果。
不同点:
1、hibernate要⽐ibatis功能强⼤很多。因为hibernate⾃动⽣成sql语句。
2、ibatis需要我们⾃⼰在xml配置⽂件中写sql语句,hibernate我们⽆法直接控制该语句,我们就⽆法去写特定的⾼效率的sql。对于⼀些不太复杂的sql查询,hibernate可以很好帮我们完成,但是,对于特别复杂的查询,hibernate就很难适应了,这时候⽤ibatis就是不错的选择,因为ibatis还是由我们⾃⼰写sql语句。
ibatis可以出来复杂语句,⽽hibernate不能。
3、ibatis要⽐hibernate简单的多。ibatis是⾯向sql的,不同考虑对象间⼀些复杂的映射关系。
31 解释下MyBatis 中的动态SQL的理解?
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论