序言

  在开发过程中经常会用到读写文件,其中就必然涉及路径问题。使用固定的绝对路径当然很方便,但会导致程序的可移植性差,比如在代码中写死了要在E盘建一个文件,而移植后的环境中木有E盘,那就只能改代码;又或者需要调用D盘某某某很长路径下的一个自定义文件,这个文件路径又不在项目文件夹下,则拷项目代码时很容易遗漏这个自定义文件,这样给项目的交接带来了不必要的麻烦。如果我们将自定义配置文件或者其他待访问的文件都放在项目根目录下的某个文件夹中,在运行时动态获取项目根目录,则能大大提升项目的可移植性。注意,Tomcat下的Web程序的项目根目录是在Tomcat根目录的webapps\项目名 下,而Java桌面程序的项目根目录是在源代码所在的文件夹下。

  这个想法从我最开始做涉及文件存取的项目时就想到了,但是实践中经常失败,因为不同情况下(Tomcat下的Web程序、Java桌面程序)获取项目根目录的方法是不一样的,同样的(new File("")).getAbsolutePath()方法在Web环境下或桌面程序环境下的结果不一样,不一一分析和测试的话就会绕晕。于是最近我专门花了点时间研究了下,发现其实也不复杂。我的测试环境为:MyEclipse1.6.0;Tomcat6.0.1,其根目录为"D:\Program Files\Java\tomcat6.0.1";项目源文件所在根目录为"D:\CHLOE\IT\java\eclipse_workspace\tests"。

正文

1. 在jsp文件或Servlet中,可以通过getServletContext().getRealPath("/")来获取项目根目录的绝对路径。

  testServletPath.jsp

1 <body>
2     <h1>jsp文件中获得项目根目录绝对路径</h1>
3     <%
4     String realPath=getServletContext().getRealPath("/");//项目绝对路径
5      %>
6      项目根目录的绝对路径为:<%=realPath %>
7 </body>
8 </html>

  访问结果:

jsp文件中获得项目根目录绝对路径

项目根目录的绝对路径为:D:\Program Files\Java\tomcat6.0.1\webapps\tests\

在Servlet中可以使用同样的方法,得到同样的结果,毕竟jsp文件中的内容在本质上跟Servlet是一回事。getServletContext().getRealPath("/")很好用,但仅仅适用于jsp文件和Servlet中,因为这是一个Servlet API。

2. Java桌面程序中,可以通过(new File("")).getAbsolutePath()获取项目根目录(非Tomcat下)。

  PathTest.jsp

 1 package chloe.aboutpath;
 2
 3 import java.io.File;
 4 public class PathTest
 5 {
 6     static String abspath;
 7    static public String getPath()
 8    {
 9
10        File file=new File("");
11        abspath=file.getAbsolutePath();
12        return abspath;
13    }
14    public static void main(String args[])throws Exception
15    {
16        System.out.println(getPath());
17    }
18 }

  运行结果为:

D:\CHLOE\IT\java\eclipse_workspace\tests

3. 在Tomcat下运行的类中,(new File("")).getAbsolutePath()获得的路径是Tomcat安装路径下的bin文件夹下,将获得的路径字符串去掉最后的"bin"再添上"webapps\\项目文件夹名"即可。

  经过测试代码的运行,我发现只要是在Tomcat环境中运行的代码,如Jsp、Servlet、Servlet调用的Java类、Servlet调用的Java类所调用的Java类等等,由(new File("")).getAbsolutePath()获得路径均为Tomcat根目录下的bin文件夹下,测试代码与PathTest.java中的基本一样,这里不再赘述。

总结

  在大多数情况下,我们都是用Java开发Web程序。根据我个人习惯,如果在jsp文件或者Servlet中需要用到项目的根目录,则采用getServletContext().getRealPath("/"),因为这个最方便,不需要进一步处理,如果在Servlet调用的其他普通类中需要获得项目根目录,则使用(new File("")).getAbsolutePath(),再稍作处理。另外,jsp文件中资源的相对路径在没有特别声明的情况下是相对于本文件所在的位置,可以通过在路径字符串的前端加上".."进入上一级文件夹后继续定位,如"../ckeditor/ckeditor.js";默认情况下,指定form的action为某Servlet时,应该使用"/servlet/Servletname",因为默认生成Servlet时,在web.xml的servlet-mapping项中均是这种形式。

转载于:https://www.cnblogs.com/gscq073240/articles/7224726.html

