Java Web开发、插件开发、EclipseRCP中相对路径/绝对路径总结

时间:2022-11-27 17:51:27
  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应用的地址,这个地址是在服务器端解析的(不同于htmljavascript中的相对地址,他们是由客户端浏览器解析的)也就是说这时候在jspservlet中的相对地址应该是相对于你的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
提交到servletactiom"/webapp/handleservlet" Javascript也是在客户端解析的,所以其相对路径和form表单一样。因此,一般情况下,在JSP/HTML页面等引用的CSS,Javascript.Action等属性前面最好都加上<%=request.getContextPath()%>,以确保所引用的文件都属于Web应用中的目录。另外,应该尽量避免使用类似".","./","../../"等类似的相对该文件位置的相对路径,这样当文件移动时,很容易出问题。

3.JSP/Servlet中获得当前应用的相对路径和绝对路径

3.1JSP中获得当前应用的相对路径和绝对路径:

根目录所对应的绝对路径: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.FileDoc文挡,可知:
默认情况下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.htmresin的安装目录下

(4).
如何读相对路径哪?

Java文件中getResourcegetResourceAsStream均可

例:getClass().getResourceAsStream(filePath);//filePath可以是"/filename",这里的/代表web发布根路径下WEB-INF/classes

默认使用该方法的路径是:WEB-INF/classes。已经在Tomcat中测试。


6.
读取文件时的相对路径,避免硬编码和绝对路径的使用
6.1
、采用SpringDI机制获得文件,避免硬编码。
参考下面的连接内容:
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 代码

/** *//**   
 * TODO 
取得当前项目的根目录   
 * 
@author
 PHeH
  
 * Created On  2006-12-30  17:15:41   
 */
   
public class Application ...
{    
            
    
/** */
/**   
     * TODO 
获取根目录
   
     * 
@return
   
     * 
@author
 PHeH
  
     * Created On  2007-5-10  15:16:21   
     */
   
    
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;
}

 

13eclipse 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.2M 6
建议使用FileLocator#resolve(URL)替代 Platform.resolve