在有Struts部署的Java EE環境中,我們一般把jsp頁面寫在WebRoot\WEB-INF\content 目錄下,這樣使得jsp頁面一定需要struts的控制轉發才可訪問,提高頁面安全性。
但是今天在jsp頁面中應用WebRoot目錄中的css,js文件發現十分困難,先看看我的文件結構:
目標是在index.jsp中訪問default.css。
defautl.css是在index.jsp目錄的父目錄的父目錄的CSS目錄下。所以我這樣寫:
ps:空格為故意添加,不知為何會自動變成博客園的網址
<link href="../ ../css/default.css" rel="stylesheet" type="text/css"/>
<link href="../ ../css/uploadify.css" rel="stylesheet" type="text/css"/>
在Eclipes中也出現超鏈接提示,說明目錄正確,但是結果失敗。
查詢資料后,在百度百科中看到:
http://baike.baidu.com/view/1745468.htm
TomCat 服務器下的WEB-INF文件夾是一個非常安全的文件,在頁面中不能直接訪問其中的文件,必須通過web.xml文件對要訪問的文件進行相應映射才能訪問。
從上面的實驗可以看出,不但是直接訪問,使用" ../ ../ "之類的間接訪問也不能成功。
在此多方查詢資料之后,嘗試使用如下方法訪問:
1 <!-- 輸出為項目根目錄,即WebRoot -->
2 <%String path = request.getContextPath(); %>
3 <link href="${path}/css/default.css" rel="stylesheet" type="text/css"/>
4 <link href="${path}/css/uploadify.css" rel="stylesheet" type="text/css"/>
原理很簡單,變量path值為項目根目錄,而css就是此目錄的子目錄,自然可以訪問。
可惜結果還是錯,思考之,el表達式的${}是以page,request,session,application的順序尋找匹配的項,而path並不在這個范圍之內,也許在java腳本中直接定義的對象是局部作用域,而不是page作用域?可惜百度之后難以找到相關資料,不過結論應該是沒錯的。
既然EL表達式無法取出,那么java腳本應該可以達到目的吧?嘗試如下:
1 <%String path = request.getContextPath(); %>
2 <link href="<%=path %>/css/default.css" rel="stylesheet" type="text/css"/>
3 <link href="<%=path %>/css/uploadify.css" rel="stylesheet" type="text/css"/>
果不其然,頁面成功讀出了css文件中的樣式,達到目的。不過此頁面中存在java腳本,不夠規范,查詢資料后,用以下純EL表達式實現:
1 <c:set value="${pageContext.request.contextPath}" var="path" scope="page"/>
2 <link href="${path}/css/default.css" rel="stylesheet" type="text/css"/>
3 <link href="${path}/css/uploadify.css" rel="stylesheet" type="text/css"/>
先將ContextPath放如page中,再使用el表達式取出,問題得以解決。
在查詢資料的過程中,發現如下問題:
WEB-INF目錄下加載CSS和JS問題?????
http://topic.csdn.net/u/20100420/14/c4efb68c-ca03-46b9-8277-126bd1290ebe.html
此問題中,CSS和JS也在WEB-INF下,多方試驗后我還是沒能解決,望高手解答。
參考資料:
百度百科
http://baike.baidu.com/view/1745468.htm
http://blog.csdn.net/qwerasdf123/article/details/4189889
ITEYE問答
http://www.iteye.com/problems/37087
百度知道