Java Web中的相对路径与绝对路径总结

原文链接https://www.cnblogs.com/jichunhu/archive/2013/01/31/2887042.html

http://blog.csdn.net/it_xiaocao/article/details/52189403

https://www.cnblogs.com/yuan1225/p/3219629.html

http://blog.csdn.net/afterlife_qiye/article/details/43149467

1、基本概念的理解

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

相对路径:相对与某个基准目录的路径。包含Web的相对路径(HTML中的相对目录),

在项目中,"/"代表Web站点的根目录,"./"代表当前目录, "../"代表上级目录, http://www.cnblogs.com/代表上上级目录,以此类推。

例如:C:\test\AC\下面有a.html和c.html, C:\test\B\下面有b.html,则在a.htm中访问b.html绝对路径为C:\test\B\b.html,相对路径为../B/b.html;访问c.html绝对路径为C:\test\AC\c.html,相对路径为./c.html或者c.html。

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

Java Web中的相对路径与绝对路径总结

2.1 服务器端的地址

Java Web中的相对路径与绝对路径总结

假设我们的项目访问地址为:http://172.0.0.1/TestProject/

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

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

在Servlet中,如果要访问WEB-INF下面的jsp页面时,必须加上/WEB-INF这个路径,因为Servlet的路径是相对服务器端地址的,即http://172.0.0.1/TestProject/,例如:request.getRequestDispatcher("/WEB-INF/content/student-detail.jsp")

2.2客户端的地址 

所有的html页面中的相对地址都是相对于服务器根目录(http://172.0.0.1/)的,而不是(跟目录下的该Web应用的目录)http://172.0.0.1/TestProject/的。 Html中的form表单的action属性的地址应该是相对于服务器根目录(http://172.0.0.1/)的,所以,如果提交到error.jsp为:action="<%=request.getContextPath()%>/pages/error.jsp”;提交到servlet为action="<%=request.getContextPath()%>/handleservlet"; Javascript也是在客户端解析的,所以其相对路径和form表单一样。

因此,一般情况下,在JSP/HTML页面等引用的CSS,Javascript.Action等属性前面最好都加上<%=request.getContextPath()%>,以确保所引用的文件都属于Web应用中的目录。另外,应该尽量避免使用类似".","./","http://www.cnblogs.com/"等类似的相对该文件位置的相对路径,因为这样当文件移动时,很容易出问题。

 

2.3 站点根目录和系统目录

站点根目录:在Web项目中“/”是表示站点根目录的相对路径,例如在jsp页面中引入<link rel="stylesheet" type="text/css" href="/css/style.css" />
<script type="text/javascript" src="/js/common.js"></script>,style.css和common.js的路径分别为http://172.0.0.1/css/style.css和(http://172.0.0.1/js/common.js。
因为/css/…. 是相对于站点根目录(http://172.0.0.1/)的相对路径。 这样jsp是无法访问到css或js文件的。

系统目录:众所周知,JSP是Servlet的一种特殊形式,每个JSP页面就是一个Servlet实例——JSP页面由系统编译成Servlet,Servlet再负责响应用户请求。JSP其实也是Servlet的一种简化,使用JSP时,其实还是使用Servlet,因为Web应用中的每个JSP页面都会由Servlet容器生成对应的Servlet。也就说jsp所在的目录还是服务端目录,即JSP地址还是相对系统根目录http://172.0.0.1/TestProject/的。

也就是说站点根目录为http://172.0.0.1/,系统根目录为http://172.0.0.1/TestProject/,这跟客户端地址和服务端地址是相似的。

 

3、在JSP中引用js/css/的两种方式

第一种:站点根目录下绝对路径的方式

假设我们项目的URL为:http://172.0.0.1/TestProject/index.jsp。

 

为了在以后更改工程名时也能正确访问,我们需要加 <%basePath=request.getContextPath() %>
如:<script src="<%=request.getContextPath() %> /js/common.js"></script>

<%=request.getContextPath() %>太麻烦,可以在每一个jsp文件顶部加入以下内容后,

Java代码
  1. <%
  2. String path = request.getContextPath();
  3. String basePath = request.getScheme()+"://" +request.getServerName()+":"+request.getServerPort()+path+"/";
  4. %>
  5. <base href="<%=basePath%>" >

就可直接使用 <script src=" /js/common.js"></script>了。

第二种:系统根目录下相对路径的访问方式

当在jsp中引入css/js时,如果其相对路径相对于当前jsp文件的,而当前的jsp的相对路径又是相对于系统目录http://172.0.0.1/TestProject/的。

所以在上面的引入方式中去掉“/”即可。即<link rel="stylesheet" type="text/css" href="css/style.css" /><script type="text/javascript" src="js/common.js"></script>。在jsp页面引入图片也是如此<img src="images/succeed.png"/>。如果一定要使用站点根目录的话就这样使用<img src="<%=request.getContextPath()%>/images/succeed.png"/>,这两种方式都是可以的。

4、在Servlet/Action中跳转到相应的Jsp页面的方式

第一种情况:假如jsp页面是可以直接访问到的,即是放在WEB-INF外面的,假设该jsp页面访问地址为http://172.0.0.1/TestProject/pages/test.jsp。则Servlet中通过request.getRequestDispatcher("/pages/test.jsp").forward(request, response)这种方式即可跳转到test.jsp。

第二种情况:假如该jsp页面是不可以直接访问的,是在WEB-INF里面的。假设该jsp页面所在的目录为http://172.0.0.1/TestProject/WEB-INF/content/student-list.jsp。则Servlet中通过request.getRequestDispatcher("/WEB-INF/content/student-list.jsp").forward(request, response)跳转。在Struts2中通过配置<result name="success">/content/student-list.jsp</result>即可访问。

 

5、Forward、Redirect及Include的区别

首先,sendRedirect与forward,include的最大区别是request,response. sendRedirect产生新的请求与响应,服务器收到请求后发送一个状态头给客户,客户将再次请求,就有两次网络通行的来往。redirect是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址.所以地址栏显示的是新的URL.所以redirect等于客户端向服务器端发出两次request,同时也接受两次response.所以redirect可以重定向到外部的资源,如:response.sendRedriect("http://www.baidu.com"); 当Servlet发送“http://www.baidu.com”到服务器时,服务器再将该地址返回客户端,此时浏览器URL为“http://www.baidu.com”,然后客户端再去访问“http://www.baidu.com”这个地址。

其次,forward与include基本上都是转发到context内部的资源。它们是服务器内部重定向,程序接收到请求后重新定向到另一个程序,而客户端并不知晓。从地址栏显示来说forward与include是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容 再发给浏览器.浏览器根本不知道服务器发送的内容从哪里来的,所以它的地址栏还是原来的地址. forward与include会将 request state、bean、等信息带到下一个jsp页面;

使用getAttribute()来取得前一个jsp所放的信息,redirect 是送到客户端后再次request,因此上一个jsp的信息不被保留。

最后,forward与include的区别就是,forward方法是把请求的内容转发到另外的一个servlet。而include是把另一个servlet处理过后的内容拿过来.

使用方式:

 

1. sendRedirect

servlet和jsp里面一样

response.sendRedirect();

2. include

1) servlet里面

request.getRequestDispatcher( "jsp2.jsp" ).include(request, response);

2) jsp里面

