目录
一、SpringMVC简介
参考于:https://www.cnblogs.com/myitnews/p/11565941.html#autoid-1-0-0
Spring Web MVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,将web层进行职责解耦,基于请求驱动指的就是使用请求-响应模型,框架的目的就是帮助我们简化开发,Spring Web MVC也是要简化我们日常Web开发的。与之相反的是基于组件的、事件驱动的Web框架,如Tapestry、JSF等。
二、Spring的MVC运行流程
-
用户请求发送给DispatcherServlet,DispatcherServlet调用HandlerMapping处理器映射器;
-
HandlerMapping根据xml或注解找到对应的处理器,生成处理器对象【其实返回的是一个执行器链:包含handler和多个拦截器Interceptor】返回给DispatcherServlet;
-
DispatcherServlet会调用相应的HandlerAdapter;
-
HandlerAdapter经过适配调用具体的处理器去处理请求,生成ModelAndView返回给DispatcherServlet
-
DispatcherServlet将ModelAndView传给ViewReslover解析生成View返回给DispatcherServlet;
-
DispatcherServlet根据View进行渲染视图,最后响应给用户。
三、SpringMVC常用注解
@Controller
- 标注控制层组件,标记的类就是一个SpringMVC Controller对象。
- 分发处理器将会扫描使用了该注解的类的方法,并检测方法是否使用使用@RequestMapping注解。
- 可以把request请求header部分的值绑定到方法参数上。
- 在标注的方法上,试图解析器可以解析jsp、html等页面,若要返回json,需要加上@ResponseBody 。
类似的表示组件作用的还有:
- @Service:表示业务层组件。
- @Repository:表示持久层组件。
- @Component:一般组件。
@RestController
- 等于@Controller + @ResponseBody
- 直接返回json,试图解析器无法再解析html等页面。
- 如果想返回页面,可以返回一个ModelAndView对象:
return new ModelAndView("index")
。
@RestController
public class HelloController {
@GetMapping("/hello")
public String hello(){
return "this is my spring-boot-quick-start...";
}
@GetMapping("go")
public ModelAndView go(){
ModelAndView mv = new ModelAndView("index");
return mv;
}
}
@ControllerAdvice
- 用于全局异常处理,配合
ExceptionHandler
,捕获Controller中抛出指定类型的异常。
@ControllerAdvice
public class GlobalExceptionHandler {
@ResponseBody
@ExceptionHandler(value = ApiException.class)
public AjaxResult handle(ApiException e){
if(e.getErrorCode()!=null){
return AjaxResult.error(e.getErrorCode().getCode(),e.getMessage());
}
return AjaxResult.error(e.getMessag());
}
}
@ControllerAdvice
public class MyControllerAdvice {
@InitBinder
public void globalInitBinder(WebDataBinder binder){
binder.addCustomFormatter(new DateFormatter("yyyy-MM-dd"));
}
}
- 全局数据预处理,结合方法型注解@modelattribute,表示其标注的方法将会在目标Controller方法执行之前执行。
@ControllerAdvice
public class MyControllerAdvice {
@modelattribute(value = "message")//在所有拦截器的preHandler方法执行之后执行
public String globalModelAttribute(){
System.out.println("MyControllerAdvice.globalModelAttribute");
return "test";
}
}
@RestController
public class HelloController {
@GetMapping("go")
public ModelAndView go(@modelattribute("message") String message){
System.out.println(message); //"test"
ModelAndView mv = new ModelAndView(message);
return mv; //跳转到 test.html页面
}
}
@RequestBody
- 作用于形参列表,将前台传来的数据【xml或json】封装为javabean。通常用于接收post请求的请求体。
@ResponseBody
@RequestParam
@RequestHeader
- 可以把Request请求header部分的值绑定到方法的参数上。
@PathVariable
@GetMapping("/go/{id}")
public String PathVa(@PathVariable("id") Long id){
System.out.println(id);
return "test";
}
@RequestMapping
-
处理请求地址映射的注解,可用于类或方法上。
-
用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。
-
参数:
- value:指定请求的实际地址,指定的地址可以是URI Template 模式;
- method: 指定请求的method类型, GET、POST、PUT、DELETE等,在RequestMethod定义,同GetMapping等。
@RequestMapping(value = "/go",method = RequestMethod.GET)
=GetMapping("/go")
- consumes: 指定处理请求的提交内容类型(Content-Type),例如
application/json,text/html;
- produces: 指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回;
- params: 指定request中必须包含某些参数值时,才让该方法处理;
- headers: 指定request中必须包含某些指定的header值,才能让该方法处理请求;
@Autowired
-
如果类型匹配的bean不止一个,接着根据名称匹配。