Spring MVC

Spring MVC是Spring提供的一个轻量级Web框架,它实现了Web MVC设计模式。提供了一个前端控制器DispatcherServlet,使开发人员无须额外开发控制器对象。

在老版本的Spring中,配置文件内必须要配置处理器映射器、处理器适配器和视图解析器。但在Spring 4.0以后,如果不配置处理器映射器BeanNameUrlHandlerMapping、处理器适配器SimpleControllerHandlerAdapter和视图解析器InternalResourceViewResolver,就会使用Spring内部默认的配置来完成相应的工作

在web.xml中配置Spring MVC的前端控制器等信息
在src目录下创建Spring MVC的核心配置文件springmvc-config.xml,在该文件中配置组件扫描器和视图解析器

执行流程

(1)用户通过浏览器向服务器发送请求,请求会被Spring MVC的前端控制器DispatcherServlet所拦截。
(2)DispatcherServlet拦截到请求后,会调用HandlerMapping处理器映射器。
(3)处理器映射器根据请求URL找到具体的处理器,生成处理器对象及处理器拦截器(如果有就生成)一并返回给DispatcherServlet。
(4)DispatcherServlet会通过返回信息选择合适的HandlerAdapter(处理器适配器)。
(5)HandlerAdapter会调用并执行Handler(处理器),这里的处理器就是程序中编写的Controller类,也被称为后端控制器
(6)Controller执行完成后,会返回一个ModelAndView对象,该对象中包含视图名或包含模型与视图名。
(7)HandlerAdapter将ModelAndView对象返回给DispatcherServlet。
(8)DispatcherServlet会根据ModelAndView对象选择一个合适的ViewResolver(视图解析器)。
(9)ViewResolver解析后,会向DispatcherServlet中返回具体的View(视图)。
(10)DispatcherServlet对View进行渲染(即将模型数据填充至视图中)。
(11)视图渲染结果会返回给客户端浏览器显示。

注解用法

Spring通过@Controller注解找到相应的控制器类后,还需要知道控制器内部对每一个请求是如何处理的,这就需要使用org.springframework.web.bind.annotation.RequestMapping注解类型。RequestMapping用于映射一个请求或一个方法,其注解形式为@RequestMapping,可以使用该注解标注在一个方法或一个类上。

@RequestMapping注解的属性

Spring 4.3版本中引入了组合注解来帮助简化常用的HTTP方法的映射,并更好地表达被注解方法的语义。其组合注解如下所示。
•  @GetMapping:匹配GET方式的请求。
•  @PostMapping:匹配POST方式的请求。
•  @PutMapping:匹配PUT方式的请求。
•  @DeleteMapping:匹配DELETE方式的请求。
•  @PatchMapping:匹配PATCH方式的请求。
以@GetMapping为例,该组合注解是@RequestMapping(method= RequestMethod.GET)的缩写

请求方法参数较多,不一一列举。绝大部分为Servlet API类型。但是,org.springframework.ui.Model类型不是一个Servlet API类型,而是一个包含Map对象的Spring MVC类型。如果方法中添加了Model参数,那么每次调用该请求处理方法时,Spring MVC都会创建Model对象,并将其作为参数传递给方法。

请求方法的返回值,常见的返回类型有ModelAndView、String和void。其中,ModelAndView类型中可以添加Model数据,并指定视图;String类型的返回值可以跳转视图,但不能携带数据;而void类型主要在异步请求时使用,它只返回数据,而不会跳转视图。

数据绑定

Spring MVC框架会通过数据绑定组件(DataBinder)将请求参数串的内容进行类型转换,然后将转换后的值赋给控制器类中方法的形参,这样后台方法就可以正确绑定并获取客户端请求携带的参数。

步骤01 Spring MVC将ServletRequest对象传递给DataBinder。
步骤02 将处理方法的入参对象传递给DataBinder。
步骤03 DataBinder调用ConversionService组件进行数据类型转换、数据格式化等工作,并将ServletRequest对象中的消息填充到参数对象中。
步骤04 调用Validator组件对已经绑定了请求消息数据的参数对象进行数据合法性校验。
步骤05 校验完成后会生成数据绑定结果BindingResult对象,Spring MVC会将BindingResult对象中的内容赋给处理方法的相应参数。

比较常用的是POJO数据绑定。所有关联的请求参数封装在一个POJO中,然后为每一个参数设定set get 方法
使用POJO类型数据绑定时,前端请求的参数名必须与要绑定的POJO类中的属性名一样,这样才会自动将请求数据绑定到POJO对象中,否则后台接收的参数值为null。
对象比较复杂时,还可以在其中一个POJO中封装另一个POJO。

为了防止前端传入的中文数据出现乱码问题,可以使用Spring提供的编码过滤器来统一编码。要使用编码过滤器,只需要在web.xml中添加编码过滤器,这样所有的请求信息都会以UTF-8的编码格式进行解析。

有些特殊类型的参数无法在后台进行直接转换,例如日期数据需要开发者自定义转换器(Converter)或格式化(Formatter)进行数据绑定。
对于复杂类型的数据,比如数组或者集合可以定义包含数组或者对象类的集合,进行绑定。

JSON数据交互

JSON(JavaScript Object Notation,JS对象标记)是一种轻量级的数据交换格式,采用完全独立于编程语言的文本格式来存储和表示数据。

对象结构:

1
2
3
{ keyl: valuel,
key2: value2,
……}

关键字(key)必须为String类型,值(value)可以是String、Number、Object、Array等数据类型。

为了实现浏览器与控制器类(Controller)之间的数据交互,Spring提供了一个HttpMessageConverter接口来完成此项工作。该接口主要用于将请求信息中的数据转换为一个类型为T的对象,并将类型为T的对象绑定到请求方法的参数中,或者将对象转换为响应信息传递给浏览器显示。
MappingJacksona2HttpMessageConverter是Spring MVC默认处理JSON格式请求响应的实现类。

JS0N数据交互注解及说明

mvc:annotation-driven/配置会自动注册 RequestMappingHandlerMapping和RequestMappingHandlerAdapter两个Bean,并提供对读写XML和读写JSON等功能的支持。

RESTful

RESTful也称为REST(Representational State Transfer),可以将它理解为一种软件架构风格或设计风格。就是把请求参数变成请求路径

http://.../queryitems?id=1http://.../queryitems?id=1
变为
http://.../items/1

RESTful风格在HTTP请求中使用put、delete、post和get方式分别对应添加、删除、修改和查询的操作。