<jsp:include page= "include.jsp" />

3. forword

1) servlet里面

request.getRequestDispatcher( "jsp2.jsp" ).forward(request, response); 
2) jsp里面

<jsp:forward page= "include.jsp" />



java在写项目路径时候/加与不加的区别

比如说 src="js/util.js 和 src="/js/util.js
解答:

就拿一个项目来说吧。


项目名称是test,项目下面有test1这个目录,如图

假如在index.jsp文件中引用util.js文件

你可以用src="js/util.js或者src="/test1/js/util.js  这两种方式引用

不加/就是相对路径代表以index.jsp文件的目录(test1)为开始路径

加/代表绝对路径以项目根目录为开始路径(/test1)

Java Web中的相对路径与绝对路径总结

不加  /    就是获取的当前路径,

加    /      就是从根目录 获取子路径(根目录为WebRoot)。


解释:通常在获取Resource的时候都是获取的不加斜杠的路径,

所以如果想获取子路径,需要先添加”/“,之后在增加相应的路径。



引用外部.css或.js文件的路径问题--jsp或html页面或是在web项目中的引用

jsp或html页面引用外部.css或.js文件时,注意路劲问题,如果设置不当,会引用不到这些外部的文件
假设使用下面的目录结构:

-webapp 
|-MyProject  目录 
 |--WebContent 目录
  |---scripts 目录
   ---dtree.js 文件
  |---styles 目录
   ---main.css 文件 
  |---pages 目录
   ---test.jsp 文件
 
现在例如要在test.jsp中引用scripts目录下的dtree.js和styles目录下的main.css
 
有如下几种方法:
 
