Java & javascript принципы и приемы взаимодействия


Содержание

Взаимодействие java и javascript в jsp файле

18.05.2013, 17:39

Взаимодействие JavaScript и Java Servlet
Здравствуйте! Скажите, пожалуйста, могу ли я получать содержимое едиторов текста JavaScript для.

Взаимодействие сервлета и jsp
Подскажите как передать данные из сервлета в jsp и как в jsp после этого извлечь.

Взаимодействие jsp и сервлет
Господа, есть косяк. Прошу разъяснить для понимания. Задание заключается в том, чтобы плавно.

JSP+localStorage javascript
Здравствуйте! Пытаюсь реализовать сохранение на стороне клиента элементов, которые.

Подключение файлов javascript на jsp-странице
Здравствуйте, пытаюсь подключить js файл в jsp, файл находится в src/main/resources/js/ .

20.05.2013, 12:04 2

У Вас нет понимания, что где выполняется.

ВЕСЬ код скриптлетов выполняется на стороне сервера в момент, когда генерируется страница. Страница сгенерировалась, ушла на сторону клиента. И вот только тут выполняется JavaScript. Так что у Вас всё закономерно, так и должно быть.

20.05.2013, 12:04

POST в jsp файле не отрабатывает
Такая проблема, при запуске приложения не отрабатывает POST и вот что выводит на странице. Maths.

Литература по Java и JSP
Проблема такая. Нужно шустро разобраться в Java и JSP. Может кто-нибудь посоветовать.

6 Взаимодействие с аплетами

Наверное, вы уже почувствовали, что сценарии JavaScript служат как бы цементом для связывания различных объектов, расположенных в документе HTML. Например, с помощью JavaScript вы можете обрабатывать данные, полученные из полей одной формы, и отображать результаты обработки в полях той же самой или другой формы.

Еще одна интересная возможность взаимодействия сценариев JavaScript с объектами документа HTML, которую мы рассмотрим в нашей книге, это связь сценариев и аплетов Java. Оказывается, из сценариев JavaScript вы можете обращаться к полям и методам аплетов Java.

Языку программирования Java мы посвятили 30 и 32 тома “Библиотеки системного программиста”, которые называются, соответственно, “Microsoft Visual J++. Создание приложений. Часть 1” и “Microsoft Visual J++. Создание приложений. Часть 2”. Перед тем как читать главу нашей книги “Взаимодействие с аплетами Java” мы рекомендуем вам ознакомиться с этими томами.

Встраивание аплета Java в документ HTML

Для того чтобы встроить аплет в документ HTML, вы должны воспользоваться оператором , например:

Перечислим допустимые параметры оператора :

Выравнивание окна аплета относительно окружающего его текста. Возможны следующие значения:

LEFT выравнивание влево относительно окружающего текста;

RIGHT выравнивание вправо относительно окружающего текста;

TOP выравнивание по верхней границе;

MIDDLE центрирование по вертикали;

BOTTOM выравнивание по нижней границе

С помощью этого параметра можно задать текст, который будет отображаться в окне аплета в том случае, если браузер не может работать с аплетами Java

Имя двоичного файла, содержащего код аплета. По умолчанию путь к этому файлу указывается относительно каталога с файлом HTML, куда встроен аплет. Такое поведение может быть изменено параметром CODEBASE

Базовый адрес URL аплета, то есть путь к каталогу, содержащему аплет

Начальная ширина окна аплета в пикселах

Начальная высота окна аплета в пикселах

Зазор слева и справа от окна аплета

Зазор сверху и снизу от окна аплета

Имя аплета. Оно может быть использовано другими аплетами, расположенными в одном и том же документе HTML, а также сценариями JavaScript

Здесь через параметр NAME оператора

передается имя параметра аплета, а через параметр VALUE — значение соответствующего параметра.

Вызов методов аплета Java из сценария JavaScript

Сценарий JavaScript может получить доступ к полям и методам аплетов, расположенных в документе HTML, адресуясь к аплетам как к элементам массива document.applets. Например, для доступа к первому аплету вы можете использовать строку document.applets[0]. Однако удобнее указывать имя аплета, заданное в параметре NAME оператора , например document.MyApplet.

В качестве примера покажем, как можно вызывать из сценария JavaScript методы аплета Rectangles, описанного нами в упомянутом выше 32 томе “Библиотеки системного программиста”. Этот аплет рисует в своем окне прямоугольники случайного размера, закрашенные случайным цветом.

Мы создали документ HTML, разместив в нем аплет Rectangles и форму с кнопками Start Animation и Stop Animation (рис. 6.1).

Рис. 6.1. Аплет Rectangles управляется кнопками с помощью сценария JavaScript

Сразу после загрузки документа в окне аплета запускается процесс анимации. Если нажать кнопку Stop Animation, рисование новых прямоугольников будет приостановлено. С помощью кнопки Start Animation можно возобновить процесс рисования.

Заметим, что если поместить курсор мыши в область окна аплета, анимация будет остановлена, а когда курсор мыши покинет пределы окна аплета — снова запущена. Однако такое поведение определяется самим аплетом и не имеет отношения к нашему сценарию JavaScript.

Исходный текст документа HTML, содержащий аплет и форму с кнопками, представлен в листинге 6.1.

Листинг 6.1. Файл chapter6/Rectangles/Rectangles.html

Когда пользователь нажимает на кнопку Start Animation, управление получает обработчик события onClick, определенный следующим образом:

Этот обработчик вызывает метод start, определенный в аплете Rectangles. Этот метод запускает анимацию в окне аплета, если она была остановлена.

Аналогично, обработчик события onClick кнопки Stop Animation вызывает метод stop, также определенный в аплете Rectangles и предназначенный для остановки анимации:

Исходный текст аплета Rectangles мы воспроизвели в листинге 6.2. Подробное описание этого аплета вы найдете в разделе “Приложение Rectangles” первой главы 32 тома “Библиотеки системного программиста”.

Листинг 6.2. Файл chapter6/Rectangles/Rectangles.java

Доступ к полям аплета Java из сценария JavaScript

В предыдущем примере сценарий JavaScript вызывал методы, определенные в аплете Java. В следующем примере сценарий будет обращаться к полю, определенному в главном классе аплета.

Заметим, что сценарию JavaScript доступны только те поля и методы аплета, определенные как public.

На рис. 6.2 показан внешний вид документа HTML, в котором расположен один аплет и форма с одним многострочным текстовым полем и одной кнопкой.

Рис. 6.2. Сценарий JavaScript вызывает получает информацию от аплета

В окне аплета, расположенном в верхней части документа, находится поле редактирования текста и кнопка с надписью “Получить строку”. Если набрать в поле редактирования любую текстовую строку и нажать эту кнопку, то введенная строка будет отображена в нижней части аплета после символа >. Такой аплет мы описали в 30 томе “Библиотеки системного программиста” в разделе “Приложение TxtField” пятой главы.

Если нажать кнопку “Get applet info and text”, то сценарий JavaScript извлечет из аплета введенную текстовую строку (она хранится в поле с именем str), а также получит описание аплета, вызвав метод getAppletInfo, определенный в нашем аплете.

Введенная строка и информация об аплете будет затем отображена сценарием в многострочном поле редактирования, как это показано на рис. 6.2.

Таким образом, наш сценарий обращается к полю и методу, определенным в аплете.

Исходный текст документа HTML вы найдете в листинге 6.3.

Листинг 6.3. Файл chapter6/TxtField/TxtField.html

Для кнопки, расположенной в форме с именем GetForm, мы определили обработчик события onClick:

Этот обработчик вызывает функцию getTextFromApplet, выполняющую взаимодействие с аплетом.

Функция getTextFromApplet обращается к аплету как к самому первому элементу массива document.applets[0]:

Здесь мы записываем в свойство value многострочного поля GetForm.Comment значение переменной str, к которому добавлен разделитель из символов “-“ и строка описания аплета, полученная от метода getAppletInfo.

Исходный текст аплета приведен в листинге 6.4.

Листинг 6.4. Файл chapter6/TxtField/TxtField.java

Этот текст воспроизведен нами с небольшими изменениями из 30 тома “Библиотеки системного программиста”. Изменения заключаются в том, что мы добавили к определению поля str ключевое слово public:

Это необходимо для того чтобы поле str было доступно из сценария JavaScript.

Динамическая загрузка аплетов Java

Еще одна полезная возможность, которая появляется у вас при использовании сценариев JavaScript, — это динамическая перезагрузка аплетов Java в документах HTML, созданных с использованием фреймов.

Идея динамической загрузки аплетов заключается в том, что сценарий JavaScript динамически создает документ HTML, в котором находится оператор . Передавая аплету в этом документе различные значения параметров с помощью оператора

, сценарий JavaScript может управлять его работой.

На рис. 6.3 мы показали документ HTML, состоящий из двух фреймов.

Рис. 6.3. Строка в окне аплета и ее шрифтовое оформление зависят от положения переключателей в левом фрейме

В левом фрейме находится форма с переключателями и кнопкой, а правой — аплет Java. Если включить один из переключателей с названиями шрифтов, а затем нажать кнопку, то в окне аплета появится название шрифта. Это название будет оформлено с применением шрифта, выбранного вами в левом фрейме.

Займемся описанием исходных текстов нашего документа HTML.

В файле Index.html (листинг 6.6) находится описание фреймов.

Листинг 6.6. Файл chapter6/FrameLoad/Index.html

Левый фрейм называется toc, а правый — mainpage.

Исходный текст документа для фрейма toc мы привели в листинге 6.6.

Листинг 6.6. Файл chapter6/FrameLoad/toc.html

Для работы с переключателями типа radio мы использовали уже знакомую вам методику. Обработчик события onClick проверяет, находится ли переключатель во включенном состоянии. Если это так, обработчик вызывает функцию chkRadio, передавая ей ссылку на форму и значение свойства value, соответствующее включенному переключателю.

Функция chkRadio сохраняет это значение в переменной szFont:

Каждый из переключателей имеет значение параметра VALUE, соответствующее названию одного из шрифтов, доступных аплетам Java. Поэтому переменная szFont хранит название шрифта, выбранного пользователем в левом фрейме.

Обработчик события onClick для кнопки, расположенной в левом фрейме, выглядит следующим образом:

Он устанавливает свойство location фрейма mainpage (то есть правого фрейма), присваивая ему адрес документа main.html. Исходный текст этого документа приведен в листинге 6.7.

Листинг 6.7. Файл chapter6/FrameLoad/main.html

Тело документа main.html содержит только сценарий JavaScript. Этот сценарий динамически создает строки оператора с параметрами Str1, Font1 и Type1.

Параметр Str1 задает текст, отображаемый в окне аплета. Наш сценарий использует для этого параметра название шрифта, выбранного пользователем в левом фрейме:

Параметр Font1 задает шрифт для текста, отображаемого в окне аплета. Этот параметр также задается с использованием названия шрифта, выбранного в левом фрейме:

И, наконец, третий параметр с именем Type1 задает тип шрифта — обычный, жирный или наклонный. В нашем случае всегда используется обычный шрифт.

Исходный текст аплета Java, использованного в нашем примере, приведен в листинге 6.8. Это упрощенный вариант алпета, описанного нами в 30 томе “Библиотеки системного программиста” в разделе “Приложение TextOut третьей главы.

Глава 14
LiveConnect. Обзор.

В этой главе рассматривается использование технологии LiveConnect для взаимодействия кодов, написанных на Java и JavaScript. Предполагается, что Вы уже знакомы с программированием на Java.

В главе имеются следующие разделы:

Дополнительно об использовании LiveConnect см. JavaScript technical notes на сайте DevEdge, а также ищите соответствующую информацию на сайтах mozilla.org и developer.netscape.com.

Что Такое LiveConnect?

LiveConnect даёт возможность подключать приложения серверного JavaScript к Java-компонентам и классам на сервере.

Вашему приложению JavaScript может понадобиться соединиться с кодом, написанным на других языках, таких как Java или C. Для подключения к Java-коду Вы используете функциональность LiveConnect. Для взаимодействия с кодом, написанным на других языках, у Вас есть несколько вариантов:

  • Вы можете обернуть/wrap Ваш код как Java-объект и использовать LiveConnect непосредственно.
  • Вы можете обернуть Ваш код как распределённый объект CORBA и использовать LiveConnect совместно с object request broker (ORB).
  • Вы можете напрямую включать внешние библиотеки в Ваше приложение.

В этой главе обсуждается использование LiveConnect для доступа к не-JavaScript коду из приложений JavaScript.

Наконец, LiveConnect даёт возможность объектам JavaScript Вашего приложения взаимодействовать с Java-объектами. Эти Java-объекты являются экземплярами классов в серверном CLASSPATH . Об установке CLASSPATH см. книгу Programmer’s Guide to Servlets . LiveConnect работает и с клиентским, и серверным JavaScript, но имеет для каждой среды разные возможности.

Предполагается, что Вы уже знакомы с программированием на Java. Об использовании Java с Netscape-серверами см. Enterprise Server 3.5.1/3.6: Notes for Java Programmers 1 . О LiveConnect см. DevEdge Library 2 .

Во всех доступных Java-классах Вы можете иметь доступ к статичным public-свойствам или методам или создавать экземпляры класса и получать доступ к public-свойствам и методам этих экземпляров. В отличие от клиентского, однако, Вы можете иметь доступ только к тем Java-объектам, которые были созданы Вашим приложением или другим приложением JavaScript, а затем сохранены как свойство объекта server .

Если Java-объект был создан серверным приложением, отличным от приложения на серверном JavaScript, Вы не можете иметь доступ к этому Java-объекту.
Например, Вы не можете получить доступ к Java-объекту, созданному WAI plug-in, расширением NSAPI или HTTP-аплетом.

Когда Вы вызываете метод Java-объекта, Вы можете передать объекты JavaScript в этот метод. Код Java может установить свойства и вызвать методы этих объектов JavaScript. Таким образом, Вы можете иметь и код JavaScript, вызывающий код Java, и код Java, вызывающий код JavaScript.

Код Java может иметь доступ к приложению JavaScript только таким способом. То есть Java-объект не может вызывать приложение JavaScript, если это приложение JavaScript (или другое приложение JavaScript) не имеет само доступа к соответствующему Java-объекту и не вызывает один из его методов.

Работа с Оболочками

В JavaScript wrapper\оболочка это объект типа данных целевого языка, который содержит в себе объект исходного языка. На стороне JavaScript Вы можете использовать объект-оболочку для доступа к методам и полям Java-объекта; вызывая метод или получая доступ к свойству в оболочке даёт в результате вызов Java-объекта. На стороне Java объекты JavaScript оборачиваются в экземпляры класса netscape.javascript.JSObject и передаются в Java.


