Java中动态获取项目根目录的绝对路径
https://www.cnblogs.com/zhouqing/archive/2012/11/10/2757774.html
序言
在开发过程中经常会用到读写文件,其中就必然涉及路径问题。使用固定的绝对路径当然很方便,但会导致程序的可移植性差,比如在代码中写死了要在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项中均是这种形式。
Java中动态获取项目根目录的绝对路径的更多相关文章
- SpringMVC中Freemarker获取项目根目录
https://blog.csdn.net/whatlookingfor/article/details/51538995 在SpringMVC框架中使用Freemarker试图时,要获取根路径的方式 ...
- servlet中获得tomcat项目根目录的绝对路径
public class CreateXmlAction extends HttpServlet { private ServletConfig config; public void init(Se ...
- java 获取项目根目录
代码入下: request.getSession().getServletContext().getRealPath(); 这里的getRealPath()括号里面可以输入你想得到的具体目录. 需要注 ...
- Weblogic部署web项目获取项目根目录为null
写在前面 图片上传功能, web项目部署在本地Tomcat上并没有问题, 但是打成war包部署到Linux服务器Weblogic下却出现如题问题, 导致图片上传失败. 问题代码 String real ...
- java中动态反射
java中动态反射能达到的效果和python的语法糖很像,能够截获方法的实现,在真实方法调用之前和之后进行修改,甚至能够用自己的实现进行特别的替代,也可以用其实现面向切片的部分功能.动态代理可以方便实 ...
- JAVA中如何获取变量的类型
JAVA中如何获取变量的类型? package xiya; public class Demo { public static void main(String[] args) { String ty ...
- Java获取项目根目录等其他系统属性
一 相对路径的获得 说明:相对路径(即不写明时候到底相对谁)均可通过以下方式获得(不论是一般的java项目还是web项目) String relativelyPath=System.getProper ...
- JS动态获取项目名以及获取URL地址中的参数
在项目当中我们可能会遇到例如改变的项目名称之后,相对应的地址就需要改变,为了减少工作量,将地址当中的项目名这一块写成动态获取的,那么最关键一点就是我要先获取它,再进行操作: 知识点整理,话不多说,直接 ...
- 在Java中动态传参调用Python脚本
最近,又接触到一个奇葩的接口,基于老板不断催促赶时间的情况下,在重写java接口和复用已有的python脚本的两条路中选择了后者,但是其实后者并没有好很多,因为我是一个对python的认识仅限于其名称 ...
随机推荐
- CCF关于NOIP2018获奖证书发放的公告
CCF定于即日起开始受理NOIP2018获奖证书申请.凡获得NOIP2018复赛提高组和普及组一二三等奖的选手均可申请证书.本次获奖证书有电子版和纸质版两种.电子版证书免费发放,纸质版证书收取部分工本 ...
- RabbitMQ direct类型的Exchange
就目前来说,Exchange是与消息发送端有关的,因为它可以指定将消息发送到哪个或哪些队列中. 本篇文章介绍的direct类型就是指定将消息定向发送到哪个队列中. direct,顾名思义,就是直接的意 ...
- 項目当中使用的easyui的模板crud页面
1.简单的增删改查页面: 第一步骤:html原型型编写,写法参照了easyui demo中form有关html等 <!DOCTYPE html> <html> <head ...
- fortran学习网站
https://www.sciencesoft.cn/Fortran/Index.htm http://m.fcode.cn/
- 2019-02-25 EST 科技文翻译
The Definition of Theme and Rheme The point of departure is equally presented to the speaker and to ...
- C++中的break,continue和return语句小结
1.break语句能用在switch,while,do...while和for语句中:continue语句用在while,do...while和for语句中. 2.break结束语句执行,并将程序的执 ...
- 制作Wi-Fi Ducky远程HID攻击设备
1.介绍WIFI DUCKY 它是一个Wi-Fi控制的BadUSB设备来远程执行Ducky Scripts. 使用充当键盘的USB设备来注入攻击,Hak5 的 USB Rubber Ducky 是这种 ...
- select标签的相关操作,选中,获取option的值,二级联动
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...
- ubantu清理垃圾文件操作
安装的ubuntu 18.01 , 随着使用的时间变长,陆陆续续使用了不少的软件, 更新了不少的软件包. 导致了现在ubuntu 系统反应速度严重下降. 下面是几种清理linux系统下冗余垃圾的命令, ...
- python 正则匹配时间格式转换方法
import re from datetime import datetime a = '2018年8月9日 10:10' s = re.findall('\d+',a) print(s) d = ' ...