如何假装成一个服务端开发(一)java
如何假装成一个服务端开发(三) spring
如何假装成一个服务端开发(五)json
如何假装成一个服务端开发(七)服务器
关于mvc模式这里就再也不详细说明了,不过对应到Spring开发的流程仍是能够学习一下的。mybatis
视图发出http请求,发送给控制器(注意,这里叫作Controller和咱们后面要说的Controller的意义有所不一样)。控制器会进行请求的分发,最终到达模型层。而后模型层要么进行服务要么再继续从数据库取数据,而后返回给控制层,控制层再返回给前台视图。mvc
尽管在 Spring Boot 的开发中,咱们能够很快速地经过配置实现 Spring MVC 的开发,但为了解决实际的问题,咱们仍是颇有必要了解 Spring MVC 的运行流程和组件,不然很难理解 Spring Boot 自动为咱们生成了什么,配置了什么,这些有什么用。流程和组件是 Spring MVC 的核心,Spring MVC 的流程是围绕 DispatcherServlet 而工做的,它负责协调和组织不一样组件完成请求处理并返回响应工做。app
上图是一张Spring MVC工做的标准流程图,可是在进行这些流程以前,咱们还须要经历相当重要的一步,服务器启动。在Spring Boot的环境下,当服务器启动,它就会初始化Spring MVC的一些重要组件,好比DispactherServlet HandlerAdapter等。咱们能够在DispatcherServlet.properties 这个文件中找到被初始化的类,而且会存放在Spring IoC容器中。
# 国际化解析器 org.springframework.web.servlet.LocaleResolver= ... # 主题解析器 org.springframework.web.servlet.ThemeResolver=... # HandlerMapping 实例 org.springframework.web.servlet.HandlerMapping=... # 处理器适配器 org.springframework.web.servlet.HandlerAdapter=... # 处理器异常解析器 org.springframework.web.servlet.HandlerExceptionResolver=... # 策略视图名称转换器,当你没有返回视图逻辑名称的时候,经过它能够生成默认的视图名称 org.springframework.web.servlet.RequestToViewNameTranslator=... # 视图解析器 org.springframework.web.servlet.ViewResolver=... # FlashMap 管理器。不经常使用,再也不讨论 org.springframework.web.servlet.FlashMapManager=...
另外,咱们在代码中还会定义一些@Controller ,它表示这是一个控制器,好比咱们在上一节定义了一个控制器
@Controller @RequestMapping("/mybatis") public class MyBatisController { @Autowired private MyBatisUserService myBatisUserService = null; @RequestMapping("/getUser") @ResponseBody public User getUser(Long id) { return myBatisUserService.getUser(id); } @RequestMapping("/test") @ResponseBody public String test() { return "test"; } }
@RequestMapping表明请求路径和控制器(和它其中的方法)的映射关系。前面看到在Spring MVC初始化的时候有一个HandlerMapping对象,这个对象会扫描全部的@RequestMapping而且保存起来。当用户发起的请求被DispatcherServlet链接后,就会经过HandlerMapping进行匹配。匹配完成后,HandlerMapping会返回一个HandlerExecutionChain对象
public class HandlerExecutionChain { // 日志 private static final Log logger = LogFactory.getLog(HandlerExecutionChain.class); // 处理器 private final Object handler; // 拦截器数组 private HandlerInterceptor[] interceptors; // 拦截器列表 private List<HandlerInterceptor> interceptorList; // 拦截器当前下标 private int interceptorIndex = -1; ...... }
其中handler字段就是对@Controller的包装,里面包含了参数处理逻辑,拦截器处理逻辑等。
获得这个匹配返回对象以后咱们须要去执行他,担任执行者的就是HandlerAdapter,不一样的handler可能有不一样的执行逻辑,因此这个时候就会存在多个HandlerAdapter去执行操做。
抛开内部复杂的运行逻辑,从宏观上来看,最终咱们的@Controller中的方法得以被执行,最终将返回一个ModelAndView(可是咱们在使用的时候可能会看到直接返回string,或者返回json字符的,咱们晚点再解释,多数状况最终仍是会被封装成ModelAndView)。而后ModelAndView会传入驶入解析器ViewResolver去生成(定位)最后的视图,最终将视图渲染出来。
在Spring Boot的默认初始化中,咱们可以看到默认的ViewResolver 的 InternalResourceViewResolver ,咱们能够经过application.properties 配置前缀和后缀。
spring.mvc.view.prefix=/WEB-INF/jsp/ spring.mvc.view.suffix=.jsp
经过这个配置InternalResourceViewResolver 这个视图解析器解析时就会添加前缀和后缀。好比控制器返回 "/user/details"就会添加先后缀而后定位视图。
一下列出了Spring MVC的可配置项
# SPRING MVC (WebMvcProperties) spring.mvc.async.request-timeout= # 异步请求超时时间(单位为毫秒) spring.mvc.contentnegotiation.favor-parameter=false # 是否使用请求参数(默认参数为"format")来肯定请求的媒体类型 spring.mvc.contentnegotiation.favor-path-extension=false # 是否使用 URL 中的路径扩展来肯定请求的媒体类型 spring.mvc.contentnegotiation.media-types.*= # 设置内容协商向媒体类型映射文件扩展名。例如,YML 文本/YAML spring.mvc.contentnegotiation.parameter-name= # 当启用 favor-parameter 参数是,自定义参数名 spring.mvc.date-format= # 日期格式配置,如 yyyy-MM-dd spring.mvc.dispatch-trace-request=false # 是否让FrameworkServlet doService方法支持 TRACE 请求 spring.mvc.dispatch-options-request=true # 是否启用 FrameworkServlet doService 方法支持OPTIONS 请求 spring.mvc.favicon.enabled=true # spring MVC 的图标是否启用 spring.mvc.formcontent.putfilter.enabled=true # Servlet 规范要求表格数据可用于 HTTP POST 而不是 HTTP PUT 或 PATCH 请求,这个选项将使得过滤器拦截 HTTP PUT 和 PATCH,且内容类型是 application/x-www-form-urlencoded 的请求,而且将其转换为 POST 请求 spring.mvc.ignore-default-model-on-redirect=true # 若是配置为 default,那么它将忽略模型重定向的场景 spring.mvc.locale= # 默认国际化选项,默认取 Accept-Language spring.mvc.locale-resolver=accept-header # 国际化解析器,若是须要固定可使用 fixed spring.mvc.log-resolved-exception=false # 是否启用警告日志异常解决 spring.mvc.message-codes-resolver-format= # 消息代码的格式化策略。例如,' prefix_error_code ' spring.mvc.pathmatch.use-registered-suffix-pattern=false # 是否对 spring.mvc.contentnegotiation.media-types.*注册的扩展采用后缀模式匹配 spring.mvc.pathmatch.use-suffix-pattern=false # 当匹配模式到请求时,是否使用后缀模式匹配(.*) spring.mvc.servlet.load-on-startup=-1 # 启用 Spring Web 服务 Serlvet 的优先顺序配置 spring.mvc.static-path-pattern=/** # 指定静态资源路径 spring.mvc.throw-exception-if-no-handler-found=false # 若是请求找不处处理器,是否抛出 NoHandlerFoundException 异常 spring.mvc.view.prefix= # Spring MVC 视图前缀 spring.mvc.view.suffix= # Spring MVC 视图后缀
咱们能够在application.properties中直接配置。这是经过Spring Boot 提供的WebMvcAutoConfiguration类实现的,这个类中有一个静态内部类WebMvcAutoConfigurationAdapter,它继承了WebMvcConfigurer。
而 WebMvcConfigurer 正是Spring MVC用于配置的接口,在没有Spring Boot的状况下,咱们会重写这个接口(接口中有不少default方法,因此没必要重写全部方法),添加咱们须要的拦截器等便可。可是在Spring Boot中,因为自动配置的存在,咱们的配置会更简单一些。
因此Spring MVC的主要工做就是拦截http请求,而且将根据必定规则将请求分发至对应的方法处理。实际上Spring MVC还有很是多的东西能够学习,可是基本上全部内容都是牢牢围绕这个目标进行的。
Spring MVC还能作那些事情?
1.处理器映射。 咱们可以制定拦截POST 或者GET等请求方式,限定请求参数,限定请求头等,具体能够学习@RequestMapping 和 @GetMapping等注解
2.参数获取。Spring MVC是如何从请求中获取数据的而且转换成@Controller中的参数的
3.自定义参数转换规则。Spring MVC默认提供了一些转换规则,可是并不能知足全部状况,不少时候须要咱们本身定义转换的规则.
4.Spring MVC 将参数转换出来以后提供了参数合法性验证的能力。
5.ModelAndView和ViewResolver学习,默认支持输出pdf,excel文档等能力
6.Spring MVC对文件上传的支持
7.在执行@Controller方法以前以后,完成后还能够设置拦截器。
8.Spring MVC 国际化(语言切换)使用
9.Spring MVC 操做Session
10.Spring MVC 获取请求头
11.@ResponseBody
12.重定向
13.@Controller 的运行通知
上面列出的这些只是想总结一下Spring MVC还可以作那些东西,咱们并不着急一次学全,在理解Spring MVC运行逻辑的状况下,其余知识内容咱们能够在须要的时候慢慢学习补充。