Я хочу использовать тег fmt JSTL в JavaScript, чтобы локализовать мои сообщения оповещений. Мой файл JavaScript является автономным файлом, и когда я включаю тег fmt в js, файловый браузер дает ошибки JavaScript. Можно ли обрабатывать файл .js
как файлы .jsp
с использованием конфигурации web.xml? Может кто-нибудь предложить, как я могу это сделать?Использование JSP-кода в JavaScript
ответ
Вы могли бы сделать следующее. Вы сохраняете переведенное сообщение в переменной, которая может быть разрешена позже в JSP.
<fmt:message key="your.alert" var="theAlert"/>
<script type="text/javascript">
alert("${theAlert}");
</script>
Вы не можете использовать тег в JavaScript, но есть обходной путь: Поместите тег в скрытый DIV
(<div style="display: none;" id="msg"><fmt:...>
Теперь вы можете использовать JS для поиска DIV
его ID и получить innerHTML
.
это говорит, FMT является просто оболочкой для функций i18n Java, который можно использовать непосредственно между <% %>
.
вы должны стремиться держать 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);
Если ваш браузер «инлайн» с остальной частью вашей страницы JSP, а затем просто использовать метод, предложенный Kees де 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 использование динамических включений является хорошим.
можно ли обрабатывать файл .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 правильно установить, но это, вероятно, не то, чтобы полагаться на .)
Я хочу использовать FMT тег JSTL в JavaScript
Это, вероятно, не является хорошей идеей. Тег fmt имеет дело с HTML-экранированием для символов, но то, что вы хотите, - это строковое литералирование строки JavaScript, например, символы кавычек-escape-кавычек. JSTL не предоставляет эту возможность. Вы получите неожиданно сбежавшие символы «& amp;», отображаемые в ваших строках JavaScript, а использование апострофы или двойной кавычки в сообщениях приведет к поломке всего скрипта.
Кроме того, обслуживание стандартных сценариев от JSP приводит к снижению производительности и кэшированию.
Я бы предложил независимую систему поиска языков в JavaScript. Так, например, включать в-языке внешний скрипт:
<script type="text/javascript" src="/script/lang/en.js"></script>
(изменяющийся «ан», чтобы соответствовать какой язык вы хотите), и в этом файле определяют поиск, как:
var msg= {
messageName: 'Message in English',
...
};
Тогда посмотрите msg.messageName
для каждой локализуемой строки в скрипте.
спасибо за объяснение. Он отправлен обратно, интересно, могу ли я спросить, как загрузить конкретный файл js jsp в jsp? то есть, если я получу локаль и хотел бы загружать только соответствующие js в файл jsp, чтобы объект msg можно было использовать в другом файле javascript? lang_xx.js может быть lang_en.js или lang_fr.js – lannyf
Вы имеете в виду '. js ">'? – bobince
спасибо bobince. будет ли это работать: в одном более раннем блоке скрипта выполните: , а затем в следующем разделе сценария: . js ">. Я не уверен в JSP, как передать var, определенный в другом блоке сценария, если в некоторых случаях это необходимо. – lannyf
Я предлагаю вам написать сервлет, который генерирует массив или объект javascript, который содержит всю локализованную информацию, которую вы желаете. Вы можете использовать пакеты ресурсов Java, которые могут совместно использоваться как на стороне клиента, так и на стороне сервера, тогда вам не нужно смешивать JSP-код и Javascript-код, и ответ сервлета будет кэшироваться браузером.
Создайте сервлет, сопоставьте его с дорожкой, попросите его прочитать локаль из параметра запроса, а затем сгенерируйте код Javascript.
Используйте строку <script src="/mydict?lang=en"></script>
затем загрузить вам скрипт после <script src="/myscript.js"></script>
Это приятное решение, должно быть выше. –
Если вы собираетесь только оповещением просто использовать этот тег в вашем JavaScript
Предположим, что вы следующий в вашем Javascript:
alert("Confirm Deletion");
Это может быть интернационализировано добавлением тега bean:message
в ваш javascript
alert('<bean:message key="msg.confirm"/>');
и добавьте key
значения в файле свойства
msg.delete=Confirm Deletion
Это требует, чтобы вы инлайн всех ваших JavaScript. Javascript действительно должен быть разделен в собственном файле, для кеширования браузера, упрощения обслуживания, повторного использования на разных страницах и для обеспечения сжатия. – Magnar
Затем сделайте файл javascript квалифицированным как JSP, настроив ваш файл web.xml по умолчанию. Тогда JS-файл - это как javascript, так и JSP. Расширение файла - это просто расширение. Используйте все, что захотите. Отлично работает с файлами CSS. –