美文网首页
SimpleUrlHandlerMapping静态资源处理器二

SimpleUrlHandlerMapping静态资源处理器二

作者: 程序员札记 | 来源:发表于2023-07-27 08:29 被阅读0次

获取资源

@Nullable
    protected Resource getResource(HttpServletRequest request) throws IOException {
        String path = (String) request.getAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE);//获取前面放入的路径属性
        ...
        path = processPath(path);//处理路径,获取资源名字

        ...
        Resource resource = this.resolverChain.resolveResource(request, path, getLocations());//解析资源
        if (resource != null) {//资源转换
            resource = this.transformerChain.transform(request, resource);
        }
        return resource;
    }

解析资源

最后到PathResourceResolvergetResource

@Nullable
    private Resource getResource(String resourcePath, @Nullable HttpServletRequest request,
            List<? extends Resource> locations) {
        //变量查看是否有该资源
        for (Resource location : locations) {
            try {
                String pathToUse = encodeIfNecessary(resourcePath, request, location);//可能要编码
                Resource resource = getResource(pathToUse, location);//获得资源,用URL读取
                if (resource != null) {
                    return resource;
                }
            }
            catch (IOException ex) {
                if (logger.isDebugEnabled()) {
                    String error = "Skip location [" + location + "] due to error";
                    if (logger.isTraceEnabled()) {
                        logger.trace(error, ex);
                    }
                    else {
                        logger.debug(error + ": " + ex.getMessage());
                    }
                }
            }
        }
        return null;
    }

会挨个遍历以下资源路径下是否有该资源。


image.png

资源是否可读

image.png

封装路径到该资源路径下,并创建ClassPathResource

image.png

AbstractFileResolvingResource的isReadable

先获取URL判断是文件路径还是网络的,然后分别尝试去查找:

image.png

其实就是用类加载器去加载路径,返回URL

image.png
image.png

根据协议来判断是不是文件:


image.png

最后创建一个文件对象,看是否可读且不是目录。

如果是网络的话就直接连接,然后获取内容长度来判断存不存在。

写出资源

资源获取到了,要写出去呀,就是调用AbstractHttpMessageConverterwrite方法,添加好内容头信息,然后写入输出缓存,并刷出去。

image.png

内部就是读资源,然后写入输出流中:


image.png

其实他在拷贝数据的时候已经刷出去了:


image.png

这样,静态资源的处理流程基本知道了,主要SimpleUrlHandlerMapping是对一些资源路径做了映射处理,有处理器处理,所以可以直接就访问资源:

classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/,/

相关文章

  • SpringMVC入门知识2

    非注解的处理器映射器SimpleUrlHandlerMapping:简单url映射可以实现对url的集中配置多个映...

  • day43课堂笔记(HTTP以及Nginx)

    第一章、思想 第二章、静态网页资源 2.1、什么是静态网页资源? 2.2、静态网页资源特点 2.3、静态网页资源特...

  • day42 HTTP以及Nginx

    第一章、思想 第二章、静态网页资源 2.1、什么是静态网页资源? 2.2、静态网页资源特点 2.3、静态网页资源特...

  • HTTP&NGINX

    第一章、思想 第二章、静态网页资源 2.1、什么是静态网页资源? 2.2、静态网页资源特点 2.3、静态网页资源特...

  • Spring MVC SimpleUrlHandlerMappi

    In Spring MVC application, the SimpleUrlHandlerMapping is...

  • 系统优化!! 吞吐量??

    一、jvm 堆内存大小 (减少full gc) 二、静态资源分离将静态资源数据加载至nginx或者其他服务提升系统...

  • 10.Nginx作为静态资源WEB服务-配置语法(sendfil

    静态资源WEB服务 Nginx作为静态资源WEB服务 , Nginx作为静态资源的HTTP WebServer它可...

  • Tomcat(Idea版)

    静态资源与动态资源 静态资源:html 动态资源:jsp 动态资源要先转换为静态资源,再返回给浏览器 网络通信三要...

  • java内部类

    静态内部类: 静态内部类本身可以访问外部的静态资源,包括静态私有资源。但是不能访问非静态资源,可以不依赖外部类实例...

  • springMVC(4) HandlerMapping实现之Si

    HandlerMapping在springMVC中有多种实现,SimpleUrlHandlerMapping就是其...

网友评论

      本文标题:SimpleUrlHandlerMapping静态资源处理器二

      本文链接:https://www.haomeiwen.com/subject/crslpdtx.html