查漏补缺3:JAVA 使用中的相对路径和绝对路径全总结以及selvlet和filter的映射规则

模块一、路径
一、绝对路径
1 本地绝对路径
增加上盘符后的路径(e:/test/test.html)
2 网络绝对路径
增加协议,IP地址,端口号后的路径(http://localhost:8080/test/test.html)
二、相对路径
1 一般相对路径:不以/开头的相对路径

	1.1 基准路径是以当前资源的访问路径为基准推到目标文件的路径
	        			本地资源:访问路径就是从盘符开始的文件路径:file:///F:/VisualStudioCode/前端学习/css/icon.css
	        			网络资源:增加协议,IP地址,端口号后的路径(http://localhost:8080/test/test.html)
	1.2  ./:表示当前目录
	1.3  ../:上一级目录

2 特殊相对路径:以/开头的相对路径,以某一固定基准为参考的路径,可以认为是半绝对路径。不同的场景中,固定基准会发生变化

  2.1 前台路径
    	例如:<a href=”/sssss”><img src=””>
    		相对服务器的根 : http://localhost:8080/sssss
  2.2 后台路径
       例如:forward(”/user.jsp”), xml文件中所配置的文件的路径
    		相对web应用的根:http://localhost:8080/atcrowdfunding-web/user.jsp
  2.3 本地路径
    	例如在本地的:本地文件:<script type="text/javascript" src="/jquery-3.3.1.min.js"></script>
   			 相对于盘符下面: file:///F:/jquery-3.3.1.min.js

模块二、servlet的url路径匹配
当 一个请求发送到servlet容器的时候,容器先会将请求的url减去当前应用上下文的路径作为servlet的映射url,比如我访问的是 http://localhost/test/aaa.html,我的应用上下文是test,容器会将http://localhost/test去掉, 剩下的/aaa.html部分拿来做servlet的映射匹配。这个映射匹配过程是有顺序的,而且当有一个servlet匹配成功以后,就不会去理会剩下 的servlet了(filter不同,后文会提到)。其匹配规则和顺序如下:

1 精确路径匹配。例子:比如servletA 的url-pattern为 /test,servletB的url-pattern为 /* ,这个时候,如果我访问的url为http://localhost/test ,这个时候容器就会先进行精确路径匹配,发现/test正好被servletA精确匹配,那么就去调用servletA,也不会去理会其他的 servlet了。

2 最长路径匹配。例子:servletA的url-pattern为/test/,而servletB的url-pattern为/test/a/,此 时访问http://localhost/test/a时,容器会选择路径最长的servlet来匹配,也就是这里的servletB。

3 扩展匹配,如果url最后一段包含扩展,容器将会根据扩展选择合适的servlet。例子:servletA的url-pattern:*.action

4 如果前面三条规则都没有找到一个servlet,容器会根据url选择对应的请求资源。如果应用定义了一个default servlet,则容器会将请求丢给default servlet,“/” 是用来定义default servlet映射的。

及其容易出错的路径匹配:
为什么定义”/*.action”这样一个看起来很正常的匹配会错?因为这个匹配即属于路径映射,也属于扩展映射,导致容器无法判断

模块三、filter的路径匹配规则

	对于filter,不会像servlet那样只匹配一个servlet,因为filter的集合是一个链,所以只会有处理的顺序不同,而不会出现只选择一个filter。Filter的处理顺序和filter-mapping在web.xml中定义的顺序相同。

最后,在补充说明一下
/ /* /** 的区别

情况一、拦截路径和静态文件(针对/ 和/*) 有错误,需要继续研究。注意注意注意
/:不会拦截静态页面,只会拦截路径。(与层数无关)
当请求为/user/login的时候可以被拦截,当为/page/login.html页面的时候不拦截
在这里插入图片描述

/* 静态页面和路径都会拦截。(与层数无关)
当请求为/user/login的时候可以被拦截,当为/page/login.html页面的时候也会被拦截
在这里插入图片描述
情况一、拦截文件和文件夹(针对/* 和/**)

 /* 是拦截所有的文件夹,不包含子文件夹
/** 是拦截所有的文件夹及里面的子文件夹

纠正:用/* 作为拦截器。路径和静态页面都拦截

@Configuration
public class MyIntercepterConfig implements WebMvcConfigurer {


    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new LoginHnadlerIntercepter()).addPathPatterns("/*");
//                设置templates里面登录页面和登录路径以及静态页面不拦截。特别注意/webjars/** 这个默认的静态文件uri
                // 拦截路径的/*的解释,我们知道/* 既可以拦截路径也可以拦截静态文件,所下面的用法就反过来,表示把静态文件和路径都释放出来
//                 ① 用作路径,则表示把根目录下的任何路径都拦截(不包括多重路径)
//                 ② 用作静态文件,则表示拦截静态目录下的所有文件和文件夹(不包括子文件夹)
//                 ③ 如果改成 / ,/ 表示拦截路径但是不拦截静态文件, 下面就反过来,把路径释放出来,但是由上面的/** 看出静态资源仍然被拦截
//                .excludePathPatterns( "/webjars/**", "/asserts/**","/");
    }
//    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        //静态资源不在默认位置,需要通过addResourceHandlers来只是静态资源的确切位置
        registry.addResourceHandler("/asserts/**").addResourceLocations("classpath:/asserts/");
// }
}

在这里插入图片描述
在这里插入图片描述
用/ 拦截,静态文件找不到,路径可以找到

@Configuration
public class MyIntercepterConfig implements WebMvcConfigurer {


    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new LoginHnadlerIntercepter()).addPathPatterns("/");
//                设置templates里面登录页面和登录路径以及静态页面不拦截。特别注意/webjars/** 这个默认的静态文件uri
                // 拦截路径的/*的解释,我们知道/* 既可以拦截路径也可以拦截静态文件,所下面的用法就反过来,表示把静态文件和路径都释放出来
//                 ① 用作路径,则表示把根目录下的任何路径都拦截(不包括多重路径)
//                 ② 用作静态文件,则表示拦截静态目录下的所有文件和文件夹(不包括子文件夹)
//                 ③ 如果改成 / ,/ 表示拦截路径但是不拦截静态文件, 下面就反过来,把路径释放出来,但是由上面的/** 看出静态资源仍然被拦截
//                .excludePathPatterns( "/webjars/**", "/asserts/**","/");
    }
//    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        //静态资源不在默认位置,需要通过addResourceHandlers来只是静态资源的确切位置
        registry.addResourceHandler("/asserts/**").addResourceLocations("classpath:/asserts/");
// }
}

在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值