java种、jsp/servlet、web应用中的相对路径与绝对路径

java类、jsp/servlet、web应用中的相对路径与绝对路径

 java类中相对路径与绝对路径讲解
      File类或者一些IO流中,在其构造函数中要求传入String类型的参数,用于指示文件所在的路径。使用绝对路径不用说,很容易就能定位到文件,那么使用了相对路径jvm如何定位文件的呢?

      按照jdk Doc上的说法”绝对路径名是完整的路径名,不需要任何其他信息就可以定位自身表示的文件。相反,相对路径名必须使用来自其他路径名的信息进行解释。默认情况下,java.io 包中的类总是根据当前用户目录来分析相对路径名。当前用户目录由系统属性user.dir 指定,通常是Java 虚拟机的调用目录.

      相对路径顾名思义,相对于某个路径,那么究竟相对于什么路径我们必须弄明白。按照上面jdk文档上讲的这个路径是“当前用户目录”也就是“java虚拟机的调用目录”.更明白的说这个路径其实是我们在哪里调用jvm的路径(我们在哪启动jvm的路径).
 
 举个例子:
 假设有一java源文件Example.java在d盘根目录下,该文件不含package信息.
 我们进入命令行窗口,然后使用”d:”命令切换到d盘根目录下,然后用”javac Example.java”来编译此文件,
 编译无错后,会在d盘根目录下自动生成”Example.class”文件.
 我们在调用”java Example”来运行该程序.此时我们已经启动了一个jvm,这个jvm是在d盘根目录下被启动的,
 所以此jvm所加载的程序中File类的相对路径也就是相对这个路径的,即d盘根目录:D:\
 同时“当前用户目录”也是D:\
 在System.getProperty(“user.dir”);系统变量”user.dir”存放的也是这个值.
 
 搞清了这些,我们可以使用相对路径来创建文件,例如:
 File file = new File(“a.txt”);
 file.createNewFile();
 假设jvm是在”D:\”下启动的,那么a.txt就会生成在D:\a.txt;
 
 此外,这个参数还可以使用一些常用的路径表示方法,例如”.”或”.\”代表当前目录,这个目录也就是jvm启动路径
 所以如下代码能得到当前目录完整路径:
 File f = new File(".");
 String absolutePath = f.getAbsolutePath();
 System.out.println(absolutePath);//D:\
 
 再说说在eclipse中的情况:Eclipse中启动jvm都是在项目根路径上启动的.
 比如该类所在的项目为coreJava,其完整路径为:D:\myEclipse_workspace\coreJava\.
 那么这个路径就是jvm的启动路径了.所以以上代码如果在eclipse里运行
 则输出结果为D:\myEclipse_workspace\coreJava\.
 

 说说在服务器中的Java类获得当前路径
 1、 在Tomcat中的情况.
 如果在tomcat中运行web应用,此时,如果我们在某个类中使用如下代码:
 File f = new File(".");

 //或者:File f = new File(System.getProperty("user.dir"));
 String absolutePath = f.getAbsolutePath();
 System.out.println(absolutePath);
 那么输出的将是tomcat下的bin目录,即%Tomcat_Home%/bin
 我的机器就是D:\myEclipsetomcat6\bin\.  ,由此可以看出tomcat服务器是在bin目录下启动jvm的.
 其实是在bin目录下的” catalina.bat”文件中启动jvm的.

 

2、在weblogic中的情况

WebApplication的系统文件根目录是你的weblogic安装所在根目录。
例如:如果你的weblogic安装在c:/weblogic10.....
那么,你的文件根路径就是c:.
所以,有两种方式能够让你访问你的服务器端的文件:
a.使用绝对路径:
比如将你的参数文件放在c:/yourconfig/yourconf.properties,
直接使用 new FileInputStream("yourconfig/yourconf.properties");
b.使用相对路径:
相对路径,是相对于你的webapplication的根路径,即WEB-INF的上一级目录,将你的参数文件放
在yourwebapp/yourconfig/yourconf.properties,
这样使用:
new FileInputStream("../yourconfig/yourconf.properties");
这两种方式均可,自己选择。

 

关于在web应用中的路径

      Java EE里的Web项目有个相对独立的最高目录WebRoot,我们估且认为它是根目录/。Web项目成品中的其它目录都是相对与此目录的子目录。在开发时, 我们可能会用到一些框架,比如struts,spring等。使用这些框架,我们需要配制相应的xml文件,至少也会配制web.xml文件。比如使用struts2时,在struts.xml中映射Action是最常见的配制,所有的映射,都以“/”开头,那么这里的“/”指的是那个目录呢?那就是不可见相对独立的WebRoot,应用中“/action”就相当于是系统目录中的”WebRoot/action", 知道这一点,就不会在为Action映射老是不可用发愁了。

   

 

关于JSP/Servlet中的相对路径和绝对路径

 

 在jsp/servlet中,服务器端的地址和客户端的地址表示有区别

 1、服务器端的地址

   服务器端的相对地址指的是相对于你的web应用的地址,这个地址是在服务器端解析的(不同于html和javascript中的相对地址,他们是由客户端浏览器解析的)也就是说这时候在jsp和servlet中的相对地址应该是相对于你的web应用,即相对于http: //127.0.0.1/webapp/的。

     其用到的地方有:forward:servlet中的request.getRequestDispatcher(address);这个address是在服务器端解析的,所以,你要forward到a.jsp应该这么写:request.getRequestDispatcher(“/user/a.jsp”)这个/ 相对于当前的web应用webapp,其绝对地址就是:http://127.0.0.1/webapp/user/a.jsp。 sendRedirect:在jsp中<%response.sendRedirect("/rtccp/user/a.jsp");%>

 

2、客户端的地址

所有的html页面中的相对地址都是相对于服务器根目录(http://127.0.0.1/)的,而不是(跟目录下的该Web应用的目录) http://127.0.0.1/webapp/的。 Html中的form表单的action属性的地址应该是相对于服务器根目录(http://127.0.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中获得当前应用的相对路径和绝对路径

随便在应用webroot下新建一个jsp文件,启动tomcat,测试一下便知:

 System.out.println(request.getRequestURI()); //相对地址 /ebpp/test/MyJsp.jsp
 System.out.println(request.getRequestURL());

//得到该文件的IE地址栏访问地址http://localhost:9999/ebpp/test/MyJsp.jsp
 System.out.println(application.getRealPath("/")); //当前web应用的绝对路径

 

 

4、Servlet中获得当前应用的相对路径和绝对路径

根目录所对应的路径:request.getServletPath();
文件的绝对路径 :request.getSession().getServletContext().getRealPath(request.getRequestURI())
当前web应用的绝对路径 :servletConfig.getServletContext().getRealPath("/");