2010-09-30 72 views
1

從一個servlet,我將轉發請求到一個呈現FusionChart的JSP頁面。 但我在加載圖表時遇到問題。 JSP文件未檢測到JavaScript文件。文件夾結構是:JSP未檢測到javascript文件

axis 
| 
WebContent 
     | 
    WEB-INF 
     | 
     classes 
     |_ com 
     |_FusionCharts.js 
     |_MyChartJsp.jsp 
     |_Line.swf 

而JSP代碼:

<html> 
<head> 
<script language="text/javascript" src="/WEB-INF/classes/FusionCharts.js"></script> 
</head> 
<body bgcolor="#ffffff"> 
<div id="chartdiv" align="left">The chart will appear within 
this DIV. This text will be replaced by the chart.</div> 
<script type="text/javascript"> 

var foo = //value fetched from DAO 
var myChart = new FusionCharts("/WEB-INF/classes/Line.swf", 
      "myChartId", "1000", "500"); 

    myChart 
      .setDataXML("<graph caption='aCaption' xAxisName='xAxis' yAxisName='yAxis' showNames='1' decimalPrecision='0' formatNumberScale='0'>"+foo+"</graph>"); 
    myChart.render("chartdiv"); 
</script> 

</body> 
</html> 

servlet代碼將所述請求轉發:

final RequestDispatcher requestDispatcher = request.getRequestDispatcher("/WEB-INF/classes/MyChartJsp.jsp"); 
requestDispatcher.forward(request, response); 

的要求越來越轉發到JSP。但沒有得到顯示在圖表,因爲它無法找出FusionCharts是在該行

var myChart = new FusionCharts("/WEB-INF/classes/Line.swf", 
       "myChartId", "1000", "500"); 

我試圖

src="/FusionCharts.js" 

src="FusionCharts.js" 

,但沒有運氣。

它與請求被轉發有關嗎?

回答

7

WEB-INF中不能有.js(或.swf,.jpg等)文件 - 它們不可公開訪問。
將其移動到/js/

沒有理由在WEB-INF中隱藏靜態資源(如腳本和css)。如果你堅持這樣做,你應該製作一個servlet,它給出js/css的名稱,從它的位置讀取它並將其作爲響應。這是默認servlet在訪問靜態資源時執行的操作。

頁面加載流程如下:瀏覽器向servlet發送請求;該servlet內部轉發到JSP,並將JSP呈現爲響應;那麼瀏覽器會解析<script>標籤並向腳本發出另一個請求。如果腳本無法通過URL訪問,則不會加載。

然後,使固定在servlet上下文根腳本網址,使用

src="<c:url value="/js/script.js" />" 

不管是什麼當前URL

+1

還應該注意的是Line.swf文件也不可訪問。像JavaScript文件一樣,它應該從WEB-INF文件夾下移出。 – 2010-09-30 13:51:16

+0

我已將.js文件移出WEB-INF。但仍然沒有運氣。當我將JSP文件移出WEB-INF時,它確實有效。所有三個(.js,.jsp,.swf)文件我放在「WebContent/FusionCharts /」,它的工作。如果我將JSP文件放在WEB-INF之外,可以嗎? – HanuAthena 2010-09-30 14:51:49

+0

@HanuAthena查看更新 – Bozho 2010-09-30 15:01:49

0

不是你的問題的原因這是可行的,還要注意您的<script>元素不正確。它應該是<script type="text/javascript"...

(我試圖張貼此作爲一個評論,但由於某些原因,它不會讓我。)

+0

我已經糾正它。 – HanuAthena 2010-09-30 14:57:26

+0

在HTML5中,'type'屬性**默認**爲'text/javascript'。因此,如果您使用的是HTML5文檔類型,您可以放心地忽略它(即使如此,在HTML4中,w3c驗證程序將是唯一一個抽搐的程序;它將在IE6的所有瀏覽器中工作*)。 – BalusC 2010-09-30 15:03:18

0

我面臨同樣的問題。在我的情況下,當我直接調用myFile.jsp時,它讀取myFile.js;

但是,當通過login-> myFile.jsp進行調用時,它不會讀取myFile.js;

在分析了通過開發人員工具:=> console的路徑之後,我發現它插入了uri,所以最終路徑不正確。

最終解決方案:

我已經用於所有的.js和.css的絕對路徑。現在它來自世界各地。

我的項目結構是:

在我的servlet-context.xml的

i) <context:component-scan base-package="com.SBP.SHWeb" /> 

ii) <resources mapping="/resources/**" location="/resources/" /> 

我對其中的.js老路是:/resources/MyJs/myfile.js ===>它有時不叫。

我的絕對路徑,其中獲得來自所有地方調用是這樣的:

/SHweb/resources/MyJs/myfile.js ==>其獲得來自世界各地調用。

希望它能幫助你。