稍微上点规模的项目,一般都会为不一样模块或功能的页面,js,css等资源创建不一样的路径,或者对不一样的servlet等配置不一样的虚拟路径。这时,关于各类路径的包含和转向问题长期困扰开发人员。
按照通常的作法,就是要理解web对资源的包含和转向原理,即便:都是从当前所在位置起,根据路径去寻找目标资源。
好比:
1.当前位置在path1下的test1.jsp,在test1.jsp中包含style目录下的css文件drp.css。那么test1.jsp中就应该这么写:
<
link
rel
="stylesheet"
href
="../style/drp.css"
>
,即从当前路径回退一个到跟目录,而后从根目录下找style/drp.css。
2.又:在test1.jsp中js函数中访问一个配置虚拟路径的servlet,配置是这样的
<
url-pattern
>/servlet/product/AddProductServlet
</
url-pattern
>
那么就应该这样访问:
../servlet/product/AddProductServlet
,即从当前路径回退一个到跟目录,而后从根目录下找servlet/product/AddProductServlet
3.又:在AddProductServlet中做转向
req.getRequestDispatcher(
"/path2/test2.jsp").forward(req, resp);
,而在test2.jsp中又包含style目录下的css文件drp.css。那么在test2.jsp中应该这么写:
<
link
rel
="stylesheet"
href
="../../style/drp.css"
>
,即从当前路径(servlet/product)回退两次到根目录,而后从根目录下找style/drp.css。
这只是个简单的例子,并无牵扯到多个servlet转向同一个页面等复杂状况。怎么样?web开发中的路径问题够头疼的了吧?
如今咱们看看使用<base>标签是怎么轻松解决这个问题的。
首先,在test1.jsp和test2.jsp中都添加这样的代码:
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
... ....
<
base href="<%=basePath %
>">
至于添加在哪一个位置就不用多说了吧,呵呵。
那么再在两个页面中使用任何资源都从跟目录查找,在js中访问任何资源只需在前面加上<%=basePath %>便可。好比上例中test1.jsp的两处分别应该这样写:
<
link
rel
="stylesheet"
href
="style/drp.css"
>
... ...
<
%=basePath %
>servlet/product/AddProductServlet
一样,test2.jsp中之处应该这么写:
<
link
rel
="stylesheet"
href
="style/drp.css"
>
不管他们之间引用的资源再多,关系再复杂,只须要记住一句话:
<base>标签让本页面全部引用资源都从根目录找,但它只对页面元素起做用,对js元素无效。