`
thtwin
  • 浏览: 165895 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

java web中的路径全接触

阅读更多
1.基本概念的理解

  绝对路径:绝对路径就是你的主页上的文件或目录在硬盘上真正的路径,(URL和物理路径)例如:
C:\xyz\test.txt 代表了test.txt文件的绝对路径。http://www.sun.com/index.htm也代表了一个
URL绝对路径。

  相对路径:相对与某个基准目录的路径。包含Web的相对路径(HTML中的相对目录),例如:在
Servlet中,"/"代表Web应用的跟目录。和物理路径的相对表示。例如:"./" 代表当前目录,
"../"代表上级目录。这种类似的表示,也是属于相对路径。

另外关于URI,URL,URN等内容,请参考RFC相关文档标准。

RFC 2396: Uniform Resource Identifiers (URI): Generic Syntax,
(http://www.ietf.org/rfc/rfc2396.txt)


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.22、客户端的地址

       所有的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.java 的Class中获得相对路径,绝对路径的方法
4.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"));   
}
}

4.2服务器中的Java类获得当前路径(来自网络)
(1).Weblogic

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

在yourwebapp\yourconfig\yourconf.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中测试。

5.读取文件时的相对路径,避免硬编码和绝对路径的使用。(来自网络)
5.1 采用Spring的DI机制获得文件,避免硬编码。
   参考下面的连接内容:
   http://www.javajia.net/viewtopic.php?p=90213&
5.2 配置文件的读取
参考下面的连接内容:
http://dev.csdn.net/develop/article/39/39681.shtm
5.3 通过虚拟路径或相对路径读取一个xml文件,避免硬编码
参考下面的连接内容:
http://club.gamvan.com/club/clubPage.jsp?iPage=1&tID=10708&ccID=8

6.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/docs/

java.io.File
java.io.InputStream
java.io.OutputStream
java.io.FileInputStream
java.io.FileReader;
java.io.FileOutputStream
java.io.FileWriter;
java.net.URI
java.net.URL


绝对路径与相对路径祥解
http://www.webjx.com/htmldata/2005-02-26/1109430310.html

[『J道习练』]JSP和Servlet中的绝对路径和相对路径
http://w3china.org/blog/more.asp?name=pcthomas&id=9122&commentid=12376

JSP,Servlet,Class获得当前应用的相对路径和绝对路径
http://cy.lzu.edu.cn/cy/club/clubPage.jsp?ccStyle=0&tID=886&ccID=77

如何获得当前文件路径
http://www.matrix.org.cn/resource/article/44/44113_java.html

通过Spring注入机制,取得文件
http://www.javajia.net/viewtopic.php?p=90213&

配置文件的读取
http://dev.csdn.net/develop/article/39/39681.shtm

读取配置文件,通过虚拟路径或相对路径读取一个xml文件,避免硬编码!
http://club.gamvan.com/club/clubPage.jsp?iPage=1&tID=10708&ccID=8

常用 java File 操作类
http://www.easydone.cn/014/200604022353065155.htm

Java文件操作大全
http://www.pconline.com.cn/pcedu/empolder/gj/java/0502/559401.html

Java文件操作详解
http://www.51cto.com/html/2005/1108/10947.htm


首先说可以用下面的方法查看当前的目录,你的文件路径就可以以此为据:
System.out.println(System.getProperty("user.dir"));

如果你用这个方法来杳看你JSP页面,可以发现它的路径很奇怪,其实它是JSP引擎路径。所以当你用
    new File(String path);
时,如果用的是相对路径,就得相对真实的当前路径,而不是任何你想当然的路径 。
当然对于这个方法用”绝对路径“一般是不会出错的。只是这样,程序的灵活性就受到了限制。下面就是一个绝对路径 的例子:
    String xmlPath = "D:\\PublicFiles\\WCI\\navigation.xml";

Part 2
FileStream file = this.getClass().getClassLoader().getResourceAsStream(String xmlPath);
这个有点复杂,我了解的也不多,这里就说说现在我所了解的吧,以后再补充!
System.out.println(this.getClass().getClassLoader().getResource("/").getPath());
如此就可以看到相对“/”的根路径。
对   FileStream fileStream = this.getClass().getClassLoader().getResourceAsStream(filePath);
这里的filePath似乎只能用相对路径,至少我不知道用绝对路径怎么表示:
下面取个相对路径的例子:
    String filePath = "/../../Resources/XML/navigation.xml"; //表达规则和LINUX一样。

System.out.println(this.getClass().getClassLoader().getResource(".").getPath());
System.out.println(this.getClass().getClassLoader().getResource("/").getPath());
System.out.println(this.getClass().getClassLoader().getResource("").getPath());
System.out.println(this.getClass().getClassLoader().getResource("..").getPath());
相信,看过这四个路径结果就应该知道在哪放置自己的文件了,用什么样的语句能找到。

今天在写一个写JSP时,碰到上面的文件路径的问题,简单的了解下,相信其中定有不少的错误,希望你能提出并改正,我在此谢过了!



一. 问题
    JSP 中究竟采用绝对路径还是采用相对路径随着所采用技术的越来越复杂,这个问题也变得越来越难以解决。
1) 采用相对路径遇到的问题
l          相对路径固然比较灵活,但如果想复制页面内的代码却变得比较困难,因为不同的页面具有不同的相对路径,复制后必须修改每一个连接的路径。
l          如果页面被多于一个的页面所包含,那么被包含页面中的相对路径将是不正确的。
l          如果采用 Struts 的 Action 返回页面,那么由于页面路径与 Action 路径不同,使得浏览器无法正确解释页面中的路径,如页面为 /pages/cust/cust.jsp ,图片所有目录为 /images/title.gif ,这时在 /pages/cust/cust.jsp 中的所用的路径为 ”../../images/title.gif” ,但是如果某一个 Action 的 Forward 指向这个 JSP 文件,而这个 Action 的路径为 /cust/manage.do ,那么页面内容中 ”../../images/title.gif” 就不再指向正确的路径了。
解决以上问题似乎只有使用绝对路径了。
2) 采用绝对路径遇到的问题
l          随着不同的 Web 应用发布方式,绝对路径的值也不同。如 Web 应用发布为 MyApp ,则路径 ”/MyApp/images/title.gif” 是正确的,但发布为另一应用时如 MyApp2 ,这个路径就不对了,也许这个情况比较少,但以 default 方式发布 Web 应用时以上绝对路径也不同: ”/images/title.gif” 。
二. 解决方案

1)  采用绝对路径,但为了解决不同部署方式的差别,在所有非 struts 标签的路径前加 ${pageContext.request.contextPath} ,如原路径为:
”/images/title.gif” ,改为
“${pageContext.request.contextPath}/images/title.gif” 。
代码 ” ${pageContext.request.contextPath}” 的作用是取出部署的应用程序名,这样不管如何部署,所用路径都是正确的。
缺点:

操作不便,其他工具无法正确解释 ${pageContext.request.contextPath}
2)  采用相对路径,在每个 JSP 文件中加入 base 标签,如:
<base href="http://${header['host']}${pageContext.request.contextPath}/pages/cust/relation.jsp" />
这样所有的路径都可以使用相对路径。
缺点:

对于被包含的文件依然无效。
    真正使用时需要灵活应用1)和2),写出更加健壮的代码。
JSP 和 Servlet 中的绝对路径和相对路径问题困扰了我好几天,经过努力之后将其部分心得和大家共享。

       前提:假设你的 Http 地址为 http://192.168.0.1/ 你的 web 应用为 webapp ,那么你的 web 应用 URL 为 http://192.168.0.1/webapp/

       web 应用的目录结构:

       webapp/

              web-inf/

                 classes/

                     lib/

                     web.xml

                              <servlet-mapping>

                               <servlet-name>handleservlet</servlet-name>

                               <url-pattern>/handleservlet</url-pattern> 此映射是相对于当前 web 应用的

                             </servlet-mapping>

              user/

a.jsp

b.jsp

              images/

              css/

              js/

             

       所有相对路径都是由“ / ”开头的。如: /image/a.gif , /user/main.jsp ,大家知道在 html 中的相对路径是这样的:

       有个 html 文件: a.html ,其中有 <link href="one.css" rel="stylesheet" type="text/css"> ,其中 href 属性表示引用的 css 文件的路径。

one.css :表示 one.css 和 a.hmtl 处于同一个目录

user/one.css :表示 one.css 处于 a.html 所在目录的子目录 user 中。

../one.css :表示 one.css 位于 a.hmtl 上一级目录下,

../../one.css :表示 one.css 位于 a.hmtl 上一级目录的上一级目录下,

./ :表示和 a.hmtl 同一目录

我们称上述相对路径为 html 相对路径

1、 服务器端的地址

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

其用到的地方有:

forwarder : servlet 中的 request.getRequestDispatcher(address); 这个 address 是在服务器端解析的,所以,你要 forwarder 到 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、 客户端的地址

所有的 html 中的相对地址都是相对于 http://192.168.0.1/ 的,而不是 http://192.168.0.1/webapp/ 的。

Html 中的 form 表单的 action 属性的地址应该是相对于 http://192.168.0.1/ 的,所以,如果提交到 a.jsp 为: action = ”/webapp/user/a.jsp” ;提交到 servlet 为 action = ”/webapp/handleservlet”

Javascript 也是在客户端解析的,所以其相对路径和 form 表单一样。

3、 站点根目录和 css 路径问题

我们称类似这样的相对路径 /webapp/…. 为相对于站点根目录的相对路径。

当在 jsp 中引入 css 时,如果其相对路径相对于当前 jsp 文件的,而在一个和这个 jsp 的路径不一样的 servlet 中 forwarder 这个 jsp 时,就会发现这个 css 样式根本没有起作用。这是因为在 servlet 中转发时 css 的路径就是相对于这个 servlet 的相对路径而非 jsp 的路径了。所以这时候不能在 jsp 中用这样的路径: <link href="one.css" rel="stylesheet" type="text/css"> 或者 <link href="../../one.css" rel="stylesheet" type="text/css"> 类似 href="one.css" 和 ../../one.css 的 html 相对路径是相对于引用这个 css 的文件的相对路径。而在 servlet 中转发时就是相对于这个 servlet 的相对路径了,因为 jsp 路径和 servlet 路径是不一样的,所以这样的引用肯定是出错的。

所以这个时候,要用站点根目录,就是相对于 http://192.168.0.1/ 的目录,以“ / ”开头。

因此上述错误应更正为 href=”/webapp/one.css” 类似的站点根目录的相对目录。这样在 servlet 转发后和 jsp 中都是相对于站点根目录的相对路径,就能正确使用所定义的 css 样式了。
分享到:
评论

相关推荐

    java Web 中相对路径绝对路径问题总结

    以下是对Java Web中相对路径与绝对路径问题的深入总结: ### 一、路径概念与标准 #### 1. URL与URI URL(Uniform Resource Locator)统一资源定位符,是一种用于标识网络上资源位置的标准格式,如`...

    java中相对路径与绝对路径的问题

    在效劳器中的 Java 类中,我们可以使用 `WebApplication 的操作系统文档根列表` 来获取当前路径。例如,我们可以使用 `Weblogic 的文档根路径` 来获取当前路径。 了解 Java 中的相对路径和绝对路径是非常重要的,...

    JAVA获取各种路径总结

    在Java开发中,特别是在Web应用开发中,经常需要获取不同类型的路径,例如:当前Web应用的路径、特定文件的真实路径等。本文将详细讲解如何通过不同的方式来获取这些路径。 #### JSP中获取路径 1. **获取当前应用...

    java web教程和资料电子书

    这份教程涵盖了Java面向对象编程在Web环境中的应用,是提升编程技能的重要参考资料。 首先,Java Web是基于Java技术构建网络应用程序的框架。它包括Servlet、JSP(JavaServer Pages)、JSTL(JavaServer Pages ...

    java web接口开发demo

    在Java Web中,创建RESTful API通常使用Jersey、Spring Boot或Spark等库。这个demo可能展示了如何创建一个RESTful接口,通过HTTP GET和POST请求获取或更新数据。 在实际开发中,接口通常需要处理JSON或XML格式的...

    Java Web程序设计任务教程源码(黑马程序员)

    总之,《Java Web程序设计任务教程》通过丰富的实例和完整的项目源码,为读者提供了全面的Java Web开发学习路径。无论是初学者还是有一定基础的开发者,都能从中获益,深入理解并掌握Java Web应用的设计和开发。

    Java Web从入门到精通_PPT

    这份"Java Web从入门到精通_PPT"很可能是提供了一个系统化的学习路径,旨在帮助初学者逐步掌握这一领域的核心概念和技术。以下是这个主题中可能包含的一些关键知识点: 1. **Java基础**:学习Java Web前,首先需要...

    Java web 交友网站

    【Java Web 交友网站】是一个基于Java技术...通过学习和分析这个“Java web 交友网站”项目,初学者可以全面掌握Java Web开发的基本技能,并且了解到如何将理论知识应用于实际项目中,为后续的高级开发打下坚实基础。

    Java Web程序设计教程.pdf

    标题《Java Web程序设计教程》与描述《Java Web程序设计教程 Java Web程序设计教程》中的知识点主要涵盖了Java Web应用开发领域的核心技术与实践。本书作为21世纪高等学校计算机规划教材,由范立锋与林果园共同编著...

    Tomcat与Java Web开发技术详解(第2版).pdf

    此外,书中还会讨论如何在Tomcat中部署和管理Web应用,包括WAR文件的打包和部署、上下文路径的设置以及热部署技术。同时,会涉及Tomcat的安全配置,如SSL/TLS加密、用户认证和授权,确保Web应用的安全性。对于性能...

    通过java类的路径实例化类并调用方法

    通过java类的路径实例化类并调用方法:仅仅知道类的路径,就可以实例化对象,利用反射机制调用其方法

    Tomcat与Java Web开发技术详解(第2版)及其源码

    《Tomcat与Java Web开发技术详解》语言深入浅出、通俗易懂,无论对于Java Web开发的新手还是行家来说,《Tomcat与Java Web开发技术详解》都是精通Tomcat和开发Java Web应用的必备的实用手册。《Tomcat与Java Web开发...

    Tomcat与Java Web开发技术详解 孙卫琴 源码

    由于Java Web技术是SUN公司在Java Servlet规范中提出的通用技术,因此《Tomcat与Java Web开发技术详解》讲解的Java Web应用例子可以运行在任何一个实现了SUN的Servlet规范的Java Web服务器上。随书附赠光盘的内容为...

    JAVA_Web开发教程.ppt

    【JAVA_Web开发教程】 Java Web开发是将Java编程语言应用于构建互联网应用程序的过程。这个教程主要面向初学者...这不仅是理论知识的积累,更是实践技能的提升,有助于学员在未来的职业生涯中胜任Java Web开发的工作。

    java web开发环境配置

    在 Eclipse 中集成 Java Web 开发环境是 Java Web 开发的基本步骤。下面将详细介绍如何在 Eclipse 中搭建 Java Web 开发环境。 Java Web 环境配置 Java Web 开发环境配置主要包括三个部分:Eclipse 的安装、Tomcat...

    JAVA WEB 校园订餐系统项目源码+数据库

    JAVA WEB 校园订餐系统项目源码+数据库 JAVA WEB 校园订餐系统项目源码+数据库 JAVA WEB 校园订餐系统项目源码+数据库 JAVA WEB 校园订餐系统项目源码+数据库 JAVA WEB 校园订餐系统项目源码+数据库 JAVA WEB 校园...

    用案例学Java Web整合开发:Java+Eclipse+Struts 2+Ajax

    在Java Web中,Ajax通常结合JSON(JavaScript Object Notation)数据格式使用,因为JSON轻量且易于解析。开发者需要学习XMLHttpRequest对象的使用,以及在JavaScript中处理JSON数据的方法。 在实际案例中,我们可能...

    java开发中的路径问题

    在Java开发中,路径问题是一个常见且重要的主题,特别是在Servlet和JSP的上下文中。路径主要分为两种类型:相对路径和绝对路径。 **1. 相对路径与绝对路径** - **相对路径**:它是相对于某个基准目录的路径。例如...

Global site tag (gtag.js) - Google Analytics