1.基本概念的理解
绝对路径:绝对路径就是你的主页上的文件或目录在硬盘上真正的路径,(URL和物理路径)例如:C:/xyz/est.txt 代表了test.txt文件的绝对路径。http://www.sun.com/index.htm也代表了一个URL绝对路径。
相对路径:相对与某个基准目录的路径。包含Web的相对路径(HTML中的相对目录),例如:在Servlet中,"/"代表Web应用的跟目录,和物理路径的相对表示。例如:"./" 代表当前目录,"../"代表上级目录。这种类似的表示,也是属于相对路径。
2.关于JSP/Servlet中的相对路径和绝对路径
2.1、服务器端的地址
服务器端的相对地址指的是相对于你的web应用的地址,这个地址是在服务器端解析的(不同于html和javascript中的相对地址,他们是由客户端浏览器解析的)也就是说这时候在jsp和servlet中的相对地址应该是相对于你的web应用,即相对于http: //192.168.0.1/webapp/的。
其用到的地方有:
forward:servlet中的 request.getRequestDispatcher(address);这个address是在服务器端解析的,所以,你要forward到 a.jsp应该这么写:request.getRequestDispatcher(“/user/a.jsp”)这个/ 相对于当前的web应用webapp,其绝对地址就是:http://192.168.0.1/webapp/user/a.jsp。 sendRedirect:在jsp中<%response.sendRedirect("/rtccp/user/a.jsp");%>
2.2、客户端的地址
所有的html页面中的相对地址都是相对于服务器根目录(http://192.168.0.1/)的,而不是(跟目录下的该Web应用的目录) http://192.168.0.1/webapp/的。 Html中的form表单的action属性的地址应该是相对于服务器根目录(http://192.168.0.1/)的,所以,如果提交到a.jsp 为:action="/webapp/user/a.jsp"或action="<%=request.getContextPath()% >"/user/a.jsp;
提交到servlet为actiom="/webapp/handleservlet" Javascript也是在客户端解析的,所以其相对路径和form表单一样。因此,一般情况下,在JSP/HTML页面等引用的CSS,Javascript.Action等属性前面最好都加上<%=request.getContextPath()%>,以确保所引用的文件都属于Web应用中的目录。另外,应该尽量避免使用类似".","./","../../"等类似的相对该文件位置的相对路径,这样当文件移动时,很容易出问题。
3.JSP/Servlet中获得当前应用的相对路径和绝对路径
3.1、JSP中获得当前应用的相对路径和绝对路径:
根目录所对应的绝对路径:request.getRequestURI()
文件的绝对路径:application.getRealPath(request.getRequestURI());
当前web应用的绝对路径:application.getRealPath("/");
取得请求文件的上层目录:
new File(application.getRealPath(request.getRequestURI())).getParent()
3.2、Servlet中获得当前应用的相对路径和绝对路径
根目录所对应的绝对路径:request.getServletPath();
文件的绝对路径:
request.getSession().getServletContext().getRealPath (request.getRequestURI())
当前web应用的绝对路径:servletConfig.getServletContext().getRealPath("/");
(ServletContext对象获得几种方式:
javax.servlet.http.HttpSession.getServletContext()
javax.servlet.jsp.PageContext.getServletContext()
javax.servlet.ServletConfig.getServletContext()
)
4.页面中使用相对路径
1)举一个例子,现在有一个页面“index.htm”,在这个页面中联接有一张图片“photo.jpg”。他们的绝对路径如下:
①c:/website/index.htm
c:/website/img/photo.jpg
如果你使用绝对路径“c:/website/img/photo.jpg”,那么在自己的计算机上将一切正常,因为确实可以在指定的位置即“c:/website/img/photo.jpg”上找到“photo.jpg”文件,但是当你将页面上传到网站的时候就很可能会出错了,因为你的网站可能在服务器的“c”盘,可能在“d”盘,也可能在“aa”目录下,更可能在“bb”目录下,总之没有理由会有“c:/website/img/photo.jpg”这样一个路径。那么,在“index.htm”文件中要使用什么样的路径来定位“photo.jpg”文件呢?对,应该是用相对路径,所谓相对路径,顾名思义就是自己相对与目标位置。在上例中“index.htm”中联接的“photo.jpg”可以使用“img/photo.jpg”来定位文件,那么不论将这些文件放到哪里,只要他们的相对关系没有变,就不会出错。
另外我们使用“../”来表示上一级目录,“../../”表示上上级的目录,以此类推。(学习过“dos”的朋友可能更容易理解)
再看几个例子,注意所有例子中都是“index.htm”文件中联接有一张图片“photo.jpg”。
②c:/website/web/index.htm
c:/website/img/photo.jpg
在此例中“index.htm”中联接的“photo.jpg”应该怎样表示呢?
错误写法:img/photo.jpg
这种写法是不正确的,在此例中,对于“index.htm”文件来说“img/photo.jpg”所代表的绝对路径是“c:/website/web/img/photo.jpg”,显然不符合要求。
正确写法:使用“../img/photo.jpg”的相对路径来定位文件
③c:/website/web/xz/index.htm
c:/website/img/images/photo.jpg
在此例中“index.htm”中联接的“photo.jpg”应该怎样表示呢?
错误写法:../img/images/photo.jpg
这种写法是不正确的,在此例中对于“index.htm”文件来说“../img/images/photo.jpg”所代表的绝对路径是“c:/website/web/img/images/photo.jpg”。
正确写法:可以使用“../../img/images/photo.jpg”的相对路径来定位文件
④c:/website/web/xz/index.htm
c:/website/web/img/photo.jpg
在此例中“index.htm”中联接的“photo.jpg”应该怎样表示呢?
错误写法:../../img/photo.jpg
这种写法是不正确的,在此例中对于“index.htm”文件来说“../../img/photo.jpg”所代表的绝对路径是“c:/website/img/photo.jpg”。
正确写法:可以使用“../img/photo.jpg”的相对路径来定位文件
总结:通过以上的例子可以发现,在把绝对路径转化为相对路径的时候,两个文件绝对路径中相同的部分都可以忽略,不做考虑。只要考虑他们不同之处就可以了。
2)如何修改样式表的路径:
使用文本编辑器打开“htm”文件,查看源代码,在源代码的开头部分“<head>......</head>”标记中间找到“<link rel="stylesheet" href="test.css" type="text/css">”。“Href=”后面的内容就是“css”的路径,我们可以根据以上的知识进行相对路径的转换。
例:
c:/website/web/xz/index.htm
c:/website/css/test.css
在此例中“index.htm”中联接“test.css”文件,可以使用“../../css/test.css”的相对路径来定位文件,完整的代码标记是“<link rel="stylesheet" href="../../css/test.css " type="text/css">”
错误写法举例:../../../css/test.css
这种写法是不正确的,在此例中对于“index.htm”文件来说“../../../css/test.css”所代表的绝对路径是“c:/css/test.css”
最后,为了避免在制作网页时出现路径错误,我们可以使用dreamweaver的站点管理功能来管理站点。只要使用菜单命令“site>new site(站点>新建站点)”新建站点并定义站点目录之后,它将自动的把绝对路径转化为相对路径,并且当你在站点中移动文件的时候,与这些文件关联的连接路径都会自动更改,实在是非常的方便。
5.java 的Class中获得相对路径,绝对路径的方法
5.1、单独的Java类中获得绝对路径
根据java.io.File的Doc文挡,可知:
默认情况下new File("/")代表的目录为:System.getProperty("user.dir")。
以下程序获得执行类的当前路径
package org.cheng.file;
import java.io.File;
public class FileTest ...{
public static void main(String[] args) throws Exception ...{
System.out.println(Thread.currentThread().getContextClassLoader().getResource(""));
System.out.println(FileTest.class.getClassLoader().getResource(""));
System.out.println(ClassLoader.getSystemResource(""));
System.out.println(FileTest.class.getResource(""));
System.out.println(FileTest.class.getResource("/"));
//Class文件所在路径
System.out.println(new File("/").getAbsolutePath());
System.out.println(System.getProperty("user.dir"));
}
}
5.2、服务器中的Java类获得当前路径
(1).Weblogic
WebApplication的系统文件根目录是你的weblogic安装所在根目录。
例如:如果你的weblogic安装在c:/beaweblogic700.....
那么,你的文件根路径就是c:.
所以,有两种方式能够让你访问你的服务器端的文件:
a.使用绝对路径:
比如将你的参数文件放在c:yourconfigyourconf.properties,
直接使用 new FileInputStream("yourconfig/yourconf.properties");
b.使用相对路径:
相对路径的根目录就是你的webapplication的根路径,即WEB-INF的上一级目录,将你的参数文件放在yourwebappyourconfigyourconf.properties,
这样使用:
new FileInputStream("./yourconfig/yourconf.properties");
这两种方式均可,自己选择。
(2).Tomcat
在类中输出System.getProperty("user.dir");显示的是%Tomcat_Home%/bin
(3).Resin
不是你的JSP放的相对路径,是JSP引擎执行这个JSP编译成SERVLET
的路径为根.比如用新建文件法测试File f = new File("a.htm");
这个a.htm在resin的安装目录下
(4).如何读相对路径哪?
在Java文件中getResource或getResourceAsStream均可
例:getClass().getResourceAsStream(filePath);//filePath可以是"/filename",这里的/代表web发布根路径下WEB-INF/classes
默认使用该方法的路径是:WEB-INF/classes。已经在Tomcat中测试。
6.读取文件时的相对路径,避免硬编码和绝对路径的使用
6.1、采用Spring的DI机制获得文件,避免硬编码。
参考下面的连接内容:
http://www.javajia.net/viewtopic.php?p=90213&
6.2、配置文件的读取
参考下面的连接内容:
http://dev.csdn.net/develop/article/39/39681.shtm
6.3、通过虚拟路径或相对路径读取一个xml文件,避免硬编码
参考下面的连接内容:
http://club.gamvan.com/club/clubPage.jsp?iPage=1&tID=10708&ccID=8
7.Java中文件的常用操作(复制,移动,删除,创建等)
常用 java File 操作类
http://www.easydone.cn/014/200604022353065155.htm
Java文件操作大全(JSP中)
http://www.pconline.com.cn/pcedu/empolder/gj/java/0502/559401.html
java文件操作详解(Java中文网)
http://www.51cto.com/html/2005/1108/10947.htm
JAVA 如何创建删除修改复制目录及文件
http://www.gamvan.com/developer/java/2005/2/264.html
总结:
通过上面内容的使用,可以解决在Web应用服务器端,移动文件,查找文件,复制
删除文件等操作,同时对服务器的相对地址,绝对地址概念更加清晰。
建议参考URI,的RFC标准文挡。同时对Java.io.File. Java.net.URI.等内容了解透彻
对其他方面的理解可以更加深入和透彻。
这是在Java中取得当前项目的根目录的方法
java 代码
public class Application ...{
public static String getRootPath()...{
//因为类名为"Application",因此" Application.class"一定能找到
String result = Application.class.getResource("Application.class").toString();
int index = result.indexOf("WEB-INF");
if(index == -1)...{
index = result.indexOf("bin");
}
result = result.substring(0,index);
if(result.startsWith("jar"))...{
// 当class文件在jar文件中时,返回"jar:file:/F:/ ..."样的路径
result = result.substring(10);
}else if(result.startsWith("file"))...{
// 当class文件在class文件中时,返回"file:/F:/ ..."样的路径
result = result.substring(6);
}
if(result.endsWith("/"))result = result.substring(0,result.length()-1);//不包含最后的"/"
return result;
}
}
8.从插件/RCP中取得文件路径
1)从插件中获得绝对路径:
AaaaPlugin.getDefault().getStateLocation().makeAbsolute().toFile().getAbsolutePath());
通过文件得到Project:
IProject project = ((IFile)o).getProject();
2)通过文件得到全路径:
①String path = ((IFile)o).getLocation().makeAbsolute().toFile().getAbsolutePath();
②IFolder srcFolder =
ResourcesPlugin.getPlugin().getWorkspace().getRoot().getProject(
"yourprojectname").getFolder("src");
IFile ifile = srcFolder.getFile("hibernate.cfg.xml");
String path= ifile.getLocation().makeAbsolute().toFile().getAbsolutePath();
其中path 得出的是真正的绝对路径.
3)得到整个Workspace的根:
IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
4)从根来查找资源:
IResource resource = root.findMember(new Path(containerName));
5)从Bundle来查找资源:
Bundle bundle = Platform.getBundle(pluginId);
URL fullPathString = BundleUtility.find(bundle, filePath);
6)得到Appliaction workspace:
Platform.asLocalURL(
PRODUCT_BUNDLE.getEntry("")).getPath()).getAbsolutePath();
7)得到runtimeworkspace:
Platform.getInstanceLocation().getURL().getPath();
8)从编辑器来获得编辑文件:
IEditorPart editor = ((DefaultEditDomain)(parent.getViewer().getEditDomain())).getEditorPart();
IEditorInput input = editor.getEditorInput();
if(input instanceof IFileEditorInput){
IFile file = ((IFileEditorInput)input).getFile();
}
9)得到项目的绝对路径:
FileLocator.toFileURL(
Platform.getBundle(Application.PLUGIN_ID).getEntry("")).getPath()
10)如果你的RCP工程没有发布,得到的是eclipse的路径。如果你的RCP工程已经发布(假如在D:/RCP/下面),得到的路径就是D:/RCP/。
Location installLoc = LocationManager.getInstallLocation();
String path = null;
String installPath = null;
if (installLoc != null)
{
URL installURL = installLoc.getURL();
// assume install URL is file: based
path = installURL.getPath();
}
installPath = path.substring(1, path.length());
11)显示相对路径的image的方法。如下:
①ImageDescriptor imageDes =
AbstractUIPlugin.imageDescriptorFromPlugin(Application.PLUGIN_ID, "/images/schemabase.jpg");
Image image = imageDes.createImage();
②Put a class in image directory.
For instance:
../../resource/icon1.bmp
../../resource/Resource.class
InputStream istream = Resources.class.getResourceAsStream("icon1.bmp");
Image icon_image = new Image(Display.getCurrent(), istream);
12)获取plugin根目录路径的方法
public static String getRoot(String pluginID){
String path=null;
try {
path = FileLocator.toFileURL(
Platform.getBundle(pluginID).getEntry("")).getPath();
path = path.substring(path.indexOf("/") + 1, path.length());
} catch (Exception e) {
e.printStackTrace();
}
return path;
}
13)eclipse 3.1.1以后用:
URL bundleRootURL = YourPlugin.getDefault().getBundle()
.getEntry("/");
try {
URL pluginURL = Platform.resolve(bundleRootURL);
return pluginURL.getPath();
} catch (IOException e) {
}
其中URL pluginURL = Platform.resolve(bundleRootURL);
eclipse 3.2M6建议使用FileLocator#resolve(URL)替代 Platform.resolve