SpringMVC面试精华汇总

1. 什么是Spring MVC ?简单介绍下你对springMVC的理解?

在这里插入图片描述

2.SpringMVC的流程?

在这里插入图片描述

3. Springmvc的优点

(1)可以支持各种视图技术,而不仅仅局限于JSP;
(2)与Spring框架集成(如IoC容器、AOP等);
(3)清晰的角色分配:前端控制器(dispatcherServlet) , 请求到处理器映射(handlerMapping), 处理器适配器(HandlerAdapter), 视图解析器(ViewResolver)。
(4) 支持各种请求资源的映射策略;

4. Spring MVC的主要组件?

(1)前端控制器 DispatcherServlet(不需要程序员开发)
作用:接收请求、响应结果,相当于转发器,有了DispatcherServlet 就减少了其它组件之间的耦合度。
(2)处理器映射器HandlerMapping(不需要程序员开发)
作用:根据请求的URL来查找Handler
(3)处理器适配器HandlerAdapter
注意:在编写Handler的时候要按照HandlerAdapter要求的规则去编写,这样适配器HandlerAdapter才可以正确的去执行Handler。
(4)处理器Handler(需要程序员开发)
(5)视图解析器 ViewResolver(不需要程序员开发)
作用:进行视图的解析,根据视图逻辑名解析成真正的视图(view)
(6)视图View(需要程序员开发jsp)
View是一个接口, 它的实现类支持不同的视图类型(jsp,freemarker,pdf等等)

5. springMVC和struts2的区别有哪些?

(1)springmvc的入口是一个servlet即前端控制器(DispatchServlet),而struts2入口是一个filter过虑器(StrutsPrepareAndExecuteFilter)。
(2)springmvc是基于方法开发(一个url对应一个方法),请求参数传递到方法的形参,可以设计为单例或多例(建议单例),struts2是基于类开发,传递参数是通过类的属性,只能设计为多例。
(3)Struts采用值栈存储请求和响应的数据,通过OGNL存取数据,springmvc通过参数解析器是将request请求内容解析,并给方法形参赋值,将数据和视图封装成ModelAndView对象,最后又将ModelAndView中的模型数据通过reques域传输到页面。Jsp视图解析器默认使用jstl。

6.SpringMvc怎么和AJAX相互调用的?

通过Jackson框架就可以把Java里面的对象直接转化成Js可以识别的Json对象。具体步骤如下 :
(1)加入Jackson.jar
(2)在配置文件中配置json的映射
(3)在接受Ajax方法里面可以直接返回Object,List等,但方法前面要加上@ResponseBody注解。

7. Spring MVC的异常处理 ?

可以将异常抛给Spring框架,由Spring框架来处理;我们只需要配置简单的异常处理器,在异常处理器中添视图页面即可;

9.SpringMVC常用的注解有哪些?

@RequestMapping:用于处理请求 url 映射的注解,可用于类或方法上。用于类上,则表示类中的所有响应请求的方法都是以该地址作为父路径。
@RequestBody:注解实现接收http请求的json数据,将json转换为java对象。
@ResponseBody:注解实现将conreoller方法返回对象转化为json对象响应给客户
@Controller注解,也可以使用@RestController,@RestController注解相当于@ResponseBody + @Controller,表示是表现层,除此之外,一般不用别的注解代替。
在@RequestMapping注解里面加上method=RequestMethod.GET。

10. SpringMvc里面拦截器是怎么写的

在这里插入图片描述

11. 注解原理

注解本质是一个继承了Annotation的特殊接口,其具体实现类是Java运行时生成的动态代理类。我们通过反射获取注解时,返回的是Java运行时生成的动态代理对象。通过代理对象调用自定义注解的方法,会最终调用AnnotationInvocationHandler的invoke方法。该方法会从memberValues这个Map中索引出对应的值。而memberValues的来源是Java常量池。

12. SpringMVC不需要配置web.xml文件的原理(以及内嵌tomcat原理)?

①自定义一个配置类实现WebApplicationInitializer接口中的onStartup方法
②当Tomcat容器启动的时候会,会启动Sping-web.jar目录下的ServletContainerInitializer接口的实现类SpringServletContainerInitializer然后调用onStartup方法
③@HandlesTypes(WebApplicatiobnInitializer.Class)会将实现该接口的所有的实现类,以set集合的方式传给onStartup方法。
④当Spring拿到这个集合后遍历、并且通过反射实例化对象,调用集合中对象的onStartup方法
⑤因此便开始加载自己定义的MyselfApplicatiobnInitializer ,通过AnnotionConfigContext以注解方式初始化Spring容器。在这个启动类中加载配置类,实例化DispatcherServlet对象,来处理前端的请求
④将DispathcServlet对象加入到ServletContext中


