一.问题
jsp中究竟采用绝对路径还是采用相对路径随着所采用技术的越来越复杂,这个问题也变得越来越难以解决。
1)采用相对路径遇到的问题
l相对路径固然比较灵活,但如果想复制页面内的代码却变得比较困难,因为不同的页面具有不同的相对路径,复制后必须修改每一个连接的路径。
l如果页面被多于一个的页面所包含,那么被包含页面中的相对路径将是不正确的。
l如果采用struts的action返回页面,那么由于页面路径与action路径不同,使得无法正确解释页面中的路径,如页面为/pages /cust/cust.,图片所有目录为/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标签,如:
这样所有的路径都可以使用相对路径。
缺点:
对于被包含的文件依然无效。
真正使用时需要灵活应用1)和2),写出更加健壮的代码。
在使用的时候可以使用${pagecontext.request.contextpath},也同时可以使 用
在jsp页面中添加base,可用相对路径:
string path = request.getcontextpath();
string basepath = request.getscheme() + "://"
+ request.getservername() + ":" + request.getserverport()
+ path + "/";
%>
然后在
标签内添加base
在本页面中“直接”引入外部文件时,可直接
同理,本页面中的css类
.top {
position: absolute;
left: 0;
top: 95px;
right: 0;
height: 120px;
background: url(images/common/title.jpg) repeat-x
}
========例外情况:引入的外部css、js文件又引入image等时
这时候如果也用相对路径的话,因为已经不在了jsp页面中,此时相对路径是相对于本css文件所在的目录:
如:棠棣新,index.jsp页面中引入的css文件
这时在jsp页面中,引入的js/common/frame.js是从网站跟目录开始寻找,没问题。
但在frame.js中有如下css
.show_menu{
background-image: url(images/left_bg.gif);
background-repeat: repeat-y;
background-position:285px 51px;
}
这种情况下直接url(images/left_bg.gif);是默认从本css文件所在目录(/css/common/frame.css)+url(images/left_bg.gif),所以此处需要的image需要单独配置,
改成
.show_menu{
background-image: url(../../images/left_bg.gif);
background-repeat: repeat-y;
background-position:285px 51px;
}