1.使用相对于jsp页面的相对路径
Html代码 [url=http://javatechnology.javaeye.com/blog/577469#][/url]
  1. <link type="text/css" rel="stylesheet" href="../styles/main.css" />  
  2. <script type="text/javascript" src="../scripts/dtree.js"></script>  
<link type="text/css" rel="stylesheet" href="../styles/main.css" /><script type="text/javascript" src="../scripts/dtree.js"></script>
  
这样在页面使用http://localhost:8080/MyProject/test.jsp访问test.jsp时就可以引用到dtree.js和main.css。
 
2.使用相对于Web工程的相对路径
对于1中的相对使用相对于于jsp页面的相对路径的这种方式,如果我们是设置action跳转到test.jsp页面,那么这种使用相对路径的方式就引用不到了。
例如我们当访问http://localhost:8080/MyProject/main.do的时候,页面跳转到test.jsp页面,如果使用方法1,就引用不到了。
这个时候我们可以使用相对于Web工程的相对路径来引用: 
Html代码 [url=http://javatechnology.javaeye.com/blog/577469#][/url]
  1. <link type="text/css" rel="stylesheet" href="styles/main.css" />  
  2. <script type="text/javascript" src="scripts/dtree.js"></script>  
<link type="text/css" rel="stylesheet" href="styles/main.css" /><script type="text/javascript" src="scripts/dtree.js"></script>
 
但是请注意:使用方法2这种方式引用,如果直接访问http://localhost:8080/MyProject/test.jsp,是引用不到的。
 
3.使用Web工程的绝对路径
方法1和方法2都有缺点,都只适用一种情况,有没有两种情况都适用的呢?答案肯定的!
我们使用绝对路径:
Html代码 [url=http://javatechnology.javaeye.com/blog/577469#][/url]
  1. <link type="text/css" rel="stylesheet" href="/MyProject/styles/main.css" />  
  2. <script type="text/javascript" src="/MyProject/scripts/dtree.js"></script>  
<link type="text/css" rel="stylesheet" href="/MyProject/styles/main.css" /><script type="text/javascript" src="/MyProject/scripts/dtree.js"></script>
 
这样,不管是通过http://localhost:8080/MyProject/main.do跳转访问test.jsp还是直接访问http://localhost:8080/MyProject/test.jsp,都可以成功引用。
 
注意:如果我们在部署Web应用时,没有设置Context Root(一般情况下配置为工程名),也就是IP和端口后面不带应用名,如http://localhost:8080/main.do和http://localhost:8080/test.jsp,这种情况在引用时就不能带工程名了,应该这样:

Html代码 [url=http://javatechnology.javaeye.com/blog/577469#][/url]
  1. <link type="text/css" rel="stylesheet" href="/styles/main.css" />  
  2. <script type="text/javascript" src="/scripts/dtree.js"></script>  
<link type="text/css" rel="stylesheet" href="/styles/main.css" /><script type="text/javascript" src="/scripts/dtree.js"></script>


java、JSP web项目中的路径问题

今天终于明白了jsp中的request.getContextPath()是怎么回事了。

request.getContextPath()  返回站点的根目录

request.getRealpath("/")得到的是实际的物理路径,也就是你的项目所在服务器中的路径

request.getScheme() 等到的是协议名称,默认是http

request.getServerName() 得到的是在服务器的配置文件中配置的服务器名称 比如:localhost .baidu.com 等等

request.getServerPort() 得到的是服务器的配置文件中配置的端口号 比如 8080等等

有一个例子来说明吧

有个web应用程序 名称就是demo

 <% 
    String basePath = request.getScheme() + "://"
            + request.getServerName() + ":" + request.getServerPort();
    String path = request.getScheme() + "://" + request.getServerName()
            + ":" + request.getServerPort() + request.getContextPath()
            + "/";
    String filePath=path+"resources/";
    session.setAttribute("path", path);
    session.setAttribute("basePath", basePath);
    session.setAttribute("filePath", filePath);
%>

以上这段代码是 demo中每一个jsp页面中都包含的一段代码

其中 request.getContextPath() = /demo

basePath = http://localhost:8080

path = http://localhost:8080/demo/

filePath = http://localhost:8080/demo/resources/

用法:

如果在jsp界面中引用resources/images/文件夹下面的图片icon.png写法如下:

<img src="${filePath }images/icon.png" />或者

 <img src="${path}resources/images/icon.png" />

同理 如果在resources/css/文件夹下引用style.css写法如下:

<link href="${filePath} css/style.css" rel="stylesheet" type="text/css" />

<link href="${path} resources/css/style.css" rel="stylesheet" type="text/css" />

OK!


java web项目中的路径,有相对路径和绝对路径

什么是相对路径呢    举个简单例子

我们有项目   test     发布后地址  http://localhost:8080/test/

页面  qiantai/login.jsp        页面中链接  <a href="index.jsp" />

JSP页面相相对寻址     链接的最终地址是    http://localhost:8080/Test/qiantai/index.jsp 

相对路径是这么一个过程    首先取当前文件的路径  也就是 http://localhost:8080/test/qiantai/

                                                然后拼接链接的地址   index.jsp   所以结果就如上   ......qiantai/index.jsp


在CSS、JS的引用中为防止后台转发造成的问题,应尽量使用绝度路径


第一种方案

JSP页面中自带两个路径参数 path和basePath

页面的开头,有这么一段代码

<%
String path = request.getContextPath();   获得当前路径 例如   http://localhost:8080/test/qiantai/

 //获得本项目的地址  例如  http://localhost:8080/test/  赋值给 basePath

String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";

//将项目路径 basePath 放入pageContext中,待以后用EL表达式读出

pageContext.setAttribute("basePath",basePath); 

%>

链接改用 <a href="${pageScope.basePath}qiantai/index.jsp">

从而构成一个绝对路径  http://localhost:8080/test/qiantai/index.jsp

 但是这样做有一个很不好的地方,那就是我们必须要在每个链接的前面都要加上 “${pageScope.basePath}”    

第二种方案

使用HTML中的base标签(推荐使用)

对base的介绍base 元素可规定页面中所有链接的基准

URL默认情况下,页面中的链接(包括样式表、脚本和图像的地址)都是相对于当前页面的地址(即:浏览器地址栏里的请求URL)。    

我们可以使用 <base>标签中的href属性来设置,所有的“相对基准 URL”。

<head>    

<!-- base需要放到head中 -->    

<base href="http://localhost:8080/test/">  或者 <base href="<%=basePath%>" />

</head>

这样就可以直接使用相对路径  <a href="index.jsp" />   

设置了 <base>后,相对路径,相对于的就是base中的路径,而不再是浏览器地址的请求路径啦~~~  

我们可以看到JSP返回的html代码中,包含了 <base href="http://localhost:8080/test/">内容

也就是说,在本html文件中,遇到的所有 “相对链接(例如: <a href="login.jsp">)”,都是相对于base 

这样就不用担心转发操作(forward)或 请求地址不同不同所造成的页面无法找到的错误啦~(即: HTTP: 404)。。。

也可以很好的避免因转发造成的css或js引用地址错误问题,以为页面的路径都是以base为基准的。




${pageContext.request.contextPath}和<%=request.getContextPath()%>


 做的一个web项目,需要在jsp页面中获取js、css和图片等资源,本想采用相对路径来写,但是发现可移植性太差,在自己电脑上还好使,但辛辛苦苦调好代码后,放到其他电脑上又得再次辛辛苦苦修改相关路径。于是决定采用绝对路径来写。然后在网上找寻相关方法,发现用的比较多的两个:${pageContext.request.contextPath}和<%=request.getContextPath()%>,但具体用哪个我也不大清楚,于是继续查找两者的区别,但让我郁闷的是,网上“抄袭”的真多啊!而且说了一大堆!尽是些不痛不痒的专业名词,关键的真没几个!所以我决定靠自己理解,现在明白了!我想用一种比较通俗的语言分享一下我对此的认识!

      可以说${pageContext.request.contextPath}等价于<%=request.getContextPath()%>!它们的意思就是取得当前项目名称(或者是--取出部署的应用程序名,不过这么说太官方了,试问有多少人知道“取出部署的应用程序名”的义)
      那么什么是当前的项目名称呢?

      Java Web中的相对路径与绝对路径总结Java Web中的相对路径与绝对路径总结

      假定你的web应用名称为hotel,这个hotel就是当前的项目名称,不过你在浏览器中输入请求路径时,例如输入http//:localhost:8080/hotel/login.jsp 

      ${pageContext.request.contextPath}或<%=request.getContextPath()%>就是从这个请求路径(URL)上截取(是截取) /hotel ,看清楚,前面是有"/",而这个“/”代表的是"http//:localhost:8080",看清楚这里是没有"/"的!

      对应到真是的物理地址,即为图中WebContent目录!

      另外,如果你是在Tomcat的server.xml文件中配置了虚拟目录,例如

      Java Web中的相对路径与绝对路径总结

      那么我们在对应的物理目录F:\javaweb中创建test_jsp.jsp文件,内容为

      Java Web中的相对路径与绝对路径总结 

      开启Tomcat,进行测试,发现输出结果为

      Java Web中的相对路径与绝对路径总结

      可以看到,此时输出为虚拟目录,并且二者完全等价!

      因此,在表单<formaction="${pageContext.request.contextPath}/hotel/login.jsp">中,这样写路径永远对,翻译过来${pageContext.request.contextPath}/hotel/login.jsp其中的含义,就是http//:localhost:8080/hotel/login.jsp,相当于你写了一全路径!当然前提是你的JSP页面等等必须放置的位置正确才可以,所以才说明路径永远正确。

       为什么这么要做呢?因为学过一些MVC模式的程序员都知道,JSP的作用是用来显示的(表现的),其他的作用最好不要在这个页面上显示,尤其是Java代码!所以就用EL表达式来替代类似有“<%%>”这样的代码格式。