- 谈一下你对SpringMVC的理解
首先SpringMVC是构建Servlet基础上的一套API,它是Spring框架的一个模块,SpringMVC天
然支持IOC和AOP,它能够定制静态资源的访问,能够配置试图解析和模板引擎,比如thymleaf
这种,而且他能统一进行异常处理,处理异常十分简单
- SpringMVC主要的组件
最核心的就是DispatcherServlet也就是前端控制器,处理器映射器,处理器适配器,视图解析
器和处理器
- SpringMVC执行流程
首先是DispatcherServlet先拦截用户的请求,然后会指使处理器映射器去解析一下咱的注解
或者xml,看看我们写的处理器是不是它需要的那种部署方式,你比如说要是用的BeanNameUrlHandlerMapping这个映射器,那处理器就得写在xml文件里,而且name属性还
是方法的url,SimpleUrlHandlerMapping这个适配器就需要自己写properties
给处理器分配路由,然后我们的处理器就需要id这个属性来让映射器的ref去对应,等等吧总之
这一步搭载完了咱们的处理器,之后会把一个HandlerExecutionChain返回给Dispatcher Servlet,然后它会从中取一个handle,这个东西就是跟处理器一个类型,扔给处理器适配器,适
配器会去调用自己的supports方法,看看是不是自己要求的处理器类型,比如 SimpleServletHandlerAdapter这个适配器就需要我们的处理器实现Servlet接口,还有一些比
如SimpleControllerHandlerAdapter需要处理器实现Controller接口,而Supports方法只有适
配成功才会返回true,一旦返回true,适配器会执行我们处理器的代码逻辑,最后返回一个
ModelAndView给视图解析器然后去渲染页面
- RequestMappingHandlerMapping为什么要和RequestMappingHandlerAdapter配合使用
首先RequestMappingHandlerMapping它主要的任务是给处理器分配一个路由地址,然而它
这个接口就一个方法,而且直接返回HandlerExecutionChain,没有分配路由给处理器,所以必
须得通过一个注解@RequestMapping("xxx")来配置处理器的url,而这个注解呢同时还送我
们一个RequestMappingAdapter的处理器适配器,而这个适配器不要求我们的处理器实现任
何接口或者继承任何父类,所以无论HandlerExecutionChain是啥Supports方法都会返回true
所以这两个被一个@RequestMapping绑在一块了,所以说他俩搭配起来使用
- 说说@RequestMapping的作用
首先@RequestMapping相当于写了一个RequestMappingHandlerMapping和一个RequestMappingHandlerAdapter这么两个东西,一个呢适配我们的处理器永远适配,另一个
呢去适配我们处理器,也是永远适配所以有了这个注解反而使我们的配置和处理器都十分省
事
其次,@RequestMapping既可以通过value属性为处理器分配一个请求地址,又可以通过method属性设置要求的请求方法
最后它支持RestFul风格的请求,而且它还变形成@PostMapping @GetMapping @PutMapping @DeleteMapping配合@PathValiable来适配rest风格的请求方式
- 如何在Controller获取Request对象
直接在方法参数接HttpServlet就拿到了,后续在通过getParam来拿里面的参数信息就ok
- 请讲一下SpringMVC和struts2的区别?
Struts2我了解的可能不是特别深刻,但是之前的同事有在用我也有所耳闻吧算是,首先,这个
Struts2它是类级别的拦截,而处理器还不是单例的,也就是说在内存里每来一个请求都会创
建一个Conrtoller,而SpringMVC我们都知道IOC容器默认都是Singleton单例的,所以一个是
类级别的拦截一个是方法级别的加载,相对来说SpringMVC的效率会高一些,再一个就是它俩在跟上就不一样,Struts2是封装了Fileter而SpringMVC是封装的Servlet,嗯,所以差别还是比较
大的
- SpringMvc怎么将url映射到Controller
主要通过处理器映射器主要有三个
第一个是BeanNameUrlHandlerMapping,它会解析xml中的处理器的bean类,name属性作为
请求的url
第二个是SimpleUrlHandlerMapping,它也是会解析处理器的bean类,但是不同的是它自己有
Mappings属性会配置处理器的url,处理器这个bean的id就作为请求的url
第三个是RequestMappingHandlerMapping,它底层会直接返回HandlerExecutionChain所
以必须配合着@RequestMapping这个注解,通过这个注解来分配给处理器url,而且还自动
部署上RequestMappingHandlerAdapter去执行处理器中的业务逻辑