结论
resources文件夹下的文件在编译后,都是为根目录
getClass().getResource("/")
== getClass().getClassLoader().getResource("")
== getClass().getClassLoader().getResource("/")
== servletContext.getResourceAsStream("/WEB-INF/classes/")
[↑ javax.Servlet Web项目]
== 硬盘上 classes 文档的全路径
如:file:/H:/MyProgramFriles/tomcat/apache-tomcat-8.5.50/webapps/aa/WEB-INF/classes/
同:spring中的classpath
另外:
关于webapps的(全物理)目录:https://blog.csdn.net/LawssssCat/article/details/103626425
(写 在 下 面 \color{#F91}{写在下面}写在下面)
关于webapps的(动态路径): https://blog.csdn.net/LawssssCat/article/details/103534942
${pageContext.request.contextPath }
⇒ 工程名/
public class LoginFilter extends HttpFilter implements Filter {
@Override
protected void doFilter(HttpServletRequest req, HttpServletResponse res, FilterChain chain)
throws IOException, ServletException {
String URL = req.getRequestURL().toString();
String uri = req.getRequestURI();
String contextPath = req.getContextPath();
System.out.println(URL);
System.out.println(uri);
System.out.println(contextPath);
}
}
↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
测试
路径问题一切要看编译后的文件路径
比如,源文件路径是:
而编译后的文件路径为:
也就是说,resources文件夹下的文件在编译后,都是为根目录,这种情况下,比如我要读取resources 文件夹下的 my.txt 文件路径。
写法①:
// 编译后,项目根路径,写法1
String url1 = A.class.getClassLoader().getResource("").toString();
// 编译后,项目根路径,写法2
String url2 = A.class.getResource("/").toString();
// 编译后,文件根路径
String url3 = A.class.getResource("").toString();
输出:
file:/D:/IdeaWorkspace/test-null-project/target/classes/
file:/D:/IdeaWorkspace/test-null-project/target/classes/
file:/D:/IdeaWorkspace/test-null-project/target/classes/com/convict/
扩展:
写法②getFile 跟写法③getPath 是有区别的,getResource 方法后返回的是一个 java.net.URL对象,那手动构造一个java.net.URL
URL url = new URL("https://www.baidu.com/img/baidu_jgylogo3.gif?param=1111¶m2=aaaaa");
System.out.println("getFile ==> " + url.getFile());
System.out.println("getPath ==> " + url.getPath());
输出:
getFile ==> /img/baidu_jgylogo3.gif?param=1111¶m2=aaaaa
getPath ==> /img/baidu_jgylogo3.gif
可以看出,getFile() 方法可以拿到参数值,而getPath() 就是只取文件名,JDK中文文档相关api如下: