2010-03-30 9 views
38

¿Hay una manera de tener Expression Language (EL) expresiones incluidos archivos JavaScript ser evaluados por JSF?Mezcla JSF EL en un archivo JavaScript

tenía la esperanza de que la costura podría tener una forma de evitar esto, pero sin suerte hasta ahora. Todo lo que quiero es poder utilizar mensajes localizados en mis funciones de JavaScript que se comparten en todas las páginas.

+1

favor Publica un ejemplo de una función de JavaScript. – lexicore

Respuesta

59

Cinco maneras:

  1. declarará como variable global en la página JSF padres.

    <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> 
    

    O, si ya está en formato JSON.

    <script type="text/javascript" src="script.js"></script> 
    <script type="text/javascript">var messages = #{bean.messagesAsJson};</script> 
    
  2. poner todo el <script> en un archivo XHTML y utilizar ui:include para incluirlo.

    <script type="text/javascript" src="script.js"></script> 
    <ui:include src="script-variables.xhtml" /> 
    
  3. Pass *.js a través de la JspServlet (sólo si es suficiente para evaluar solamente las expresiones ${}). P.ej. en web.xml (el <servlet-name> de JspServlet se pueden encontrar en web.xml del servletcontainer en cuestión, por lo general es jsp).

    <servlet-mapping> 
        <servlet-name>jsp</servlet-name> 
        <url-pattern>*.js</url-pattern> 
    </servlet-mapping> 
    
  4. Utilice el "viejo" JSP con un tipo de contenido modificado. Cambiar el nombre de script.js a script.jsp y añadir la siguiente línea al principio de la JSP (sólo si es suficiente para evaluar solamente las expresiones ${}):

    <%@page contentType="text/javascript" %> 
    
  5. Vamos JS obtener los datos ajaxically durante la carga. Aquí hay un ejemplo de orientación jQuery.

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

Podría agregar que el primero es el más fácil. Deje que Facelets lo maneje por usted. –

+1

Gracias usé el primero. – user283680

+0

Gracias. No sabía que podía usar '' dentro de un bloque '

2

Dado que no me gusta técnicas que no permitirá que el caché del navegador de la cadenas localizadas, que utilizó la siguiente técnica para localizar alerta JavaScript, etc. Parece una buena opción si las cadenas que que necesita en su código JavaScript son diferentes de las que necesita el servidor web:

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

entonces asignar los recursos JsFwStrings cuerda al nombre de archivo del archivo JavaScript que define las cadenas localizadas para el idioma dado.

Por ejemplo, el archivo contiene fw_en.properties la entrada JsFwStrings = JsFwStrings_en.js

y el archivo contiene JsFwStrings_en.js

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