В этой главе рассматривается использование технологии LiveConnect, позволяющей
коду Java и коду JavaScript взаимодействовать. Предполагается, что Вы уже знакомы с программированием на Java.
Дополнительно об использовании LiveConnect см.
на сайте 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-консоль:
public void init() { System.out.println("Hello, world!") }
Работа с оболочками
В 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
Объект
Описание
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. Например, следующий код создаёт JavaArrayx
из 10 элементов типа int:
theInt = java.lang.Class.forName("java.lang.Integer") x = java.lang.reflect.Array.newInstance(theInt, 10)
Подобно 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
для создания массива.
Вы не можете передавать односимвольные строки в Java-метод, требующий аргумента
типа char. Вы обязаны передавать в такие методы целое число,
соответствующее Unicode-значению символа. Например, вот присвоение значения "H" переменной c:
c = new java.lang.Character(72)
Управления Java-аплетами
Вы можете использовать JavaScript для управления поведением Java-аплета, не зная
почти ничего о внутреннем строении аплета. Все public-переменные, методы и
свойства аплета доступны для работы из JavaScript. Например, Вы можете
использовать кнопки, расположенные на HTML-форме, для запуска и остановки Java-аплета, находящегося в любом месте документа.
Обращение к аплетам
Каждый аплет документа отражается в JavaScript как document.appletName,
где appletName это значение атрибута NAME тэга <APPLET>.
Массив applets также содержит все аплеты страницы; Вы можете
обратиться к элементам этого массива по имени аплета (как в ассоциативном
массиве) или по порядковому номеру аплета на странице (начиная с 0).
Например, рассмотрим аплет "Hello World" на языке Java:
Массив applets имеет свойство length, document.applets.length,
указывающее количество аплетов в документе.
Все public-переменные, объявленные в аплете и его классах и пакетах-предках,
доступны в JavaScript. Static-методы и свойства, объявленные в аплете, доступны
в JavaScript как методы и свойства объекта Applet. Вы можете
получать и устанавливать значения свойств и вызывать методы, возвращающие строковые, числовые и Булевы значения.
Пример 1: Hello World
Например, Вы можете изменить вышеприведённый аплет HelloWorld:
переопределить его метод init, чтобы он объявлял и
инициализировал строку myString
определить метод setString, принимающий строковой аргумент,
присвоить этот аргумент объекту myString и вызвать метод repaint. (Методы paint
и repaint наследуются из java.awt.Component).
Когда Вы компилируете аплет HelloWorld и загружаете HTML-страницу в Navigator, Вы
сначала увидите "Hello, World!", выведенное на серой панели аплета. Однако Вы
можете теперь изменить текст, введя новый в текстовом поле и щёлкнув кнопку. Это
демонстрирует управление аплетом из JavaScript.
Пример 2: аплет Flashing Color Text
Более сложный пример - аплет, отображающий "вспыхивающий" текст разными цветами.
Текстовое поле и кнопка позволяют ввести новый текст. Этот аплет показан на Рисунке 15.1.
<FORM NAME=colorText> <P>Enter new text for the flashing display:
<INPUT TYPE="text" NAME="textBox" LENGTH=50>
<P>Click the button to change the display: <INPUT TYPE="button" VALUE="Change Text" onClick="document.colorApp.setString(document.colorText.textBox.value)">
</FORM>
Этот аплет использует 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 ассоциирован с Java-классом netscape.plugin.Plugin, Вы
можете получить доступ к его static-переменным и методам тем способом, которым Вы получаете доступ к переменным и методам.
Массив embeds имеет свойство length, document.embeds.length,
указывающего количество plug-in'ов, встроенных в документ.
Книга
содержит информацию о:
вызове 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 со значением типа такого:
D:\Navigator\Program\Java\Classes\java40.jar
См. в документации к 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:
import netscape.javascript.*;
public class JavaDog { public String dogBreed; public String dogColor; public String dogSex;
// определяется конструктор класса public JavaDog(JSObject jsDog) { // здесь используйте try...catch для обработки JSException 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, посмотрим на определение специального 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-код
не вычисляется из-за ошибки компиляции JavaScript или какой-нибудь другой
ошибки времени выполнения, интерпретатор JavaScript генерирует сообщение об
ошибке, которое конвертируется в JSException-экземпляр.
Например, Вы можете использовать try...catch для обработки исключений LiveConnect:
Здесь оператор eval терпит неудачу, если foo не
определено. Блок catch выполняет метод jsCodeFailed,
если оператор eval в блоке try вызывает JSException;
метод otherCodeFailed выполняется, если блок try
вызывает какую-нибудь другую ошибку.
Доступ к клиентскому JavaScript
Давайте теперь отдельно рассмотрим использование Java для доступа к клиентскому JavaScript.
Автор HTML-страницы обязан разрешить аплету доступ к JavaScript, специфицировав
атрибут MAYSCRIPT тэга <APPLET>. Это
предотвращает доступ аплета к JavaScript на странице без ведома автора страницы.
Попытка получить доступ к JavaScript из аплета, не имеющего атрибут MAYSCRIPT,
генерирует исключение. Тэг MAYSCRIPT нужен только для доступа Java
к JavaScript; он не требуется для доступа JavaScript к Java.
Получение дескриптора для окна JavaScript
Прежде чем Вы получите доступ к JavaScript в Navigator'е, Вы
обязаны получить дескриптор/handle для окна Navigator'а.
Используйте метод getWindow класса netscape.javascript.JSObject
для получения дескриптора окна, передавая его объекту Applet.
Например, если win это ранее объявленная переменная типа JSObject,
следующий Java-код присваивает дескриптор окна переменной win:
public class myApplet extends Applet { public void init() { JSObject win = JSObject.getWindow(this); } }
Доступ к объектам и свойствам JavaScript
Метод getMember класса netscape.javascript.JSObject
даёт доступ к объектам и свойствам JavaScript. Вызывайте getWindow
для получения дескриптора окна JavaScript, затем вызывайте getMember
для доступа к каждому JavaScript-объекту. Заметьте, что JavaScript-объекты
появляются в Java как экземпляры класса netscape.javascript.JSObject.
Например, следующий код Java даёт доступ к JavaScript-объекту document.testForm
через переменную myForm:
public void init() { win = JSObject.getWindow(this); myForm=win.eval("document.testForm") }
Вы могли бы использовать следующие строки вместо myForm=win.eval("document.testForm"):
Метод 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() { JSObject win = JSObject.getWindow(this); }
public boolean mouseUp(Event e, int x, int y) { win.eval("alert(\"Hello world!\");"); return true; }
По-другому можно вызвать JavaScript-методы JSObject-методом call.
Используйте следующий вызов JavaScript-метода из Java, кода Вы хотите передать Java-объекты
в качестве аргументов:
JSObject.call(methodName, argArray)
где argArray это массив Java-объектов, используемый для передачи
аргументов JavaScript-методу.
Если Вы хотите передать примитивные значения JavaScript-методу, Вы обязаны
использовать Java-оболочки объектов (такие как Integer, Float
и Boolean), а затем наполнить Array такими объектами.
Пример: Hello World
Вернёмся к примеру HelloWorld, изменим метод paint в коде Java
таким образом, чтобы он вызывал JavaScript-метод alert (с
сообщением "Painting!"):
Затем добавим атрибут MAYSCRIPT в тэг <APPLET>
на HTML-странице, рекомпилируем аплет и запустим его. При каждой прорисовке
аплета (когда он инициализируется, когда Вы вводите новое текстовое значение и
когда страница перезагружается) выводится JavaScript-бокс alert. Это простая иллюстрация вызова JavaScript из Java.
ПРИМЕЧАНИЕ:
Может понадобиться перезагрузка HTML-страницы путём выбора Open Page в меню File
вместо щелчка по кнопке Reload, чтобы гарантировать реинициализацию аплета.
Вызов пользовательский функций
Вы можете также вызвать определённые пользователем функции из Java-аплета. Например,
добавьте следующую функцию в <HEAD> HTML-страницы с аплетом HelloWorld:
<SCRIPT> function test() { alert("You are using " + navigator.appName + " " + navigator.appVersion) } </SCRIPT>
Эта простая функция выведет диалог alert, содержащий имя и версию используемого
клиентского программного обеспечения. Затем измените метод init в
Вашем Java-коде аналогично тому, как Вы изменили paint:
public void init() { myString = new String("Hello, world!") JSObject win = JSObject.getWindow(this) String args2[] = {""} win.call("test", args2) }
Заметьте, что args2 объявлен как массив без элементов, хотя этот
метод не принимает аргументов. Когда Вы рекомпилируете аплет и перезагрузите HTML-страницу (и
реинициализируете аплет), JavaScript-диалог alert выведет версию Navigator'а,
который запущен у Вас. Это простая иллюстрация вызова пользовательской функции из Java.
Конвертация типов данных
Поскольку Java является строго типизированным языком, а JavaScript типизирован
слабо, машина выполнения JavaScript конвертирует значения аргументов в подходящие типы данных других
языков, когда Вы используете LiveConnect. Эта конвертация рассматривается в следующих разделах:
Если Вы вызываете Java-метод и передаёте ему параметры из JavaScript, тип
передаваемых параметров конвертируется в соответствии с правилами, описанными в следующих разделах:
Return-значения методов netscape.javascript.JSObject
всегда конвертируются в экземпляры java.lang.Object. Правила конвертации этих return-значений также описаны в этих разделах.
Например, если JSObject.eval возвращает JavaScript-число, Вы можете
найти правило конвертации этого числа в экземпляр java.lang.Object в разделе "Числа".
Числа
Если Вы передаёте числовые типы JavaScript в качестве параметров Java-методам, 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,
число конвертируется в строку. Используйте операцию == для сравнения результата конвертации с другими строковыми значениями.
Булевы
Если Вы передаёте Булев тип JavaScript в качестве параметра Java-методам, 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 Boolean передаётся в качестве параметра Java-методу, который ожидает экземпляр java.lang.String, Boolean
конвертируется в строку. Используйте операцию == для сравнения результата конвертации с другими строковыми значениями.
Строковые
Если Вы передаёте строковые значения JavaScript в качестве параметров Java-методам, Java конвертирует значения так:
Тип Java-параметра
Правила конвертации>
lava.lang.String java.lang.Object
Строка JavaScript конвертируется в экземпляр java.lang.String с ASCII-значением.
byte double float int long short
Все значения конвертируются в числа, как описано в спецификации .
char
Все значения конвертируются в числа.
boolean
Пустая строка становится false.
Все другие значения становятся true.
Undefined-значения
Если Вы передаёте undefined-значения JavaScript в качестве параметров Java-методам, 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 конвертируется в строку. Используйте операцию == для
сравнения результата конвертации с другими строковыми значениями.
Null-значения
Если Вы передаёте null-значения JavaScript в качестве параметров Java-методам, Java конвертирует значения так:
Тип Java-параметра
Правила конвертации
Любой класс Интерфейс любого типа
Значение становится null.
byte char double float int long short
Значение становится 0.
boolean
Значение становится false.
Объекты JavaArray и JavaObject
В большинстве случаев, если Вы передаёте JavaScript JavaArray или JavaObject
в качестве параметров Java-методу, 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
JavaClass-объекты
Если Вы передаёте JavaScript JavaClass-объект как параметр Java-методу, 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, конвертация терпит неудачу.
Другие объекты JavaScript
Если Вы передаёте любой другой объект JavaScript в качестве параметра Java-методу, 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,
описанного в .
Подсказка PreferredType, используемая с этим оператором, это Number.
boolean
Оболочка с объекта снимается и возникает одна из следующих ситуаций:
Если объект null, он конвертируется в false.
Если объект имеет какое-нибудь другое значение, он конвертируется в true.
В JavaScript 1.2 и ранее - оболочка с объекта снимается, и возникает одна из
следующих ситуаций:
Если развёрнутый объект имеет метод booleanValue, исходный объект конвертируется в return-значение.
Если развёрнутый объект не имеет метода booleanValue, конвертация терпит неудачу.
Конвертация из 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-строку,
присоединяя к ней пустую строку, как показано здесь:
var JavaString = JavaObj.methodThatReturnsAString(); var JavaScriptString = JavaString + "";