2010-09-30 22 views
1

A partir d'une servlet, je suis en transmettant la requête à une page JSP qui rend un FusionChart. Mais j'ai un problème pour charger le graphique. Le fichier JSP ne détecte pas le fichier JavaScript. La structure du dossier est:JSP ne détecte pas le fichier javascript

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

Et le code 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> 

Le code Servlet pour transmettre la demande:

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

La demande est obtenir transmis à la JSP. Mais le tableau ne s'affiche parce qu'il est incapable de comprendre ce que FusionCharts est dans la ligne

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

J'ai essayé

src="/FusionCharts.js" 

src="FusionCharts.js" 

mais pas de chance.

Cela a-t-il quelque chose à voir avec la demande transmise?

Répondre

7

Vous ne pouvez pas avoir les fichiers .js (ou .swf, .jpg, etc.) dans WEB-INF - ils ne sont pas accessibles au public.
Déplacer à /js/

Il n'y a aucune raison de cacher des ressources statiques (comme les scripts et css) dans WEB-INF. Si vous insistez sur ce point, vous devriez créer une servlet qui, étant donné le nom de js/css, la lira depuis son emplacement et servira de réponse. C'est ce que fait le servlet par défaut lorsque vous accédez à des ressources statiques.

Le déroulement du chargement de la page est le suivant: le navigateur envoie une requête au servlet; le servlet transmet en interne à la JSP, et le JSP est rendu en réponse; Ensuite, le navigateur analyse la balise <script> et envoie une autre requête au script. Si le script n'est pas accessible via l'URL, il n'est pas chargé.

Ensuite, pour faire l'url de script fixe à la racine du contexte de servlet, utilisez

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

Cela fonctionnera indépendamment de ce qui est l'URL actuelle

+1

Il convient également de noter que le fichier Line.swf ne sera pas non plus accessible. Comme le fichier javascript, il doit être retiré du dossier WEB-INF. –

+0

J'ai déplacé le fichier .js sur WEB-INF. Mais toujours pas de chance. Cela a fonctionné quand j'ai déplacé le fichier JSP trop hors de WEB-INF. Tous les trois fichiers (.js, .jsp, .swf) j'ai placé "WebContent/FusionCharts /" et cela a fonctionné. Est-ce OK si je place un fichier JSP en dehors de WEB-INF? – HanuAthena

+0

@HanuAthena voir la mise à jour – Bozho

0

pas la cause de votre problème, mais aussi noter que votre élément <script> est incorrect. Il devrait être <script type="text/javascript"....

(j'ai essayé de poster cela comme un commentaire, mais pour une raison quelconque, il ne me laisserait pas.)

+0

Je l'ai corrigé. – HanuAthena

+0

En HTML5, le 'type' attribue ** par défaut ** à' text/javascript'. Donc, si vous utilisez un doctype HTML5, vous pouvez l'omettre en toute sécurité (même alors, en HTML4, le validateur w3c serait le seul qui jerks, il aurait * travaillé * dans tous les navigateurs de IE6 et on). – BalusC

0

je faisais face même question. Dans mon cas, lorsque j'appelle myFile.jsp directement sa lecture du fichier myFile.js; Mais lors de l'appel via login-> myFile.jsp, il ne lit pas myFile.js;

Après avoir analysé le chemin à travers le Outils de développement: => console, j'ai trouvé que son insertion de l'uri, chemin final était incorrect.

Solution finale:

j'avais utilisé le chemin absolu pour tous les .js et .css. Maintenant, il est appelé de partout.

Ma structure du projet est:

Dans mon servlet-context.xml

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

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

Mon ancien chemin pour inclure .js était: /resources/MyJs/myfile.js ===> Ce n'est pas appelé parfois.

Mon chemin absolu, qui s'appelle de tous les lieux est comme ceci:

/SHweb/resources/MyJs/myfile.js ==> Son s'appelle de partout.

J'espère que cela vous aidera.