Spring和SpringMVC经典⾯试题及答案
关于Spring 和 Spring MVC的43个问题【问题汇总】
1.为什么使⽤Spring ?
1). ⽅便解耦,简化开发
通过Spring提供的IoC容器,可以将对象之间的依赖关系交由Spring进⾏控制,避免硬编码所造成的过度程序耦合。
2). AOP编程的⽀持
通过Spring提供的AOP功能,⽅便进⾏⾯向切⾯的编程,如性能监测、事务管理、⽇志记录等。
3). 声明式事务的⽀持
4). ⽅便集成各种优秀框架
5). 降低Java EE API的使⽤难度
如对JDBC,JavaMail,远程调⽤等提供了简便封装。
2. 什么是IoC,为什使⽤IoC ?
IoC全称Iversion of Controller,控制反转。
这概念是说你不⽤创建对象,⽽只需要描述它如何被创建。你不在代码⾥直接组装你的组件和服务,但是要在配置⽂件⾥描述哪些组件需要哪些服务,之后⼀个容器(IOC容器)负责把他们组装起来。
它能指导我们如何设计出松耦合、更优良的程序。
3.什么是AOP,为什么使⽤AOP ?
AOP全称:Aspect-Oriented Programming,⾯向切⾯编程。spring ioc注解
AOP,⾯向切⾯编程,就是把可重⽤的功能提取出来,然后将这些通⽤功能在合适的时候织⼊到应⽤程序中,⽐如事务管理、权限控制、⽇志记录、性能统计等。
AOP并没有帮助我们解决任何新的问题,它只是提供了⼀种更好的办法,能够⽤更少的⼯作量来解决现有的⼀些问题,使得系统更加健壮,可维护性更好。
4.什么是Spring的事务管理?
事务就是对⼀系列的数据库操作(⽐如插⼊多条数据)进⾏统⼀的提交或回滚操作,如果插⼊成功,那么⼀起成功,如果中间有⼀条出现异常,那么回滚之前的所有操作。这样可以防⽌出现脏数据,防⽌数据库数据出现问题。
开发中为了避免这种情况⼀般都会进⾏事务管理。
Spring的声明式事务通常是指在配置⽂件中对事务进⾏配置声明,其中包括了很多声明属性,它是通过Spring Proxy帮你做代理,⾃⼰不⽤额外的写代码,只要在Spring配置⽂件中声明即可;通常⽤在数据库的操作⾥⾯;
编程式事务就是指通过硬编码的⽅式做事务处理,这种处理⽅式需要写代码,事务中的逻辑可以⾃⼰定制;可以是数据库的东东,也可以是其他的操作。
Spring中也有⾃⼰的事务管理机制,⼀般是使⽤TransactionMananger进⾏管理,可以通过Spring的注⼊来完成此功能。
5.Spring框架⽀持以下五种bean的作⽤域?
singleton : 默认值,bean在每个Spring ioc 容器中只有⼀个实例。
prototype:⼀个bean的定义可以有多个实例。
request:每次http请求都会创建⼀个bean,该作⽤域仅在基于web的Spring ApplicationContext情形下有效。
session:在⼀个HTTP Session中,⼀个bean定义对应⼀个实例。该作⽤域仅在基于web的Spring ApplicationContext情形下有效。
global-session:在⼀个全局的HTTP Session中,⼀个bean定义对应⼀个实例。该作⽤域仅在基于web的
Spring ApplicationContext情形下有效。
6.什么是Spring的MVC框架?
Spring 配备构建Web 应⽤的全功能MVC框架。Spring可以很便捷地和其他MVC框架集成,如Struts,Spring 的MVC框架⽤控制反转把业务对象和控制逻辑清晰地隔离。它也允许以声明的⽅式把请求参数和业务对象绑定。
spring mvc是⼀个基于mvc的web框架。spring mvc是spring框架的⼀个模块,springmvc和spring⽆需通过中间整合层进⾏整合。
7.如何启⽤注解?
<context:annotation-config/>
如果使⽤<context:component-scan base-package="ller.annotation"> </context:component-scan> 则上⾯内容可以省略
8.Spring MVC的请求流程?
第⼀步:发起请求到前端控制器(DispatcherServlet)
第⼆步:前端控制器请求HandlerMapping查Handler可以根据xml配置、注解进⾏查
第三步:处理器映射器HandlerMapping向前端控制器返回Handler
第四步:前端控制器调⽤处理器适配器去执⾏Handler
第五步:处理器适配器去执⾏Handler
第六步:Handler执⾏完成给适配器返回ModelAndView
第七步:处理器适配器向前端控制器返回ModelAndView。ModelAndView是springmvc框架的⼀个底层对象,包括 Model和view
第⼋步:前端控制器请求视图解析器去进⾏视图解析,根据逻辑视图名解析成真正的视图(jsp)
第九步:视图解析器向前端控制器返回View
第⼗步:前端控制器进⾏视图渲染。视图渲染将模型数据(在ModelAndView对象中)填充到request域
第⼗⼀步:前端控制器向⽤户响应结果
l的配置
10.注解的处理器映射器和适配器?
spring3.1之后使⽤org.springframework.web.hod.annotation.RequestMappingHandlerMapping注解映射器。
在spring3.1之后使⽤org.springframework.web.hod.annotation.RequestMappingHandlerAdapter注解适配器。
使⽤ mvc:annotation-driven代替上边注解映射器和注解适配器配置
11.spring 与 mybatis整合过程?
第⼀步:整合dao层
mybatis和spring整合,通过spring管理mapper接⼝。
使⽤mapper的扫描器⾃动扫描mapper接⼝在spring中进⾏注册。
第⼆步:整合service层
通过spring管理 service接⼝。
使⽤配置⽅式将service接⼝配置在spring配置⽂件中。
实现事务控制。
第三步:整合springmvc
由于springmvc是spring的模块,不需要整合
主要配置有:
1). mybatis配置⽂件l配置别名⾃动扫描(实体类)
2). mapper扫描器(接⼝,数据库访问接⼝)
3). 数据库连接池配置
4). 声明式事务配置
5). 启⽤注解扫描:<context:component-scan base-package="cn.ller"></context:component-scan>
6). 配置注解映射器和适配器: <mvc:annotation-driven></mvc:annotation-driven>
7). 视图解析器:<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
8). 配置控制类: DispatcherServlet前端控制器
9). 配置spring配置⽂件加载类:ClassLoadListener
12.视图解析器配置前缀和后缀?
l,mybatis⾃⼰的配置⽂件?
14.配置数据源?
15.事务控制(l)?
在l中使⽤spring声明式事务控制⽅法。
16.加载spring配置?
17.静态资源访问不被拦截?
<resources mapping="/resources/**" location="/resources/" />
<resources mapping="/images/**" location="/images/" />
<resources mapping="/js/**" location="/js/" />
18.@RequestMapping的作⽤?
1). url映射
2). 窄化请求映射
3). 限制http请求⽅法
1 返回ModelAndView
需要⽅法结束时,定义ModelAndView,将model和view分别进⾏设置。
2 返回string
如果controller⽅法返回string,
1). 表⽰返回逻辑视图名。真正视图(jsp路径)=前缀+逻辑视图名+后缀
2). redirect重定向:返回字符串格式为:"redirect:queryItem.action"
3). forward页⾯转发:返回字符串格式为:“forward:queryItem.action”
3 返回void
在controller⽅法形参上可以定义request和response,使⽤request或 response指定响应结果:
1). 使⽤request转向页⾯,如下:RequestDispatcher("页⾯路径").forward(request, response);
2). 也可以通过response页⾯重定向:response.sendRedirect("url")
3). 也可以通过response指定响应结果,例如响应json数据如下:
response.setCharacterEncoding("utf-8");
response.setContentType("application/json;charset=utf-8");
20.参数绑定
1 默认⽀持的类型
直接在controller⽅法形参上定义下边类型的对象,就可以使⽤这些对象。在参数绑定过程中,如果遇到下边类型直接进⾏绑定。
1). HttpServletRequest:通过request对象获取请求信息
2). HttpServletResponse:通过response处理响应信息
3). HttpSession:通过session对象得到session中存放的对象
4). Model/ModelMap:model是⼀个接⼝,modelMap是⼀个接⼝实现 。作⽤:将model数据填充到request域。
2 简单类型
通过@RequestParam对简单类型的参数进⾏绑定。
如果不使⽤@RequestParam,要求request传⼊参数名称和controller⽅法的形参名称⼀致,⽅可绑定成功。
如果使⽤@RequestParam,不⽤限制request传⼊参数名称和controller⽅法的形参名称⼀致。
通过required属性指定参数是否必须要传⼊,如果设置为true,没有传⼊参数,会报错。
3 pojo绑定
页⾯中input的name和controller的pojo形参中的属性名称⼀致,将页⾯中数据绑定到pojo。(usename,age;不需要
user.username,user.age)
4 ⾃定义参数绑定实现⽇期类型绑定
对于controller形参中pojo对象,如果属性中有⽇期类型,需要⾃定义参数绑定。将请求⽇期数据串转成 ⽇期类型,要转换的⽇期类型和pojo中⽇期属性的类型保持⼀致。
21.Spring MVC 和 Struts2 对⽐?
1). Struts2是类级别的拦截, ⼀个类对应⼀个request上下⽂,SpringMVC是⽅法级别的拦截,⼀个⽅法对应⼀个request上下⽂,⽽⽅法同时⼜跟⼀个url对应,所以说从架构本⾝上SpringMVC 就容易实现restful url
2). 由上边原因,SpringMVC的⽅法之间基本上独⽴的,独享request response数据,请求数据通过参数获取,处理结果通过ModelMap 交回给框架,⽅法之间不共享变量,⽽Struts2搞的就⽐较乱,虽然⽅法之间也是独⽴的,但其所有Action变量是共享的,这不会影响程序运⾏,却给我们编码 读程序时带来⿇烦,每次来了请求就创建⼀个Action,⼀个Action对象对应⼀个request上下⽂。
3). 由于Struts2需要针对每个request进⾏封装,把request,session等servlet⽣命周期的变量封装成⼀个⼀个Map,供给每个Action使⽤,并保证线程安全,所以在原则上,是⽐较耗费内存的。
4). SpringMVC集成了Ajax,使⽤⾮常⽅便,只需⼀个注解@ResponseBody就可以实现,然后直接返回响应⽂本即可,⽽Struts2集成了Ajax,在Action中处理时⼀般必须安装插件或者⾃⼰写代码集成进去,使⽤起来也相对不⽅便。
5). springmvc⾯向⽅法开发的(更接近service接⼝的开发⽅式),struts2⾯向类开发。
6). springmvc可以单例开发,struts2只能是多例开发。
22. 乱码处理?
1). post乱码
在l添加post乱码filter:CharacterEncodingFilter
2). 对于get请求中⽂参数出现乱码解决⽅法有两个:
a. 修改tomcat配置⽂件添加编码与⼯程编码⼀致,如下:
<Connector URIEncoding="utf-8" connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>
b. 对参数进⾏重新编码:
String userName = new Paramter("userName").getBytes("ISO8859-1"),"utf-8")
ISO8859-1是tomcat默认编码,需要将tomcat编码后的内容按utf-8编码
23. 集合类型绑定
1). 数组绑定:
controller⽅法参数使⽤:(Integer[] itemId)
页⾯统⼀使⽤:itemId 作为name
2). list绑定:
pojo属性名为:itemsList
页⾯:itemsList[index].属性名
3). map 绑定:
pojo属性名为:Map<String, Object> itemInfo = new HashMap<String, Object>();
页⾯: <td>姓名:<inputtype="text"name="itemInfo['name']"/>
24.spring 校验 ?
1). 项⽬中,通常使⽤较多是前端的校验,⽐如页⾯中js校验。对于安全要求较⾼点建议在服务端进⾏校验。
2). springmvc使⽤hibernate的校验框架validation(和hibernate没有任何关系)。
校验思路:页⾯提交请求的参数,请求到controller⽅法中,使⽤validation进⾏校验。如果校验出错,将错误信息展⽰到页⾯。
25.数据回显?
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论