在学习javaweb项目相对路径与绝对路径之前,我们要搞清楚java程序在运行时是怎么跑的。

我们平时写的代码统称java文件,也就是源文件,而.class文件是虚拟机编译得到的,虚拟机需要把我们写的.java文件编译成它可执行的字节文件。所以在脱离开发环境以后,java程序跑的其实是编译出来的.class字节码文件。

那么我们原本在开发环境src文件夹里放置的静态资源文件(如xxx.img,xxx.txt等),脱离了开发环境以后该怎么获取路径呢?

其实我们可以试验一下,如下图是一个简单的javaweb项目结构:

out目录是这个javaweb项目编译以后生成的输出文件夹,可以看到我们在src/hhh/目录中放置一个1.jpg,项目编译以后会在out文件夹里的WEB-INF/classes/hhh/目录下生成一个一模一样的备份,其实我们的javaweb项目在部署上服务器以后,如果要在.class文件里使用项目里普通的资源文件,拿的就是out目录下生成的备份文件,因为项目部署的是out文件夹里面的内容,源代码不会放在服务器上;

至于编译后的目录结构为什么和源代码的目录结构有区别,可以看看我之前写的文章:IDEA创建简单javaweb项目
下面让我们通过一个例子,讲解一下在test1.class里该怎么获取1.jpg文件;首先建立一个Servlet类:

@WebServlet("/test1")
public class test1 extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {try {//打印当前目录:D:\java\apache-tomcat-8.5.31\bin\.System.out.println(new File(".").getAbsolutePath());//打印当前工程根目录:D:\java\apache-tomcat-8.5.31\binSystem.out.println(System.getProperty("user.dir"));//使用test1.class.getClassLoader().getResourceAsStream():可以默认定位到out/artifacts/web项目/WEB-INF/classes,即web项目的classpath(根路径),参数不能以"/"开头InputStream resourceAsStream = test1.class.getClassLoader().getResourceAsStream("hhh/1.jpg");System.out.println("resourceAsStream:"+resourceAsStream);//使用test1().getClass().getResourceAsStream():可以默认定位到test1类当前的路径,即:out/artifacts/web项目/WEB-INF/classes/hhhInputStream resourceAsStream1 = new test1().getClass().getResourceAsStream("1.jpg");System.out.println("resourceAsStream1:"+resourceAsStream1);//使用test1().getClass().getResourceAsStream("/"):如果加了"/"开头可以默认定位到web项目的classpath(根路径),即out/artifacts/web项目/WEB-INF/classesInputStream resourceAsStream2 = new test1().getClass().getResourceAsStream("/hhh/1.jpg");System.out.println("resourceAsStream2:"+resourceAsStream2);//因为javase和javaweb的classpath略有不同,所以在javaweb项目中使用与路径相关的文件操作最好使用文件在服务器上的真实路径ServletContext servletContext = this.getServletContext();String realPath = servletContext.getRealPath("/WEB-INF/classes/hhh/1.jpg");FileInputStream inputStream = new FileInputStream(realPath);System.out.println("inputStream:"+inputStream);} catch (Exception e) {e.printStackTrace();}}@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {this.doPost(req,resp);}}

启动tomcat以后,在浏览器输入http://localhost:8080/test1,输出结果为:

D:\java\apache-tomcat-8.5.31\bin\.
D:\java\apache-tomcat-8.5.31\bin
resourceAsStream:java.io.ByteArrayInputStream@2d2c15d8
resourceAsStream1:java.io.ByteArrayInputStream@d0d79a7
resourceAsStream2:java.io.ByteArrayInputStream@53cc9413
inputStream:java.io.FileInputStream@64ad07cd

可以看到,在test1.class类里获取1.jpg文件成功!

分析:

//使用test1.class.getClassLoader().getResourceAsStream():可以默认定位到out/artifacts/web项目/WEB-INF/classes,即web项目的classpath(根路径),参数不能以"/"开头
InputStream resourceAsStream = test1.class.getClassLoader().getResourceAsStream("hhh/1.jpg");
//使用test1().getClass().getResourceAsStream():可以默认定位到test1类当前的路径,即:out/artifacts/web项目/WEB-INF/classes/hhh
InputStream resourceAsStream1 = new test1().getClass().getResourceAsStream("1.jpg");
//使用test1().getClass().getResourceAsStream("/"):如果加了"/"开头可以默认定位到web项目的classpath(根路径),即out/artifacts/web项目/WEB-INF/classes
InputStream resourceAsStream2 = new test1().getClass().getResourceAsStream("/hhh/1.jpg");
//因为javase和javaweb的classpath略有不同,所以在javaweb项目中使用与路径相关的文件操作最好使用文件在服务器上的真实路径
ServletContext servletContext = this.getServletContext();
String realPath = servletContext.getRealPath("/WEB-INF/classes/hhh/1.jpg");
FileInputStream inputStream = new FileInputStream(realPath);
String b = context.getRealPath("/b.txt");//web目录下资源访问,直接/加文件路径表示在项目中web目录下访问;
String c = context.getRealPath("/WEB-INF/c.txt");//WEB-INF目录下的资源访问,WEB-INF是web目录的子目录;
String a = context.getRealPath("/WEB-INF/classes/a.txt");//src目录下的资源访问,javaweb项目中src整个文件夹编译后都会存储在服务器项目中WEB-INF/classes文件夹中;

javaweb项目相对路径与绝对路径相关推荐

