JSP的相对路径深入研究!

 

 

 

 

如图,要在/jsp/index.jsp文件中使用/images文件夹下的go.gif图片,如何计算相对路径? 经过Servlet,struts转发或重定向后情况又有如何变化?

目录结构:
图片

知识要点:相对路径的计算以浏览器地址栏为准

------------------------------------------------------------------------------

 

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

URL http://localhost/request.getContextPath/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

大家在平常的web项目开发时一定有注意到,当新建一个jsp文件后,文件代码中自动生成了如下代码:

...

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

...

<base href="<%=basePath%>">

...

这三句代码有什么作用呢?

注意回看上面“1.使用绝对路径

<img src='<%=request.getContextPath() %>/images/go.gif'/>”的地方,没错

String path =request.getContextPath();得到的是文件的根目录,
 request.getScheme()
web传输协议(http),request.getServerName()是服务器域名(localhost),
request.getServerPort()
是服务端口号(8080

所以path就是文件的根目录,basePath就是基本路径

由此<base href="<%=basePath%>">也就好理解了——设置当前.jsp文件基本路径为basePath.

 

有了上面三句代码,再使用图片时只用这样写就可以了

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

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

(注意:由于.jsp文件自动生成上述代码,因此如果要使用相对路径,一定要手动删掉上述代码,否则图片无法显示!)

 

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

使用request转发(地址栏不会发生变化)

(以下情况都是去掉了上述自动生成的代码的条件下) 

1、使用相对路径 

URLhttp://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使用相对路径

URLhttp://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'/>

 

使用response重定向后地址栏变为定向后的页面地址,所以使用情况和直接访问JSP文件一样

------------------------------------------------------------------------------

 

总结:相对路径是由浏览器通过地址栏分析出来的,与服务器端文件的存放路径没有关系,由其是使用Servlet,struts转发到某jsp文件后,某jsp在服务器端存放的位置是/a/b/c/d/f/g.jsp , 但经过Servlet,struts转发后,浏览器的地址栏可不一定是/a/b/c/d/f/这样的层次。所以相对路径的计算以浏览器地址栏为准。原创地址:http://www.javaeye.com/,我增减了部分内容,以便能更好理解,希望对大家有帮助!

 

 

附:

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

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

 

                                                                                
                                    
                                                                                                                                                               点击我试试 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值