如何假装成一个服务端开发(七)

目录

如何假装成一个服务端开发(一)java

如何假装成一个服务端开发(二)web

如何假装成一个服务端开发(三) spring

如何假装成一个服务端开发(四)数据库

如何假装成一个服务端开发(五)json

如何假装成一个服务端开发(六)数组

如何假装成一个服务端开发(七)服务器

 

MVC模式

    关于mvc模式这里就再也不详细说明了,不过对应到Spring开发的流程仍是能够学习一下的。mybatis

    视图发出http请求,发送给控制器(注意,这里叫作Controller和咱们后面要说的Controller的意义有所不一样)。控制器会进行请求的分发,最终到达模型层。而后模型层要么进行服务要么再继续从数据库取数据,而后返回给控制层,控制层再返回给前台视图。mvc

 

Spring 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的可配置项

# 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运行逻辑的状况下,其余知识内容咱们能够在须要的时候慢慢学习补充。 

相关文章
相关标签/搜索