当Tomcat容器启动的时候会,会启动Sping-web.jar目录下的ServletContainerInitializer接口的实现类SpringServletContainerInitializer然后调用onStartup方法,由于注解@HandlesTypes(WebApplicatiobnInitializer.Class)会将实现该接口的所有的实现类,以set集合的方式传给onStartup方法。
在这里插入图片描述
当Spring拿到这个集合后遍历、并且实例化对象,调用集合中对象的onStartup方法。因此便开始加载自己定义的MyselfApplicatiobnInitializer ,在这个启动类中加载配置类,实例化DispatcherServlet对象,来处理前端的请求如下图所示:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

13. SpringMVC调用到Controller执行的原理

(selvert中init()初始化操作):
①加载配置文件Web.xml,加载SpringMVC.xml文件
②扫描整个文件,根据配置文件给定目录进行扫描
③通过反射技术扫描所有加了@Controller的类,当扫描到@Controller注解类之后遍历里面所有方法。并且解析该方法上是否添加了@RequestMapping注解。
④定义一个Map对象将@RequestMapping注解下的Value与方法绑定起来Map<String,Method>【key是某个 类下的方法,value是该类下的方法】
(selvert中doGet()初始化操作):
①拦截到请求之后,获取请求的URI【统一资源标识符:例如tets.do】
②通过URI获取通过get方法获取Map中Value

14. 自定义实现一个注解步骤:

①@Target()作用的目标,可以指定注解作用在类、方法、属性等【ElementType.Type,ElementType.Method】
②@Rentention()作用是注解的生命周期【RententionPolicy.Runtime运行时】

15.SpringMVC执行的核心流程操作步骤

①用户发送请求至前端控制器DispatcherServlet;
②DispatcherServlet收到请求后,调用HandlerMapping处理器映射器;
③处理器映射器HandlerMapping根据请求url找到具体的处理器,生成处理器对象Handle及处理器拦截器(如果有则生成)一并返回给DispatcherServlet;
④DispatcherServlet 调用 HandlerAdapter处理器适配器负责执行Handle,并且将执行结果ModelAndView返回给DispatcherServlet;
⑤DispatcherServlet将ModelAndView传给ViewResolver视图解析器进行解析;ViewResolver解析后返回具体View;
⑥DispatcherServlet对View进行渲染视图(即将模型数据填充至视图中)
⑦DispatcherServlet响应用户。

16. SpringMVC源码知识点总结

1) 首先方法进入doDispatch然后调用CheckMutipart()判断当前请求是否有文件
2) 调用getHander()方法,通过HandleMapping寻找一个Controller对象(扩展点1:SpringBoot利用了HandlerMapping接口进行扩展,解析了静态资源)
3) 调用getHanderAdapter方法,根据controller的类型寻找合适的是适配器。因为Controller有很多种不同的注册方式,所以需要不同的适配器(扩展点2:HanderAdapter)
4) 调用了Handle()方法,执行Controller逻辑进行试图裁决(判断是要重定向、转发、还是响应页面)
5) 调用invokeForRequest(0方法,执行该方法全部的而逻辑。首先给参数赋值(扩展点3:HandleMethodArgumentResolver)其次调用invoke()执行方法
6) 调用setResponseStatus(0方法,设置响应状态码,对应@ResponseStatus注解
7) 调用handleReturnValue()进行视图裁决(扩展点4:returnValuesHandlers可以通过这个对象来进行判断接下来视图怎么做)
8) 调用handle.handleReturnValue()方法,对于返回值处理判断是否需要响应还是重定向。如果是@ResponseBody注解(扩展点5:HttpMessageConverter)
9) 调用getModelAndViews()方法,重新封装一个ModelAndView对象。如果不需要渲染试图(如果是重定向||响应试图的话)就会返回NULL。通过mavContainer.isResquestHandled()判断是否需要重定向或者响应,同时回把model里面的参数放到request.setAttribute中,说明Model的作用域是request作用域。
10) 调用processDispatchResult()方式开始渲染视图,判断是否需要响应异常视图。拿到视图名称,封装一个视图对象进行forward.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值