目录
HttpServeltRequest和Model传值的区别:
RequestHead、RequestBody、RequestEntity
运行流程:
浏览器发送请求给后端,若请求地址符合url-pattern,该请求就会被SpringMVC的DispatcherServlet处理,在HandleMapping中保存了所有的请求映射,即哪个请求对应哪个Controller的哪个方法。调用HandlerMapping找到Controller控制器,以及对应的Controller方法,获得该Controller对象以及该对象对应的拦截器以HandlerExecutionChain执行链对象的形式返回。DispatcherServlet根据获得的Controller方法选择一个合适的HandlerAdapter提取Request中的数据模型作为形参填入controller方法中,开始执行方法。这个方法最终会返回为一个modelandview,DispatcherServlet根据model和view选择合适的视图解析器返回视图调用视图的render方法解析视图返回给浏览器。
@RequesMapping
如果标记在类上面表示请求路径的基本信息,如果标记在方法上面表示的是路径的具体信息,访问这个方法的请求路径应该是基本信息加上具体信息。
Model、ModelMap、Map之间的关系
都有一个直接或间接的实现类或子类叫BindingAwareModelMap所以都可以用这个类实例化。
ModelAndView:
DispatcherServlet在执行完任何Controller中的方法之后都会将模型(model)和视图(view)信息封装成一个ModelAndView对象返回。DispatcherServlet会将ModelAndView中的数据存入到request域中。
HttpServeltRequest和Model传值的区别:
只是用model更符合mvc设计,减少各层间耦合。
RequestHead、RequestBody、RequestEntity
RequestHead:包含了host、url、来源页面referer等大量信息。
RequestBody:包含了请求中传输的属性名属性值。@RequestBody用来标识形参,这个形参就表示RequestBody了
RequestEntity:包含了requestHead和requestBody。
@ResponseBody:
这个注解加在在一个方法上面的话这个方法的返回值就不是一个视图名称了而是一个响应体。想要返回json数据给浏览器的时候方法就要加上这个注解,并且打开mvc的注解驱动和加上jackson的依赖,这个时候服务器的就会将返回的对象自动转换成字符串形式的json对象给浏览器,如果返回的是一个Collection、数组则会转换成一个json数组,Map转换成对象。
json
json分为json数组和json对象,对象是在大括号中以键值对的形式存储数据,数组是在方括号中一个个的存储数据,json数组通过循环获取值,json对象通过.key获取值。
@RestController:
这个Controller的所有方法上面加上了一个@ResponseBody。
Interceptor拦截器
拦截的是controller中的控制器方法
使用方法是创建一个类实现HandlerInterceptor接口然后重写里面的3个方法,然后给这个拦截器注册。注册方法是创建一个配置类,如图LoginInterceptor是之前创建好的实现了HandlerInterceptor接口的拦截器。
这三个要重写的方法分别是
preHandle:在controller方法执行之前执行,这个方法的返回值类型是boolean如果返回的是true则表示放行,如果返回的是false则表示拦截。
postHandle:在controller方法执行之后执行
afterCompletion:在controller返回modelandview然后解析视图之后执行。
如果有多个拦截器三个方法的执行顺序是怎么样的:
如果多个拦截器的preHandel都返回true的话,根据拦截器注册的顺序preHandle顺序执行,postHandle和afterCompletion逆序执行。如果有preHandle返回false,则返回false的拦截器后面注册的拦截器的preHandle不会执行,所有拦截器的postHandle都不会执行,返回false的拦截器后面注册的拦截器的afterCompletion不会执行。