2

从 servlet,我将请求转发到呈现 FusionChart 的 JSP 页面。但是我在加载图表时遇到了问题。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"

但没有运气。

与转发的请求有关吗?

4

3 回答 3

8

您不能在其中包含.js(或 .swf、.jpg 等)文件WEB-INF- 它们不可公开访问。
将其移至/js/

没有理由在WEB-INF. 如果你坚持这一点,你应该创建一个 servlet,给定 js/css 的名称,从它的位置读取它并将其作为响应。这是您访问静态资源时默认 servlet 所做的事情。

页面加载的流程如下:浏览器向servlet发送请求;servlet 在内部转发给 JSP,并将 JSP 呈现为响应;然后浏览器解析<script>标签并向脚本发出另一个请求。如果无法通过 URL 访问脚本,则不会加载它。

然后,要将脚本 url 固定到 servlet 上下文根,请使用

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

无论当前 url 是什么,这都会起作用

于 2010-09-30T13:46:37.233 回答
0

不是您的问题的原因,但还要注意您的<script>元素不正确。应该是<script type="text/javascript"...

(我试图将此作为评论发布,但由于某种原因它不会让我这样做。)

于 2010-09-30T14:13:34.630 回答
0

我面临同样的问题。在我的情况下,当我直接调用 myFile.jsp 时,它会读取 myFile.js;

但是当通过 login-> myFile.jsp 调用时,它没有读取 myFile.js;

通过Developer tools :=> 控制台分析路径后,我发现它插入了 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 ==> 它从任何地方被调用。

希望对您有所帮助。

于 2016-03-01T09:10:36.490 回答