2009-03-11 2 views
11

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

ответ

3

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

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

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

Это требует, чтобы вы инлайн всех ваших JavaScript. Javascript действительно должен быть разделен в собственном файле, для кеширования браузера, упрощения обслуживания, повторного использования на разных страницах и для обеспечения сжатия. – Magnar

+0

Затем сделайте файл javascript квалифицированным как JSP, настроив ваш файл web.xml по умолчанию. Тогда JS-файл - это как javascript, так и JSP. Расширение файла - это просто расширение. Используйте все, что захотите. Отлично работает с файлами CSS. –

1

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

Теперь вы можете использовать JS для поиска DIV его ID и получить innerHTML.

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

4

вы должны стремиться держать 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

Если ваш браузер «инлайн» с остальной частью вашей страницы 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 использование динамических включений является хорошим.

19

можно ли обрабатывать файл .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 для каждой локализуемой строки в скрипте.

+0

спасибо за объяснение. Он отправлен обратно, интересно, могу ли я спросить, как загрузить конкретный файл js jsp в jsp? то есть, если я получу локаль и хотел бы загружать только соответствующие js в файл jsp, чтобы объект msg можно было использовать в другом файле javascript? lang_xx.js может быть lang_en.js или lang_fr.js lannyf

+0

Вы имеете в виду ', а затем в следующем разделе сценария:

Смежные вопросы