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时才能执行】