Java框架--SpringMVC(工作原理,常用注解)的学习笔记
SpringMVC
什么是SpringMVC?
- Spring MVC是一个基于Java的实现了MVC设计模式的请求驱动类型的轻量级Web框架,通过把模型-视图-控制器分离,将web层进行职责解耦,把复杂的web应用分成逻辑清晰的几部分,简化开发,减少出错,方便组内开发人员之间的配合。
SpringMVC的优点
- 是Spring框架的一部分,可以方便的利用Spring所提供的其他功能(如IOC容器,AOP等)。
- 灵活性强,易于与其他框架集成。
- 提供了一个前端控制器DispatcherServlet,使开发人员无需额外开发控制器对象。
- 可自动绑定用户输入,并能正确的转换数据类型。
- 内置了常见的校验器,可以校验用户输入。如果校验不能通过,那么就会重定向到输入表单。
- 支持国际化。可以根据用户区域显示多国语言。
- 支持多种视图技术。它支持JSP、Velocity和FreeMarker等视图技术。
- 使用基于XML的配置文件,在编辑后,不需要重新编译应用程序。
SpringMVC的原理图
SpringMVC接口解释
- DispatcherServlet接口:
Spring提供的前端控制器,所有的请求都有经过它来统一分发。在DispatcherServlet将请求分发给Spring Controller之前,需要借助于Spring提供的HandlerMapping定位到具体的Controller。 - HandlerMapping接口:
能够完成客户请求到Controller映射。 - Controller接口:
需要为并发用户处理上述请求,因此实现Controller接口时,必须保证线程安全并且可重用。Controller将处理用户请求,这和Struts Action扮演的角色是一致的。一旦Controller处理完用户请求,则返回ModelAndView对象给DispatcherServlet前端控制器,ModelAndView中包含了模型(Model)和视图(View)。- 从宏观角度考虑,DispatcherServlet是整个Web应用的控制器;
- 从微观角度考虑,Controller是单个Http请求处理过程中的控制器,而ModelAndView是Http请求过程中返回的模型(Model)和视图(View)。
- ViewResolver接口:
Spring提供的视图解析器(ViewResolver)在Web应用中查找View对象,从而将相应结果渲染给客户。SpringMVC运行原理
- 用户发送请求到前端控制器DispatcherServlet。
- DispatcherServlet收到请求调用HandlerMapping处理器映射器。
- 处理器映射器找到具体的处理器(可以根据xml配置,注解进行查找),生成处理器对象以及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。
- DispatcherServlet调用处理器适配器HandlerAdapter。
- HandlerAdapter经过适配调用具体的处理器(Controller,后端控制器)。
- Controller执行完成返回ModelAndView。
- HandlerAdapter将controller返回的ModelAndView返回给DispatcherServlet。
- DispatcherServlet将ModelAndView传送给ViewResolver视图解析器。
- VIewResolver解析后返回具体的View。
- DispatcherServlet根据View渲染视图(即将模型数据填充至视图中)。
- DispatcherServlet响应用户。
SpringMVC常用注解
- @Controller
- 用于标注控制层组件,被标记的类就是一个SpringMVC Controller对象;
- 分发处理器会扫描使用了该注解的类的方法,并检测该方法是否使用了@RequestMapping注解;
- 可以把Request请求header部分绑定到方法的参数上。
- @RestController
- 相当于@Controller与@ResponseBody的组合效果
- @Respository
- 用于标注dao层,在daoImpl类上面注解
- @Service
- 用于标注业务层组件
- @Component
- 泛指组件,当组件不好归类时,可用此注解标注
- @ResponseBody
- 异步请求
- 该注解用于将Controller的方法返回的对象,通过恰当的HttpMessageConverter转换为指定格式后,写入Response对象的Body数据区。
- 返回的数据不是Html标签的页面,而是其他某种格式的数据时(json,xml等)使用
- @RequestMapping
- 用来处理请求地址映射的注解,可用于类或者方法上。用于类上,表示类中所有响应请求的方法都是以该地址作为父路径。
- @PathVariable
- 用于将请求URL中的模板变量映射到功能处理方法的参数上,即取出url模板中的变量作为参数。
- @RequestsParam
- 用于在SpringMVC后台控制层获取参数,类似一种时request.getParamter(“name”)
- @RequestHeader
- 配置阶段,主要是完成对 xml配置和注解配置。
- 具体步骤如下:
- 初始化阶段,主要是加载并解析配置信息以及 IoC 容器、DI 操作和 HandlerMapping 的初始化。
- 具体步骤如下:
- 首先,Web 容器启动以后,会由 Web 容器自动调用DispatcherServlet 的 init()方法。然后,在 init()方法中,会初始化 IoC 容器(Map),紧接着,根据配置好的扫描包路径,扫描出相关的类,并利用反射进行实例化,存放到 IoC 容器中。
- 缓存之后,Spring 将再次迭代扫描 IoC 容器中的实例,给需要自动赋值的属性(加了 @Autowired注解 )自动赋值。
- 最后,读取 @RequestMapping 注解,获得请求 url,将 url 和 Method 建议一对一的映射关系并缓存起来。可以简单粗暴地理解为缓存在一个 Map 中,它的 Key 就是url,它的值是 Method。
3.运行阶段
- 运行阶段,在 Spring 启动以后,等待用户请求,完成内
部调度并返回响应结果。 - 具体步骤如下:
- 用户在浏览器输入 url 之后,Web 容器会接收到用户请求。Web 容器会自动调用 doGet()或者 doPost()方法。从doGet()或者 doPost()方法中,我们可以获得两个对象,分别是 request 和 response。通过 request 可以获得用户请求带过来的信息,通过 response 可以往浏览器端输出响应结果。
- 然后,根据 request 中获得的请求 url,可以从HandlerMapping 中找到对应 Method。
- 接着,还是利用反射调用方法,将获得方法调用的返回结果。
- 最后,将返回结果通过 response 输出到浏览器,用户就可以看到响应结果。
一些问题
Spring MVC的控制器是不是单例模式,如果是,有什么问题,怎么解决?
- 答:是单例模式,所以在多线程访问的时候有线程安全问题,不要用同步,会影响性能的,解决方案是在控制器里面不能写字段。
Spring MVC怎么样设定重定向和转发的?
- 答:
- 转发:在返回值前面加”forward:”,如”forward:user.do?name=method4”;
- 重定向:在返回值前面加”redirect:”,如”redirect:http://www.baidu.com"。
Spring MVC怎么和AJAX相互调用的?
- 答:通过Jackson框架就可以把Java里面的对象直接转化成Js可以识别的Json对象。
具体步骤如下 : - 答:返回值可以有很多类型,有String, ModelAndView。ModelAndView类把视图和数据都合并的一起的,但一般用String比较好。
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.