700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > javaweb项目相对路径与绝对路径

javaweb项目相对路径与绝对路径

时间:2019-08-23 05:09:06

相关推荐

javaweb项目相对路径与绝对路径

在学习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\binresourceAsStream:java.io.ByteArrayInputStream@2d2c15d8resourceAsStream1:java.io.ByteArrayInputStream@d0d79a7resourceAsStream2:java.io.ByteArrayInputStream@53cc9413inputStream: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/hhhInputStream resourceAsStream1 = new test1().getClass().getResourceAsStream("1.jpg");

//使用test1().getClass().getResourceAsStream("/"):如果加了"/"开头可以默认定位到web项目的classpath(根路径),即out/artifacts/web项目/WEB-INF/classesInputStream 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文件夹中;

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。