Когда JavaScript-объект высылается в Java, машина выполнения создаёт Java-оболочку типа JSObject ; когда JSObject высылается из Java в JavaScript, машина выполнения разворачивает его в объект оригинального типа JavaScript. Класс JSObject предоставляет интерфейс для вызова методов JavaScript и проверки свойств JavaScript.

Взаимодействие JavaScript с Java

Когда Вы обращаетесь к пакету или классу Java или работаете с объектом или массивом Java, Вы используете один из специальных объектов LiveConnect. Доступ JavaScript к Java имеет место в объектах, резюме по которым дано в следующей таблице.

Таблица 14.1 Объекты LiveConnect

Обёрнутый/wrapped массив Java, доступ к которому выполняется в коде JavaScript.

Ссылка JavaScript на Java-класс.

Обёрнутый объект Java, доступ к которому выполняется в коде JavaScript.

Ссылка JavaScript на Java-пакет.

Поскольку Java является строго типизированным, а JavaScript -слабо типизированным языком, машина выполнения JavaScript конвертирует значения аргументов в соответствующие типы данных тех языков, которые Вы используете с LiveConnect. См. «Конвертация Типов Данных».

Иногда существование объекта LiveConnect прозрачно, поскольку Вы работаете с Java интуитивно. Например, Вы можете создать в Java String -объект и присвоить его переменной JavaScript myString с помощью оператора new в конструкторе Java таким образом:

В предыдущем примере переменная myString это JavaObject , потому что она содержит экземпляр Java String -объекта. Как JavaObject , myString имеет доступ к методам public-экземпляра java.lang.String и его суперкласса java.lang.Object . Эти методы Java доступны в JavaScript как методы JavaObject , и Вы можете вызывать их так:

Вы имеете доступ к конструкторам, полям и методам класса через тот же синтаксис, который используете в Java. Например, следующий код JavaScript использует свойства объекта request для создания нового экземпляра класса Bug и присвоения затем этого нового экземпляра переменной JavaScript bug . Поскольку Java-класс требует целочисленного значения для первого поля, этот код конвертирует строковое свойство объекта request к целому числу, перед тем как передать его конструктору.

Объект Packages

Если класс Java не является частью пакетов java , sun или netscape , Вы имеете к нему доступ через объект Packages . Например, корпорация Redwood использует пакет Java под названием redwood как контейнер различных Java-классов, которые ею реализованы. Для создания экземпляра класса HelloWorld в redwood Вы вводите конструктор класса:

Вы можете также получить доступ к классам в пакете по умолчанию (то есть классам, которые не указывают пакет явно). Например, если класс HelloWorld находится непосредственно в CLASSPATH , а не в пакете, Вы можете получить к нему доступ так:

Объекты LiveConnect java , sun и netscape являются сокращениями для обычно используемых пакетов Java. Например, можно записать так:

вместо более длинной версии:

По умолчанию директория $NSHOME\js\samples , где $NSHOME это директория, в которой установлен сервер, находится в CLASSPATH сервера. Вы можете поместить Ваш пакет в эту директорию. Альтернативно Вы можете поместить Ваши пакеты и классы Java в другую директорию. Если Вы это делаете, убедитесь, что директория находится в Вашем CLASSPATH .

Работа с Массивами Java

Если какой-нибудь метод Java создаёт массив и Вы обращаетесь к этому массиву в JavaScript, Вы работаете с JavaArray . Например, следующий код создаёт JavaArray x из 10 элементов типа int:

Подобно объекту JavaScript Array , JavaArray имеет свойство length , возвращающее количество элементов массива. В отличие от Array.length , JavaArray.length является свойством только для чтения/read-only, поскольку количество элементов в Java-массиве фиксируется в момент создания.

Ссылки на Пакеты и Классы

Простые ссылки на пакеты и классы Java из JavaScript создают объекты JavaPackage и JavaClass . В одном из предыдущих примеров о корпорации Redwood, например, обращение Packages.redwood это JavaPackage -объект. Аналогично обращение java.lang.String это JavaClass -объект.

В большинстве случаев Вам не нужно беспокоиться об объектах JavaPackage и JavaClass : Вы просто работаете с пакетами и классами Java, а LiveConnect прозрачно создаёт эти объекты.

JavaClass -объекты не конвертируются автоматически в экземпляры java.lang.Class при передаче их в качестве параметров Java-методам — Вы обязаны создать оболочку/wrapper вокруг экземпляра java.lang.Class . В следующем примере метод forName создаёт объект-оболочку theClass , который затем передаётся методу newInstance для создания нового массива.

Аргументы Типа char

Вы не можете передать односимвольную строку Java-методу, требующему аргумента типа char . Вы обязаны передать таким методам целое число, соответствующее значению Unicode для данного символа. Например, следующий код присваивает значение «H» переменной c :

Пример JavaScript-Вызова Java

Директория $NSHOME\js\samples\bugbase содержит простое приложение, иллюстрирующее использование LiveConnect. В этом разделе описан код JavaScript этого приложения-образца. См. в разделе «Пример Вызывающего JavaScript» описание кода Java этого приложения.

Приложение bugbase представляет собой простую БД «жучков». Вы вводите bug, заполняя клиентскую форму номером жучка, приоритетом, продуктом, в котором он обнаружен, и кратким описанием. Другая форма позволяет просмотреть существующий bug.

Следующий JavaScript обрабатывает акцию входа:

Шаги в этом коде:

  1. Проверить, что пользователь ввёл ID для bug. Только в этом случае выполняется вход в bug.
  2. Создать экземпляр Java-класса Bug и присвоить его переменной bug . Конструктор класса Bug принимает три параметра: два из них являются свойствами объекта request ; третий это сам объект JavaScript request . Поскольку они являются элементами формы, эти свойства объекта request являются строками JavaScript. Код изменяет ID на целое число перед передачей его Java-конструктору. После передачи request -объекта Java-конструктору этот конструктор может затем вызывать его методы. Этот процесс обсуждается в разделе «Пример Вызывающего Серверного JavaScript».
  3. Использовать project.bugsLock для получения исключительного доступа к массиву project.bugs и сохранить затем новый Bug -экземпляр в этом массиве, индексированным по номеру bug’а, специфицированному в форме. Заметьте, что этот код сохраняет ссылку на Java-объект как значение свойства JavaScript-объекта. О блокировке см. «Безопасное Совместное Использование Объектов с Блокировкой» .
  4. Отобразить клиенту информацию о bug’е, который Вы только что сохранили.
  5. Если bug ID не введён, вывести сообщение о том, что bug не может быть найден в БД.

Взаимодействие Java с JavaScript

Если Вам нужно использовать объекты JavaScript в Java, Вы обязаны импортировать пакет netscape.javascript в Ваш Java-файл. Этот пакет определяет следующие классы:

  • netscape.javascript.JSObject даёт Java-коду доступ к методам и свойствам JavaScript.
  • netscape.javascript.JSException позволяет Java-коду обрабатывать ошибки JavaScript.

Эти классы поставляются в .jar или .zip-файле. См. в книге Серверный JavaScript. Справочник. дополнительную информацию об этих классах.

Например, в Navigator 4. 0 для Windows NT классы поставляются в файле java40.jar в директории Program\Java\Classes ниже директории Navigator’а. Вы можете специфицировать переменную окружения Windows NT, войдя в Control Panel и создав пользовательскую переменную окружения с названием CLASSPATH со значением типа такого:

Поскольку Java является строго типизированным языком, а JavaScript — слабо типизированным, машина выполнения JavaScript конвертирует значения аргументов в подходящие типы данных другого языка, при использовании LiveConnect. См. «Конвертация Типов Данных».

Использование Классов LiveConnect

Все объекты JavaScript появляются в коде Java как экземпляры netscape.javascript.JSObject . Когда Вы вызываете метод в Вашем Java-коде, Вы можете передать ему JavaScript-объект как один из аргументов. Чтобы сделать это, Вы обязаны определить соответствующий формальный параметр метода как имеющий тип JSObject .

Таким образом, всегда, когда Вы используете JavaScript-объекты в коде Java, Вы должны помещать вызов JavaScript-объекта внутри блока try. catch , который обрабатывает исключения netscape.javascript.JSException . Это позволяет Вашему Java-коду обрабатывать ошибки при выполнении кода JavaScript, которые появляются в Java как исключения типа JSException .

Доступ к JavaScript с Помощью JSObject

Предположим, к примеру, что вы работаете с Java-классом JavaDog . Как показано в следующем коде, конструктор JavaDog constructor принимает JavaScript-объект jsDog , который определён как имеющий тип JSObject , в качестве аргумента:

Обратите внимание, что метод getMember объекта JSObject используется для доступа к свойствам объекта JavaScript. Предыдущий пример использует getMember для присвоения значения JavaScript-свойства jsDog.breed члену данных Java JavaDog.dogBreed .

ПРИМЕЧАНИЕ: Более жизненный пример помещает вызов getMember в блок try. catch для обработки ошибок типа JSException . См. «Обработка Ошибок JavaScript в Java».

Чтобы лучше понять, как работает getMember , посмотрим на определение специального JavaScript-объекта Dog :

Вы можете создать JavaScript-экземпляр Dog под названием gabby :

Если Вы вычислите свойство gabby.color , Вы увидите, что оно имеет значение «chocolate». Теперь предположим, что Вы создаёте экземпляр JavaDog в вашем JavaScript-коде, передавая объект gabby -конструктору:

Если Вы вычислите javaDog.dogColor , Вы увидите, что оно также имеет значение «chocolate», поскольку метод getMember в Java-конструкторе присваивает dogColor значение gabby.color .

Обработка Исключений JavaScript в Java

Если JavaScript-код, вызванный из Java, потерпел неудачу на этапе прогона/выполнения, он вызывает исключение. Если Вы вызываете JavaScript-код из Java, Вы можете отловить/catch это исключение в блоке операторов try. catch . Исключение JavaScript доступно коду Java как экземпляр netscape.javascript . JSException. JSException это Java-оболочка вокруг исключения любого типа, вызываемого в JavaScript, так же как и экземпляры JSObject являются оболочками для JavaScript-объектов.

Используйте JSException при вычислении JavaScript-кода в Java. Если JavaScript-код не вычисляется из-за ошибки компиляции JavaScript или из-за какой-то другой ошибки времени прогона, интерпретатор JavaScript генерирует сообщение об ошибке, которое конвертируется в экземпляр JSException .

Например, можно использовать блок try. catch для обработки исключений LiveConnect:

В этом примере оператор eval терпит неудачу, если foo не определён. Блок catch выполняет метод jsCodeFailed , если оператор eval в блоке try вызывает JSException ; метод otherCodeFailed выполняется, если блок try вызывает какую-то иную ошибку.

Доступ к Серверному JavaScript

Рассмотрим теперь использование Java для доступа к серверному JavaScript. Для того чтобы метод Java получил доступ к объектам JavaScript, он обязан быть вызван из приложения, написанном на серверном JavaScript. В клиентском JavaScript, Java может инициировать взаимодействие с JavaScript. На сервере Java не может инициировать это взаимодействие.

Когда Вы рекомпилируете Java-класс, который используется в приложении JavaScript, новое определение может не иметь немедленного эффекта. Если любое приложение JavaScript, запущенное на web-сервере, имеет «живую» ссылку на объект, созданный из старого определения класса, все приложения продолжают использовать старое определение. Поэтому при рекомпилировании Java-класса Вы должны рестартовать любые приложения JavaScript, имеющие доступ к этому классу.

Потоки

Java даёт вам возможность создавать раздельные потоки выполнения. Вы должны осторожно использовать эту возможность, если Ваш Java-код взаимодействует с JavaScript-кодом.

Каждый запрос серверного JavaScript обрабатывается в потоке, известном как request thread/поток запроса . Этот поток запроса ассоциируется с информацией о статусе, такой как контекст JavaScript, используемый для процессинга информации HTTP-запроса, и HTTP-буфер ответа.

Когда Вы вызываете Java-код из приложения JavaScript, этот код Java работает в том же самом потоке запроса, что и оригинальное приложение JavaScript. Java-код в этом потоке может взаимодействовать с приложением JavaScript и иметь гарантию, что оно является таким, как он ожидает. Точнее, он может полагаться на ассоциированную информацию статуса.

Однако Вы можете создать новый поток из Java-кода. Если Вы это сделаете, этот новый поток не сможет взаимодействовать с приложением JavaScript и не сможет опираться на информацию о статусе, ассоциированную с оригинальным потоком запроса. Если он попытается это сделать, поведение будет неопределённым. Например, создаваемый Вами Java-поток не может ни инициировать выполнение JavaScript-кода через использование JSObject , ни использовать writeHttpOutput , поскольку этот метод требует доступа к HTTP-буферу ответа.

Пример Вызывающего Серверного JavaScript

В директории $NSHOME\js\samples\bugbase содержится простое приложение, которое иллюстрирует использование LiveConnect. В это разделе описывается приложение-образец Java-кода. См. в разделе «Пример JavaScript, Вызывающего Java» описание основ работы этого приложения и его JavaScript-кода.

Многие шаги в этом коде не являются специфичными для взаимодействия с JavaScript. Только шаги 1 и 3 имеют отношение к JavaScript.

  1. Специфицировать пакет, используемый в файле, и импортировать пакеты netscape.javascript и netscape.server.serverenv . Если Вы пропустите этот шаг, Вы не сможете использовать объекты JavaScript.
  2. Создать Java-класс Bug , специфицировать его поля.
  3. Определить конструктор для этого класса. Этот конструктор принимает три параметра: целое число, строку и объект типа JSObject . Этот последний параметр является представлением JavaScript-объекта в Java. Через методы этого объекта конструктор может получить доступ к свойствам и вызвать методы объекта JavaScript. В этом случае он использует метод getMember объекта JSObject для получения значений свойств JavaScript-объекта. Также этот метод использует метод writeHttpOutput предопределённого объекта NetscapeServerEnv (из пакета netscape.server.serverenv ) для вывода информации в процессе конструирования объекта. Этот метод записывает массив байтов в тот же поток вывода, который используется JavaScript-функцией write .
  4. Определить метод toString . Это стандартный метод для Java-объекта, возвращающий строковое представление полей объекта.

Конвертация Типов Данных

Поскольку Java является строго типизированным, а JavaScript — слабо типизированным языком, машина выполнения JavaScript конвертирует значения аргументов в подходящие типы данных других языков, если Вы пользуетесь LiveConnect. Эта конвертация описана в следующих разделах:

Конвертация из JavaScript в Java

Если Вы вызываете Java-метод и передаёте ему параметры из JavaScript, типы данных передаваемых параметров конвертируются в соответствии с правилами, описанными в следующих разделах:

