Я хочу использовать тег fmt JSTL в JavaScript, чтобы локализовать мои сообщения оповещений.
Мой файл JavaScript является автономным файлом, и когда я включаю тег fmt в js, файловый браузер дает ошибки JavaScript. Можно ли обрабатывать файл .js
как .jsp
с помощью конфигурации web.xml?
Кто-нибудь может предложить, как я могу это сделать?
Использование JSP-кода в JavaScript
Ответ 1
Можно ли обрабатывать файл .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>
(Помимо этого: в текущих браузерах сценарии, связанные с тегом script > , будут работать даже без правильного набора Content-Type, но, вероятно, не на что полагаться.)
Я хочу использовать тег fmt JSTL в javascript
Это, вероятно, не очень хорошая идея. Тег fmt имеет дело с HTML-экранированием для символов, но то, что вы хотите, - это строковое литералирование строки JavaScript, например, символы кавычек-escape-кавычек. JSTL не предоставляет эту возможность. Вы получите неожиданно сбежавший '& символы, отображаемые в ваших строках JavaScript, а использование апострофы или двойной кавычки в сообщениях приведет к разрыву целых script.
Кроме того, обслуживание часто включенных скриптов из JSP приводит к низкой производительности и кэшированию.
Я бы предложил независимую систему поиска языков в JavaScript. Например, включите внешний язык script:
<script type="text/javascript" src="/script/lang/en.js"></script>
(изменение "en" для соответствия любому желаемому языку), и в этом файле определить поиск, например:
var msg= {
messageName: 'Message in English',
...
};
Затем найдите msg.messageName
для каждой локализуемой строки в script.
Ответ 2
Я бы предложил вам написать сервлет, который генерирует массив или объект javascript, который содержит всю локализованную информацию, которую вы желаете. Вы можете использовать пакеты ресурсов Java, которые могут совместно использоваться как на стороне клиента, так и на стороне сервера, тогда вам не нужно смешивать код JSP и код Javascript, а ответ сервлета будет кэшироваться браузером.
Создайте сервлет, сопоставьте его с контуром, попросите его прочитать локаль из параметра запроса, а затем сгенерируйте код Javascript.
Используйте строку типа <script src="/mydict?lang=en"></script>
затем загрузите script после <script src="/myscript.js"></script>
Ответ 3
Вам следует попытаться сохранить код 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);
Ответ 4
Если ваш javascript является "inline" с остальной частью вашей JSP-страницы, просто используйте технику, предложенную Kees de Kooter.
Если ваш 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 должна привести вас к разумному решению.
EDIT: изменил пример использования "text/javascript" insetad of "text/plain" - благодаря @bobince за то, что я понял эту ошибку (несмотря на то, что "text/plain" работает, правильнее использовать текст /JavaScript "). Кроме того, если количество строк, которые должны быть интернационализированы, невелико и/или вы можете оправдать наличие своих ресурсов в более чем одном месте - один для серверной части, а другой для клиентской стороны - метод @bobince использование динамических включений является хорошим.
Ответ 5
Вы можете сделать следующее. Вы сохраняете переведенное сообщение в переменной, которая может быть разрешена позже в JSP.
<fmt:message key="your.alert" var="theAlert"/>
<script type="text/javascript">
alert("${theAlert}");
</script>
Ответ 6
Вы не можете использовать теги в JavaScript, но есть обходной путь: поместите тег в скрытый DIV
(<div style="display: none;" id="msg"><fmt:...>
Теперь вы можете использовать JS для поиска DIV
по его идентификатору и получить innerHTML
.
Тем не менее, fmt является просто оболочкой для функций Java i18n, которые вы можете использовать непосредственно между <% %>
.
Ответ 7
Если вы отправляете только предупреждающие сообщения просто используйте этот тег в своем javascript
Предположим, что у вас есть следующее в вашем Javascript:
alert("Confirm Deletion");
Это может быть интернационализировано добавлением тега bean:message
в ваш javascript
alert('<bean:message key="msg.confirm"/>');
и добавить значение key
в файле свойств
msg.delete=Confirm Deletion