`

JSP的相对路径--深入研究

阅读更多

作者:赵磊

博客:http://elf8848.iteye.com

 

要在/jsp/index.jsp文件使用图片,如何计算相对路径? 经过Servlet,struts转发后又如何计算相对路径     

相对路径是由浏览器通过地址栏分析出来的,与服务器端文件的存放路径没有关系,由其是使用 Servlet,struts转发到某jsp文件后,某jsp在服务器端存放的位置是/a/b/c/d/f/g.jsp , 但经过Servlet,struts转发后,浏览器的地址栏可不一定是/a/b/c/d/f/这样的层次。所以相对路径的计算以浏览器地址栏为准 。原创地址:http://elf8848.iteye.com/

 

目录结构如下图:

 

    

 

--------------------第一种情况 :直接访问JSP文件 ---------------------------------------

 


URL是 http://localhost/Context path /jsp/index.jsp

 

要在index.jsp引用go.gif文件:

1、使用决对路径

<img src='<%=request.getContextPath() %>/images/go.gif'/>

浏览器寻找方式: 域名+/Context path/images/go.gif   ,可找到。

 

 

2、使用相对路径

<img src='../images/go.gif'/>

浏览器寻找方式:通过地址栏分析,index.jsp所在目录(jsp )的上一层目录(WebRoot)下的images/go.gif文件  

 

 

3、使用base href

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

<% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <base href="<%=basePath%>">

 

 

 <img src='images/go.gif'/>

浏览器寻找方式: basePath的值http://localhost/Context path/ 再加上images/go.gif,可找到。

 

 

----------------------- 第二种情况: servlet转发到jsp ---------------------------------------


1、使用相对路径  

URL是http://localhost/Context path /servlet_2   (转发到/jsp/index.jsp)

 

错误:

根据/jsp/index.jsp路径计算,得到 <img src='../images/go.gif'/>

 

 

正确:

<img src='images/go.gif'/>

 

原因:

index.jsp是保存在服务器端的/jsp/index.jsp目录下面,但通过转发后浏览器并不知道/jsp/目录的存在,因为地址栏中没有体现出来。所以服务器端/jsp/目录并不会对相对路径产生影响

浏览器寻找方式:通过地址栏分析http://localhost/Context path /servlet_2 ,相对于servlet_2所在目录(/)下面找到images/go.gif文件

 

 

2、使用相对路径

URL是http://localhost/Context path /servlet /ser/ser/servlet_1 (转发到/jsp/index.jsp)

 

“/servlet /ser/ser/servlet_1 是在web.xml文件配置的

 

错误:

根据/jsp/index.jsp路径计算,得到 <img src='../images/go.gif'/>

 

正确:  

<img src='../../../images/go.gif'/>

 

原因:

index.jsp是保存在服务器端的/jsp/index.jsp目录下面,但通过转发后浏览器并不知道/jsp/目录的存在,因为地址栏中没有体现出来。所以服务器端/jsp/目录并不会对相对路径产生影响

浏览器寻找方式:通过地址栏分析http://localhost/Context path / servlet /ser/ser/servlet_1,相对于servlet_1所在目录(ser)的上一层目录的上一层目录的上一层目录(/)下的images/go.gif文件

 

 

3、使用决对路径

<img src='<%=request.getContextPath() %>/images/go.gif'/>

 

------------------------------- 总结 -----------------------------------------------

 

相对路径是由浏览器通过地址栏分析出来的,与服务器端文件的存放路径没有关系,由其是使用Servlet,struts转发到某jsp文件后,某jsp在服务器端存放的位置是/a/b/c/d/f/g.jsp , 但经过Servlet,struts转发后,浏览器的地址栏可不一定是/a/b/c/d/f/这样的层次。所以相对路径的计算以浏览器地址栏为准 。原创地址:http://elf8848.iteye.com/

 

 

struts2中可以使用命名空间,来保证浏览器地址栏中的目录层次与服务器端目录层次的一致性,这样程序员通过服务器端的目录层次计算相对路径,在浏览器中也是正常的。

但我们理解了原理,就算不使用命名空间,自己也有强大的控制力。

 

转载入注明出处:JAVA应用与开发办公室 http://elf8848.iteye.com/

  • 大小: 19.2 KB
分享到:
评论
11 楼 phenom 2010-02-24  
在一个Frameset框架页面.子Frame里应该怎么用呢?如果猫的Context设为FrameContext.
那JSP通常会用<%=request.getContextPath() %>/XX.js来引入JS文件,
JSP页面的JS里的请求:如AJAX也可以用<%=request.getContextPath() %>/XX.do来处理
但是到了JS文件里的就不能了.换成/XX.do就会到主机名+端口号.没有了FrameContext.如果换成XX.do显然也不对.应该如何处理呢?
10 楼 simplejacky2009 2010-02-21  
request.getContextPath()/dir1/dir2/**.jsp
9 楼 citymoon2000 2010-02-16  
我正好遇到同样的问题,终于找到答案了, 我把css和图片路径改成绝对路径就好了
8 楼 lucane 2009-08-07  
在一个jsp里专门引js&css,在里面做成http打头的绝对路径

要不就写个标签,同上
7 楼 kjj 2009-08-06  
我一直用相对路径 ,有时也用绝对路径!!
6 楼 brucewuu 2009-08-06  
谢谢你们哈 ,我貌似懂了一些了,也解决了一些问题了
5 楼 chbest 2009-08-06  
直接写绝对路径不就可以了吗?
4 楼 elf8848 2009-08-06  
brucewuu 的问题与我文章的主题没有系吗!!
pejaming 也回答了一些, 我再补充一下。
pejaming也说了src下面的文件会输出到/WebRoot/WEB-INF/classes 下,
classes内的文件, 是不可以“直接”从浏览器中访问在, 但可以通过servlet转发。

还有如果只写/filefolder1/filefolder2/login.jsp 表示的位置又是怎样的?
答: Web应用/WebRoot
3 楼 pejaming 2009-08-06  
brucewuu 写道
问题一:
     我用MyEclipse 7.5 新建了一个web project ,名为test,在src目录(在test文件夹下)下新建了一个文件夹,名为jsp ,里面放的都是jsp得文件,其中有个login.jsp 文件,src目录和WebRoot目录在同一个文件夹下,WebRoot中有个index.jsp,是MyEclipse自动建的,我现在想在index.jsp 中增加一个超链接,为<a href="" >click to login page </a >, 我想问这里href应该如何填才能顺利跳转到src/jsp/login.jsp ,请大家帮忙?

问题二:
    我在src/jsp 目录下又建了一个register.jsp 文件,在login.jsp 中有个超链接跳转到register.jsp ,发现结果跳出来的竟然是register.jsp 的源代码,为什么会这样?

问题三:
   在浏览器里访问index.jsp的路径如下:
http://ad-af0ac77b9f5d:8080/test/
test为项目名,我现在想在浏览器中改变路径访问src/jsp/login.jsp ,于是我输入
http://ad-af0ac77b9f5d:8080/test/src/jsp/login.jsp ,结果是unavailable,可是我输入
http://ad-af0ac77b9f5d:8080/test/index.jsp 是可以访问到index.jsp 页面的,问题在哪里?
我不懂myeclipse里路径的位置到底是如何的?

您能帮我解决下这个问题吗?
还有如果只写/filefolder1/filefolder2/login.jsp 表示的位置又是怎样的?



src一般是放置源码的路径,可以在eclipse的buildpath下设置,编译时会将src下面的东东输出到指定的output folder下,用eclipse来建,默认是工程名/WebRoot/WEB-INF/classes
2 楼 brucewuu 2009-08-06  
问题一:
     我用MyEclipse 7.5 新建了一个web project ,名为test,在src目录(在test文件夹下)下新建了一个文件夹,名为jsp ,里面放的都是jsp得文件,其中有个login.jsp 文件,src目录和WebRoot目录在同一个文件夹下,WebRoot中有个index.jsp,是MyEclipse自动建的,我现在想在index.jsp 中增加一个超链接,为<a href="" >click to login page </a >, 我想问这里href应该如何填才能顺利跳转到src/jsp/login.jsp ,请大家帮忙?

问题二:
    我在src/jsp 目录下又建了一个register.jsp 文件,在login.jsp 中有个超链接跳转到register.jsp ,发现结果跳出来的竟然是register.jsp 的源代码,为什么会这样?

问题三:
   在浏览器里访问index.jsp的路径如下:
http://ad-af0ac77b9f5d:8080/test/
test为项目名,我现在想在浏览器中改变路径访问src/jsp/login.jsp ,于是我输入
http://ad-af0ac77b9f5d:8080/test/src/jsp/login.jsp ,结果是unavailable,可是我输入
http://ad-af0ac77b9f5d:8080/test/index.jsp 是可以访问到index.jsp 页面的,问题在哪里?
我不懂myeclipse里路径的位置到底是如何的?

您能帮我解决下这个问题吗?
还有如果只写/filefolder1/filefolder2/login.jsp 表示的位置又是怎样的?
1 楼 bryan.liu 2009-04-04  
其实,偶一直是用 <s:url value="/js/Common.js"/> 来写引用路径的,以不变应万变,:)

相关推荐

Global site tag (gtag.js) - Google Analytics