Spring MVC是Spring构建在Servlet API上的Web框架。目前大部分的Java Web 开发已经使用Spring MVC 来作。它提供了模型 - 视图 - 控制器架构,可用于开发灵活的Web应用程序。在本教程中,咱们将重点关注与之相关的问题,由于它一般是Spring开发人员面试的主题。前端
Spring MVC 实现了一些明确并且相对低耦合的概念,可让开发者很容易开发和测试他们的Web应用。这些概念有:java
这些概念都是彻底独立并且职责单一。所以Spring MVC给了咱们很大的灵活性。它基于接口(提供的实现类),咱们可使用自定义接口配置框架的每一个部分。另外一个重要的事情是咱们再也不依赖于特定的视图技术(例如,JSP),能够选择咱们最复合业务的视图技术。此外,咱们不只仅在Web应用程序开发中使用Spring MVC,也能够用它建立RESTful Web服务。web
流程图:面试
@Autowired
注解可使用在成员属性上或方法上,按类型注入Spring bean。这个注解容许Spring解析协做的bean并注入到你业务须要的bean中。spring
@ModelAttribute
注解是Spring MVC中最重要的注解之一。它将方法参数或方法返回值绑定到命名中的Model属性中,而后将其公开给Web视图。若是咱们在方法级别使用它,则代表该方法的目的是添加一个或多个模型属性。另外一方面,当用做方法参数时,它表示应从模型中检索参数。若是不存在,咱们应该首先实例化它,而后将其添加到Model中。一旦出如今模型中,咱们应该填充全部具备匹配名称的请求参数的参数字段。segmentfault
@Controller
和@RestController
注释之间的主要区别在于@ResponseBody
注释自动包含在@RestController
中。这意味着咱们不须要使用@ResponseBody
来注释咱们的处理程序方法。后端
咱们可使用@PathVariable
注解来从请求URI中提取一个特定模版变量的值来做为咱们的请求参数。例如 从/user/123
提取123
给/user/{id}
控制器来获取一个id=123
的数据映射关系。须要特别指出的是经过此注解获取的值不会被编码。具体可经过个人文章来获取缘由。api
Spring MVC 默认支持JSR-303校验规范 。并在Spring-Boot-starter-web中提供了JSR-303规范实现Hibernate Validator。咱们可使用它来进行参数校验。详情可查看个人文章。跨域
@RequestBody
注解用于控制器方法参数上,目的是将Http 请求体转换为领域对象(请求参数)。Spring 经过HttpMessageConverter
将请求体反序列化到Java对象中,默认使用jackson类库反序列化。@ResponseBody
注解使用于Spring MVC控制器中的处理程序方法上,它代表咱们将把方法的返回类型直接写入HTTP响应主体而不会将它放在Model中,一样不会将其解释为视图名称。Spring MVC拦截器容许咱们拦截客户端请求并在三个地方处理它 - 在处理以前,处理以后或完成以后(在呈现视图时)。拦截器切面处理一些公共逻辑而避免重复处理程序代码(如日志记录),也能够用来更改Spring模型中全局使用的参数。经过如下方式:架构
org.springframework.web.servlet.handler.HandlerInterceptorAdapter
——继承该类org.springframework.web.servlet.HandlerInterceptor
——实现该接口经过@ControllerAdvice
(也可以使用@RestControllerAdvice
)注解和@ExceptionHandler
注解组合,经过在方法入参中捕获异常进行处理,举例以下:
@Slf4j @RestControllerAdvice("cn.felord.manage.api") public class GlobalExceptionControllerAdvice { @ExceptionHandler(NullPointerException.class) public Rest nullPointHandler(HttpServletRequest request, NullPointerException e) { log.error("空指针啦,赶忙关注公众号:Felordcn", e); return RestBody.failure(-1, "null point exception"); } }
Spring MVC 解决跨域问题主要有如下种办法:
filter
也能够处理。@CrossOrigin
注解。 请注意该方案须要在Spring MVC 4.x 以上。<mvc:cors>
标签中配置。WebMvcConfigurer#addCorsMappings(CorsRegistry)
来配置。若是想具体深刻可经过公众号:Felordcn 来获取具体的教程。
通常可经过两种方式:
org.springframework.core.convert.converter.Converter<S,T>
,并将实现注入Spring容器中。org.springframework.format.Formatter<T>
,并将实现注入Spring 容器中。关注公众号:码农小胖哥 获取更多资讯