Spring MVC 工作原理和流程、注解
Spring MVC 是实现MVC设计模式的企业级开发框架,是Spring框架的一个子模块,无需整合,开发起来更加便捷。
MVC设计模式
MVC是一种设计模式,它将应用程序分为 Controller、Model、View 三层,Controller 接收客户端请求,调用 Model 生成业务数据,传递给 View进行视图渲染。实现前端页面的展现与后端业务数据处理的分离。
好处:分层设计,实现了业务系统各个组件之间的解耦。
Spring MVC组件
-
DispatcherServlet:前置控制器,是整个流程控制的核心,相当于总指挥,控制其他组件的执行,进行统一调度。
-
Handler:处理器,完成具体的业务逻辑,相当于 Servlet 或 Action。
-
HandlerMapping:处理器映射器,DispatcherServlet 接收到请求之后,通过 HandlerMapping 将不同的请求映射到不同的 Handler。
-
HandlerInterceptor:处理器拦截器,是一个接口,如果需要完成一些拦截处理,可以实现该接口。
-
HandlerExecutionChain:处理器执行链,包括两部分内容:Handler 和HandlerInterceptor(处理器对象和处理器拦截器)。
-
HandlerAdapter:处理器适配器,Handler 执行业务方法之前,需要进行一系列的操作,包括表单数据的验证、数据类型的转换、将表单数据封装到 JavaBean 等,这些操作都是由HandlerApater 来完成,开发者只需将注意力集中业务逻辑的处理上,DispatcherServlet 通过HandlerAdapter 执行不同的 Handler。
-
ModelAndView:装载了模型数据和视图信息,作为 Handler 的处理结果,返回给DispatcherServlet。
-
ViewResolver:视图解析器,DispatcheServlet 通过它将逻辑视图解析为物理视图,最终将渲染结果响应给客户端
Spring MVC 执行流程
-
用户发送请求至前端控制器DispatcherServlet
-
DispatcherServlet收到请求调用处理器映射器HandlerMapping。
-
处理器映射器根据请求url找到具体的处理器,生成处理器执行链HandlerExecutionChain(包括处理器对象和处理器拦截器)一并返回给DispatcherServlet。
-
DispatcherServlet根据处理器Handler获取处理器适配器HandlerAdapter执行HandlerAdapter处理一系列的操作,如:参数封装,数据格式转换,数据验证等操作
-
执行处理器Handler(Controller,也叫页面控制器)。
-
Handler执行完成返回ModelAndView
-
HandlerAdapter将Handler执行结果ModelAndView返回到DispatcherServlet
-
DispatcherServlet将ModelAndView传给ViewReslover视图解析器
-
ViewReslover解析后返回具体View
-
DispatcherServlet对View进行渲染视图(即将模型数据model填充至视图中)。
-
DispatcherServlet响应用户。
常用注解
@RequstMapping:将URL请求与业务方法进行映射,可以用在类和以及方法上。用在类上,相当于多加了一层父级访问路径。
value:指定URL请求的实际地址;method:指定请求的method类型,GET、POST、PUT、DELET。params:指定请求中必须包含某些参数。
package com.mytest.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; @Controller @RequestMapping("/hello") public class HelloHandler { @RequestMapping("/index",method=RequestMethod.GET, Params="username") public String index(){ System.out.println("执行了index..."); return "index"; } }
@Controller: 在类的定义处添加,将该类交给IOC容器来管理(结合springmvc.xml的自动扫描配置使用),同时使其成为一个控制器,可以接收客户端请求。
@RequstParam:把请求中的指定参数名称给控制器参数赋值,用value指定名称。
public String requestparam1(@RequestParam String username)
@PathVariable:完成请求参数与形参的映射。
@RequestMapping(value="/users/{userId}/topics/{topicId}") public String test( @PathVariable(value="userId") int userId, @PathVariable(value="topicId") int topicId)
@RequestBody:注解实现接收http请求的json数据,将json转换为java对象
@ResponseBody:注解实现将controller方法返回对象转化为json对象响应给客户。