Электронная библиотека
Программисту веб-дизайнеру
Другие материалы
Клиентский JavaScript. Руководство по Использованию
В этой главе рассматривается использование технологии LiveConnect, позволяющей коду Java и коду JavaScript взаимодействовать. Предполагается, что Вы уже знакомы с программированием на Java.
В главе имеются следующие разделы:
Дополнительно об использовании LiveConnect см. JavaScript technical notes на сайте DevEdge.
В браузере Navigator LiveConnect дает возможность использовать:
Служба LiveConnect по умолчанию включена в Navigator'е 1.1 и последующих версиях. Чтобы LiveConnect работала, должны быть включены Java и JavaScript. Для проверки этого выберите Preferences в меню Edit и просмотрите раздел Advanced.
Для отключения Java или JavaScript уберите галочки в переключателях; если Вы это сделали, LiveConnect работать не будет.
Консоль 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
Обернутый Java-массив, доступ к которому выполняется из кода JavaScript.
Ссылка JavaScript на Java-класс.
Обернутый объект Java, доступ к которому выполняется из кода JavaScript.
Ссылка 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
Если 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-метод создает массив и Вы обращаетесь к этому массиву в JavaScript, Вы
работаете с JavaArray
. Например, следующий код создает JavaArray
x
из 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
для создания массива.
theClass = java.lang.Class.forName("java.lang.String")
theArray = java.lang.reflect.Array.newInstance(theClass, 5)
Вы не можете передавать односимвольные строки в Java-метод, требующий аргумента
типа char
. Вы обязаны передавать в такие методы целое число,
соответствующее Unicode-значению символа. Например, вот присвоение значения "H" переменной c
:
c = new java.lang.Character(72)
Вы можете использовать JavaScript для управления поведением Java-аплета, не зная почти ничего о внутреннем строении аплета. Все public-переменные, методы и свойства аплета доступны для работы из JavaScript. Например, Вы можете использовать кнопки, расположенные на HTML-форме, для запуска и остановки Java-аплета, находящегося в любом месте документа.
Каждый аплет документа отражается в JavaScript как document.appletName
,
где appletName
это значение атрибута NAME
тэга <APPLET>
.
Массив applets
также содержит все аплеты страницы; Вы можете
обратиться к элементам этого массива по имени аплета (как в ассоциативном
массиве) или по порядковому номеру аплета на странице (начиная с 0).
Например, рассмотрим аплет "Hello World" на языке Java:
import java.applet.Applet;
import java.awt.Graphics;
public class HelloWorld extends Applet {
public void paint(Graphics g) {
g.drawString("Hello world!", 50, 25);
}
}
Следующий HTML запускает и отображает аплет и именует его "HelloWorld" (в
атрибуте NAME
):
<APPLET CODE="HelloWorld.class" NAME="HelloWorld" WIDTH=150 HEIGHT=25>
</APPLET>
Если это первый аплет документа (самый верхний на странице), Вы можете обратиться к нему в JavaScript одним из следующих способов:
document.HelloWorld
document.applets["HelloWorld"]
document.applets[0]
Массив applets
имеет свойство length
, document.applets.length
,
указывающее количество аплетов в документе.
Все public-переменные, объявленные в аплете и его классах и пакетах-предках,
доступны в JavaScript. Static-методы и свойства, объявленные в аплете, доступны
в JavaScript как методы и свойства объекта Applet
. Вы можете
получать и устанавливать значения свойств и вызывать методы, возвращающие строковые, числовые и Булевы значения.
Например, Вы можете изменить вышеприведенный аплет HelloWorld:
init
, чтобы он объявлял и
инициализировал строку myString
setString
, принимающий строковой аргумент,
присвоить этот аргумент объекту myString
и вызвать метод repaint
. (Методы paint
и repaint
наследуются из java.awt.Component
).Исходный код Java выглядит теперь так:
import java.applet.Applet;
import java.awt.Graphics;
public class HelloWorld extends Applet {
String myString;
public void init() {
myString = new String("Hello, world!");
}
public void paint(Graphics g) {
g.drawString(myString, 25, 20);
}
public void setString(String aString) {
myString = aString;
repaint();
}
}
Сделав стоку сообщения переменной, Вы можете модифицировать ее из JavaScript. Теперь изменим HTML-файл:
onClick
, вызывающий метод setString
из HelloWorld со строкой из текстового поля в качестве аргумента.<APPLET CODE="HelloWorld1.class" NAME="Hello" WIDTH=150 HEIGHT=25>
</APPLET>
<FORM NAME="form1">
<INPUT TYPE="button" VALUE="Set String"
onClick="document.HelloWorld.setString(document.form1.str.value)">
<BR>
<INPUT TYPE="text" SIZE="20" NAME="str">
</FORM>
Когда Вы компилируете аплет HelloWorld и загружаете HTML-страницу в Navigator, Вы сначала увидите "Hello, World!", выведенное на серой панели аплета. Однако Вы можете теперь изменить текст, введя новый в текстовом поле и щелкнув кнопку. Это демонстрирует управление аплетом из JavaScript.
Пример 2: аплет Flashing Color Text
Более сложный пример - аплет, отображающий "вспыхивающий" текст разными цветами. Текстовое поле и кнопка позволяют ввести новый текст. Этот аплет показан на Рисунке 15.1.
Рисунок 15.1 Аплет Flashing text
<APPLET CODE="colors.class" WIDTH=500 HEIGHT=60 NAME="colorApp">
</APPLET>
<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-аплета.
Каждый plug-in документа отражается в JavaScript как элемент массива embeds
. Например,
следующий HTML-код включает AVI plug-in в документ:
<EMBED SRC=myavi.avi NAME="myEmbed" WIDTH=320 HEIGHT=200>
Если это первый plug-in в документе, Вы может получить к нему доступ одним из следующих способов:
document.embeds[0]
document.embeds["myEmbed"]
document.myEmbed
Если plug-in ассоциирован с Java-классом netscape.plugin.Plugin
, Вы
можете получить доступ к его static-переменным и методам тем способом, которым Вы получаете доступ к переменным и методам.
Массив embeds
имеет свойство length
, document.embeds.length
,
указывающего количество plug-in'ов, встроенных в документ.
Книга Plug-in Guide содержит информацию о:
Взаимодействие 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-файла.-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
в блоке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.
это Java-оболочка вокруг исключения любого типа, вызванного JavaScript,
аналогично тому, как
JSExceptionJSObject
-экземпляры являются оболочками для JavaScript-объектов.
Используйте JSException
при вычислении JavaScript-кода в Java. Если JavaScript-код
не вычисляется из-за ошибки компиляции JavaScript или какой-нибудь другой
ошибки времени выполнения, интерпретатор JavaScript генерирует сообщение об
ошибке, которое конвертируется в JSException
-экземпляр.
Например, Вы можете использовать try...catch
для обработки исключений LiveConnect:
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
вызывает какую-нибудь другую ошибку.
Доступ к клиентскому 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")
:
JSObject doc = (JSObject) win.getMember("document");
JSObject myForm = (JSObject) doc.getMember("testForm");
Если JavaScript-объект document.testForm.jazz
это переключатель/checkbox,
следующий код Java дает доступ к его свойству checked
:
public void init() {
win = JSObject.getWindow(this);
JSObject doc = (JSObject) win.getMember("document");
JSObject myForm = (JSObject) doc.getMember("testForm");
JSObject check = (JSObject) myForm.getMember("jazz");
Boolean isChecked = (Boolean) check.getMember("checked");
}
Метод 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
такими объектами.
Вернемся к примеру HelloWorld, изменим метод paint
в коде Java
таким образом, чтобы он вызывал JavaScript-метод alert
(с
сообщением "Painting!"):
public void paint(Graphics g) {
g.drawString(myString, 25, 20);
JSObject win = JSObject.getWindow(this);
String args[] = {"Painting!"};
win.call("alert", args);
}
Затем добавим атрибут MAYSCRIPT
в тэг <APPLET>
на HTML-странице, рекомпилируем аплет и запустим его. При каждой прорисовке
аплета (когда он инициализируется, когда Вы вводите новое текстовое значение и
когда страница перезагружается) выводится JavaScript-бокс alert. Это простая иллюстрация вызова JavaScript из Java.
Можно добиться того же эффекта таким образом:
public void paint(Graphics g) {
g.drawString(myString, 25, 20);
JSObject win = JSObject.getWindow(this);
win.eval("alert('Painting')");
}
ПРИМЕЧАНИЕ: Может понадобиться перезагрузка 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 без округления и потери точности или знака.
lava.lang.Double
java.lang.Object
Создается новый java.lang.Double
-экземпляр, точное значение
переносится в Java без округления и потери точности или знака.
NaN
-значения конвертируются в 0.NaN
конвертируются в false.Если JavaScript-число передается как параметр в Java-метод, ожидающий экземпляр java.lang.String
,
число конвертируется в строку. Используйте операцию == для сравнения результата конвертации с другими строковыми значениями.
Если Вы передаете Булев тип JavaScript в качестве параметра Java-методам, Java конвертирует значения таким образом:
Все значения конвертируются напрямую в Java-эквиваленты.
lava.lang.Boolean
java.lang.Object
Создается новый экземпляр java.lang.Boolean
. Каждый параметр
создает новый экземпляр, а не один экземпляр, того же примитивного типа.
Если JavaScript Boolean передается в качестве параметра Java-методу, который ожидает экземпляр java.lang.String
, Boolean
конвертируется в строку. Используйте операцию == для сравнения результата конвертации с другими строковыми значениями.
Если Вы передаете строковые значения JavaScript в качестве параметров Java-методам, Java конвертирует значения так:
lava.lang.String
java.lang.Object
Строка JavaScript конвертируется в экземпляр java.lang.String
с ASCII-значением.
Все значения конвертируются в числа, как описано в спецификации ECMA-262.
Если Вы передаете undefined-значения JavaScript в качестве параметров Java-методам, Java конвертирует значения так:
lava.lang.String
java.lang.Object
Значение конвертируется в экземпляр java.lang.String, значением которого становится строка "undefined".
Конвертация undefined-значений возможна только в JavaScript 1.3. Предыдущие версии JavaScript не поддерживают значение undefined.
Если JavaScript-значение undefined передается в качестве параметра Java-методу, который ожидает экземпляр java.lang.String
,
значение undefined конвертируется в строку. Используйте операцию == для
сравнения результата конвертации с другими строковыми значениями.
Если Вы передаете null-значения JavaScript в качестве параметров Java-методам, Java конвертирует значения так:
Любой класс
Интерфейс любого типа
byte
char
double
float
int
long
short
Объекты JavaArray и JavaObject
В большинстве случаев, если Вы передаете JavaScript JavaArray
или JavaObject
в качестве параметров Java-методу, Java просто снимает оболочку с объекта;
иногда объект приводится к другому типу данных в соответствии с правила из таблицы:
Любой интерфейс или класс, который совместим при присвоении с развернутым объектом.
Оболочка с объекта снимается, вызывается метод toString
развернутого Java-объекта, результат возвращается как новый экземпляр java.lang.String
.
byte
char
double
float
int
long
short
Оболочка с объекта снимается, и возникает одна из следующих ситуаций:
doubleValue
, JavaArray
или JavaObject
конвертируется в значение, возвращаемое этим методом.doubleValue
, возникает ошибка.
Оболочка с объекта снимается, и возникает одна из следующих ситуаций:
В JavaScript 1.2 и ранее - оболочка с объекта снимается, и возникает одна из следующих ситуаций:
Интерфейс или класс совместимы при присвоении, если развернутый объект является экземпляром типа Java-параметра. То есть следующий оператор обязан возвратить true:
unwrappedObject instanceof parameterType
Если Вы передаете JavaScript JavaClass
-объект как параметр Java-методу, Java
конвертирует этот объект в соответствии со следующими правилами:
java.lang.JSObject
java.lang.Object
Объект JavaClass
оборачивается в новый экземпляр java.lang.JSObject
.
Оболочка с объекта снимается, вызывается метод toString
развернутого Java-объекта, результат возвращается как новый экземпляр java.lang.String
.
Оболочка с объекта снимается и возникает одна из следующих ситуаций:
В JavaScript 1.2 и ранее - оболочка с объекта снимается, и возникает одна из следующих ситуаций:
Если Вы передаете любой другой объект JavaScript в качестве параметра Java-методу, Java конвертирует этот объект в соответствии со следующими правилами:
java.lang.JSObject
java.lang.Object
Объект оборачивается в новый экземпляр java.lang.JSObject
.
Оболочка с объекта снимается, вызывается метод toString
развернутого Java-объекта, результат возвращается как новый экземпляр java.lang.String
.
byte
char
double
float
int
long
short
Объект конвертируется в значение с использованием логики оператора ToPrimitive
,
описанного в ECMA-262.
Подсказка PreferredType, используемая с этим оператором, это Number.
Оболочка с объекта снимается и возникает одна из следующих ситуаций:
В JavaScript 1.2 и ранее - оболочка с объекта снимается, и возникает одна из следующих ситуаций:
Конвертация из Java а JavaScript
Передаваемые из Java в JavaScript значения конвертируются так:
netscape.javascript.JSObject
конвертируется в
оригинальный JavaScript-объект.Array
: Вы может получить доступ к
нему с синтаксисом arrayName[index]
(где index
это
целое число) и определить его размер с помощью arrayName.length
.toString
объекта-оригинала.
Конвертация в число вызывает метод doubleValue
, если
возможно, иначе терпит неудачу.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 + "";
Оглавление | Назад | Вперед | Индекс