一. 問題
JSP 中究竟采用絕對路徑還是采用相對路徑隨著所采用技術的越來越復雜,這個問題也變得越來越難以解決。
1) 采用相對路徑遇到的問題
l 相對路徑固然比較靈活,但如果想復制頁面內的代碼卻變得比較困難,因為不同的頁面具有不同的相對路徑,復制后必須修改每一個連接的路徑。
l 如果頁面被多于一個的頁面所包含,那么被包含頁面中的相對路徑將是不正確的。
l 如果采用 Struts 的 Action 返回頁面,那么由于頁面路徑與 Action 路徑不同,使得瀏覽器無法正確解釋頁面中的路徑,如頁面為 /pages/cust/cust.jsp ,圖片所有目錄為 /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 標簽,如:
<base href="http://${header['host']}${pageContext.request.contextPath}/pages/cust/relation.jsp" />
這樣所有的路徑都可以使用相對路徑。
缺點:
對于被包含的文件依然無效。
真正使用時需要靈活應用1)和2),寫出更加健壯的代碼。
posted on 2008-12-25 12:20
沖出銀河系 閱讀(2066)
評論(0) 編輯 收藏 所屬分類:
java