Return-значения методов netscape.javascript.JSObject всегда конвертируются в экземпляры java.lang.Object . Правила конвертации этих return-значений также описаны в этих разделах.

Например, если JSObject.eval возвращает число JavaScript, Вы можете найти правило конвертации этого числа в экземпляр java.lang.Object в разделе «Числовые Значения».

Числовые Значения

Если Вы передаёте числовые типы JavaScript в качестве параметров Java-методам, Java конвертирует эти значения в соответствии с правилами из данной таблицы:

Объект Описание

Точное значение переносится в Java без округления и без потери точности или знака.

Создаётся новый экземпляр java.lang.Double , и точное значение переносится в Java без округления и без потери точности или знака.

Значения конвертируются в строки. Например,

  • 237 становится «237»

Тип Java-параметра Правила конвертации

  • Значения округляются до точности float.
  • Значения, которые слишком велики либо малы, округляются до +бесконечности
    или -бесконечности.

  • Значения округляются с использованием режима «округление до минус-бесконечности»/round-to-negative-infinity.
  • Значения, которые слишком велики либо малы, дают ошибку времени выполнения.
  • NaN -значения конвертируются до нуля.

  • 0 и NaN -значения конвертируются в false.
  • Другие значения конвертируются в true.

Когда число JavaScript передаётся как параметр в Java-метод, ожидающий экземпляр java.lang.String , это число конвертируется в строку. Используйте операцию == для сравнения результата этой конвертации с другими строковыми значениями.

Булевы Значения

Когда Вы передаёте Булев тип JavaScript в качестве параметра Java-методам, Java конвертирует эти значения в соответствии с правилами, описанными в таблице:

Все значения конвертируются непосредственно в Java-эквиваленты.

Создаётся новый экземпляр java.lang.Boolean . Каждый параметр создаёт новый экземпляр, а не экземпляр с тем же примитивным значением.

Значения конвертируются в строки. Например:

  • true становится «true»
  • false становится «false»

Тип Java-параметра Правила конвертации

  • true становится 1
  • false становится 0

Когда JavaScript Boolean передаётся в качестве параметра Java-методу, ожидающему экземпляр java.lang.String , Boolean конвертируется в строку. Используйте операцию == для сравнения результата конвертации с другими строковыми значениями.

Строковые Значения

Когда Вы передаёте строковые типы JavaScript в качестве параметра Java-методам, Java конвертирует эти значения в соответствии с правилами, описанными в таблице:

Строка JavaScript конвертируется в экземпляр java.lang.String с ASCII-значением.

Все значения конвертируются в числа, как описано в ECMA-262.

Все значения конвертируются в числа.

Тип Java-параметра Правила конвертации

  • Пустая строка становится false.
  • все другие значения становятся true.


Null-Значения

Когда Вы передаёте null JavaScript в качестве параметра Java-методам, Java конвертирует это значение в соответствии с правилами, описанными в таблице:

Любой класс
Любой тип интерфейса

Значение становится null.

Значение становится 0.

Значение становится false.

Объекты JavaArray и JavaObject

В большинстве случаев, когда Вы передаёте объект JavaScript JavaArray или JavaObject как параметр Java-методу, Java просто разворачивает этот объект (снимает оболочку); иногда объект переводится в другой тип данных по правилам из таблицы:

Тип Java-параметра Правила конвертации

Любой интерфейс или класс, который совместим в операции присвоения с развёрнутым объектом.

Оболочка с объекта снимается.

Оболочка с объекта снимается, вызывается метод toString развёрнутого Java-объекта, а результат возвращается как новый экземпляр java.lang.String .

Оболочка с объекта снимается, и возникает одна из следующих ситуаций:

  • Если развёрнутый Java-объект имеет метод doubleValue , JavaArray или JavaObject конвертируется в значение, возвращаемой этим методом.
  • Если развёрнутый Java-объект не имеет метода doubleValue , возникает ошибка.

Оболочка с объекта снимается, и возникает одна из следующих ситуаций:

  • Если развёрнутый объект имеет метод booleanValue, объект-источник конвертируется в это return-значение.
  • Если развёрнутый объект не имеет метода booleanValue, конвертация терпит неудачу.

Тип Java-параметра Правила конвертации

Интерфейс или класс совместимы для присвоения с развёрнутым объектом, если развёрнутый объект является экземпляром типа Java-параметра. То есть, следующий оператор обязан возвращать true:

Объекты JavaClass

Если вы передаёте JavaScript-объект JavaClass в качестве параметра Java-методу, Java конвертирует объект в соответствии с правилами из таблицы:

Оболочка с объекта снимается.

Объект JavaClass оборачивается в новый экземпляр java.lang.JSObject .

Оболочка с объекта снимается, вызывается метод toString развёрнутого Java-объекта, а результат возвращается как новый экземпляр java.lang.String .

Оболочка с объекта снимается, и возникает одна из следующих ситуаций:

  • Если развёрнутый объект имеет метод booleanValue, исходный объект конвертируется в return-значение.
  • Если объект не имеет метода booleanValue, конвертация терпит неудачу.

Тип Java-параметра Правила конвертации

Другие Объекты JavaScript

Если вы передаёте любой другой объект JavaScript в качестве параметра Java-методу, Java конвертирует объект в соответствии с правилами из таблицы:

Объект оборачивается в новый экземпляр java.lang.JSObject .

Оболочка с объекта снимается, вызывается метод toString развёрнутого Java-объекта, а результат возвращается как новый экземпляр java.lang.String .

Объект конвертируется в значение с использованием логики оператора ToPrimitive , описанного в ECMA-262. Подсказка PreferredType , используемая с этим оператором, это Number.

Оболочка с объекта снимается, и возникает одна из следующих ситуаций:

  • Если развёрнутый объект имеет метод booleanValue, исходный объект конвертируется в return-значение.
  • Если объект не имеет метода booleanValue, конвертация терпит неудачу.

Тип Java-параметра Правила конвертации

Конвертация из Java в JavaScript

Значения, переданные из Java в JavaScript конвертируются так:

  • Java byte, char, short, int, long, float и double конвертируются в числа JavaScript.
  • Java boolean конвертируется в JavaScript boolean.
  • Объект класса netscape.javascript.JSObject конвертируется в оригинальный JavaScript-объект.
  • Java-массивы конвертируются в объект JavaScript pseudo-Array; этот объект ведёт себя так же, как объект JavaScript Array : Вы можете иметь к нему доступ с синтаксисом arrayName[index] (где index это целое число) и определять его размер с помощью arrayName.length .
  • Java-объект любого иного класса конвертируется в JavaScript-оболочку, которая может использоваться для доступа к методам и полям Java-объекта:
    • Конвертация оболочки в строку вызывает метод toString объекта-оригинала.
    • Конвертация в число вызывает метод doubleValue , если возможно, иначе — терпит неудачу.
    • Конвертация в boolean вызывает метод booleanValue , если возможно, иначе — терпит неудачу.

    Обратите внимание, что экземпляры java.lang.Double и java.lang.Integer конвертируются в объекты JavaScript, а не в числа JavaScript. Аналогично, экземпляры java.lang.String также конвертируются в JavaScript-объекты, а не в строки JavaScript.

    Java String -объекты также соответствуют оболочкам JavaScript. Если Вы вызываете JavaScript-метод, который требует строки JavaScript, и передаёте его данной оболочке, Вы получите ошибку. Вместо этого конвертируйте оболочку в строку JavaScript, присоединяя к ней пустую строку, как показано здесь:

    Оглавление | Назад | Вперёд | Индекс

    Дата последнего обновления: 29 сентября 1999 г.

    © Copyright ╘ 1999 Sun Microsystems, Inc. Некоторая часть Copyright ╘ 1999 Netscape Communications Corp. Все Права Зарезервированы.

    Глава 9 LiveConnect. Обзор.

    В этой главе рассматривается использование технологии LiveConnect, обеспечивающей совместную работу кодов, написанных на Java и JavaScript. Предполагается, что Вы уже знакомы с программированием на Java.

    Дополнительную информацию об использовании LiveConnect см. в технических замечаниях по JavaScript на сайте DevEdge.

    Работа с Оболочками

    В JavaScript wrapper\оболочка это объект целевого типа данных языка, содержащий объект исходного языка. При программировании на JavaScript Вы можете использовать объект-оболочку для доступа к методам и полям Java-объекта; вызов методов или доступ к свойству в wrapper вызывает Java-объект. На стороне Java объекты JavaScript «обёртываются» в экземпляры класса netscape.javascript.JSObject и передаются в Java.

    Если JavaScript-объект посылается в Java, машина времени выполнения создаёт Java-оболочку типа JSObject; когда JSObject посылается из Java в JavaScript, машина времени выполнения разворачивает его в оригинальный тип объекта JavaScript. Класс JSObject предоставляет интерфейс для вызова методов JavaScript и проверки JavaScript-свойств.

    Взаимодействие JavaScript и Java

    Если Вы ссылаетесь на пакет или класс Java или работаете с объектом или массивом Java, Вы используете один из специальных объектов LiveConnect. Весь доступ JavaScript к Java осуществляется через эти объекты, резюме по которым — в следующей таблице.

    Таблица 9.1 &nbsp&nbspОбъекты LiveConnect

    Объект Описание

    JavaArray

    Обёрнутый массив Java, к которому имеется доступ из кода JavaScript.

    JavaClass

    Ссылка JavaScript на Java-класс.

    JavaObject

    Обёрнутый объект Java, к которому имеется доступ из кода JavaScript.

    JavaPackage

    Ссылка JavaScript на Java-пакет.

    Примечание

    Поскольку Java является строго типизированным языком, а JavaScript типизирован слабо, машина выполнения JavaScript конвертирует значения аргументов в типы данных, подходящие для других языков, если Вы используете LiveConnect. См. Конвертация Типов Данных.

    Иногда существование объектов LiveConnect достаточно прозрачно, поскольку Вы взаимодействуете с Java в довольно интуитивной манере. Например, Вы можете создать объект Java String и присвоить его в JavaScript переменной myString путём использования оператора new с конструктором Java таким вот образом:

    var myString = new java.lang.String(«Hello world»)

    Здесь переменная myString является JavaObject, поскольку она содержит экземпляр Java-объекта String. Как JavaObject, myString имеет доступ к public-методам экземпляра java.lang.String и его суперкласса, java.lang.Object. Эти Java-методы доступны в JavaScript как методы из JavaObject, и Вы можете вызывать их так:

    myString.length() // возвращает 11

    Объект Packages

    Если Java-класс не является частью пакетов java, sun или netscape, Вы можете получить к нему доступ через объект Packages. Например, предположим, корпорация Redwood использует Java-пакет под названием redwood как контейнер различных Java-классов. Чтобы создать экземпляр класса HelloWorld из redwood, Вы осуществляете доступ к конструктору класса так:

    var red = new Packages.redwood.HelloWorld()

    Вы можете также иметь доступ к классам в пакете по умолчанию (то есть к классам, не указывающим пакет явно). Например, если класс HelloWorld находится непосредственно в пути CLASSPATH, а не в пакете, Вы можете получить к нему доступ так:

    var red = new Packages.HelloWorld()

    Объекты LiveConnect java, sun и netscape являются аббревиатурами для наиболее часто употребляющихся Java-пакетов. Например:

    var myString = new java.lang.String(«Hello world»)

    вместо более длинной версии:

    var myString = new Packages.java.lang.String(«Hello world»)

    Работа с Массивами Java

    Если любой Java-метод создаёт массив и Вы ссылаетесь на этот массив в JavaScript, Вы работаете с JavaArray. Например, следующий код создаёт JavaArray x из 10 элементов типа int:

    x = java.lang.reflect.Array.newInstance(java.lang.Integer, 10)

    Как и объект Array из JavaScript, JavaArray имеет свойство length, которое возвращает количество элементов массива. В отличие от Array.length, JavaArray.length, это свойство только для чтения, поскольку количество элементов Java-массива фиксируется в момент создания.

    Ссылки на Пакеты и Классы

    Простые ссылки из JavaScript на пакеты и классы Java создают объекты JavaPackage и JavaClass. В предыдущем примере о компании Redwood, к примеру, ссылка Packages.redwood это JavaPackage-объект. Аналогично ссылка java.lang.String является JavaClass-объектом.

    В большинстве случаев Вам не нужно беспокоиться об объектах JavaPackage и JavaClass — Вы просто работаете с пакетами и классами Java, а LiveConnect создаёт эти объекты прозрачно.

    В JavaScript 1.3 и ранее JavaClass-объекты не конвертируются автоматически в экземпляры java.lang.Class. Если Вы передаёте их в качестве параметров Java-методам — Вы обязаны создавать wrapper/оболочку вокруг экземпляра java.lang.Class. В следующем примере метод forName создаёт объект-оболочку theClass, который затем передаётся методу newInstance для создания массива.

    // JavaScript 1.3
    the )
    theArray = java.lang.reflect.Array.newInstance(theClass, 5)

    В JavaScript 1.4 и позднее Вы можете передавать JavaClass-объект непосредственно в метод, как в следующем примере:

    // JavaScript 1.4
    theArray = java.lang.reflect.Array.newInstance(java.lang.String, 5)

    Аргументы Типа char

    В JavaScript 1.4 и позднее Вы можете передавать строку из одного символа в Java-метод, который требует аргумент типа char. Например, Вы можете передать строку «H» в конструктор Character:

    c = new java.lang.Character(«H»)

    В JavaScript 1.3 и ранее Вы обязаны передавать в такие методы целое число, соответствующее Unicode-значению символа. Например, следующий код также присваивает значение «H» переменной c:

    c = new java.lang.Character(72)

    Обработка Исключений Java в JavaScript

    Если код Java прерывается на этапе прогона программы, он вызывает исключение. Если Ваш JavaScript-код имеет доступ к члену данных Java или методу и терпит неудачу, исключение Java передаётся в JavaScript для обработки. Начиная с JavaScript 1.4, Вы можете отловить это исключение в операторе try. catch.

    Например, предположим, Вы используете Java-метод forName для присвоения имени Java-класа переменной theClass. Метод forName вызывает исключение, если передаваемое Вами значение не вычисляется в имя Java-класса. Поместите оператор присвоения forName в блок try для обработки исключения:

    function getClass(javaClassName) <
    try <
    var the > > catch (e) <
    return («The Java exception is » + e);
    >
    return theClass
    >

    В этом примере, если javaClassName вычисляется в верное имя класса, такое как «java.lang.String», присвоение проходит успешно. Если javaClassName вычисляется в неверное имя класса, такое как «String», функция getClass отлавливает исключение и возвращает нечто подобное:

    The Java exception is java.lang.ClassNotFoundException: String

    См. в разделе «Операторы Обработки Исключений» информацию об исключениях JavaScript.

    Взаимодействие Java и JavaScript

    Если Вы хотите использовать объекты JavaScript в Java, Вы обязаны импортировать пакет netscape.javascript в Ваш Java-файл. Этот пакет определяет следующие классы:

      netscape.javascript.JSObject даёт доступ Java-коду к методам и свойствам JavaScript;

  • netscape.javascript.JSException даёт возможность Java-коду обрабатывать ошибки JavaScript.


