web-dev-qa-db-fra.com

Mélanger JSF EL dans un fichier JavaScript

Existe-t-il un moyen d'avoir Expression Language (EL) les fichiers JavaScript inclus soient évalués par JSF?

J'espérais que Seam pourrait avoir un moyen de contourner cela, mais pas de chance jusqu'à présent. Tout ce que je veux, c'est pouvoir utiliser des messages localisés dans mes fonctions JavaScript qui sont partagés sur plusieurs pages.

42
user283680

Cinq façons:

  1. Déclarez-le comme variable globale dans la page JSF parent.

    <script type="text/javascript" src="script.js"></script>
    <script type="text/javascript">
        var messages = [];
        <ui:repeat value="#{bean.messages}" var="message">
            messages['#{message.key}'] = '#{message.value}';
        </ui:repeat>
    </script>
    

    Ou, si c'est déjà au format JSON.

    <script type="text/javascript" src="script.js"></script>
    <script type="text/javascript">var messages = #{bean.messagesAsJson};</script>
    
  2. Mettez l'ensemble <script> dans un fichier XHTML et utilisez ui:include pour l'inclure.

    <script type="text/javascript" src="script.js"></script>
    <ui:include src="script-variables.xhtml" />
    
  3. Passer *.js à travers le JspServlet (uniquement s'il suffit d'évaluer uniquement le ${} expressions). Par exemple. dans web.xml (les <servlet-name> de JspServlet se trouve dans web.xml du conteneur de servlet en question, c'est généralement jsp).

    <servlet-mapping>
        <servlet-name>jsp</servlet-name>
        <url-pattern>*.js</url-pattern>
    </servlet-mapping>
    
  4. Utilisez le "bon vieux" JSP avec un type de contenu modifié. Renommer script.js à script.jsp et ajoutez la ligne suivante en haut de JSP (uniquement s'il suffit d'évaluer uniquement le ${} expressions):

    <%@page contentType="text/javascript" %>
    
  5. Laissez JS obtenir les données de façon ajaxiale pendant le chargement. Voici un exemple ciblé jQuery .

    $.getJSON('json/messages', function(messages) {
        $.each(messages, function(key, value) {
            $.messages[key] = value;
        });
    });
    
68
BalusC

Comme je n'aime pas les techniques qui ne permettent pas au navigateur de mettre en cache les chaînes localisées, j'ai utilisé la technique suivante pour localiser les alertes JavaScript, etc. Cela semble un bon choix si les chaînes dont vous avez besoin dans votre code JavaScript sont différentes de la ceux dont le serveur Web a besoin:

<h:head>
    <h:outputScript library="javascript" name="#{fw.JsFwStrings}" />
    ...

J'attribue ensuite la chaîne de ressources JsFwStrings au nom de fichier du fichier JavaScript définissant les chaînes localisées pour la langue donnée.

Par exemple, le fichier fw_en.properties contient l'entrée JsFwStrings = JsFwStrings_en.js

Et le fichier JsFwStrings_en.js contient

var TosFramework = TosFramework || {};
TosFramework.Strings = {
    UnSavedChangesWarning : 'You have unsaved changes.',
    CancelConfirmQuestion : 'Are you sure you want to cancel?'
}
3
timr