目录
工作流程:
用户发送请求到前端控制器DispatcherServlet,前端控制器收到请求后,调用处理器映射器handlerMapping,来获取handler并返回给前端控制器。
接着前端控制器会调用处理器适配器handlerAdapter,来执行handler,handler执行完毕后会返回modelandview,这个返回值会由处理器适配器接收并返回给前端控制器。
然后呢前端控制器会把modelandview传递给视图解析器进行解析,解析完毕后会得到一个具体的view,前端控制器会对这个view进行数据填充,填充完毕后就会响应给用户。
spring mvc的常用注解:
@Controller,@RestController,@RequestMapping @getMapping @PostMapping
@PathVariable @RequestParam @RequestBody @ResponseBody
分别说一下这些注解的作用:
@requestMapping:是一个处理用户发送的请求的注解,可用于类或方法上。用于类上,则表示类中的所有响应该请求的方法都是以@requestmapping中的vlaue中的值作为父路径。
@getmapping和@PostMapping,@getMapping是@RequestMapping里面的一种具体的请求方式,作用跟requestMapping差不多,但是getMapping就只能接收get请求,postMapping也是只能接收post请求
@PathVariable:获取url地址中占位符的值
@RequestParam:获取url地址上的请求参数
@RequestBody的作用:获取http请求中的json数据,将json转换为java对象
@ResponseBody的作用:将方法的返回值以json格式写到响应体中,不会进行逻辑视图解析而造成的页面跳转
spring mv跨域问题:
写一个配置类,实现WebMvcConfigurer接口,重写addCorsMappings方法
@Override public void addCorsMappings(CorsRegistry registry) { // 设置允许跨域的路由 registry.addMapping("/**") // 设置允许跨域请求的域名 .allowedOriginPatterns("*") // 是否允许证书(cookies) .allowCredentials(true) // 设置允许的方法 .allowedMethods("*") // 跨域允许时间 .maxAge(3600); }
Spring MVC怎么和AJAX相互调用的:
用responsebody注解,这样可以把方法的返回值以json的形式写到响应体中,而且不会经过视图解析器解析而造成页面跳转
spring mvc中的拦截功能:
写一个类去实现HandlerInterceptor接口,重写preHandler方法,在方法里面写请求放行逻辑,然后写一个配置类实现WebMvcConfigurer接口,重写方法addInterceptors方法,把拦截器加进去,然后在方法里面填写拦截路径以及放行路径
拦截路径的时候,不用写 servlet.context-path对应的值
Spring MVC的异常处理:
把异常抛到controller层,然后用ControllerAdvice跟ExceptionHandler两个注解来进行统一处理。
在前后端分离的时候,一定要加@responsebody注解,要不然会被视图解析器解析
mvc中的组件:
1,前端控制器dispatcherServlet:作用就是:接收请求,响应结果,相当于一个转发器,有了前端控制器就可以减少其他组件之间的耦合度,而且spring mvc框架是围绕着这个dispatcherServlet来设计的,它可以处理所有的http请求和响应
2,处理器映射器(handlerMapping): 根据url来寻找handler
3,处理器适配器(handlerAdapter):handler需要根据处理器适配器要求的规则去编写,这样子处理器适配器才能正确的去执行handler
4,处理器(handler)
5,视图解析器(viewResolver):对视图进行解析,根据视图的逻辑名解析成为真正的视图view
6,视图view:view是一个接口,它的实现类的支持不同的视图类型
preHandle、postHandle与afterCompletion的区别
preHandle
调用时间:Controller方法处理之前
执行顺序:链式Intercepter情况下,Intercepter按照声明的顺序一个接一个执行
若返回false,则中断执行,注意:不会进入afterCompletion
postHandle
调用前提:preHandle返回true
调用时间:Controller方法处理完之后,DispatcherServlet进行视图的渲染之前,也就是说在这个方法中你可以对ModelAndView进行操作
执行顺序:链式Intercepter情况下,Intercepter按照声明的顺序倒着执行。
备注:postHandle虽然post打头,但post、get方法都能处理
afterCompletion
调用前提:preHandle返回true
调用时间:DispatcherServlet进行视图的渲染之后
多用于清理资源