Spring面试(六)WebMVC
文章目录
- Spring WebMVC 底层原理
- Spring WebMVC 处理请求的流程
- 核心架构的具体流程步骤
- 对上述流程的补充
- SpringMVC实现原理之DispatcherServlet的初始化过程
- Spring进阶 - SpringMVC实现原理之DispatcherServlet处理请求的过程
- MVC是什么?MVC设计模式的好处有哪些
- Spring WebMVC相关注解
- 1. 常用注解
- 1. 请求映射相关注解
- 2. 请求参数相关的注解
- 3. @Controller注解的作用
- 4. @RequestMapping注解的作用
- 5. @ResponseBody注解的作用
Spring WebMVC 底层原理
Spring WebMVC 处理请求的流程
核心架构的具体流程步骤
核心架构的具体流程步骤如下:
- 首先用户发送请求——>DispatcherServlet,前端控制器收到请求后自己不进行处理,而是委托给其他的解析器进行处理,作为统一访问点,进行全局的流程控制;
- DispatcherServlet——>HandlerMapping, HandlerMapping 将会把请求映射为 HandlerExecutionChain 对象(包含一个Handler 处理器(页面控制器)对象、多个HandlerInterceptor 拦截器)对象,通过这种策略模式,很容易添加新的映射策略;
- DispatcherServlet——>HandlerAdapter,HandlerAdapter 将会把处理器包装为适配器,从而支持多种类型的处理器,即适配器设计模式的应用,从而很容易支持很多类型的处理器;
- HandlerAdapter——>处理器功能处理方法的调用,HandlerAdapter 将会根据适配的结果调用真正的处理器的功能处理方法,完成功能处理;并返回一个ModelAndView 对象(包含模型数据、逻辑视图名);
- ModelAndView 的逻辑视图名——> ViewResolver,ViewResolver 将把逻辑视图名解析为具体的View,通过这种策略模式,很容易更换其他视图技术;
- View——>渲染,View 会根据传进来的Model 模型数据进行渲染,此处的Model 实际是一个Map 数据结构,因此很容易支持其他视图技术;
- 返回控制权给DispatcherServlet,由DispatcherServlet 返回响应给用户,到此一个流程结束。
对上述流程的补充
上述流程只是核心流程,这里我们再补充一些其它组件:
- Filter(ServletFilter):进入Servlet前可以有preFilter, Servlet处理之后还可有postFilter
- LocaleResolver:在视图解析/渲染时,还需要考虑国际化(Local),显然这里需要有LocaleResolver.
- ThemeResolver:如何控制视图样式呢?SpringMVC中还设计了ThemeSource接口和ThemeResolver,包含一些静态资源的集合(样式及图片等),用来控制应用的视觉风格。
- 对于文件的上传请求?:对于常规请求上述流程是合理的,但是如果是文件的上传请求,那么就不太一样了;所以这里便出现了MultipartResolver。
SpringMVC实现原理之DispatcherServlet的初始化过程
Spring进阶 - SpringMVC实现原理之DispatcherServlet的初始化过程
Spring进阶 - SpringMVC实现原理之DispatcherServlet处理请求的过程
Spring进阶 - SpringMVC实现原理之DispatcherServlet处理请求的过程
MVC是什么?MVC设计模式的好处有哪些
-
mvc是一种设计模式(设计模式就是日常开发中编写代码的一种好的方法和经验的总结)。模型(model)-视图(view)-控制器(controller),三层架构的设计模式。用于实现前端页面的展现与后端业务数据处理的分离。
-
mvc设计模式的好处
a. 分层设计,实现了业务系统各个组件之间的解耦,有利于业务系统的可扩展性,可维护性。
b.有利于系统的并行开发,提升开发效率。
Spring WebMVC相关注解
1. 常用注解
1. 请求映射相关注解
- @RequestMapping (包含所有类型)
- @GetMapping
- @PostMapping
- @PutMapping
- @DeleteMapping
- @PatchMapping
注意:由于form表单不支持put和delete方式提交,所以需要一些方法去解决;
2. 请求参数相关的注解
@Pathvariable、@RequestHeader、@RequestParam、@CookieValue、@RequestBody、@RequestAttribute、@MatrixVariable 矩阵变量
- @Pathvariable
获取路径中的参数,用于rest风格
@PathVariable的文档:
If the method parameter is Map<String, String>
then the map is populated with all path variable
names and values.(map可以取到所有的参数。)
- @RequestHeader
可以获得所有请求头的信息
可以一次取一个信息:
文档:
If the method parameter is Map<String, String>, MultiValueMap<String, String>, or HttpHeaders then the map is populated with all header names and values.
map可以取到所有的参数
-
@RequestParam
获取参数,用于非rest风格 ,可以指定默认值
也可以使用map取到所有参数。 -
@CookieValue
获取cookie -
@RequestBody
获取请求体 (只有post才有请求体) -
@RequestAttribute
获取request域属性。 可用于转发的时候,携带参数
- @MatrixVariable 矩阵变量
注意:矩阵变量应该绑定在路径变量中!Springboot默认禁用了矩阵变量功能!!!
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Override
public void configurePathMatch(PathMatchConfigurer configurer) {
UrlPathHelper urlPathHelper = new UrlPathHelper();
//开启矩阵变量功能
urlPathHelper.setRemoveSemicolonContent(false);
configurer.setUrlPathHelper(urlPathHelper);
}
}
url路径:
http://localhost:8080/cars/sell;low=34;brand=byd;brand=haha
结果:
{"path":"sell","low":34,"brand":["byd","haha"]}
测试二
:
@GetMapping("/boss/{bossId}/{empId}")
@ResponseBody
public Map boss(@MatrixVariable(value = "age", pathVar = "bossId") Integer bossAge,
@MatrixVariable(value = "age", pathVar = "empId") Integer empAge) {
Map<String, Object> map = new HashMap<>();
map.put("bossAge", bossAge);
map.put("empAge", empAge);
return map;
}
url路径:
http://localhost:8080/boss/1;age=20/2;age=10
结果:
{"bossAge":20,"empAge":10}
3. @Controller注解的作用
- 在Spring MVC 中,控制器Controller 负责处理由DispatcherServlet 分发的请求,它把用户请求的数据经过业务处理层处理之后封装成一个Model ,然后再把该Model 返回给对应的View 进行展示。在Spring MVC 中提供了一个非常简便的定义Controller 的方法,你无需继承特定的类或实现特定的接口,只需使用@Controller 标记一个类是Controller ,然后使用@RequestMapping 和@RequestParam 等一些注解用以定义URL 请求和Controller 方法之间的映射,这样的Controller就能被外界访问到。此外Controller 不会直接依赖于HttpServletRequest 和HttpServletResponse等HttpServlet 对象,它们可以通过Controller 的方法参数灵活的获取到。
- @Controller 用于标记在一个类上,使用它标记的类就是一个Spring MVC Controller 对象。分发处理器将会扫描使用了该注解的类的方法,并检测该方法是否使用了@RequestMapping 注解。@Controller 只是定义了一个控制器类,而使用@RequestMapping 注解的方法才是真正处理请求的处理器。单单使用@Controller 标记在一个类上还不能真正意义上的说它就是Spring MVC 的一个控制器类,因为这个时候Spring 还不认识它。那么要如何做Spring 才能认识它呢?这个时候就需要我们把这个控制器类交给Spring 来管理。
4. @RequestMapping注解的作用
- RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。
RequestMapping注解有六个属性 | |
---|---|
value | 指定请求的实际地址,指定的地址可以是URI Template 模式 |
method | 指定请求的method类型, GET、POST、PUT、DELETE等; |
consumes | 指定处理请求的提交内容类型(Content-Type),例如application/json,text/html; |
produces | 指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回; |
params | 指定request中必须包含某些参数值是,才让该方法处理。 |
headers | 指定request中必须包含某些指定的header值,才能让该方法处理请求。 |
5. @ResponseBody注解的作用
-
作用: 该注解用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区。
-
使用时机:返回的数据不是html标签的页面,而是其他某种格式的数据时(如json、xml等)使用;