Java's absolute and relative path
Posted easggoinghulk
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java's absolute and relative path相关的知识,希望对你有一定的参考价值。
在java中文件目录中带“/”的是绝对路径,不带“/”的是相对路径。
请求页面的写法,在web中,页面路径主要写的有以下几种
1、重定向
2、转发
3、超链接
4、form表单提交的action
5、servlet web.xml中的配置参数的路径
6、properties类型的文件
本文以项目部署在tomcat服务器为例,其他相信也是一样的。
先说明,一定要考虑的问题:
1、路径是谁发起的(浏览器,服务器)
2、路径开头直接 “/” 表示绝对路径
例如
项目的根目录是指FirstWEB下,即http://localhost:8080/FirstWEB,此时由浏览器发起的请求,代码中的“/”表示的当前路径就应该表示的是这个根目录
服务器的根目录是指wptwebapps下,即 localhost:8080,
(1)重定向是是由浏览器发起的,所以“/”代表的是服务器根目录
(2)转发是由服务器发起的,所以“/”代表的是项目根目录
(3、4) 前台页面不论时<a><form><img>等标签,所有的绝对路径,“/”都代表服务器根目录
(5)我们在编写项目的web.xml中编写servlet映射时,所有的servlet前都要加“/”,这个“/”指的是服务器根目录
(6)properties文件不能直接放置在项目根目录下,因为项目编译时,只会编译src下的文件和webcontent下的文件,properties文件就会被忽略
因此,放置properties文件时 ,要么放在src文件目录下,要么放置在webcontent目录下,由于编译后java文件放置在web-inf的下的classes下,所以建议把properties文件就放置在src下,跟着程序的编译一起编译,这样保证查找文件时,不会路径出错。
此时,通过classes来找资源 就是通过类加载器来加载文件:
//获取jdbc.properties 需要在类路径下找
//类加载器获取资源会在类路径下找(WEB-INF/classes)
ClassLoader loader = JDBCUtils.class.getClassLoader();
InputStream stream = loader.getResourceAsStream("jdbc.properties");
为了进行静态文件与源码分离,可以创建一个名为conf的资源文件夹,这个文件夹下的内容会进行分类,但不编译:
总结:
1、由浏览器发起的路径,“/”表示%tomcat根目录%/webapps根目录
2、由服务器发起的路径,“/”表示项目中的WebRoot根目录
3、以上所有情况,除了“转发”是服务器发起的,其他都是由浏览器发起的
转发后的页面变化,但地址不变,所以当前页面的相对路径的地址都会根据浏览器的地址来查找资源,就可能会报错,所以如果要使前台页面保证无误,可以都是用绝对路径。
推荐使用<base>标签,<base>标签指定页面中所有以相对路径的基础路径,所有路径都是以该标签指定的为开始路径,最后通过拼接来进行访问。
例如: <base href="http://localhost:8080/FirstWEB"/> 之后如果访问相对路径下的 index.html,在访问时,浏览器自动装载为http://localhost:8080/FirstWEB/index.html来访问。
由于转发时,要在路径中写项目名,而项目可能时动态的,所以需要动态获得项目的根目录,如下:
第一种
ServletContext context = getServletContext();
String path = context.getContextPath();
response.sendRedirect(path1 + "index.html");
第二种
String path2 = request.getContextPath();
response.sendRedirect(path2 + "index.html");
项目在编译发布时,只会有项目名称,且带着webcontent下的所有文件,编写的java代码 会编译在 WEB-INF下的classes中,
所以不论写相对路径还是绝对路径,都注意不要写WEB-INF。
以上是关于Java's absolute and relative path的主要内容,如果未能解决你的问题,请参考以下文章
Codeforcecs 459D Pashmak and Parmida's problem 树状数组 OR 分治
IO的详细解释:It's all about buffers: zero-copy, mmap and Java NIO
Jenkins: because the document's frame is sandboxed and the 'allow-scripts' permission