2010-09-30 65 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 ==>其获得来自世界各地调用。

希望它能帮助你。