SpringMVC面试题及答案
Spring MVC
面试总结
说说对Spring MVC
的理解
MVC
是一种设计模式,Spring MVC
是一款非常优秀的MVC
框架,它天生与Spring
框架集成,它可以帮助我们进行更简洁的Web
层开发。在Spring MVC
下,我们一般会把项目分为Service
层(业务层),Dao
层(数据库操作),Entity
层(实体类),Controller
层(控制层,返回数据给前台页面)。
Spring
工作流程
流程说明:
- 客户端(浏览器)发起请求,直接请求到
DispatcherServlet
。 -
DispatcherServlet
根据请求信息向HandlerMapping
请求解析对应的Handler
(也就是Controller
控制器)。 - 解析到对应的
Handler
。 -
DispatcherServlet
请求HandlerAdapter
执行Handler
。 -
HandlerAdapter
会根据Handler
调用真正的处理器来处理请求和执行对应的业务逻辑。 - 处理器处理完后返回
ModelAndView
,Model
是返回数据对象,View
是逻辑上的View
。 -
DispatcherServlet
请求View Resolver
,View Resolver
会根据逻辑View
去查找实际的View
,然后返回View
。 -
DispatcherServlet
把返回的Model
传给View
进行视图渲染。 - 最后把
View
返回给请求者(浏览器)。
SpringMVC
工作原理
- 客户端发送请求到
DispatcherServlet
。 -
DisPatcherServlet
查询HandlerMapping
找到请求处理的Controller
。 -
Controller
调用业务逻辑后,返回ModelAndView
。 -
DispatcherServlet
查询ModelAndView
,找到指定视图 - 将结果返回到客户端。
SpringMVC的控制器是不是单例模式,如果是有什么问题,怎么解决?
答:
- 是单例模式。
- 在多线程访问的时候会有线程安全问题,不要用同步,会影响性能。
- 解决办法:控制器里不能写字段
SpringMVC和struts2的区别
SpringMVC
的入口是servlet
(前端控制器),而struts2
的入口是filter过滤器。
SpringMVC
是基于方法开发,可以设计单例或者多例,而struts2
是基于类开发,只能设计为多例。
@RequestMapping
有什么作用
- 作用在类是上或是方法上
- 作用在类上表示,该类有响应请求的方法都是以该类的地址作为父路径。
怎么把某个请求映射到特定的方法上面?
直接在方法上加上@RequestMapping
注解,在注解里面写上这个请求的路径。
如果在拦截请求中,想要拦截get
方式提交的方法,怎么配置?
答:可以在@RequestMapping
注解中加上method=RequestMethod.GET
。
SpringMVC
怎样设定重定向和转发?
- 重定向:在返回值前面加上
forward
。 - 转发:在返回值前面加上
redirect
。
怎么把ModelMap
里面的数据放到Session
里面?
答:可以使用@SessionAttributes
注解,里面的字符串就是Session
的key
。
-
ModelMap
:-
ModelMap
也是主要用于传递控制方法处理数据到页面的结果。作用类似于request
对象的setAttribute
方法的作用,ModelMap
或Model
都是通过addAttribute
方法向页面传递参数。 -
ModelMap
本身不能设置页面跳转的url
地址别名或物理跳转地址。
-
【@ModelAttribute
注解,每次客户端访问SpringMVC
的@RequestMapping
请求时都会先执行该类里有@ModelAttribute
注解的方法,然后再去执行该请求】
Spring
拦截器执行顺序及各方法的作用
实现HandlerInterceptor
接口或是继承HandlerInterceptor
的子类,Spring
已经提供了实现HandlerInterceptor
接口的抽象类HandlerInterceptorAdapter
。
- 方法
preHandle
:该方法将在请求处理之前进行调用,在Controller
之前执行,在一个应用或在一个请求中可以同时存在多个Interceptor
。每个Interceptor
调用都会依据他们声明的先后顺序依次执行,最先执行的都是Interceptor
中的preHandle
方法。可以在这个方法中进行一些前置初始化操作或是对当前请求的一个预处理。该方法的返回值是Boolean
布尔值类型当他返回false
时,后续的都不会在执行,当返回为true
时会继续调用下一个Interceptor
的preHandle
方法,如果是最后一个Interceptor
就会执行当前请求调用的Controller
方法。 - 方法
postHandle
:postHandle
是在当前请求进行处理后执行,也就是Controller
方法调用后执行,但是会在DispatcherServlet
进行视图返回渲染之前调用,所以这个方法可以对Controller
进行处理后的ModelAndView
对象进行操作。postHandle
和preHandle
是相反的,也就是先声明的Interceptor
的postHandle
方法反而会后执行。 - 方法
afterCompletion
:该方法在整个请求结束后执行,也就是DispatcherServlet
渲染了视图后执行,主要作用是进行资源清理工作。
【postHandle
和afterCompletion
方法都是在当前Interceptor
的preHandle
方法返回true
时才能执行】
【postHandle
和afterCompletion
方法都是在当前Interceptor
的preHandle
方法返回true
时才能执行】