  1. java web项目 相对路径怎么写_理解JavaWeb项目中的路径问题——相对路径与绝对路径...

    背景:html 在刚开始学习javaweb,使用servlet和jsp开发web项目的过程当中,一直有一个问题困扰着我:servlet 和 jsp 之间相互跳转,跳转的路径应该如何书写,才能正确的访问 ...

  2. 【相对/绝对路径】JavaWeb项目中,请求转发与重定向的路径写法

    相对路径.全路径 是要不以/开头,都是相对路径.相对路径是从当前资源出发,去寻找其他资源. 只要路径中以/开肉,就是全路径.全路径是从项目根目录出发,去寻找其他资源. 在开发中,写文件路径时,最好使用 ...

  3. java resources目录 编码_关于Java项目读取resources资源文件路径

    在看此篇博客是建议清楚classpath代表的路径,getServletContext().getRealPath("/")的含义,idea中项目编译后的目录格式,resoures ...

  4. web项目的中绝对路径和相对路径

    在做JavaWeb项目,总是出现各种的路径错误,而且发现不同情况下 /  所代表的含义不同. 绝对路径: 相对于当前Web应用根路径的路径 也就是任何路径都必须要带上contextPath = htt ...

  5. 【JavaWeb】web开发中的绝对路径和相对路径

    文章目录 一.基本概念 二.Java中路径的使用 3.1./ 和 .符号 3.2.Java读取文件的三种方式 三.JavaWeb中的绝对.相对路径 5.1.概念 5.2.简述web根路径 / 的区别 ...

  6. c# 如何找到项目中图片的相对路径

    c# 如何找到项目中图片的相对路径 string path = System.Environment.CurrentDirectory;//非Web程序 if (System.Environment. ...

  7. 谈asp.net解决方案的项目生成时的输出路径

    今日将一个大的asp.net解决方案从VS2005升级为VS2008,本来以为由VS自动转换后就应该不会有问题.没想到出现了不少问题,弄了大半天. 其中的一个主要原因就是项目生成时的"输出路 ...

  8. Web项目中引进EasyUI的路径问题

    场景 Web项目中引入EasyUI,新建test.html,页面中引入EasyUI相关资源文件. 运行后页面并没有改变,打开检查提示404找不到资源. 实现 项目路径为: 路径引用错误: test.h ...

  9. 如何修改myeclipse中web项目的工作路径或默认路径

    如何修改myeclipse中web项目的工作路径或默认路径 博客分类: J2EE开发技术指南 安装好myeclipse后,第一次启动myeclipse时,都会弹出会弹出Workspace Launch ...

最新文章

  1. python打开是什么样的-Python程序的执行过程是什么样的?
  2. DayDayUp:教你一招如何在道客巴巴免费下载自己被侵权的文章
  3. php 数组到字符串的转换,php – 数组到字符串到数组的转换
  4. CentOS中怎样卸载旧版本Git并安装高版本Git
  5. insert和insertSelective区别
  6. SSM框架笔记14:Spring MVC表单验证
  7. php动态交叉表,PHP Array交叉表实现代码
  8. python查看方法作用_python中有帮助函数吗
  9. 啦啦外卖UNIAPP(4.0)源码商家+骑手
  10. 常见端口号和对应协议
  11. 2019软考-软件设计师考试真题与详解
  12. android app 检测是否开启了开发者模式
  13. 扒皮 || 优衣库X KAWS凭什么会被疯抢??!!!
  14. 站在物联网风口 中兴着力构建GIA 的IoT新生态
  15. MATLAB classificationLearner
  16. 怎样增加图片的大小,不是尺寸哦!
  17. 华为eNSP交换机原理实验
  18. 阿里鱼卡,腾讯王卡,百度圣卡,谁是流量卡中的性价比之王?
  19. Android 调用系统相册选取视频,过滤视频(兼容小米)
  20. swr_get_out_samples和swr_convert,比特率重采样

热门文章

  1. Windows Terminal 终极美
  2. 二氧化碳吸收速率统计分析
  3. MST唯一性条件证明
  4. 【工具】Github copilot 安装扩展后无图标问题
  5. Python Pandas 分析郁达夫《故都的秋》
  6. [bzoj3252]攻略
  7. 图片处理:完成图片的颜色反转
  8. 更新windows补丁时一直卡在搜索更新
  9. weblogic配置数据源
  10. 百万辆自动驾驶出租车明年上路?美媒:马斯克又吹牛