1.Spring MVC概述
Spring MVC是Spring提供的一个强大而灵活的web框架。借助于注解,Spring MVC提供了几乎是POJO的开发模式,使得控制器的开发和测试更加简单。这些控制器一般不直接处理请求,而是将其委托给Spring上下文中的其他bean,通过Spring的依赖注入功能,这些bean被注入到控制器中。
Spring MVC主要由前台控制器(DispatcherServlet
)、处理器映射(HandlerMapping
)、处理器(控制器HandlerAdapter/Controller
)、视图解析器(ViewResolver
)、视图(View
)组成。他的两个核心是两个核心:
处理器映射:选择使用哪个控制器来处理请求
视图解析器:选择结果应该如何渲染
通过以上两点,Spring MVC保证了如何选择控制处理请求和如何选择视图展现输出之间的松耦合。
2. SpringMVC主要组件
组件名称 | 说明 |
---|---|
DispatcherServlet:前端控制器 | 用户请求到达前端控制器,它就相当于mvc模式中的c,DispatcherServlet 是整个流程控制的中心,由它调用其它组件处理用户的请求,DispatcherServlet的存在降低了组件之间的耦合性。本质就是一个Servlet,作为Spring应用程序和其客户端之间的前台控制器。 调度器servlet拦截到应用程序的所有请求,并查询要调用哪个控制器来处理请求的 Handler Mapping 。 作为Spring应用程序和其客户端之间的前台控制器。 调度器servlet拦截到应用程序的所有请求,并查询要调用哪个控制器来处理请求的Handler Mapping接收请求,响应结果,返回可以是json,String等数据类型,也可以是页面(Model)。 |
HandlerMapping:处理器映射器 | HandlerMapping 负责根据用户请求找到Handler 即处理器,springmvc提供了不同的映射器实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式等。 |
Handler:处理器 | Handler 是继DispatcherServlet前端控制器的后端控制器,在DispatcherServlet的控制下Handler对具体的用户请求进行处理。由于Handler涉及到具体的用户业务请求,所以一般情况需要程序员根据业务需求开发Handler。 |
HandlAdapter:处理器适配器 | 通过HandlerAdapter 对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行。 |
View Resolver:视图解析器 | View Resolver 负责将处理结果生成View视图,View Resolver首先根据逻辑视图名解析成物理视图名即具体的页面地址,再生成View视图对象,最后对View进行渲染将处理结果通过页面展示给用户。 springmvc框架提供了很多的View视图类型,包括:jstlView、freemarkerView、pdfView等。一般情况下需要通过页面标签或页面模版技术将模型数据通过页面展示给用户,需要由程序员根据业务需求开发具体的页面。 |
3. 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对象,从而将相应结果渲染给客户。
4. SpringMVC注解
@RestController
相当于@Controller
和@ResponseBody
的组合效果
@Controller
负责注册一个bean 到spring 上下文中
用于标注控制层组件,用于标记在一个类上,使用它标记的类就是一个SpringMVC Controller对象
,分发处理器将会扫描使用了该注解的类的方法,并检测该方法是否使用了@RequestMapping
注解。
可以把Request请于header部分的值绑定到方法的参数上
@RequestMapping
注解为控制器指定可以处理哪些 URL 请求
一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径
@Component
泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注
@RequestBody
该注解用于读取Request请求的body部分数据,使用系统默认配置的HttpMessageConverter
进行解析,然后把相应的数据绑定到要返回的对象上 ,再把HttpMessageConverter返回的对象数据绑定到 controller中方法的参数上
@ResponseBody
该注解用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区
返回的数据不是html标签的页面,而是其他某种格式的数据时(如json、xml等)使用
@ModelAttribute
在方法定义上使用@ModelAttribute
注解:Spring MVC 在调用目标处理方法前,会先逐个调用在方法级上标注了@ModelAttribute 的方法
在方法的入参前使用 @ModelAttribute
注解:可以从隐含对象中获取隐含的模型数据中获取对象,再将请求参数 –绑定到对象中,再传入入参将方法入参对象添加到模型中
@RequestParam
在处理方法入参处使用 @RequestParam
可以把请求参 数传递给请求方法,主要用于在SpringMVC后台控制层获取参数,类似request.getParameter(“name”)
@PathVariable
绑定 URL 占位符到入参
用于将请求URL中的模板变量映射到功能处理方法的参数上,即取出url模板中的变量作为参数
@ExceptionHandler
注解到方法上,出现异常时会执行该方法
@ControllerAdvice
使一个Contoller成为全局的异常处理类,类中用@ExceptionHandler
方法注解的方法可以处理所有Controller发生的异常
@Responsitory
用于注解dao层,在daoImpl类上面注解
@Service
用于标注业务层组件
@Autowired
它可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作,通过@Autowired的使用来消除set、get方法
@RequestHeader
可以把Request请求header部分的值绑定到方法的参数上