Клиентский JavaScript 1.3 Руководство

         

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



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

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

c = new java.lang.Character(72)



Булевы



Булевы

Если Вы передаёте Булев тип 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 становится 1false становится 0

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



Числа



Числа

Если Вы передаёте числовые типы 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, число конвертируется в строку. Используйте операцию == для сравнения результата конвертации с другими строковыми значениями.



Что такое LiveConnect?


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

JavaScript для прямого доступа к переменным, методам, классам и пакетам Java.

Управлять Java-аплетами и plug-in'ами с помощью JavaScript.

Код Java для доступа к методам и свойствам JavaScript.



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


Доступ к 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



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

Давайте теперь отдельно рассмотрим использование Java для доступа к клиентскому JavaScript. Автор HTML-страницы обязан разрешить аплету доступ к JavaScript, специфицировав атрибут MAYSCRIPT тэга <APPLET>. Это предотвращает доступ аплета к JavaScript на странице без ведома автора страницы. Попытка получить доступ к JavaScript из аплета, не имеющего атрибут MAYSCRIPT, генерирует исключение. Тэг MAYSCRIPT нужен только для доступа Java к JavaScript; он не требуется для доступа JavaScript к Java.



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



Доступ к объектам и свойствам 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");
}



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



Другие объекты 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, описанного в ECMA-262. Подсказка PreferredType, используемая с этим оператором, это Number.
booleanОболочка с объекта снимается и возникает одна из следующих ситуаций:

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

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

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

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

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



LiveConnect. Обзор.



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

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

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

Что такое LiveConnect?

Включение LiveConnect

Консоль Java

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

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

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

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

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



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



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

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

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



JavaClass-объекты



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, конвертация терпит неудачу.



Консоль 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 в Java


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

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

Числа

БулевыСтроки

Undefined-значенияNull-значения

Объекты JavaArray и JavaObjectJavaClass-объекты

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

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

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




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

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

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



Null-значения


Null-значения

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

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

Любой класс
Интерфейс любого типа
Значение становится null.
byte
char
double
float
int
long
short
Значение становится 0.
booleanЗначение становится false.



Объект Packages


Объект 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")



Объекты JavaArray и JavaObject



Объекты 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



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



Обработка исключений 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:

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 как 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. Вы можете получать и устанавливать значения свойств и вызывать методы, возвращающие строковые, числовые и Булевы значения.



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


Получение дескриптора для окна 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);
   }
}



Hello World



Пример 1: Hello World

Например, Вы можете изменить вышеприведённый аплет 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 со строкой из текстового поля в качестве аргумента.

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

<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.



аплет Flashing Color Text



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

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



Hello World



Пример: Hello World

Вернёмся к примеру 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



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

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

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



Аплет Flashing text



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

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

<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-аплета.



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



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

Простые ссылки из 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)



Строковые



Строковые

Если Вы передаёте строковые значения JavaScript в качестве параметров Java-методам, 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.



Объекты LiveConnect



Таблица 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



Undefined-значения



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 конвертируется в строку. Используйте операцию == для сравнения результата конвертации с другими строковыми значениями.



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


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

Каждый 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-методов из plug-in'оввызове методов plug-in'а из Java



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


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

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



Включение LiveConnect


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

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

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

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



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



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

Метод 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 такими объектами.



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



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

Вы можете также вызвать определённые пользователем функции из 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 в 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. См. полную информацию в разделе "Конвертация Типов Данных".



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


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



LiveAudio и LiveConnect



Глава 16

LiveAudio и LiveConnect

LiveAudio работает с LiveConnect. Используя LiveConnect, LiveAudio и JavaScript, событие, которое может быть описано программно с использованием среды JavaScript, может включать звуковое событие. Например, Вы можете создать альтернативный интерфейс управления звуком, задержать загрузку sound-файла, пока пользователь не щёлкнул кнопку, создать кнопку, производящую шум при щелчке по ней, или создать звуковое подтверждения для действий интерфейса (заставить объект "проговаривать" свои действия при щелчке мыши или перемещении над ним курсора). В этой главе описано, как использовать JavaScript для управления встроенными LiveAudio-элементами.

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

JavaScript-методы для управления LiveAudio

Использование LiveAudio LiveConnect-методов



JavaScript-методы для управления LiveAudio


LiveAudio предоставляет следующие JavaScript-методы управления. Чтобы эти методы были доступны для JavaScript (и на web-странице), Вы обязаны внедрить LiveAudio-консоль (всё, что эта консоль будет выполнять, она может даже быть скрыта) где-нибудь на странице.

play({loop[TRUE, FALSE or an INT]}, '{url_to_sound}')

pause()stop()

StopAll()start_time({number of seconds})

end_time({number of seconds})setvol({percentage number - without "%" sign})

fade_to({volume percent to fade to, without the "%"})

fade_from_to({volume % start fade}, {volume % end fade})

start_at_beginning()stop_at_end()

Следующие JavaScript-методы индикации состояния не управляют LiveAudio plug-in'ом, но предоставляют информацию о текущем состоянии plug-in'а:

IsReadyIsPlaying

IsPausedGetVolume