SpringMVC 阶段总结
介绍
讲一下你对SpringMVC的认识。
-
SpringMVC是一个基于请求驱动的web框架,主要是实现了MVC设计模式。MVC设计模式就是把整个项目分成
Model层、
View层、
Controller层,让整体的逻辑清晰,层次分明。
- Model层:写一些JavaBean在里面,主要是包含整个项目的数据对象。
- View层:页面的视图配置
- Controller层:接收前端的请求,返回响应
SpringMVC的流程
- 张三进店,说我要只叫化鸡!(发送请求
RequestMapping
)。
老板 前端控制器DispatcherServlet
接到后,将请求转到后厨打杂的小工处理器映射器HandlerMapping
,说你去冰箱拿只肉鸡 Handler 过来,小工很快就带着肉鸡回来了。 - 老板得到Handler后,就将它给了厨子处理器适配器
HandlerAdapter
,厨子就找了个合适的烤炉处理器Handler
进行加工处理。加工完毕后,厨子将黄泥包着的烤鸡ModelAndView
重新交给了老板。 - 烤鸡一到老板手上,老板心说这不行,这么一坨,顾客也不会拆啊,还得再加工!于是就把包裹送到了摆盘师傅视图解析器
ViewResolver
,说你给他拾掇好了再给我端过来。摆盘师傅迅速把鸡和荷叶黄泥壳之类的分开,并把鸡美美地拆成一冷盘(解析视图),端给了老板。 - 老板看了看很满意,但是感觉缺少一点灵魂,现场表演撒盐哥招牌动作(渲染视图),终于大功告成!于是把这一盘叫化鸡端给了张三(响应请求)。
说人话版:
- 用户向服务端发送一次请求,这个请求会先到前端控制器
DispatcherServlet
(也叫中央控制器)。 - DispatcherServlet接收到请求后会调用
HandlerMapping
处理器映射器。由此得知,该请求该由哪个Controller来处理(并未调用Controller,只是得知)。 - DispatcherServlet调用
HandlerAdapter
处理器适配器,告诉处理器适配器应该要去执行哪个Controller。 - HandlerAdapter处理器适配器去执行Controller并得到
ModelAndView
(数据和视图),并层层返回给DispatcherServlet。 - DispatcherServlet将ModelAndView交给
ViewReslover
视图解析器解析,然后返回真正的视图。 - DispatcherServlet将模型数据填充到视图中。
- DispatcherServlet将结果响应给用户。
图文版:
SpringMVC和Strus2的区别?
- 入口不同
SpringMVC入口是servlet
,Struts2入口是filter
。 - 生命周期不同
SpringMVC Controller是单例的,所以效率更高,但是不能使用成员变量获取参数。
Struts2 Action是多例的,可以使用成员变量获取参数,导致效率比较低。
SpringMVC的控制器是什么设计模式?有什么问题?如何解决?
是单例模式,所以在多线程访问的时候有线程安全问题,所以不要用同步,会影响性能。
解决方案是不要在controller中定义成员变量,也就是不要在controller中定义比如private String name;
这类操作。如果非要用,这个时候就可以用Spring的注解@Scope
来实现,设置成员变量的范围。
比如把这个bean 的范围设置成session,表示这bean是会话级别的:
@Scope(“session”)
,当我们首次访问这个Controller的时候,他会根据判断这个会话是不是处于同一个session中,如果是一个新的,容器会执行init方法,如果一样就不会。
为什么设计成单例设计模式?
因为单例模式可以提高程序运行效率,节省内存空间,不需要每次访问都创建新的对象,所以,不需要花费额外的性能去创建对象,销毁对象,管理对象等等。
SpringMVC的常用注解有哪些。
Controller
:标注该类是控制器。
@RequestMapping
:后面跟个具体的url路径,用在方法上是该方法的具体路径,用在类上表示是所有方法的父路径。
@RequestBody
:接收体,将客户端请求过来的Json转成Java对象
@ResponseBody
:响应体,将Java对象转成Json,并且发送给客户端。
@PathVariable
:用于获取URI中的参数,比如 xxx.com/user/{id} ,中id的值
@RestController
:RESTful 风格的新API,还有@GetMapping
,@DeleteMapping
,@PostMapping
,@PutMapping
等。
@RequestParam
:当表单参数和方法形参名字不一致时,做一个名字映射。
注解的原理
注解的本质是一个继承了Annotation
类的接口,注解接口的实现类实际上是Java通过反射在运行时生成的动态代理类。
@Component
和@Bean
的区别是什么?
区别 | @Bean | @Component |
---|---|---|
作用对象 | 方法 | 类 |
使用位置 | 在标有该注解的方法中定义产生这个bean,告诉Spring这是某个类的实例,当我需要用它的时候还给我。 | 通过类路径扫描来自动侦测以及自动装配到Spring容器中(我们可以使用@ComponentScan注解定义要扫描的路径)。 |
自定义性 | 比@Component注解的自定义性更强,而且很多地方只能通过@Bean注解来注册bean。比如当引用第三方库的类需要装配到Spring容器的时候,就只能通过@Bean注解来实现。 | \ |
SpringMvc用什么对象从后台向前台传递数据的?
通过Model
对象或Map
对象,可以在这个对象里面调用put方法,把对象加到里面,前台就可以通过el表达式拿到。