Java中动态获取项目根目录和tomcat的绝对路径相关推荐

  1. 百度ueditor编辑器动态获取项目根目录

    编辑器的 jsp\config.json 文件里面有个 imageUrlPrefix 这里指定的是"上传图片访问路径前缀",即项目根目录,如果是跨域(远程)操作的话,需要写上服务器 ...

  2. java 取项目根路径_java中如何获取项目的路径

    记录是为了更好的成长! 1.ssm项目中 以工程名为TEST为例: (1)得到包含工程名的当前页面全路径:request.getRequestURI() 结果:/TEST/test.jsp (2)得到 ...

  3. JSP中获取项目根目录

    JSP中获取项目根目录可以用EL表达式:${pageContext.request.contextPath}, 等价于JSP中的 <%=request.getContextPath()%> ...

  4. Weblogic部署web项目获取项目根目录为null

    写在前面 图片上传功能, web项目部署在本地Tomcat上并没有问题, 但是打成war包部署到Linux服务器Weblogic下却出现如题问题, 导致图片上传失败. 问题代码 String real ...

  5. Java中动态加载字节码的方法 (持续补充)

    文章目录 Java中动态加载字节码的方法 1.利用 URLClassLoader 加载远程class文件 2.利用 ClassLoader#defineClass 直接加载字节码 2.1 类加载 - ...

  6. javase获取项目根目录_JavaSE:如何设置/获取您自己的文件和目录属性

    javase获取项目根目录 在上一篇文章"确定特定文件系统支持的视图"中 ,了解如何询问文件系统存储,并了解特定文件属性视图的可支持性. 简而言之,我们将探索最高级和最重要的文件属 ...

  7. java 中lock,java中lock获取锁的四种方法

    在java接口中会存放着许多方法,方便线程使用时的直接调用.对于lock接口大家都不陌生,我们已经初步对概念进行了理解.那么在获取锁的方法上想必还不是很清楚.下面我们就lock获取锁的四种方法分别进行 ...

  8. java 获取spring对象数组_解析Java中如何获取Spring中配置的bean

    解析Java中如何获取Spring中配置的bean Java中如何获取Spring中配置的bean?下面是由百分网小编为大家整理的解析Java中如何获取Spring中配置的bean,喜欢的可以收藏一下 ...

  9. java 数组 取部分_在Java中只获取一部分数组?

    在Java中只获取一部分数组? 我在Java中有一个Integers数组,我只想使用它的一部分. 我知道在Python中你可以做类似这个数组[index:]的东西,它从索引中返回数组. 这样的事情在J ...

最新文章

  1. vue展示日历 考勤展示_VUE实战—菜单栏商品展示数据交互(8)
  2. 6种CSS控制元素上下居中效果
  3. JBoss5.x6.x 反序列化漏洞
  4. Opencv4.5-C++ 摄像头画面镜像显示及文件保存
  5. voms下的反射大师_VOMS旧版
  6. Thread.Sleep太久,界面卡死
  7. 决策树留一法python代码_西瓜书 第4章 决策树 读书笔记
  8. PHP word转pdf
  9. 下载Sonar-Runner
  10. 大数据之路:阿里巴巴大数据实践
  11. SVN Cleanup失败的解决方法
  12. 推荐模型-序列推荐-2018:SHAN
  13. element-ui message 显示重叠问题
  14. 2021年真无线蓝牙耳机排名:人气排名前十的蓝牙耳机推荐
  15. Samung Galaxy III I535 黑砖救活经过
  16. 假如我是儿子——树形动态规划
  17. nginx+https+自签名+各种云dns解析+浏览器安全可用include相对路径和绝对路径
  18. 来2019全球智博会 见证AI创新未来 1
  19. Keil MDK调试时,软硬件的要求
  20. 国产巨芯:中芯国际燃爆芯片圈;360守护国产UOS系统安全

热门文章

  1. tf.layers.Dense与 tf.layers.dense的区别
  2. python 类和对象 atm_Python 类和对象
  3. 星系超级计算机,Mira超级计算机“最后的旅程”:阿贡实验室进行了一次超大规模宇宙模拟...
  4. vector模板,初学者必读
  5. java数组 序列化_程序猿的日常——Java基础之clone、序列化、字符串、数组
  6. spring加载顺序
  7. 《系统集成项目管理工程师》必背100个知识点-41控制进度
  8. 《系统集成项目管理工程师》必背100个知识点-21监控项目工作ITTO
  9. Vue中使用el-popover实现悬浮弹窗显示图片预览
  10. JS中怎样获取当前日期的前一个月和后一个月的日期字符串