2009-03-11 16 views
11

Desidero utilizzare il tag fmt di JSTL in JavaScript per localizzare i miei messaggi di avviso. Il mio file JavaScript è un file standalone e quando includo il tag fmt in js, il file browser restituisce errori JavaScript. È possibile trattare il file .js come file .jsp utilizzando la configurazione web.xml? Qualcuno può suggerire per favore come posso farlo?Utilizzo del codice JSP in JavaScript

risposta

3

Si potrebbe fare quanto segue. Memorizzi il messaggio tradotto in una variabile che può essere risolta in un secondo momento in JSP.

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

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

Ciò richiede che si in linea tutto il vostro javascript. Il javascript dovrebbe essere davvero separato nel proprio file, per la memorizzazione nella cache del browser, una manutenzione più semplice, il riutilizzo attraverso le pagine e per consentire la compressione. – Magnar

+0

Quindi rendere il file javascript qualificato come JSP modificando il file web.xml predefinito. Quindi il file JS è entrambi, javascript AND JSP. L'estensione del file è semplicemente questa, un'estensione. Usa quello che vuoi. Funziona alla grande anche con i file CSS. –

1

Non è possibile utilizzare i tag in JavaScript, ma c'è una soluzione: mettere il tag in un nascosto DIV (<div style="display: none;" id="msg"><fmt:...>

Ora è possibile utilizzare JS per cercare il DIV dal suo ID e ottenere il innerHTML.

detto questo, fmt è solo un wrapper per funzioni i18n di Java, che è possibile utilizzare direttamente tra <% %>.

4

si dovrebbe cercare di mantenere il vostro javascript codice in un file separato dal codice jsp. Ciò serve a ottenere il caching del browser, una manutenzione più semplice, il riutilizzo delle pagine e la compressione.

Ti suggerisco di creare un oggetto globale per il testo nel jsp, che verrà utilizzato dai file javascript. Come questo:

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

Più tardi lo si utilizza in Javascript:

alert(text.this_page_name.required_field_error); 
4

Se il javascript è 'in linea' con il resto della pagina JSP, quindi è sufficiente utilizzare la tecnica suggerita da Kees de Kooter .

Se il tuo javascript deve essere in un file esterno (per la condivisione su pagine, per esempio), quindi semplicemente metterlo nel proprio file 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 includerlo come questo ...

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

È quindi possibile fare riferimento a 'someMessage' e 'anotherMessage' all'interno del file che include il JSP, o da qualsiasi file JavaScript che è incluso dopo 'yourScript.jsp.

Nota l'uso dell'attributo contentType - 'text/javascript' impedisce al parser JSP di lamentarsi del fatto che l'output non è ben formato XML - e che la tage fa riferimento a un file JSP.

Una combinazione di questa tecnica e quella suggerita da @Magner dovrebbe portare a una soluzione ragionevole.

MODIFICA: Modificato l'esempio per utilizzare 'text/javascript' come 'text/plain' - grazie a @bobince per avermi fatto capire questo errore (Anche se 'text/plain' funziona, è più corretto usare ' text/javascript '). Inoltre, se il numero di stringhe che devono essere internazionalizzate è piccolo, e/o puoi giustificare avere le tue "risorse" in più di un posto - uno per il lato server e un altro per il lato client roba - la tecnica di @ bobince di l'uso di include dinamici è buono.

19

è possibile trattare il file .js come file .jsp utilizzando la configurazione 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> 

Ma, non v'è alcun vantaggio reale in questo modo, perché i file JavaScript non devono avere gli URL che terminano in ‘js’. Ciò che determina se un file è un file JavaScript è il tipo di supporto MIME utilizzato. È possibile impostare questo da JSP utilizzando:

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

nella parte superiore. Poi si può collegare direttamente a:

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

(A parte: nei browser attuali, gli script legati a con lo script <> tag funzionerà anche senza avere il Content-Type impostato correttamente, ma che non è probabilmente qualcosa a che fare affidamento su .)

voglio usare tag fmt di JSTL in javascript

Questo non è probabilmente una buona idea. Il tag fmt si occupa dell'escape HTML per i caratteri, ma ciò che si desidera è l'escape letterale stringa JavaScript, ad esempio per i caratteri di virgoletta con escape backslash. JSTL non fornisce questa funzionalità. I caratteri "& amp;" visualizzati in modo imprevisto vengono visualizzati nelle stringhe JavaScript e l'uso di apostrofo o virgolette nei messaggi interromperà l'intero script.

Inoltre, l'offerta di script inclusi di comune da JSP rischia di prestazioni e cacheing scadenti.

Suggerirei un sistema di ricerca lingua indipendente in JavaScript. Ad esempio, includere uno script esterno per-lingua:

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

(cambiando 'it' per indicare qualsiasi lingua che si desidera), e in quel file definire un riferimento come:

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

Poi guardare in alto msg.messageName per ogni stringa localizzabile nello script.

+0

grazie per la spiegazione. Viene pubblicato mentre è tornato, mi chiedo se posso chiedere come caricare il file js della lingua specifica nel jsp? Ad esempio, se ottengo le impostazioni internazionali e vorrei caricare solo i file js corrispondenti nel file jsp in modo che l'oggetto msg possa essere utilizzato in un altro file javascript? lang_xx.js potrebbe essere lang_en.js o lang_fr.js lannyf

+0

Vuoi dire ' quindi nella seguente sezione di script:

Problemi correlati