Вы не можете передавать односимвольные строки в Java-метод, требующий аргумента типа char. Вы обязаны передавать в такие методы целое число, соответствующее Unicode-значению символа. Например, вот присвоение значения "H" переменной c:
c = new java.lang.Character(72)Если Вы передаёте Булев тип 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 становится 1false становится 0 |
Если JavaScript Boolean передаётся в качестве параметра Java-методу, который ожидает экземпляр java.lang.String, Boolean конвертируется в строку. Используйте операцию == для сравнения результата конвертации с другими строковыми значениями.
Если Вы передаёте числовые типы JavaScript в качестве параметров Java-методам, Java конвертирует значения таким образом:
double | Точное значение переносится в Java без округления и потери точности или знака. |
lava.lang.Double java.lang.Object | Создаётся новый java.lang.Double -экземпляр, точное значение переносится в Java без округления и потери точности или знака. |
float | Значения округляются до float-точности. Значения, которые слишком велики или малы, округляются до +infinity или -infinity. |
byte char int long short | Значения округляются с использованием режима round-to-negative-infinity. Значения, которые слишком велики или малы, дают ошибку времени выполнения. NaN-значения конвертируются в 0. |
java.lang.String | Значения конвертируются в строки. Например,237 становится "237" |
boolean | Значения 0 и NaN конвертируются в false.Другие значения конвертируются в true. |
Если JavaScript-число передаётся как параметр в Java-метод, ожидающий экземпляр java.lang.String, число конвертируется в строку. Используйте операцию == для сравнения результата конвертации с другими строковыми значениями.
В браузере Navigator LiveConnect даёт возможность использовать:
JavaScript для прямого доступа к переменным, методам, классам и пакетам Java. Управлять Java-аплетами и plug-in'ами с помощью JavaScript. Код Java для доступа к методам и свойствам JavaScript.Например, Вы работаете с Java-классом JavaDog. Как показано в следующем коде, конструктор JavaDog принимает в качестве параметра JavaScript-объект jsDog, который определён как имеющий тип JSObject:
import netscape.javascript.*;Обратите внимание, что метод getMember из JSObject используется для доступа к свойствам JavaScript-объекта. Предыдущий пример использует getMember для присвоения значения JavaScript-свойства jsDog.breed Java-члену данных JavaDog.dogBreed.
ПРИМЕЧАНИЕ: Лучше было бы поместить вызов getMember в блоке try...catch для отлова ошибок типа JSException. См. "Обработка Исключений JavaScript в Java".
Чтобы лучше представить работу getMember, посмотрим на определение специального JavaScript-объекта Dog:
function Dog(breed,color,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.
Давайте теперь отдельно рассмотрим использование Java для доступа к клиентскому JavaScript. Автор HTML-страницы обязан разрешить аплету доступ к JavaScript, специфицировав атрибут MAYSCRIPT тэга <APPLET>. Это предотвращает доступ аплета к JavaScript на странице без ведома автора страницы. Попытка получить доступ к JavaScript из аплета, не имеющего атрибут MAYSCRIPT, генерирует исключение. Тэг MAYSCRIPT нужен только для доступа Java к JavaScript; он не требуется для доступа JavaScript к Java.
Метод getMember класса netscape.javascript.JSObject даёт доступ к объектам и свойствам JavaScript. Вызывайте getWindow для получения дескриптора окна JavaScript, затем вызывайте getMember для доступа к каждому JavaScript-объекту. Заметьте, что JavaScript-объекты появляются в Java как экземпляры класса netscape.javascript.JSObject.
Например, следующий код Java даёт доступ к JavaScript-объекту document.testForm через переменную myForm:
public void init() {Вы могли бы использовать следующие строки вместо myForm=win.eval("document.testForm"):
JSObject doc = (JSObject) win.getMember("document");Если JavaScript-объект document.testForm.jazz это переключатель/checkbox, следующий код Java даёт доступ к его свойству checked:
public void init() {Если Вы передаёте любой другой объект 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 |
Оболочка с объекта снимается и возникает одна из следующих ситуаций:
Если объект null, он конвертируется в false.
Если объект имеет какое-нибудь другое значение, он конвертируется в true. В JavaScript 1.2 и ранее - оболочка с объекта снимается, и возникает одна из следующих ситуаций: Если развёрнутый объект имеет метод booleanValue, исходный объект конвертируется в return-значение. Если развёрнутый объект не имеет метода booleanValue, конвертация терпит неудачу. |
В этой главе рассматривается использование технологии LiveConnect, позволяющей коду Java и коду JavaScript взаимодействовать. Предполагается, что Вы уже знакомы с программированием на Java.
В главе имеются следующие разделы:
Что такое LiveConnect? Включение LiveConnect Консоль Java Работа с оболочками Взаимодействие JavaScript с Java Взаимодействие Java с JavaScript Конвертация типов данныхДополнительно об использовании LiveConnect см. JavaScript technical notes на сайте DevEdge.
Все JavaScript-объекты появляются в коде Java как экземпляры netscape.javascript.JSObject. Когда Вы вызываете метод в Вашем Java-коде, Вы можете передать ему JavaScript-объект в качестве одного из аргументов. Для этого Вы обязаны определить соответствующий формальный параметр метода как имеющего тип JSObject.
Также всегда при использовании JavaScript-объектов в Вашем Java-коде, Вы должны помещать вызов JavaScript-оъекта внутри блока операторов try...catch, который обрабатывает ошибки типа netscape.javascript.JSException. Это даёт Java-коду возможность обрабатывать ошибки выполнения кода JavaScript, которые появляются в Java как исключения типа JSException.
Если Вы передаёте JavaScript JavaClass-объект как параметр Java-методу, Java конвертирует этот объект в соответствии со следующими правилами:
java.lang.Class | Оболочка с объекта снимается. |
java.lang.JSObject java.lang.Object | Объект JavaClass оборачивается в новый экземпляр java.lang.JSObject. |
java.lang.String | Оболочка с объекта снимается, вызывается метод toString развёрнутого Java-объекта, результат возвращается как новый экземпляр java.lang.String. |
boolean |
Оболочка с объекта снимается и возникает одна из следующих ситуаций:
Если объект null, он конвертируется в false.
Если объект имеет какое-нибудь другое значение, он конвертируется в true.
В JavaScript 1.2 и ранее - оболочка с объекта снимается, и возникает одна из следующих ситуаций: Если развёрнутый объект имеет метод booleanValue, исходный объект конвертируется в return-значение.Если развёрнутый объект не имеет метода booleanValue, конвертация терпит неудачу. |
Консоль Java это окно Navigator'а отображающее сообщения Java. Если Вы используете переменные классов out или err в java.lang.System для вывода сообщения, сообщение появляется на консоли. Для показа Java-консоли, выберите Java Console в меню Communicator.
Вы можете использовать Java-консоль для показа сообщений пользователю или для трассировки значений переменных в различных точках при выполнении программы. Учтите, что многие пользователи отключают показ консоли.
Например, следующий код Java выводит сообщение "Hello, world!" в Java-консоль:
public void init() {Передаваемые из 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-строку, присоединяя к ней пустую строку, как показано здесь:
var JavaString = JavaObj.methodThatReturnsAString();Если Вы вызываете Java-метод и передаёте ему параметры из JavaScript, тип передаваемых параметров конвертируется в соответствии с правилами, описанными в следующих разделах:
Числа БулевыСтроки Undefined-значенияNull-значения Объекты JavaArray и JavaObjectJavaClass-объекты Другие объекты JavaScriptReturn-значения методов netscape.javascript.JSObject всегда конвертируются в экземпляры java.lang.Object. Правила конвертации этих return-значений также описаны в этих разделах.
Например, если JSObject.eval возвращает JavaScript-число, Вы можете найти правило конвертации этого числа в экземпляр java.lang.Object в разделе "Числа".
Поскольку Java является строго типизированным языком, а JavaScript типизирован слабо, машина выполнения JavaScript конвертирует значения аргументов в подходящие типы данных других языков, когда Вы используете LiveConnect. Эта конвертация рассматривается в следующих разделах:
Конвертация JavaScript в Java Конвертация Java в JavaScriptЕсли Вы передаёте null-значения JavaScript в качестве параметров Java-методам, Java конвертирует значения так:
Любой класс Интерфейс любого типа | Значение становится null. | ||||
byte char double float int long short | Значение становится 0. | ||||
boolean | Значение становится false. |
Если 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")В большинстве случаев, если Вы передаёте JavaScript JavaArray или JavaObject в качестве параметров Java-методу, Java просто снимает оболочку с объекта; иногда объект приводится к другому типу данных в соответствии с правила из таблицы:
Любой интерфейс или класс, который совместим при присвоении с развёрнутым объектом. | Оболочка с объекта снимается. |
java.lang.String | Оболочка с объекта снимается, вызывается метод toString развёрнутого Java-объекта, результат возвращается как новый экземпляр java.lang.String. |
byte char double float int long short | Оболочка с объекта снимается, и возникает одна из следующих ситуаций: Если развёрнутый Java-объект имеет метод doubleValue, JavaArray или JavaObject конвертируется в значение, возвращаемое этим методом. Если развёрнутый Java-объект не имеет метода doubleValue, возникает ошибка. |
boolean |
Оболочка с объекта снимается, и возникает одна из следующих ситуаций:
Если объект null, он конвертируется в false.
Если объект имеет любое другое значение, он конвертируется в true.
В JavaScript 1.2 и ранее - оболочка с объекта снимается, и возникает одна из следующих ситуаций: Если развёрнутый объект имеет метод booleanValue, исходный объект конвертируется в return-значение. Если развёрнутый объект не имеет метода booleanValue, конвертация терпит неудачу. |
Интерфейс или класс совместимы при присвоении, если развёрнутый объект является экземпляром типа Java-параметра. То есть следующий оператор обязан возвратить true:
unwrappedObject instanceof parameterType
Если код 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:
try {Здесь оператор eval терпит неудачу, если foo не определено. Блок catch выполняет метод jsCodeFailed, если оператор eval в блоке try вызывает JSException; метод otherCodeFailed выполняется, если блок try вызывает какую-нибудь другую ошибку.
Каждый аплет документа отражается в JavaScript как document.appletName, где appletName это значение атрибута NAME тэга <APPLET>. Массив applets также содержит все аплеты страницы; Вы можете обратиться к элементам этого массива по имени аплета (как в ассоциативном массиве) или по порядковому номеру аплета на странице (начиная с 0).
Например, рассмотрим аплет "Hello World" на языке Java:
import java.applet.Applet;Следующий HTML запускает и отображает аплет и именует его "HelloWorld" (в атрибуте NAME):
<APPLET CODE="HelloWorld.class" NAME="HelloWorld" WIDTH=150 HEIGHT=25>Если это первый аплет документа (самый верхний на странице), Вы можете обратиться к нему в JavaScript одним из следующих способов:
document.HelloWorldМассив applets имеет свойство length, document.applets.length, указывающее количество аплетов в документе.
Все public-переменные, объявленные в аплете и его классах и пакетах-предках, доступны в JavaScript. Static-методы и свойства, объявленные в аплете, доступны в JavaScript как методы и свойства объекта Applet. Вы можете получать и устанавливать значения свойств и вызывать методы, возвращающие строковые, числовые и Булевы значения.
Прежде чем Вы получите доступ к JavaScript в Navigator'е, Вы обязаны получить дескриптор/handle для окна Navigator'а. Используйте метод getWindow класса netscape.javascript.JSObject для получения дескриптора окна, передавая его объекту Applet.
Например, если win это ранее объявленная переменная типа JSObject, следующий Java-код присваивает дескриптор окна переменной win:
public class myApplet extends Applet {Например, Вы можете изменить вышеприведённый аплет HelloWorld:
переопределить его метод init, чтобы он объявлял и инициализировал строку myString определить метод setString, принимающий строковой аргумент, присвоить этот аргумент объекту myString и вызвать метод repaint. (Методы paint и repaint наследуются из java.awt.Component).Исходный код Java выглядит теперь так:
import java.applet.Applet;Сделав стоку сообщения переменной, Вы можете модифицировать её из JavaScript. Теперь изменим HTML-файл:
добавим форму с текстовым полем и кнопкой и создадим для кнопки обработчик onClick, вызывающий метод setString из HelloWorld со строкой из текстового поля в качестве аргумента.Файл HTML выглядит так:
<APPLET CODE="HelloWorld1.class" NAME="Hello" WIDTH=150 HEIGHT=25>Когда Вы компилируете аплет HelloWorld и загружаете HTML-страницу в Navigator, Вы сначала увидите "Hello, World!", выведенное на серой панели аплета. Однако Вы можете теперь изменить текст, введя новый в текстовом поле и щёлкнув кнопку. Это демонстрирует управление аплетом из JavaScript.
Более сложный пример - аплет, отображающий "вспыхивающий" текст разными цветами. Текстовое поле и кнопка позволяют ввести новый текст. Этот аплет показан на Рисунке 15.1.
Вернёмся к примеру HelloWorld, изменим метод paint в коде Java таким образом, чтобы он вызывал JavaScript-метод alert (с сообщением "Painting!"):
public void paint(Graphics g) {Затем добавим атрибут MAYSCRIPT в тэг <APPLET> на HTML-странице, рекомпилируем аплет и запустим его. При каждой прорисовке аплета (когда он инициализируется, когда Вы вводите новое текстовое значение и когда страница перезагружается) выводится JavaScript-бокс alert. Это простая иллюстрация вызова JavaScript из Java.
Можно добиться того же эффекта таким образом:
public void paint(Graphics g) {ПРИМЕЧАНИЕ: Может понадобиться перезагрузка HTML-страницы путём выбора Open Page в меню File вместо щелчка по кнопке Reload, чтобы гарантировать реинициализацию аплета.
Если какой-нибудь Java-метод создаёт массив и Вы обращаетесь к этому массиву в JavaScript, Вы работаете с JavaArray. Например, следующий код создаёт JavaArray x из 10 элементов типа int:
theInt = java.lang.Class.forName("java.lang.Integer")Подобно JavaScript-объекту Array, JavaArray имеет свойство length, которое возвращает количество элементов массива. В отличие от Array.length, JavaArray.length является свойством только для чтения, так как количество элементов в Java-массиве фиксируется в момент создания.
В JavaScript оболочка\wrapper это объект типа данных целевого языка, который содержит объект исходного языка. На стороне JavaScript Вы можете использовать объект-оболочку для доступа в методам и полям Java-объекта; вызов метода или доступ к свойству в оболочке приводит к вызову Java-объекта. На стороне Java - JavaScript-объекты оборачиваются в экземпляры класса netscape.javascript.JSObject и передаются в Java.
Если JavaScript-объект пересылается в Java, машина выполнения создаёт Java-оболочку типа JSObject; когда JSObject высылается из Java в JavaScript, машина выполнения развёртывает его в оригинальный тип JavaScript-объекта. Класс JSObject предоставляет интерфейс для вызова методов JavaScript и проверки свойств JavaScript.
Вот исходный HTML:
<APPLET CODE="colors.class" WIDTH=500 HEIGHT=60 NAME="colorApp">Этот аплет использует public-метод setString для специфицирования вспыхивающего текста. В HTML-форме обработчик onClick кнопки позволяет менять строку "Hello, world!" через вызов метода setString.
Здесь colorText это имя HTML-формы и textBox - имя текстового поля. Обработчик события передаёт значение, которое пользователь ввёл в текстовое поле, методу setString 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 для создания массива.
theClass = java.lang.Class.forName("java.lang.String")Если Вы передаёте строковые значения JavaScript в качестве параметров Java-методам, Java конвертирует значения так:
lava.lang.String java.lang.Object | Строка JavaScript конвертируется в экземпляр java.lang.String с ASCII-значением. | ||||||
byte double float int long short | Все значения конвертируются в числа, как описано в спецификации ECMA-262. | ||||||
char | Все значения конвертируются в числа. | ||||||
boolean | Пустая строка становится false.Все другие значения становятся true. |
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Если Вы передаёте 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.
Если JavaScript-значение undefined передаётся в качестве параметра Java-методу, который ожидает экземпляр java.lang.String, значение undefined конвертируется в строку. Используйте операцию == для сравнения результата конвертации с другими строковыми значениями.
Каждый plug-in документа отражается в JavaScript как элемент массива embeds. Например, следующий HTML-код включает AVI plug-in в документ:
<EMBED SRC=myavi.avi NAME="myEmbed" WIDTH=320 HEIGHT=200>Если это первый plug-in в документе, Вы может получить к нему доступ одним из следующих способов:
document.embeds[0]Если plug-in ассоциирован с Java-классом netscape.plugin.Plugin, Вы можете получить доступ к его static-переменным и методам тем способом, которым Вы получаете доступ к переменным и методам.
Массив embeds имеет свойство length, document.embeds.length, указывающего количество plug-in'ов, встроенных в документ.
Книга Plug-in Guide содержит информацию о:
вызове Java-методов из plug-in'оввызове методов plug-in'а из JavaВы можете использовать JavaScript для управления поведением Java-аплета, не зная почти ничего о внутреннем строении аплета. Все public-переменные, методы и свойства аплета доступны для работы из JavaScript. Например, Вы можете использовать кнопки, расположенные на HTML-форме, для запуска и остановки Java-аплета, находящегося в любом месте документа.
Служба LiveConnect по умолчанию включена в Navigator'е 1.1 и последующих версиях. Чтобы LiveConnect работала, должны быть включены Java и JavaScript. Для проверки этого выберите Preferences в меню Edit и просмотрите раздел Advanced.
Убедитесь, что опция Enable Java отмечена. Убедитесь, что опция Enable JavaScript отмечена.Для отключения Java или JavaScript уберите галочки в переключателях; если Вы это сделали, LiveConnect работать не будет.
Метод eval класса netscape.javascript.JSObject позволяет вычислять произвольные выражения JavaScript. Используйте метод getWindow для получения дескриптора окна JavaScript, затем используйте eval для доступа к JavaScript-методу.
Вот синтаксис вызова методов JavaScript:
JSObject.getWindow().eval("expression")expression это JavaScript-выражение, которое вычисляется в вызов JavaScript-метода.
Например, следующий код Java использует eval для вызова JavaScript-метода alert, если возникает событие MouseUp:
public void init() {По-другому можно вызвать JavaScript-методы JSObject-методом call. Используйте следующий вызов JavaScript-метода из Java, кода Вы хотите передать Java-объекты в качестве аргументов:
JSObject.call(methodName, argArray)где argArray это массив Java-объектов, используемый для передачи аргументов JavaScript-методу.
Если Вы хотите передать примитивные значения JavaScript-методу, Вы обязаны использовать Java-оболочки объектов (такие как Integer, Float и Boolean), а затем наполнить Array такими объектами.
Вы можете также вызвать определённые пользователем функции из Java-аплета. Например, добавьте следующую функцию в <HEAD> HTML-страницы с аплетом HelloWorld:
<SCRIPT>Эта простая функция выведет диалог alert, содержащий имя и версию используемого клиентского программного обеспечения. Затем измените метод init в Вашем Java-коде аналогично тому, как Вы изменили paint:
public void init() {Заметьте, что args2 объявлен как массив без элементов, хотя этот метод не принимает аргументов. Когда Вы рекомпилируете аплет и перезагрузите HTML-страницу (и реинициализируете аплет), JavaScript-диалог alert выведет версию Navigator'а, который запущен у Вас. Это простая иллюстрация вызова пользовательской функции из Java.
Если Вы хотите использовать объекты 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 со значением типа такого:
D:\Navigator\Program\Java\Classes\java40.jarСм. в документации к Sun JDK информацию о CLASSPATH.
ПРИМЕЧАНИЕ: Поскольку Java является строго типизированным языком, а JavaScript типизирован слабо, машина выполнения JavaScript конвертирует значения аргументов в подходящие типы данных других языков, когда Вы используете LiveConnect. См. полную информацию в разделе "Конвертация Типов Данных".
Когда Вы обращаетесь к пакету или классу Java или работаете с массивом или объектом Java, Вы используете один из специальных объектов LiveConnect. Все запросы JavaScript к Java выполняются с помощью этих объектов, резюме по которым дано в таблице.