2009-03-11 16 views
11

Quiero utilizar la etiqueta fmt de JSTL en JavaScript para localizar mis mensajes de alerta. Mi archivo JavaScript es un archivo independiente y cuando incluyo la etiqueta fmt en js, el buscador de archivos da errores de JavaScript. ¿Es posible tratar el archivo .js como archivos .jsp usando la configuración web.xml? ¿Alguien puede sugerir por favor cómo puedo hacer eso?Uso del código JSP en JavaScript

Respuesta

3

Puede hacer lo siguiente. Almacena el mensaje traducido en una variable que se puede resolver más adelante en el JSP.

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

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

Esto requiere que toda su línea de javascript. El javascript realmente debe estar separado en su propio archivo, para el almacenamiento en caché del navegador, mantenimiento más fácil, reutilización en todas las páginas y para permitir la compresión. – Magnar

+0

Luego, haga que el archivo javascript califique como JSP ajustando su archivo web.xml predeterminado. Entonces el archivo JS es ambos, JavaScript y JSP. La extensión del archivo es simplemente eso, una extensión. Usa lo que quieras Funciona muy bien con archivos CSS también. –

1

No puede utilizar etiquetas en JavaScript, pero hay una solución: poner la etiqueta en un oculto DIV (<div style="display: none;" id="msg"><fmt:...>

Ahora puede utilizar JS para buscar el DIV por su ID y obtener el . innerHTML

dicho esto, FMT es sólo un envoltorio para las funciones de i18n de Java que se puede utilizar directamente entre <% %>.

4

usted debe esforzarse para mantener su javascript código en un archivo separado del código jsp. Esto es para obtener el almacenamiento en caché del navegador, facilitar el mantenimiento, reutilizar en todas las páginas y permitir la compresión.

Sugiero que cree un objeto global para texto en el jsp, para ser utilizado por sus archivos javascript. De esta manera:

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

tarde que lo utilice en su javascript:

alert(text.this_page_name.required_field_error); 
4

Si el Javascript es 'en línea' con el resto de la página JSP, a continuación, sólo tiene que utilizar la técnica sugerida por Kees de Kooter .

Si su javascript necesita estar en un archivo externo (para compartir entre páginas, por ejemplo), simplemente colóquelo en su propio archivo 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}"/>" 

e incluirlo como esto ...

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

A continuación, puede referirse a 'someMessage' y 'anotherMessage' desde dentro del archivo que incluye la JSP, o de cualquier archivo javascript que es incluido después de 'yourScript.jsp.

Tenga en cuenta que el uso del atributo contentType - 'text/javascript' evita que el analizador JSP se queje de que el resultado no está bien formado XML - y que el tage se refiere a un archivo JSP.

Una combinación de esta técnica y la sugerida por @Magner debería brindarle una solución sensata.

EDIT: Cambié el ejemplo para usar 'text/javascript' inserta de 'text/plain' - gracias a @bobince por hacerme cargo de este error (Aunque 'text/plain' funciona, es más correcto usar ' texto/javascript '). Además, si el número de cadenas que se deben internacionalizar es pequeño, y/o puede justificar tener sus 'recursos' en más de un lugar, uno para el lado del servidor y otro para el lado del cliente, la técnica de @bobince usar Dynamic includes es bueno.

19

¿es posible tratar el archivo .js como archivo .jsp usando la configuración web.xml?

Sí:

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

embargo, no hay ninguna ventaja real en hacer esto, ya que los archivos de JavaScript no tiene que tener las URL que terminan en ‘js’. Lo que determina si un archivo es un archivo JavaScript es qué tipo de medio MIME se sirve. Puede configurar esto desde JSP usando:

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

en la parte superior. A continuación, puede vincular directamente a:

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

(Aparte: en los navegadores actuales, guiones vinculados con el guión <> etiqueta funcionará incluso sin tener el Content-Type configurado correctamente, pero eso no es probablemente algo que depender de .)

quiero usar la etiqueta de FMT JSTL en javascript

Esto probablemente no es una buena idea. La etiqueta fmt trata sobre el escape de HTML para caracteres, pero lo que usted quiere es un escape literal de cadena de JavaScript, por ejemplo, para caracteres de comillas invertidas-escape. JSTL no proporciona esta capacidad. Obtendrá caracteres '& amp;' inesperadamente escapados que aparecerán en sus cadenas de JavaScript, y el uso de apóstrofos o comillas dobles en los mensajes romperá todo el script.

Además, el servicio de scripts comúnmente incluidos de JSP puede reducir el rendimiento y el almacenamiento en caché.

Sugeriría un sistema de búsqueda de idiomas independiente en JavaScript. Por ejemplo, incluir un script externa per-idioma:

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

(cambiando 'es' para que coincida con el idioma que desee), y en ese archivo definir una búsqueda, tal como:

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

A continuación, busque msg.messageName para cada cadena localizable en el script.

+0

gracias por la explicación. Se publicó en la parte de atrás, ¿me pregunto si puedo preguntar cómo cargar el archivo js del idioma específico en el jsp? es decir, si obtengo la configuración regional y me gustaría cargar solo las js correspondientes en el archivo jsp para que el objeto msg pueda usarse en otro archivo javascript? lang_xx.js podría ser lang_en.js o lang_fr.js lannyf

+0

Quieres decir ' luego en la siguiente sección de scripts:

Cuestiones relacionadas