Начиная с JavaScript 1.2, эти классы поставляются в .jar файле; в предыдущих версиях JavaScript они поставлялись в .zip файле. См. в книге Ядро JavaScript. Справочник. информацию об этих классах.

Для доступа к классам LiveConnect поместите .jar или .zip файл в CLASSPATH компилятора JDK одним из следующих способов:

    Создав переменную окружения CLASSPATH и специфицировав путь и имя .jar или .zip файла.
  • Специфицировав размещение .jar или .zip файла при компиляции, используя параметр командной строки -classpath.
  • Например, в Navigator 4. 0 для Windows NT классы расположены в файле java40.jar в директории Program\Java\ >’ а. Вы можете специфицировать переменную окружения в Windows NT, дважды щёлкнув иконку System в Control Panel и создав пользовательскую переменную окружения под названием CLASSPATH со значением, типа такого:

    См. в документации Sun JDK информацию о CLASSPATH.

    Прим ечание

    Поскольку Java является строго типизированным языком, а JavaScript -слабо типизированным, машина выполнения JavaScript конвертирует значения аргументов в типы данных, подходящие для других языков, если Вы используете LiveConnect. См. полную информацию в разделе Конвертация Типов Данных.

    Использование Классов LiveConnect

    Все объекты JavaScript появляются в коде Java как экземпляры netscape.javascript.JSObject. Если Вы вызываете метод в Java-коде, Вы можете передать в него JavaScript-объект как один из аргументов. Чтобы выполнить это, Вы обязаны определить соответствующий формальный параметр этого метода как имеющий тип JSObject.

    Итак, при использовании JavaScript-объектов в Java-коде Вы всегда должны помещать вызов JavaScript-объекта внутри оператора try. catch, который обрабатывает исключения типа netscape.javascript.JSException. Это даёт Вашему Java-коду возможность обрабатывать ошибки при выполнении JavaScript-кода, которые появляются в Java как исключения типа JSException.

    Доступ к JavaScript через JSObject

    Например, предположим, Вы работаете с Java-классом JavaDog. Как показано в следующем коде, конструктор JavaDog принимает в качестве аргумента JavaScript-объект jsDog, который определён как имеющий тип JSObject:

    public class JavaDog
    <
    public String dogBreed;
    public String dogColor;
    public String dogSex;

    // определяется конструктор класса
    public JavaDog(JSObject jsDog)
    <
    // здесь try. catch используется для обработки JSExceptions
    this.dogBreed = (String)jsDog.getMember(«breed»);
    this.dogColor = (String)jsDog.getMember(«color»);
    this.dogSex = (String)jsDog.getMember(«sex»);
    >
    >

    Обратите внимание, что метод getMember из JSObject используется для доступа к свойствам JavaScript-объекта. Предыдущий пример использует getMember для присвоения значения JavaScript-свойства jsDog.breed члену данных Java JavaDog.dogBreed.

    Прим ечание

    Более жизненный пример — помещение вызова метода getMember внутрь блока try. catch для обработки ошибок типа JSException. См. также Обработка Исключений JavaScript в Java.

    Чтобы лучше понять, как работает getMember, посмотрите на определение специального JavaScript-объекта Dog:

    function Dog(breed,color,sex) <
    this.breed = breed
    this.color = color
    this.sex = sex
    >

    Вы можете создать в JavaScript экземпляр объекта Dog под названием gabby:

    gabby = new Dog(«lab»,»chocolate»,»female»)

    Если Вы вычисляете gabby.color, то увидите, что это свойство имеет значение «chocolate». Теперь предположим, что Вы создаёте экземпляр JavaDog в Вашем JavaScript-коде, передавая конструктору объект gabby:

    javaDog = new Packages.JavaDog(gabby)

    Если Вы вычисляете javaDog.dogColor, то увидите, что это свойство также имеет значение «chocolate», потому что метод getMember в Java-конструкторе присваивает переменной dogColor значение свойства gabby.color.

    Обработка Ошибок JavaScript в Java

    Когда JavaScript-код вызываемый из Java, терпит неудачу на этапе прогона программы, он вызывает исключение. Если Вы вызываете JavaScript-код из Java, Вы можете отловить это исключение в операторе try. catch. Исключение JavaScript доступно в Вашем Java-коде как экземпляр netscape.javascript.JSException.

    JSException это Java-оболочка вокруг исключения любого типа, вызываемого в JavaScript, аналогично тому, как экземпляры JSObject являются оболочками для JavaScript-объектов. Используйте JSException, если Вы вычисляете JavaScript-код в Java.

    Если Вы вычисляете JavaScript-код в Java, следующие ситуации могут вызвать ошибки времени выполнения:

      Код JavaScript не вычисляется или из-за ошибки компиляции JavaScript, или из-за какой-нибудь другой ошибки времени выполнения. Интерпретатор JavaScript генерирует сообщение об ошибке, которое конвертируется в экземпляр JSException.

    Java успешно вычисляет JavaScript-код, но JavaScript-код выполняет необработанный оператор throw.

    JavaScript вызывает исключение, которое обёрнуто как экземпляр JSException. Используйте метод getWrappedException из JSException для развёртывания этого исключения в Java.

    Например, предположим, что Java-объект eTest вычисляет строку jsCode, которую Вы ему передали. Вы можете отреагировать на любую ошибку времени выполнения, возникающую при вычислении, реализуя такой обработчик исключения:

    import netscape.javascript.JSObject;
    import netscape.javascript.JSException;

    public class eTest <
    public static Object doit(JSObject obj, String jsCode) <
    try <
    obj.eval(jsCode);
    > catch (JSException e) <
    if (e.getWrappedException()==null)
    return e;
    return e.getWrappedException();
    >
    return null;
    >
    >

    В этом примере код блока try пытается вычислить строку jsCode, переданную ему Вами. Скажем, Вы передали строку «myFunction()» в качестве значения jsCode. Если myFunction не определена как функция JavaScript, интерпретатор JavaScript не может вычислить jsCode. Интерпретатор генерирует сообщение об ошибке, Java-обработчик отлавливает сообщение, а метод doit возвращает экземпляр объекта netscape.javascript.JSException.

    Предположим, однако, что myFunction определена в JavaScript так:

    function myFunction() <
    try <
    if (theCondition == true) <
    return «Everything’s ok»;
    > else <
    throw «JavaScript error occurred» ;
    >
    > catch (e) <
    if (canHandle == true) <
    handleIt();
    > else <
    throw e;
    >
    >
    >

    Если theCondition — false, функция вызывает исключение. Это исключение отлавливается в коде JavaScript, и, если canHandle — true, JavaScript обрабатывает исключение. Если canHandle — false, исключение повторно вызывается, Java-обработчик отлавливает его, а метод doit возвращает Java-строку:

    JavaScript error occurred

    См. в разделе «Операторы Обработки Исключений» полную информацию об исключениях JavaScript.

    Обратная Совместимость

    В JavaScript 1.3 и ранее, класс JSException имел три public-конструктора, которые по выбору принимали строковой аргумент, специфицирующий детали сообщения или другую информацию для исключения. Метод getWrappedException отсутствовал.

    Используйте оператор try. catch для обработки LiveConnect-исключений в JavaScript 1.3 и более ранних версиях таким образом:

    try <
    global.eval(«foo.bar = 999;»);
    > catch (Exception e) <
    if (e instanceof JSException) <
    jsCodeFailed()»;
    > else <
    otherCodeFailed();
    >
    >

    В этом примере оператор eval терпит неудачу, если foo не определено. Блок catch выполняет метод jsCodeFailed, если оператор eval в блоке try вызывает JSException; метод otherCodeFailed выполняется в случае, если блок try вызывает какую-либо иную ошибку.

    Конвертация Типов Данных

    Поскольку язык Java строго типизирован, а JavaScript типизирован слабо, машина выполнения JavaScript конвертирует значения аргументов в типы данных, подходящие для других языков, если Вы используете LiveConnect. Эта конвертация описана в разделах:

    Конвертация JavaScript в Java

    Если Вы вызываете Java-метод и передаёте ему параметры из JavaScript, типы данных передаваемых параметров конвертируются в соответствии с правилами, описанными в следующих разделах:

    return-значения методов объекта netscape.javascript.JSObject всегда конвертируются в экземпляры объекта java.lang.Object. Правила конвертации этих return-значений также описаны в этих разделах.

    Например, если JSObject.eval возвращает JavaScript-число, Вы можете найти правила конвертации этого числа в экземпляр объекта java.lang.Object в разделе Числа.

    Числа

    Если Вы передаёте числовые типы JavaScript в качестве параметров методам Java, Java конвертирует эти значения в соответствии с правилами, описанными в следующей таблице:

    double

    Точное значение переносится в Java без округления и без потери точности или знака.

    lava.lang.Double
    java.lang.Object

    Создаётся новый экземпляр java.lang.Double, и точное значение передаётся в Java без округления и без потери точности или знака.

    float

      Значения округляются до чисел с плавающей точкой.
  • Значения, которые слишком малы или велики, чтобы быть представленными, округляются до +infinity или -infinity.
  • byte
    char
    int
    long
    short

      Значения округляются с использованием режима round-to-negative-infinity/округление-в-сторону-отрицательной-бесконечности.

    Значения, которые слишком малы или велики, чтобы быть представленными, дают ошибку времени выполнения.

  • Значения NaN конвертируются до нуля.
  • java.lang.String

    Значения конвертируются в строки. Например,

    • 237 становится «237»

    boolean

      Значения 0 и NaN конвертируются в false.
  • Другие значения конвертируются в true.
  • Если число JavaScript передаётся в качестве параметра в Java-метод, который ожидает экземпляр объекта java.lang.String, это число конвертируется в строку. Используйте метод equals() для сравнения результата этой конвертации с другими строковыми значениями.

    Булевы Значения

    Если Вы передаёте Булевы типы JavaScript как параметры для Java-методов, Java конвертирует значения в соответствии с правилами, описанными в следующей таблице:

    boolean

    Все значения конвертируются непосредственно в Java-эквиваленты.

    lava.lang.Boolean
    java.lang.Object

    Создаётся новый экземпляр объекта java.lang.Boolean. Каждый параметр создаёт новый экземпляр, а не один экземпляр с тем же примитивным значением.

    java.lang.String

    Значения конвертируются в строки. Например:

      true становится «true»
  • false становится «false»
  • byte
    char
    double
    float
    int
    long
    short

      true становится 1
  • false становится 0
  • Если Булево значение JavaScript передаётся в качестве параметра Java-методу, ожидающему экземпляр объекта java.lang.String, Булево значение конвертируется в строку. Используйте операцию == для сравнения результата этой конвертации с другими строковыми значениями.

    Строковые Значения

    Если Вы передаёте строковые типы JavaScript как параметры для Java-методов, Java конвертирует значения в соответствии с правилами, описанными в следующей таблице:

    lava.lang.String
    java.lang.Object

    JavaScript 1.4:

      Строка JavaScript конвертируется в экземпляр объекта java.lang.String со значением Unicode.

    JavaScript 1.3 и ранее:

    • Строка JavaScript конвертируется в экземпляр объекта java.lang.String со значением ASCII.

    byte
    double
    float
    int
    long
    short

    Все значения конвертируются в числа так, как описано в ECMA-262.

    Строковые значения JavaScript конвертируются в числа в соответствии с правилами ECMA-262


    JavaScript 1.4:

      Односимвольные строки конвертируются в Unicode-символы.
  • Все иные значения конвертируются в числа.
  • JavaScript 1.3 и ранее:

    • Все значения конвертируются в числа.

    boolean

      Пустая строка становится false.
  • Все иные значения становятся true.
  • Undefined-Значения

    Если Вы передаёте значения undefined JavaScript в качестве параметров методам Java, Java конвертирует значения в соответствии с правилами, описанными в следующей таблице:

    lava.lang.String
    java.lang.Object

    Значение конвертируется в экземпляр объекта java.lang.String, значением которого является строка «undefined».

    boolean

    Значение становится false.

    double
    float

    Значение становится NaN.

    byte
    char
    int
    long
    short

    Значение становится 0.

    Конверсия значения undefined возможна только в JavaScript 1.3 и более поздних версиях. Более ранние версии JavaScript не поддерживают значения undefined.

    Если значение undefined JavaScript передаётся в качестве параметра Java-методу, который ожидает экземпляр объекта java.lang.String, значение undefined конвертируется в строку. Используйте операцию == для сравнения результата этой конвертации с другими строковыми значениями.

    Null-Значения

    Если Вы передаёте значения null JavaScript в качестве параметра Java-методам, Java конвертирует значения в соответствии с правилами, описанными в следующей таблице:

    Любой класс
    Любой тип интерфейса

    Значение становится null.

    byte
    char
    double
    float
    int
    long
    short

    Значение становится 0.

    boolean

    Значение становится false.

    Объекты JavaArray и JavaObject

    В большинстве случаев, если Вы передаёте JavaArray или JavaObject JavaScript в качестве параметра Java-методу, Java просто снимает оболочку с объекта; в некоторых случаях объект приводится к другому типу данных в соответствии с правилами, описанными в следующей таблице:

    Любой интерфейс или класс, совместимый при присвоении с развёрнутым /unwrapped объектом.

    Объект разворачивается.

    java.lang.String

    Объект разворачивается, вызывается метод toString развёрнутого Java-объекта, и результат возвращается как новый экземпляр объекта java.lang.String.

    byte
    char
    double
    float
    int
    long
    short

    Объект разворачивается, и возникает одна из следующих ситуаций:

      Если развёрнутый Java-объект имеет метод doubleValue, the JavaArray или JavaObject конвертируется в значение, возвращаемое этим методом.
  • Если развёрнутый Java-объект не имеет метода doubleValue, возникает ошибка.
  • boolean

    В JavaScript 1.3 и более поздних версиях, объект разворачивается, и возникает одна из следующих ситуаций:

      Если объект — null, он конвертируется в false.
  • Если объект имеет какое-либо другое значение, он конвертируется в true.
  • В JavaScript 1.2 и ранее, объект разворачивается, и возникает одна из следующих ситуаций:

      Если развёрнутый объект имеет метод booleanValue, the исходный объект конвертируется в return-значение.
  • Если развёрнутый объект не имеет метода booleanValue, конвертация терпит неудачу.
  • Интерфейс или класс совместим для присвоения с развёрнутым объектом, если развёрнутый объект является экземпляром типа Java-параметра. То есть, следующий оператор должен возвращать true:

    развёрнутыйОбъект instanceof параметраТип

    Объекты JavaClass

    Если Вы передаёте объект JavaClass из JavaScript в качестве параметра Java-методу, Java конвертирует значение в соответствии с правилами, описанными в следующей таблице:

    java.lang.Class

    Объект разворачивается.

    java.lang.JSObject
    java.lang.Object

    Объект JavaClas разворачивается в новый экземпляр объекта java.lang.JSObject.

    java.lang.String

    Объект разворачивается, вызывается метод toString развёрнутого Java-объекта и результат возвращается как новый экземпляр объекта java.lang.String.

    boolean

    В JavaScript 1.3 и позднее, объект разворачивается, и возникает одна из следующих ситуаций:

      Если объект — null, он конвертируется в false.

    Если объект имеет какое-либо другое значение, он конвертируется в true.

    В JavaScript 1.2 и ранее, объект разворачивается, и возникает одна из следующих ситуаций:

      Если развёрнутый объект имеет метод booleanValue, исходный объект конвертируется в return-значение.
  • Если развёрнутый объект не имеет метода booleanValue, конвертация терпит неудачу.
  • Другие Объекты JavaScript

    Если Вы передаёте любой иной объект JavaScript в качестве параметра Java-методу, Java конвертирует значение в соответствии с правилами, описанными в следующей таблице:

    java.lang.JSObject
    java.lang.Object

    Объект разворачивается в новый экземпляр объекта java.lang.JSObject.

    java.lang.String

    Объект разворачивается, вызывается метод toString развёрнутого Java-объекта и результат возвращается как новый экземпляр объекта java.lang.String.

    byte
    char
    double
    float
    int
    long
    short

    Объект конвертируется в значение с использованием логики оператора ToPrimitive, описанного в ECMA-262. Подсказка PreferredType , используемая с этим оператором, является Number.

    boolean

    В JavaScript 1.3 и позднее, объект разворачивается, и возникает одна из следующих ситуаций:

      Если объект — null, он конвертируется в false.
  • Если объект имеет какое-либо другое значение, он конвертируется в true.
  • В JavaScript 1.2 и ранее, объект разворачивается, и возникает одна из следующих ситуаций:

      Если развёрнутый объект имеет метод booleanValue, исходный объект конвертируется в return-значение.
  • Если развёрнутый объект не имеет метода booleanValue, конвертация терпит неудачу.
  • Конвертация из Java в JavaScript

    Значения, передаваемые из Java в JavaScript, конвертируются так:

      Java-значения byte, char, short, int, long, float и double конвертируются в числа JavaScript.

    Булево значение Java конвертируется в булево значение JavaScript.

    Объект класса netscape.javascript.JSObject конвертируется в оригинальный JavaScript-объект.

    Массивы Java конвертируются в объект псевдо-Array JavaScript; поведение этого объекта похоже на объект Array из JavaScript: Вы можете получить к нему доступ через синтаксис arrayName[index] (где index это целое число) и определить его размер через свойство arrayName.length.

    Java-объект любого иного класса конвертируется в оболочку JavaScript, которая может использоваться для доступа к методам и полям Java-объекта:

      Конвертация этой оболочки в строку вызывает метод toString объекта-оригинала.

    Конвертация в число вызывает метод doubleValue, если это возможно, иначе — терпит неудачу.

    Конвертация в boolean в JavaScript 1.3 и более поздних версиях возвращает false, если объект — null, и true — в ином случае.

  • Конвертация в boolean в JavaScript 1.2 и более ранних версиях вызывает метод booleanValue, если это возможно, иначе — терпит неудачу.

  • Заметьте, что экземпляры объектов java.lang.Double и java.lang.Integer конвертируются в объекты JavaScript, а не в числа JavaScript. Аналогично и экземпляры java.lang.String также конвертируются в объекты JavaScript, а не в строки JavaScript.

    Java String-объекты также соответствуют JavaScript-оболочкам. Если Вы вызываете метод JavaScript, который требует строки JavaScript, и передаёте его этой оболочке, Вы получите ошибку. Вместо этого конвертируйте оболочку в строку JavaScript путём присоединения к ней пустой строки, как показано здесь:

    Джедайские приемы на JavaScript: магические свойства транслятора событий

    О чем мы?

    Event Emitter можно перевести как “транслятор” или “эмиттер” событий. Звучит как название штуки, умеющей генерировать событие, которое может “услышать” кто угодно.

    Представьте себе такую схему: в вашем асинхронном коде определенный участок может “крикнуть” остальным, что он выполнил свою задачу, а другие части “услышат” этот сигнал и примут соответствующие меры.

    Event Emitter — это шаблон, который можно реализовать разными способами. Основная идея в том, чтобы грамотно создать основу для управления событиями и реализовать возможность любым элементам “подписаться” на него (и быть в курсе происходящего). С другими шаблонами проектирования вы можете познакомиться в нашей статье.

    Уже интересно, как такая магия может работать? Итак, мы хотим добиться кода, который затем можно будет использовать так:

    Реализация

    Как видите, конструктор нашего класса будет инициализировать поле events, пока что делая его пустым объектом. Задача этого поля — хранить события, “подписавшиеся” на нас (то есть в нем будут храниться функции).

    «КРОК», Москва, Троицк, Санкт-Петербург, Нижний Новгород, Самара, Иркутск, Пермь, Краснодар, Воронеж, Челябинск, от 120 000 до 240 000 ₽

    Этот метод принимает в качестве аргументов название события (например, event:name-changed , как в нашем примере) и функцию, которая будет вызываться, когда будет инициироваться транслируемое событие.

    Одна из ключевых особенностей функций в JavaScript состоит в том, что функции — это этакие “объекты первого класса”, то есть мы можем передать функцию в качестве параметра другой функции, как в методе subscribe() .

    Этот метод принимает имя события, которое мы хотим всем транслировать, и данные, которые будут отправляться в момент этого события. Если в экземпляре класса сохранены какие-то подписанные на него события, мы проходимся по каждому из них и вызываем каждое, передавая ему данные, которые хотим транслировать.

    Собственно, с реализацией паттерна мы закончили. Но пока остается одна проблема: нам нужно будет “отписать” функции, которые нам больше не нужны. Не сделаем этого — столкнемся с утечкой памяти.

    Давайте решим эту проблему. Пусть метод subscribe() возвращает функцию unsubscribe() , которую позже можно будет использовать, чтобы отписаться от события.

    Как мы помним, в JavaScript особенные функции — их легко можно вернуть из другой функции. Теперь метод subscribe() можно использовать следующим образом:

    Вызывая сохраненную в переменной функцию unsubscribe() , мы отписываемся от события.

    Вот и все. Пока-пока, утечки памяти!

    Вот тут можно попробовать весь получившийся код в действии.

    Глава 15
    LiveConnect. Обзор.

    В этой главе рассматривается использование технологии LiveConnect, позволяющей коду Java и коду JavaScript взаимодействовать. Предполагается, что Вы уже знакомы с программированием на Java.

    В главе имеются следующие разделы:

    Дополнительно об использовании LiveConnect см. JavaScript technical notes на сайте DevEdge.

    Что такое LiveConnect?

    В браузере Navigator LiveConnect дает возможность использовать:

    • JavaScript для прямого доступа к переменным, методам, классам и пакетам Java.
    • Управлять Java-аплетами и plug-in’ами с помощью JavaScript.
    • Код Java для доступа к методам и свойствам JavaScript.

    Включение LiveConnect

    Служба LiveConnect по умолчанию включена в Navigator’е 1.1 и последующих версиях. Чтобы LiveConnect работала, должны быть включены Java и JavaScript. Для проверки этого выберите Preferences в меню Edit и просмотрите раздел Advanced.

    • Убедитесь, что опция Enable Java отмечена.
    • Убедитесь, что опция Enable JavaScript отмечена.

    Для отключения Java или JavaScript уберите галочки в переключателях; если Вы это сделали, LiveConnect работать не будет.

    Консоль Java

    Консоль Java это окно Navigator’а отображающее сообщения Java. Если Вы используете переменные классов out или err в java.lang.System для вывода сообщения, сообщение появляется на консоли. Для показа Java-консоли, выберите Java Console в меню Communicator.

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

    Например, следующий код Java выводит сообщение «Hello, world!» в Java-консоль:

    Работа с оболочками

    В JavaScript оболочка\wrapper это объект типа данных целевого языка, который содержит объект исходного языка. На стороне JavaScript Вы можете использовать объект-оболочку для доступа в методам и полям Java-объекта; вызов метода или доступ к свойству в оболочке приводит к вызову Java-объекта. На стороне Java — JavaScript-объекты оборачиваются в экземпляры класса netscape.javascript.JSObject и передаются в Java.

    Если JavaScript-объект пересылается в Java, машина выполнения создает Java-оболочку типа JSObject ; когда JSObject высылается из Java в JavaScript, машина выполнения развертывает его в оригинальный тип JavaScript-объекта. Класс JSObject предоставляет интерфейс для вызова методов JavaScript и проверки свойств JavaScript.

    Взаимодействие JavaScript с Java

    Когда Вы обращаетесь к пакету или классу Java или работаете с массивом или объектом Java, Вы используете один из специальных объектов LiveConnect. Все запросы JavaScript к Java выполняются с помощью этих объектов, резюме по которым дано в таблице.

    Таблица 15.1 Объекты LiveConnect

    Обернутый Java-массив, доступ к которому выполняется из кода JavaScript.

    Ссылка JavaScript на Java-класс.

    Обернутый объект Java, доступ к которому выполняется из кода JavaScript.

    Ссылка JavaScript на Java-пакет.

    ПРИМЕЧАНИЕ: Поскольку Java является строго типизированным языком, а JavaScript типизирован слабо, машина выполнения JavaScript конвертирует значения аргументов в подходящие типы данных других языков, когда Вы используете LiveConnect. См. полную информацию в разделе «Конвертация Типов Данных».

    Существование объектов LiveConnect в некотором смысле прозрачно, так как Вы взаимодействуете с Java в довольно интуитивной манере. Например, Вы можете создать Java-объект String и присвоить его JavaScript-переменной myString путем использования операции new с Java-конструктором:

    В предыдущем примере переменная myString это JavaObject , потому что она содержит экземпляр Java-объекта String . Как JavaObject , myString имеет доступ к public-методам экземпляра java.lang.String и его суперкласса, java.lang.Object . Эти Java-методы доступны в JavaScript как методы из JavaObject , и Вы можете вызвать их так:

    Объект Packages

    Если Java-класс не является частью пакетов java , sun или netscape , Вы осуществляете доступ к нему через объект Packages . Например, корпорация Redwood использует Java-пакет redwood как контейнер для различных Java-классов. Для создания экземпляра класса HelloWorld пакета redwood Вы выполняете доступ к конструктору этого класса так:

    Вы можете получить доступ также к класса пакета по умолчанию (то есть к классам, которые не называют пакет явным образом). Например, если класс HelloWorld находится непосредственно в CLASSPATH и не в пакете, Вы можете выполнить к нему доступ так:

    LiveConnect-объекты java , sun и netscape являются аббревиатурами для известных Java-пакетов. Например, Вы может записать:

    вместо более длинного варианта:

    Работа с массивами Java

    Если какой-нибудь Java-метод создает массив и Вы обращаетесь к этому массиву в JavaScript, Вы работаете с JavaArray . Например, следующий код создает JavaArray x из 10 элементов типа int:

    Подобно JavaScript-объекту Array , JavaArray имеет свойство length , которое возвращает количество элементов массива. В отличие от Array.length , JavaArray.length является свойством только для чтения, так как количество элементов в Java-массиве фиксируется в момент создания.

    Ссылки на пакет и класс

    Простые ссылки из JavaScript на пакеты и классы Java создают объекты JavaPackage и JavaClass . Ранее в примере о компании Redwood, например, ссылка Packages.redwood это объект JavaPackage . Аналогично, ссылка java.lang.String это JavaClass -объект.

    В большинстве случаев Вам не нужно беспокоиться о создании объектов JavaPackage и JavaClass — Вы просто работаете с пакетами и классами Java, а LiveConnect прозрачно создает эти объекты.

    JavaClass -объекты не конвертируются автоматически в экземпляры java.lang.Class , когда Вы передаете их как параметры Java-методам — Вы обязаны создавать оболочку для java.lang.Class -экземпляра. В следующем примере метод forName создает объект-оболочку theClass , который затем передается методу newInstance для создания массива.

    Аргументы типа char

    Вы не можете передавать односимвольные строки в Java-метод, требующий аргумента типа char . Вы обязаны передавать в такие методы целое число, соответствующее Unicode-значению символа. Например, вот присвоение значения «H» переменной c :

    Управления Java-аплетами

    Вы можете использовать JavaScript для управления поведением Java-аплета, не зная почти ничего о внутреннем строении аплета. Все public-переменные, методы и свойства аплета доступны для работы из JavaScript. Например, Вы можете использовать кнопки, расположенные на HTML-форме, для запуска и остановки Java-аплета, находящегося в любом месте документа.

    Обращение к аплетам

    Например, рассмотрим аплет «Hello World» на языке Java:

    Следующий HTML запускает и отображает аплет и именует его «HelloWorld» (в атрибуте NAME ):

    Если это первый аплет документа (самый верхний на странице), Вы можете обратиться к нему в JavaScript одним из следующих способов:

    Массив applets имеет свойство length , document.applets.length , указывающее количество аплетов в документе.

    Все public-переменные, объявленные в аплете и его классах и пакетах-предках, доступны в JavaScript. Static-методы и свойства, объявленные в аплете, доступны в JavaScript как методы и свойства объекта Applet . Вы можете получать и устанавливать значения свойств и вызывать методы, возвращающие строковые, числовые и Булевы значения.

    Пример 1: Hello World

    Например, Вы можете изменить вышеприведенный аплет HelloWorld:

    • переопределить его метод init , чтобы он объявлял и инициализировал строку myString
    • определить метод setString , принимающий строковой аргумент, присвоить этот аргумент объекту myString и вызвать метод repaint . (Методы paint и repaint наследуются из java.awt.Component ).

    Исходный код Java выглядит теперь так:

    Сделав стоку сообщения переменной, Вы можете модифицировать ее из JavaScript. Теперь изменим HTML-файл:

    • добавим форму с текстовым полем и кнопкой и
    • создадим для кнопки обработчик onClick , вызывающий метод setString из HelloWorld со строкой из текстового поля в качестве аргумента.

    Файл HTML выглядит так:

    Когда Вы компилируете аплет HelloWorld и загружаете HTML-страницу в Navigator, Вы сначала увидите «Hello, World!», выведенное на серой панели аплета. Однако Вы можете теперь изменить текст, введя новый в текстовом поле и щелкнув кнопку. Это демонстрирует управление аплетом из JavaScript.

    Пример 2: аплет Flashing Color Text

    Более сложный пример — аплет, отображающий «вспыхивающий» текст разными цветами. Текстовое поле и кнопка позволяют ввести новый текст. Этот аплет показан на Рисунке 15.1.

    Рисунок 15.1 Аплет Flashing text

    Вот исходный HTML:

    Этот аплет использует public-метод setString для специфицирования вспыхивающего текста. В HTML-форме обработчик onClick кнопки позволяет менять строку «Hello, world!» через вызов метода setString .

    Здесь colorText это имя HTML-формы и textBox — имя текстового поля. Обработчик события передает значение, которое пользователь ввел в текстовое поле, методу setString Java-аплета.

    Управление Java Plug-in’ами

    Каждый plug-in документа отражается в JavaScript как элемент массива embeds . Например, следующий HTML-код включает AVI plug-in в документ:

    Если это первый plug-in в документе, Вы может получить к нему доступ одним из следующих способов:

    Если plug-in ассоциирован с Java-классом netscape.plugin.Plugin , Вы можете получить доступ к его static-переменным и методам тем способом, которым Вы получаете доступ к переменным и методам.

    Массив embeds имеет свойство length , document.embeds.length , указывающего количество plug-in’ов, встроенных в документ.

    Книга Plug-in Guide содержит информацию о:

    • вызове Java-методов из plug-in’ов
    • вызове методов plug-in’а из Java

    Взаимодействие Java и JavaScript

    Если Вы хотите использовать объекты JavaScript в Java, Вы обязаны импортировать пакет netscape.javascript в Ваш Java-файл. Этот пакет определяет следующие классы:

    • netscape.javascript.JSObject дает коду Java доступ к методам и свойствам JavaScript.
    • netscape.javascript.JSException позволяет Java-коду обрабатывать ошибки JavaScript.
    • netscape.plugin.Plugin дает клиентскому JavaScript и аплетам возможность работать с plug-in’ом.

    Начиная с JavaScript 1.2, эти классы поставляются в .jar-файле; в предыдущих версиях JavaScript эти классы находились в .zip-файле. См. также книгу Клиентский JavaScript. Справочник.

    Для доступа к классам LiveConnect поместите файл .jar или .zip в CLASSPATH компилятора JDK одним из следующих способов:

    • создайте переменную окружения CLASSPATH для специфицирования пути и имени .jar или .zip-файла.
    • специфицируйте размещение .jar или .zip-файла при компиляции путем использования команды -classpath в командной строке.

    Например, в Navigator 4. 0 для Windows NT классы поставляются в файле java40.jar в директории Program\Java\Classes ниже директории Navigator’а. Вы можете специфицировать переменную окружения в Windows NT, открыв System из Control Panel и создав пользовательскую переменную окружения CLASSPATH со значением типа такого:


    См. в документации к Sun JDK информацию о CLASSPATH .

    ПРИМЕЧАНИЕ: Поскольку Java является строго типизированным языком, а JavaScript типизирован слабо, машина выполнения JavaScript конвертирует значения аргументов в подходящие типы данных других языков, когда Вы используете LiveConnect. См. полную информацию в разделе «Конвертация Типов Данных».

    Использование классов LiveConnect

    Все JavaScript-объекты появляются в коде Java как экземпляры netscape.javascript.JSObject . Когда Вы вызываете метод в Вашем Java-коде, Вы можете передать ему JavaScript-объект в качестве одного из аргументов. Для этого Вы обязаны определить соответствующий формальный параметр метода как имеющего тип JSObject .

    Также всегда при использовании JavaScript-объектов в Вашем Java-коде, Вы должны помещать вызов JavaScript-оъекта внутри блока операторов try. catch , который обрабатывает ошибки типа netscape.javascript.JSException . Это дает Java-коду возможность обрабатывать ошибки выполнения кода JavaScript, которые появляются в Java как исключения типа JSException .

    Доступ к JavaScript с помощью JSObject

    Например, Вы работаете с Java-классом JavaDog . Как показано в следующем коде, конструктор JavaDog принимает в качестве параметра JavaScript-объект jsDog , который определен как имеющий тип JSObject :

    Обратите внимание, что метод getMember из JSObject используется для доступа к свойствам JavaScript-объекта. Предыдущий пример использует getMember для присвоения значения JavaScript-свойства jsDog.breed Java-члену данных JavaDog.dogBreed .

    ПРИМЕЧАНИЕ: Лучше было бы поместить вызов getMember в блоке try. catch для отлова ошибок типа JSException . См. «Обработка Исключений JavaScript в Java».

    Чтобы лучше представить работу getMember , посмотрим на определение специального JavaScript-объекта Dog :

    Вы можете создать в JavaScript Dog -экземпляр gabby :

    При вычислении gabby.color Вы увидите, что оно имеет значение «chocolate». Теперь, предположим, Вы создаете JavaDog -экземпляр в Вашем JavaScript-коде, передавая объект gabby конструктору:

    Если Вы вычисляете javaDog.dogColor , Вы увидите, что оно также имеет значение «chocolate», поскольку метод getMember Java-конструктора присваивает свойству dogColor значение gabby.color .

    Обработка исключений JavaScript в Java

    Если код JavaScript, вызванный из Java, терпит неудачу на этапе прогона, он вызывает исключение. Если Вы вызываете JavaScript-код из Java, Вы можете отловить это исключение в блоке операторов try. catch . Исключение JavaScript доступно Вашему Java-коду как экземпляр netscape.javascript . JSException.
    JSException это Java-оболочка вокруг исключения любого типа, вызванного JavaScript, аналогично тому, как JSObject -экземпляры являются оболочками для JavaScript-объектов.

    Используйте JSException при вычислении JavaScript-кода в Java. Если JavaScript-код не вычисляется из-за ошибки компиляции JavaScript или какой-нибудь другой ошибки времени выполнения, интерпретатор JavaScript генерирует сообщение об ошибке, которое конвертируется в JSException -экземпляр.

    Например, Вы можете использовать try. catch для обработки исключений LiveConnect:

    Здесь оператор eval терпит неудачу, если foo не определено. Блок catch выполняет метод jsCodeFailed , если оператор eval в блоке try вызывает JSException ; метод otherCodeFailed выполняется, если блок try вызывает какую-нибудь другую ошибку.

    Доступ к клиентскому JavaScript

    Получение дескриптора для окна JavaScript

    Прежде чем Вы получите доступ к JavaScript в Navigator’е, Вы обязаны получить дескриптор/handle для окна Navigator’а. Используйте метод getWindow класса netscape.javascript.JSObject для получения дескриптора окна, передавая его объекту Applet .

    Например, если win это ранее объявленная переменная типа JSObject , следующий Java-код присваивает дескриптор окна переменной win :

    Доступ к объектам и свойствам JavaScript

    Метод getMember класса netscape.javascript.JSObject дает доступ к объектам и свойствам JavaScript. Вызывайте getWindow для получения дескриптора окна JavaScript, затем вызывайте getMember для доступа к каждому JavaScript-объекту. Заметьте, что JavaScript-объекты появляются в Java как экземпляры класса netscape.javascript.JSObject .

    Например, следующий код Java дает доступ к JavaScript-объекту document.testForm через переменную myForm :

    Вы могли бы использовать следующие строки вместо myForm=win.eval(«document.testForm») :

    Если JavaScript-объект document.testForm.jazz это переключатель/checkbox, следующий код Java дает доступ к его свойству checked :

    Вызов методов JavaScript

    Метод eval класса netscape.javascript.JSObject позволяет вычислять произвольные выражения JavaScript. Используйте метод getWindow для получения дескриптора окна JavaScript, затем используйте eval для доступа к JavaScript-методу.

    Вот синтаксис вызова методов JavaScript:

    expression это JavaScript-выражение, которое вычисляется в вызов JavaScript-метода.

    Например, следующий код Java использует eval для вызова JavaScript-метода alert , если возникает событие MouseUp :

    По-другому можно вызвать JavaScript-методы JSObject -методом call . Используйте следующий вызов JavaScript-метода из Java, кода Вы хотите передать Java-объекты в качестве аргументов:

    где argArray это массив Java-объектов, используемый для передачи аргументов JavaScript-методу.

    Если Вы хотите передать примитивные значения JavaScript-методу, Вы обязаны использовать Java-оболочки объектов (такие как Integer , Float и Boolean ), а затем наполнить Array такими объектами.

    Пример: Hello World

    Вернемся к примеру HelloWorld, изменим метод paint в коде Java таким образом, чтобы он вызывал JavaScript-метод alert (с сообщением «Painting!»):

    Можно добиться того же эффекта таким образом:

    ПРИМЕЧАНИЕ: Может понадобиться перезагрузка HTML-страницы путем выбора Open Page в меню File вместо щелчка по кнопке Reload, чтобы гарантировать реинициализацию аплета.

    Вызов пользовательский функций

    Вы можете также вызвать определенные пользователем функции из Java-аплета. Например, добавьте следующую функцию в HTML-страницы с аплетом HelloWorld:

    Эта простая функция выведет диалог alert, содержащий имя и версию используемого клиентского программного обеспечения. Затем измените метод init в Вашем Java-коде аналогично тому, как Вы изменили paint :

    Заметьте, что args2 объявлен как массив без элементов, хотя этот метод не принимает аргументов. Когда Вы рекомпилируете аплет и перезагрузите HTML-страницу (и реинициализируете аплет), JavaScript-диалог alert выведет версию Navigator’а, который запущен у Вас. Это простая иллюстрация вызова пользовательской функции из Java.

    Конвертация типов данных

    Поскольку Java является строго типизированным языком, а JavaScript типизирован слабо, машина выполнения JavaScript конвертирует значения аргументов в подходящие типы данных других языков, когда Вы используете LiveConnect. Эта конвертация рассматривается в следующих разделах:

    Конвертация JavaScript в Java

    Если Вы вызываете Java-метод и передаете ему параметры из JavaScript, тип передаваемых параметров конвертируется в соответствии с правилами, описанными в следующих разделах:

    Return-значения методов netscape.javascript.JSObject всегда конвертируются в экземпляры java.lang.Object . Правила конвертации этих return-значений также описаны в этих разделах.

    Например, если JSObject.eval возвращает JavaScript-число, Вы можете найти правило конвертации этого числа в экземпляр java.lang.Object в разделе «Числа».

    Числа

    Если Вы передаете числовые типы JavaScript в качестве параметров Java-методам, Java конвертирует значения таким образом:

    Объект Описание

    Точное значение переносится в Java без округления и потери точности или знака.

    Создается новый java.lang.Double -экземпляр, точное значение переносится в Java без округления и потери точности или знака.

    Значения конвертируются в строки. Например,

    • 237 становится «237»
  • Значения 0 и NaN конвертируются в false.
  • Другие значения конвертируются в true.
  • Тип Java-парамера Правила конвертации
    • Значения округляются до float-точности.
    • Значения, которые слишком велики или малы, округляются до +infinity или -infinity.
    • Значения округляются с использованием режима round-to-negative-infinity.
    • Значения, которые слишком велики или малы, дают ошибку времени выполнения.
    • NaN -значения конвертируются в 0.

    Если JavaScript-число передается как параметр в Java-метод, ожидающий экземпляр java.lang.String , число конвертируется в строку. Используйте операцию == для сравнения результата конвертации с другими строковыми значениями.

    Булевы

    Если Вы передаете Булев тип JavaScript в качестве параметра Java-методам, Java конвертирует значения таким образом:

    Все значения конвертируются напрямую в Java-эквиваленты.

    Создается новый экземпляр java.lang.Boolean . Каждый параметр создает новый экземпляр, а не один экземпляр, того же примитивного типа.

    Значения конвертируются в строки. Например:

  • true становится «true»
  • false становится «false»
  • true становится 1

  • false становится 0
  • Тип Java-параметра Правила конвертации

    Если JavaScript Boolean передается в качестве параметра Java-методу, который ожидает экземпляр java.lang.String , Boolean конвертируется в строку. Используйте операцию == для сравнения результата конвертации с другими строковыми значениями.

    Строковые

    Если Вы передаете строковые значения JavaScript в качестве параметров Java-методам, Java конвертирует значения так:

    Строка JavaScript конвертируется в экземпляр java.lang.String с ASCII-значением.

    Все значения конвертируются в числа, как описано в спецификации ECMA-262.

    Все значения конвертируются в числа.

    Тип Java-параметра Правила конвертации>
    • Пустая строка становится false.
    • Все другие значения становятся true.

    Undefined-значения

    Если Вы передаете undefined-значения JavaScript в качестве параметров Java-методам, Java конвертирует значения так:

    Значение конвертируется в экземпляр java.lang.String, значением которого становится строка «undefined».

    Значение становится false.

    Значение становится NaN .

    Значение становится 0.

    Конвертация undefined-значений возможна только в JavaScript 1.3. Предыдущие версии JavaScript не поддерживают значение undefined.

    Если JavaScript-значение undefined передается в качестве параметра Java-методу, который ожидает экземпляр java.lang.String , значение undefined конвертируется в строку. Используйте операцию == для сравнения результата конвертации с другими строковыми значениями.

    Null-значения

    Если Вы передаете null-значения JavaScript в качестве параметров Java-методам, Java конвертирует значения так:

    Тип Java-параметра Правила конвертации

    Любой класс
    Интерфейс любого типа

    Значение становится null.

    Значение становится 0.

    Значение становится false.

    Объекты JavaArray и JavaObject


    В большинстве случаев, если Вы передаете JavaScript JavaArray или JavaObject в качестве параметров Java-методу, Java просто снимает оболочку с объекта; иногда объект приводится к другому типу данных в соответствии с правила из таблицы:

    Тип Java-параметра Правила конвертации

    Любой интерфейс или класс, который совместим при присвоении с развернутым объектом.

    Оболочка с объекта снимается.

    Оболочка с объекта снимается, вызывается метод toString развернутого Java-объекта, результат возвращается как новый экземпляр java.lang.String .

    Оболочка с объекта снимается, и возникает одна из следующих ситуаций:

    • Если развернутый Java-объект имеет метод doubleValue , JavaArray или JavaObject конвертируется в значение, возвращаемое этим методом.
    • Если развернутый Java-объект не имеет метода doubleValue , возникает ошибка.

    Оболочка с объекта снимается, и возникает одна из следующих ситуаций:

    • Если объект null, он конвертируется в false.
    • Если объект имеет любое другое значение, он конвертируется в true.

    В JavaScript 1.2 и ранее — оболочка с объекта снимается, и возникает одна из следующих ситуаций:

    • Если развернутый объект имеет метод booleanValue, исходный объект конвертируется в return-значение.
    • Если развернутый объект не имеет метода booleanValue, конвертация терпит неудачу.
    Тип Java-параметра Правила конвертации

    Интерфейс или класс совместимы при присвоении, если развернутый объект является экземпляром типа Java-параметра. То есть следующий оператор обязан возвратить true:

    JavaClass-объекты

    Если Вы передаете JavaScript JavaClass -объект как параметр Java-методу, Java конвертирует этот объект в соответствии со следующими правилами:

    Оболочка с объекта снимается.

    Объект JavaClass оборачивается в новый экземпляр java.lang.JSObject .

    Оболочка с объекта снимается, вызывается метод toString развернутого Java-объекта, результат возвращается как новый экземпляр java.lang.String .

    Оболочка с объекта снимается и возникает одна из следующих ситуаций:

    • Если объект null, он конвертируется в false.
    • Если объект имеет какое-нибудь другое значение, он конвертируется в true.

    В JavaScript 1.2 и ранее — оболочка с объекта снимается, и возникает одна из следующих ситуаций:

    • Если развернутый объект имеет метод booleanValue, исходный объект конвертируется в return-значение.
    • Если развернутый объект не имеет метода booleanValue, конвертация терпит неудачу.
    Тип Java-параметра Правила конвертации

    Другие объекты JavaScript

    Если Вы передаете любой другой объект JavaScript в качестве параметра Java-методу, Java конвертирует этот объект в соответствии со следующими правилами:

    Объект оборачивается в новый экземпляр java.lang.JSObject .

    Оболочка с объекта снимается, вызывается метод toString развернутого Java-объекта, результат возвращается как новый экземпляр java.lang.String .

    Объект конвертируется в значение с использованием логики оператора ToPrimitive , описанного в ECMA-262. Подсказка PreferredType, используемая с этим оператором, это Number.

    Оболочка с объекта снимается и возникает одна из следующих ситуаций:

    • Если объект null, он конвертируется в false.
    • Если объект имеет какое-нибудь другое значение, он конвертируется в true.

    В JavaScript 1.2 и ранее — оболочка с объекта снимается, и возникает одна из следующих ситуаций:

    • Если развернутый объект имеет метод booleanValue, исходный объект конвертируется в return-значение.
    • Если развернутый объект не имеет метода booleanValue, конвертация терпит неудачу.
    Тип Java-параметра Правила конвертации

    Конвертация из Java а JavaScript

    Передаваемые из Java в JavaScript значения конвертируются так:

    • Java byte, char, short, int, long, float и double конвертируются в числа JavaScript.
    • Java boolean конвертируется в JavaScript boolean.
    • Объект класса netscape.javascript.JSObject конвертируется в оригинальный JavaScript-объект.
    • Массивы Java конвертируются в JavaScript псевдо-Array-объект; этот объект ведет себя так же, как и JavaScript-объект Array : Вы может получить доступ к нему с синтаксисом arrayName[index] (где index это целое число) и определить его размер с помощью arrayName.length .
    • Java-объект любого другого класса конвертируется в JavaScript-объект-оболочку, который может использоваться для доступа к методам и полям Java-объекта:
      • Конвертация этой оболочки в строку вызывает метод toString объекта-оригинала.
      • Конвертация в число вызывает метод doubleValue , если возможно, иначе терпит неудачу.
      • Конвертация в boolean в JavaScript 1.3 возвращает false, если объект null, иначе — true.
      • Конвертация в boolean в JavaScript 1.2 и в более ранних версиях вызывает метод booleanValue , если возможно, иначе терпит неудачу.

      Заметьте, что экземпляры java.lang.Double и java.lang.Integer конвертируются в JavaScript-объекты, а не в числа JavaScript. Аналогично, экземпляры java.lang.String также конвертируются в объекты JavaScript, а не в строки JavaScript.

      Java String -объекты также соответствуют JavaScript-оболочкам. Если Вы вызываете JavaScript-метод, который требует JavaScript-строку и передает ее оболочке, Вы получите ошибку. Вместо этого конвертируйте оболочку в JavaScript-строку, присоединяя к ней пустую строку, как показано здесь:

      Оглавление | Назад | Вперед | Индекс

      Наши ссылки на веб-страницы, можно скопировать html-код ссылки

      Книги по математике и физике, программы HTML, компьютерные технологии Документация HTML, XML, JavaScript на русском языке для разработчиков W3C

      Примечание. Удобная текстовая ссылка для форумов, блогов, цитирования материалов веб-сайта, код html можно скопировать и просто вставить в Ваши веб-страницы при цитировании материалов нашего веб-сайта. Материал носит неофициальный характер и приведен для ознакомления.

      Основы языка JavaScript

      1. Основы языка JavaScript *

      1.1. Основные особенности JavaScript *

      1.2. Возможности языка JavaScript *

      1.3. Основные типы данных *

      1.4. Переменные. Приведение типов *

      1.5. SCRIPT-вставки в HTML-документе *

      2. Операторы, выражения, функции *

      2.1. Операторы: арифметических действий, присваивания, инкрементные, декрементные. Условные выражения *

      2.2. Строковые операции *

      2.3. Побитовые операции присваивания *

      2.4. Операторы сравнения *

      2.5. Старшинство операций *

      2.7. Условный оператор if *

      3. Объектная модель *

      3.1. Классы, объекты, поля данных, методы *

      3.2. Работа с полями данных и методами уже существующих объектов *

      3.3. Задание нового класса объектов. Квалификатор this *

      3.4. Операторы for и with для работы с объектами *

      3.5. Правила работы с объектами *

      3.6. Динамическое формирование документа *

      4. Классы и объекты языка JavaScript *

      4.1. Класс Global (задан неявно) *

      4.3. Класс Window *

      4.4. Коллекция фреймов (window.frames) *

      4.5. Класс Document (window.document) *

      4.6. Класс Location (window.location) *

      4.7. Класс Link (document.link) *

      4.8. Класс History *

      4.9. Класс MimeType *

      4.10. Класс Navigator *

      5. Экранные формы *

      5.1. Класс Form (document.forms[i]) *

      5.2. Классы Button, Checkbox, Hidden, Password, Radio, Reset, Submit, Text, Textarea *

      5.3. Класс Checkbox *

      5.6. Классы Text и Password *

      5.7. Класс Textarea *

      5.8. Классы Select и Option *

      6. Классы для программной обработки данных *

      6.1. Класс Object *

      6.1.1. Свойство constructor *

      6.1.2. Свойство prototype *

      6.2. Класс Number *

      6.3. Класс Boolean *

      6.4. Класс String *

      6.6. Класс Function *

      6.7. Класс JavaArray *

      6.8. Класс JavaClass *

      6.9. Класс JavaObject *

      6.10. Класс JavaPasckage *

      6.11. Класс Screen *

      6.11.1. Свойства availHeight и availWidth для Netscape Navigator *

      6.11.2. Свойство bufferDepth для Internet Explorer *

      6.11.3. Свойство colorDepth *

      6.11.4. Свойства height и width *

      6.11.5. Свойство pixelDepth для Netscape Navigator *

      6.11.6. Свойство updateInterval для Internet Explorer *

      JavaScript — это относительно простой объектно-ориентированный язык, предназначенный для создания небольших клиентских и серверных приложений для Internet. Программы, написанные на языке JavaScript, включаются в состав HTML-документов и распространяются вместе с ними. Программы просмотра (браузеры – от англ. browser ) типа Netscape Navigator и Microsoft Internet Explorer распознают встроенные в текст документа программы-вставки ( script- коды) и выполняют их. Таким образом, JavaScript — интерпретируемый язык программирования. Примерами программ на JavaScript могут служить программы, проверяющие введенные пользователем данные или выполняющие какие-то действия при открытии или закрытии документа. Такие программы могут реагировать на действия пользователя — нажатие кнопок «мыши», ввод данных в экранной форме или перемещение «мыши» по странице. Более того, JavaScript-программы могут управлять самим браузером и атрибутами документа.

      Язык JavaScript, будучи схожим по синтаксису с языком Java, за исключением объектной модели, в то же время не обладает такими свойствами, как статические типы данных и строгой типизацией. В JavaScript, в отличие от Java, понятие классов не является основой синтаксических конструкций языка. Такой основой является небольшой набор предопределенных типов данных, поддерживаемых исполняемой системой: числовые, булевские и строковые; функции, которые могут быть как самостоятельными, так и методами объектов (метод в терминологии JavaScript — не что иное, как функция/подпрограмма); объектная модель с большим набором предопределенных объектов со своими свойствами и методами, а также правилами задания в программе пользователя новых объектов.

      Для создания программ на JavaScript не требуется никаких дополнительных средств— необходим лишь браузер, поддерживающий язык JavaScript соответствующей версии и текстовый редактор, позволяющий создавать HTML-документы. Так как программа на JavaScript встраивается непосредственно в текст HTML-документа, вы можете немедленно увидеть результаты своей работы во время просмотра документа браузером и при необходимости внести изменения.

      С его помощью можно динамически управлять отображением и содержимым HTML-документов. Можно записывать в отображаемый на экран документ произвольный HTML-код в процессе синтаксического анализа загруженного браузером документа. С помощью объекта Document можно генерировать документы «с нуля» в зависимости от предыдущих действий пользователя или каких-либо иных факторов.

      JavaScript позволяет контролировать работу браузера. Например, объект Window поддерживает методы, позволяющие выводить на экран всплывающие диалоговые окна, создавать, открывать и закрывать новые окна браузера, задавать режимы прокрутки и размеры окон и т.д.


      JavaScri pt позволяет взаимодействовать с содержимым документов. Объект Document и содержащиеся в нем объекты позволяют программам читать части HTML- документа и иногда взаимодействовать с ними. Сам текст прочитать невозможно, но можно, например, получить список гипертекстовых ссылок, имеющихся в данном документе. На текущий момент широкие возможности взаимодействия с содержимым документов обеспечивает объект Form и объекты, которые он может содержать: Button, Checkbox, Hidden, Password, Radio, Reset, Select, Submit, Text и Textarea.

      JavaScript обеспечивает взаимодействие с пользователем. Важной особенностью этого языка является реализованная в нем возможность определять обработчики событий — произвольные порции кода, которые выполняются при наступлении конкретных событий (обычно действий пользователя). JavaScript позволяет использовать в качестве обработчиков событий любые новые предварительно заданные функции. Например, можно написать программу, которая выведет в строке состояния специальное сообщение, если пользователь установит указатель «мыши» на гипертекстовую ссылку, или выведет на экран диалоговое окно с запросом на подтверждение выполнения некоторого действия, или осуществит проверку введенного пользователем значения и в случае ошибки ввода выдаст соответствующую диагностику и заставит ввести правильное значение.

      JavaScript дает возможность выполнять произвольные математические вычисления. Кроме того, этот язык имеет развитые средства работы со значениями даты и времени. JavaScript был создан в качестве альтернативы CGI -программам и языку сценариев Perl , а также в качестве дополнения м в ряде случаев альтернативы языку Java.

      Ниже приведена таблица, в которой проводится сравнение Java и JavaScript:

      JavaScript

      Исходный код программ встраивается непосредственно в HTML-документ либо загружается из независимых файлов.

      Исходный код программ не распространяется с приложением -апплетом. Апплеты загружаются с сервера из независимых файлов.

      Программа выкладывается на сервер в виде исходного кода в текстовой форме и в дальнейшем интерпретируется (без предварительной компиляции) браузером после загрузки ее с сервера.

      Программа компилируется в машинно-независимый байтовый код Java-код, после чего выкладыватся на сервер. Браузер (виртуальная Java-машина) исполняет Java-код.

      Объектный . Можно программировать как без использования объектного программирования, так и используя предопределенные встроенные классы. Имеется теоретическая возможность расширения этих классов, но реально она никогда не используется.

      Объектно-ориентированный . Программировать без использования объектного программирования нельзя. Апплеты состоят из классов с возможностью иерархического наследования по традиционной схеме наследования. Использование наследования и полиморфизма – основа программирования в Java.

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

      Структура объектов полностью задается на этапе компиляции их классов.

      Свободная типизация : элементарные типы данных переменных не описываются, при присваивании тип левой части всегда определяется по результату присваивания (т.е. по правой части)

      Строгая типизация : типы данных любых переменных должны быть описаны перед использованием, тип левой части должен совпадать с типом правой (за редкими исключениями, когда работает автоматическое приведение типа результата к типу левой части)

      Динамическое связывание кода с объектами : ссылки на объекты проверяются во время выполнения программы.

      Статическое связывание кода с объектами : ссылки на объекты должны существовать на момент компиляции

      Значения переменных, функций и выражений бывают следующих типов:

      в десятичной системе единиц: 0, 29, 70, -147 и т.п.;

      в 16-ричной: 0х70 или 0х70, 0 X FA7D0 и т.п.;

      в 8-ричной: 070, 0710 ( Внимание. В едущий ноль воспринимается как символ 8-ричного числа ) и т.п.

      0.0, -2.9, 0.7E1, 14.7e-2, 1e+308 (максимальное вещественное число), 1.001e-305 (минимальное по модулю вещественное число, отличное от нуля) и т.п.;

    • логические (булевские): true и false;
    • строковые: » Привет, все! «, » ОК «, ‘ Слово «Привет!» с кавычками внутри строки’, «Другой вариант ‘Привет’ с кавычками внутри строки» и т.п. (допускаются оба типа кавычек и многократное использование таких пар внутри друг друга). Специальные символы обозначаются комбинацией символа \ и буквы (или последовательности цифр), например: \b — «забой», \n — перевод на новую строку, \» — » кавычка «.
    • null — специальное значение для обозначения “пустого множества” значений.
    • Глобальные переменные можно вводить в любом месте текста программы путем простого присваивания значения . Но необходимо, чтобы переменная была определена до того момента, когда вызывается при исполнении:

      и т.п. При этом тип переменной приводится к типу присваиваемого значения, причем в последующем этой же переменной можно присвоить значение другого типа:

      myVariable=» Теперь это текстовая переменная «

      При задании переменной использование зарезервированного слова var не обязательно, но желательно, т.к. помогает при использовании отладчика фирмы Microsoft и делает текст программы более структурированным. На деле вместо переменной в текущем объекте window создается новое поле с таким именем. В функциях при задании локальных переменных использование var обязательно (иначе будет создана глобальная переменная).

      При наличии численных и строковых значений в одном выражении идет приведение к строковому типу. Значением переменной

      a=7+» раз отмерь,»+1+»раз присвой «

      будет строка «7 раз отмерь, 1 раз присвой «.

      Стоит отметить, что существуют также функции parseFloat и parseInt , которые осуществляют преобразование из строкового значения в численное.

      Идентификатором переменной может быть последовательность символов из набора букв от «A» до «Z», от «a» до «z», цифр от «0» до «9», а также символ подчеркивания «_». При этом первым символом имени не может быть цифра, а заглавные и строчные буквы отличаются (т. е. имена MyVariable и myvariable относятся к разным переменным).

      Кроме глобальных переменных в функции или другом блоке кода можно определить локальные, для них областью видимости будет только функция (без кода), в которой они определены:

      Для встраивания программы на JavaScript в HTML — файл используются теги . При этом результат работы можно увидеть сразу и при необходимости внести изменения.

      Вызов java-методов в javascript-коде

      Я создал метод содержимого класса Java, возвращающий String, мой вопрос — как вызвать эту функцию в моем javascript-коде, чтобы использовать возвращаемое значение из java-метода. Я хочу называть код Java на стороне клиента, встроенный в браузер.

      вот пример того, о чем я говорю:

      на моей веб-странице у меня есть код javascript, вот некоторые из них:

      Я хочу создать методы содержимого класса Java для предоставления данных этой функции javascript «GanttTaskInfo». например, для получения имени, получения идентификатора и даты. хорошо, я думаю, что на этот раз я ясно: D Я искал способ вызова java-методов в javascript, и я нашел апплеты, как вы сказали, но я думаю, что это не полезно для меня. Еще раз спасибо

      Когда на стороне сервера используются веб-сервисы — возможно, restfull с json. Например, посмотрите на этот учебник http://developers-blog.org/blog/default/2010/04/27/JQuery-Ajax-Client-and-Jersey-Rest-JSON-Endpoint-Example.

      Когда java-код находится в апплете, вы можете использовать javascript-мост. Мост между языками программирования Java и JavaScript известен неформально LiveConnect, реализован в java-плагине. Раньше функциональность LiveConnect, зависящая от Mozilla, такая как возможность вызова статических методов Java, создания экземпляров новых объектов Java и ссылок на сторонние пакеты из JavaScript, теперь доступна во всех браузерах.

      Ниже приведен пример из документации. Посмотрите methodReturningString .

      Веб-страница и код JavaScript:

      Java — это серверный язык, а javascript — язык на стороне клиента. Оба не могут общаться. Если вы настроили серверную часть script с помощью Java, вы можете использовать AJAX на клиенте, чтобы отправить асинхронный запрос на него и таким образом, вызывать любые возможные функции Java. Например, если вы используете jQuery как js framework, вы можете взглянуть на метод $.ajax() . Или, если вы хотите сделать это, используя простой javascript, здесь учебник.

      Введение в JavaScript

      Давайте посмотрим, что такого особенного в JavaScript, чего можно достичь с его помощью и какие другие технологии хорошо с ним работают.

      Что такое JavaScript?

      Изначально JavaScript был создан, чтобы «сделать веб-страницы живыми».

      Программы на этом языке называются скриптами. Они могут встраиваться в HTML и выполняться автоматически при загрузке веб-страницы.

      Скрипты распространяются и выполняются, как простой текст. Им не нужна специальная подготовка или компиляция для запуска.

      Это отличает JavaScript от другого языка – Java.

      Когда JavaScript создавался, у него было другое имя – «LiveScript». Однако, язык Java был очень популярен в то время, и было решено, что позиционирование JavaScript как «младшего брата» Java будет полезно.

      Со временем JavaScript стал полностью независимым языком со своей собственной спецификацией, называющейся ECMAScript, и сейчас не имеет никакого отношения к Java.

      Сегодня JavaScript может выполняться не только в браузере, но и на сервере или на любом другом устройстве, которое имеет специальную программу, называющуюся «движком» JavaScript.

      У браузера есть собственный движок, который иногда называют «виртуальная машина JavaScript».

      Разные движки имеют разные «кодовые имена». Например:

      • V8 – в Chrome и Opera.
      • SpiderMonkey – в Firefox.
      • …Ещё есть «Trident» и «Chakra» для разных версий IE, «ChakraCore» для Microsoft Edge, «Nitro» и «SquirrelFish» для Safari и т.д.

      Эти названия полезно знать, так как они часто используются в статьях для разработчиков. Мы тоже будем их использовать. Например, если «функциональность X поддерживается V8», тогда «Х», скорее всего, работает в Chrome и Opera.

      Движки сложны. Но основы понять легко.

      1. Движок (встроенный, если это браузер) читает («парсит») текст скрипта.
      2. Затем он преобразует («компилирует») скрипт в машинный язык.
      3. После этого машинный код запускается и работает достаточно быстро.

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

      Что может JavaScript в браузере?

      Современный JavaScript – это «безопасный» язык программирования. Он не предоставляет низкоуровневый доступ к памяти или процессору, потому что изначально был создан для браузеров, не требующих этого.

      Возможности JavaScript сильно зависят от окружения, в котором он работает. Например, Node.JS поддерживает функции чтения/записи произвольных файлов, выполнения сетевых запросов и т.д.

      В браузере для JavaScript доступно всё, что связано с манипулированием веб-страницами, взаимодействием с пользователем и веб-сервером.

      Например, в браузере JavaScript может:

      • Добавлять новый HTML-код на страницу, изменять существующее содержимое, модифицировать стили.
      • Реагировать на действия пользователя, щелчки мыши, перемещения указателя, нажатия клавиш.
      • Отправлять сетевые запросы на удалённые сервера, скачивать и загружать файлы (технологии AJAX и COMET).
      • Получать и устанавливать куки, задавать вопросы посетителю, показывать сообщения.
      • Запоминать данные на стороне клиента («local storage»).

      Чего НЕ может JavaScript в браузере?

      Возможности JavaScript в браузере ограничены ради безопасности пользователя. Цель заключается в предотвращении доступа недобросовестной веб-страницы к личной информации или нанесения ущерба данным пользователя.

      Примеры таких ограничений включают в себя:

      JavaScript на веб-странице не может читать/записывать произвольные файлы на жёстком диске, копировать их или запускать программы. Он не имеет прямого доступа к системным функциям ОС.

      Современные браузеры позволяют ему работать с файлами, но с ограниченным доступом, и предоставляют его, только если пользователь выполняет определённые действия, такие как «перетаскивание» файла в окно браузера или его выбор с помощью тега .

      Существуют способы взаимодействия с камерой/микрофоном и другими устройствами, но они требуют явного разрешения пользователя. Таким образом, страница с поддержкой JavaScript не может незаметно включить веб-камеру, наблюдать за происходящим и отправлять информацию в ФСБ.

      Различные окна/вкладки не знают друг о друге. Иногда одно окно, используя JavaScript, открывает другое окно. Но даже в этом случае JavaScript с одной страницы не имеет доступа к другой, если они пришли с разных сайтов (с другого домена, протокола или порта).

      Это называется «Политика одинакового источника» (Same Origin Policy). Чтобы обойти это ограничение, обе страницы должны согласиться с этим и содержать JavaScript-код, который специальным образом обменивается данными.

      Это ограничение необходимо, опять же, для безопасности пользователя. Страница http://anysite.com , которую открыл пользователь, не должна иметь доступ к другой вкладке браузера с URL http://gmail.com и воровать информацию оттуда.

      JavaScript может легко взаимодействовать с сервером, с которого пришла текущая страница. Но его способность получать данные с других сайтов/доменов ограничена. Хотя это возможно в принципе, для чего требуется явное согласие (выраженное в заголовках HTTP) с удалённой стороной. Опять же, это ограничение безопасности.

      Подобные ограничения не действуют, если JavaScript используется вне браузера, например — на сервере. Современные браузеры предоставляют плагины/расширения, с помощью которых можно запрашивать дополнительные разрешения.

      Что делает JavaScript особенным?

      Как минимум, три сильные стороны JavaScript:

      • Полная интеграция с HTML/CSS.
      • Простые вещи делаются просто.
      • Поддерживается всеми основными браузерами и включён по умолчанию.

      JavaScript – это единственная браузерная технология, сочетающая в себе все эти три вещи.

      Вот что делает JavaScript особенным. Вот почему это самый распространённый инструмент для создания интерфейсов в браузере.

      Хотя, конечно, JavaScript позволяет делать приложения не только в браузерах, но и на сервере, на мобильных устройствах и т.п.

      Языки «над» JavaScript

      Синтаксис JavaScript подходит не под все нужды. Разные люди хотят иметь разные возможности.

      Это естественно, потому что проекты разные и требования к ним тоже разные.

      Так, в последнее время появилось много новых языков, которые транспилируются (конвертируются) в JavaScript, прежде чем запустятся в браузере.

      Современные инструменты делают транспиляцию очень быстрой и прозрачной, фактически позволяя разработчикам писать код на другом языке, автоматически преобразуя его в JavaScript «под капотом».

      Примеры таких языков:

      • CoffeeScript добавляет «синтаксический сахар» для JavaScript. Он вводит более короткий синтаксис, который позволяет писать чистый и лаконичный код. Обычно такое нравится Ruby-программистам.
      • TypeScript концентрируется на добавлении «строгой типизации» для упрощения разработки и поддержки больших и сложных систем. Разработан Microsoft.
      • Flow тоже добавляет типизацию, но иначе. Разработан Facebook.
      • Dart стоит особняком, потому что имеет собственный движок, работающий вне браузера (например, в мобильных приложениях). Первоначально был предложен Google, как замена JavaScript, но на данный момент необходима его транспиляция для запуска так же, как для вышеперечисленных языков.

      Есть и другие. Но даже если мы используем один из этих языков, мы должны знать JavaScript, чтобы действительно понимать, что мы делаем.

      Использование языка JavaScript с HTML-формами

      Дата добавления: 2015-07-09 ; просмотров: 4842 ; Нарушение авторских прав

      Форма является единственным средством, которое предоставляет пользователю возможность вводить данные в Web-документы без помощи каких-либо программ. Взаимодействие JavaScript-программ и форм обеспечивается за счет того, что в языке JavaScript имеется множество объектов, соответствующих HTML-тегам, которые могут присутствовать в теге . Таким образом, поля ввода (text-field), области текста (text-area), селекторные кнопки, списки и контрольные переключатели не могут располагаться вне этого контейнера. Поля формы предоставляют возможность вводить данные и сохранять их для дальнейшей обработки. До появления языка JavaScript формы были единственным способом ввода данных в HTML-документы. В языке JavaScript имеется собственный метод (prompt()), обеспечивающий ввод текста, однако формы в этом случае предоставляют все же больше удобств. Тег

      Атрибут name задает имя формы, а атрибут enctype — тип кодирования для передаваемых данных формы (по умолчанию используется MIME). Посредством атрибута method определяется метод передачи данных формы, а посредством атрибута action — адрес URL для CGI-скрипта, который вызывается на сервере для обработки данных формы. Атрибут обработчика события on Submit используется для указания JavaScript-программы, вызываемой при активизации кнопки передачи данных. Эта кнопка задается в теге .

      Интерфейс CGI и язык JavaScript

      До появления броузера Navigator 2.0 и языка JavaScript данные HTML-формы обрабатывались только с помощью CGI-скрипта, работающего на сервере. Интерфейс CGI (Common Gateway Interface) — это стандарт обслуживания запросов, широко применяемый на интерактивных Web-узлах.
      Главным в концепции интерфейса CGI является CGI-скрипт (программа, которая принимает данные, передаваемые клиентом). Данные формы посылаются клиентом в закодированном виде. Скрипты, как правило, преобразовывают их для чтения и записывают в обычный текстовый файл или в базу данных на сервере. Программы CGI используются в разных целях, например для ведения журналов посещений (guest-book), для обработки данных форм HTML, электронной почты и даже для игр.
      При помощи языка JavaScript проверка правильности введенной пользователем информации может выполняться на локальной клиентской станции и в большинстве случаев не требует передачи данных на сервер. Значения атрибутов method и action используют главным образом разработчики программ CGI, которые принимают и обрабатывают данные формы. Возможности языка JavaScript по хранению данных ограничены: в настоящее время «ключики» (cookie) являются единственным способом хранения данных на локальном диске (см. главу 13), хотя серверный JavaScript-модуль в продукте Live Wire компании Netscape предоставляет возможность ведения баз данных. Программы на языке JavaScript предназначены для локальной обработки данных. Одной из главных проблем, возникающих при обработке данных форм, является проверка правильности таких данных, и язык JavaScript может помочь в этом. Если на локальном компьютере не производится проверки правильности форм, выполнение этой задачи должен взять на себя сервер. Тогда увеличится не только нагрузка на сервер, но и время реакции системы в целом, поскольку данные формы сначала передаются серверу, который проверяет их и при обнаружении ошибок пересылаются обратно вместе с сопроводительным сообщением. При большом количестве ошибок многократная передача исправленных данных занимает много времени и ресурсов. Проверка правильности данных формы при помощи JavaScript-программы перед передачей их на сервер имеет большие преимущества: во-первых, экономится время, а во-вторых, облегчается сетевой трафик. Кроме того, сервер, принимая данные формы, не выполняет проверки, предполагая, что переданная ему информация является полной и корректной.

      Контейнер . может содержать любой из приведенных в следующей таблице тегов элементов формы языка HTML.

      Описание Тег элемента Формы
      Контрольный переключатель
      Кнопка передачи формы
      Скрытое поле
      Кнопка
      Селекторная кнопка
      Список , в котором с помощью тегов задаются его элементы. Количество элементов списка не ограничено. В языке JavaScript элементам списка соответствует массив options, индексы которого начинаются с нуля. Элементы списка имеют свойство selected, которое содержит значение true, если данный элемент выбран, и false — в противном случае. В HTML-теге также можно указать атрибут selected и задать в нем элемент, выбранный по умолчанию. Чтобы получить информацию о состоянии элемента списка по умолчанию в JavaScript-программе, необходимо обратиться к свойству default Che eked элемента списка. Элементы списка имеют также свойство text, значением которого является текст, заданный после тега . Свойство списка selectedlndex возвращает индекс выбранного элемента. Списки могут быть представлены несколькими способами. Если в теге , в котором задается необходимое количество тегов . В списке этого типа можно выбрать только один элемент (single selection). Все элементы списка появляются после щелчка мышью на кнопке списка или на элементе списка, а когда список закрыт, отображается тот элемент, который выбран по умолчанию. На следующем рисунке слева изображен закрытый список (установка по умолчанию), а справа — открытый список. Если список содержит много элементов, в нем присутствует полоса прокрутки (scroll bar).

      Например, список, определенный в следующем документе, содержит три элемента:

      Илон Маск рекомендует:  Что такое код msql_fetch_array
      Понравилась статья? Поделиться с друзьями:
      Кодинг, CSS и SQL