2009-03-11 14 views
11

Je souhaite utiliser la balise fmt de JSTL en JavaScript pour localiser mes messages d'alerte. Mon fichier JavaScript est un fichier autonome et lorsque j'inclus fmt tag dans js, l'explorateur de fichiers donne des erreurs JavaScript. Est-il possible de traiter le fichier .js en tant que fichiers .jsp en utilisant la configuration web.xml? Quelqu'un peut-il suggérer comment je peux faire cela?Utilisation du code JSP en JavaScript

Répondre

3

Vous pouvez effectuer les opérations suivantes. Vous stockez le message traduit dans une variable qui peut être résolue plus tard dans la JSP.

<fmt:message key="your.alert" var="theAlert"/> 

<script type="text/javascript"> 
alert("${theAlert}"); 
</script> 
+0

Cela exige que vous en ligne tout votre javascript. Le javascript devrait vraiment être séparé dans son propre fichier, pour la mise en cache du navigateur, une maintenance plus facile, une réutilisation sur plusieurs pages et pour permettre la compression. – Magnar

+0

Ensuite, faites en sorte que le fichier javascript soit considéré comme JSP en modifiant votre fichier web.xml par défaut. Ensuite, le fichier JS est à la fois, javascript et JSP. L'extension de fichier est simplement cela, une extension. Utilisez ce que vous voulez. Fonctionne très bien avec les fichiers CSS. –

1

Vous ne pouvez pas utiliser des balises en JavaScript, mais il existe une solution: mettre le tag dans un DIV caché (<div style="display: none;" id="msg"><fmt:...>

Maintenant, vous pouvez utiliser JS pour rechercher le DIV par son ID et obtenir le innerHTML.

Cela dit, fmt est juste un wrapper pour les fonctions i18n de Java que vous pouvez utiliser directement entre <% %>.

4

vous devez vous efforcer de garder votre javascript code dans un fichier séparé du code jsp. Ceci permet d'obtenir une mise en cache du navigateur, une maintenance plus facile, une réutilisation sur plusieurs pages et d'autoriser la compression.

Je vous suggère de créer un objet global pour le texte dans le fichier jsp, qui sera utilisé par vos fichiers javascript. Comme ceci:

<script> 
    var text = text || {}; // play well with other jsps on the page 
    text.this_page_name = { 
     required_field_error: "<fmt:message key="required.field.error"/>", 
     system_error: "<fmt:message key="system.error"/>" 
    }; 
</script> 

Plus tard, vous l'utilisez dans votre javascript:

alert(text.this_page_name.required_field_error); 
4

Si votre javascript est 'en ligne' avec le reste de votre page JSP, puis il suffit d'utiliser la technique proposée par Kees de Kooter .

Si votre javascript doit être dans un fichier externe (pour un partage sur plusieurs pages, par exemple), placez-le simplement dans son propre fichier JSP.

<%@page contentType="text/javascript" %> 
<fmt:message key="some.message" var="someMessage"/>" 
<fmt:message key="another.message" var="anotherMessage"/>" 
var someMessage = "${someMessage}" 
var anotherMessage = "${anotherMessage}"/>" 

et l'inclure comme ça ...

 <script src="yourScript.jsp" language="JavaScript" type="text/javascript"></script> 

Vous pouvez alors se référer à « someMessage » et « anotherMessage » à partir du fichier qui inclut le JSP, ou de tout fichier javascript qui est inclus après 'yourScript.jsp. Notez que l'utilisation de l'attribut contentType - 'text/javascript' empêche l'analyseur JSP de se plaindre que la sortie n'est pas bien formée XML - et que le tage fait référence à un fichier JSP.

Une combinaison de cette technique et celle suggérée par @Magner devrait vous apporter une solution raisonnable.

EDIT: Changé l'exemple pour utiliser 'text/javascript' de 'text/plain' - merci à @bobince pour m'avoir fait réaliser cette erreur (même si 'text/plain' fonctionne, c'est plus correct à utiliser ' text/javascript '). Aussi, si le nombre de chaînes qui doivent être internationalisées est petit, et/ou vous pouvez justifier avoir vos «ressources» dans plus d'un endroit - un pour les trucs côté serveur et un autre pour les trucs côté client - la technique de Bobince @ L'utilisation d'inclusions dynamiques est une bonne chose.

19

Est-il possible de traiter le fichier .js comme fichier .jsp en utilisant la configuration web.xml?

Oui:

<servlet> 
    <servlet-name>scriptjsp</servlet-name> 
    <jsp-file>/script.jsp</jsp-file> 
</servlet> 
<servlet-mapping> 
    <servlet-name>scriptjsp</servlet-name> 
    <url-pattern>/script.js</url-pattern> 
</servlet-mapping> 

Mais, il n'y a aucun avantage réel à faire cela, parce que les fichiers JavaScript ne doivent pas avoir des URL se terminant par « .js ». Ce qui détermine si un fichier est un fichier JavaScript est le type de média MIME utilisé. Vous pouvez définir ceci à partir de JSP en utilisant:

<%@ page contentType="text/javascript" %> 

en haut. Ensuite, vous pouvez accéder directement à:

<script type="text/javascript" src="/script.jsp"></script> 

(En plus: dans les navigateurs actuels, les scripts liés à la balise de script <> fonctionnera même sans avoir le type de contenu bien défini, mais c'est probablement pas quelque chose à compter sur .)

Je veux utiliser la balise fmt de JSTL en javascript

Ceci est probablement pas une bonne idée. La balise fmt traite de l'échappement HTML pour les caractères, mais ce que vous voulez, c'est l'échappement de la chaîne de caractères JavaScript, par exemple pour éviter les caractères de guillemets. JSTL ne fournit pas cette fonctionnalité. Vous obtiendrez des caractères '& ampli' inattendus; les caractères apparaissant dans vos chaînes JavaScript, et l'utilisation d'une apostrophe ou d'une double citation dans les messages briseront l'ensemble du script. De plus, la prise en charge des scripts généralement inclus dans JSP risque de compromettre les performances et la mise en cache.

Je suggère un système de recherche de langue indépendant en JavaScript. Par exemple, inclure un script externe par langue:

var msg= { 
    messageName: 'Message in English', 
    ... 
}; 

Puis rechercher: et dans ce fichier définir une recherche comme

<script type="text/javascript" src="/script/lang/en.js"></script> 

(vous voulez changer « en » pour correspondre selon la langue) msg.messageName pour chaque chaîne localisable dans le script.

+0

merci pour l'explication. Il est posté en arrière, je me demande si je peux demander comment charger le fichier js de la langue spécifique dans le jsp? c'est-à-dire si j'obtiens les paramètres régionaux et que je souhaite charger uniquement les js correspondants dans le fichier jsp afin que l'objet msg puisse être utilisé dans un autre fichier javascript? lang_xx.js pourrait être lang_en.js ou lang_fr.js lannyf

+0

Vous voulez dire puis dans la section de script suivante:

Questions connexes