Использование кода JSP в JavaScript - PullRequest
12 голосов
/ 11 марта 2009

Я хочу использовать тег fmt JSTL в JavaScript для локализации моих предупреждающих сообщений. Мой файл JavaScript является отдельным файлом, и когда я включаю тег fmt в js, браузер файлов выдает ошибки JavaScript. Можно ли обработать файл .js как файл .jsp, используя конфигурацию web.xml? Кто-нибудь может подсказать, как мне это сделать?

Ответы [ 7 ]

20 голосов
/ 11 марта 2009

возможно ли рассматривать файл .js как файл .jsp с использованием конфигурации web.xml?

Да:

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

Но в этом нет никакого реального преимущества, поскольку файлы JavaScript не обязательно должны иметь URL-адреса, заканчивающиеся на «.js». Что определяет, является ли файл файлом JavaScript, так это тип носителя MIME, к которому он относится. Вы можете установить это из JSP используя:

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

наверху. Тогда вы можете связаться непосредственно с:

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

(Кроме того: в современных браузерах скрипты, связанные с тегом , будут работать даже без правильно установленного Content-Type, но, вероятно, на это нельзя полагаться.)

Я хочу использовать тег jstl fmt в javascript

Это, вероятно, не очень хорошая идея. Тег fmt имеет дело с экранированием HTML для символов, но вам нужен экранирование литерала строки JavaScript, например, для символов кавычки с обратной косой чертой. JSTL не предоставляет эту возможность. Вы получите неожиданно экранированные символы «& amp;», которые будут отображаться в ваших строках JavaScript, а использование апострофов или двойных кавычек в сообщениях нарушит весь сценарий.

Кроме того, обслуживание часто включаемых сценариев из JSP может снизить производительность и кеширование.

Я бы предложил независимую систему поиска языков в JavaScript. Например, включите внешний языковой сценарий:

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

(изменив 'en' в соответствии с тем языком, который вы хотите), и в этом файле определите поиск следующим образом:

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

Затем найдите msg.messageName для каждой локализуемой строки в скрипте.

5 голосов
/ 05 мая 2009

Я бы предложил вам написать сервлет, который генерирует массив или объект javascript, который содержит всю локализованную информацию, которую вы хотите. Вы можете использовать пакеты ресурсов Java, которые могут совместно использоваться как клиентской, так и серверной сторонами, тогда вам не нужно смешивать код JSP и код Javascript, и ответ сервлета будет кэшироваться браузером.

Создайте сервлет, сопоставьте его с путем, прочитайте локаль из параметра запроса и сгенерируйте код Javascript.

Используйте строку типа <script src="/mydict?lang=en"></script> затем загрузите ваш скрипт <script src="/myscript.js"></script>

5 голосов
/ 11 марта 2009

Если ваш javascript «встроен» в остальную часть вашей страницы JSP, просто используйте технику, предложенную Кисом де Кутером.

Если ваш javascript должен быть во внешнем файле (например, для совместного использования между страницами), просто поместите его в свой собственный файл 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}"/>"

И включи вот так ...

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

Затем вы можете ссылаться на «someMessage» и «anotherMessage» из файла, включающего JSP, или из любого файла javascript, включенного после «yourScript.jsp».

Обратите внимание, что использование атрибута contentType - 'text / javascript' не позволяет анализатору JSP жаловаться на то, что вывод не является правильно сформированным XML - и что tage ссылается на файл JSP.

Сочетание этого метода и предложенного @Magner должно привести к разумному решению.

РЕДАКТИРОВАТЬ: изменен пример использования «text / javascript» вставки «text / plain» - спасибо @bobince за то, что я понял эту ошибку (хотя «text / plain» работает, правильнее использовать «text») / JavaScript "). Кроме того, если число строк, которые необходимо интернационализировать, невелико и / или вы можете оправдать наличие своих «ресурсов» в более чем одном месте - одна для серверной части, а другая для клиентской - методика @ bobince: использование динамических включений - это хорошо.

4 голосов
/ 11 марта 2009

Вы должны стремиться хранить свой код javascript в отдельном файле от кода jsp. Это необходимо для кэширования браузера, упрощения обслуживания, повторного использования на страницах и для сжатия.

Я предлагаю вам создать глобальный объект для текста в jsp, который будет использоваться вашими файлами javascript. Как это:

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

Позже вы используете его в своем JavaScript:

alert(text.this_page_name.required_field_error);
3 голосов
/ 11 марта 2009

Вы можете сделать следующее. Переведенное сообщение хранится в переменной, которая может быть позже разрешена в JSP.

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

<script type="text/javascript">
alert("${theAlert}");
</script>
1 голос
/ 11 марта 2009

Вы не можете использовать теги в JavaScript, но есть обходной путь: поместите тег в скрытый DIV (<div style="display: none;" id="msg"><fmt:...>

Теперь вы можете использовать JS, чтобы найти DIV по его ID и получить innerHTML.

Тем не менее, fmt - это просто оболочка для функций Java i18n, которые вы можете использовать непосредственно между <% %>.

0 голосов
/ 14 марта 2014

Если вы собираетесь только для оповещения просто используйте этот тег в вашем JavaScript

Предположим, у вас есть следующее в вашем Javascript:

alert("Confirm Deletion"); 

Это может быть интернационализировано добавлением тега bean:message в ваш javascript

alert('<bean:message key="msg.confirm"/>');

и добавьте key значение в файл свойств

msg.delete=Confirm Deletion
...