Взаимодействие Java и JavaScript
Если вы хотите использовать объекты
JavaScript в
Java, вы обязаны импортировать пакет
netscape.javascript в ваш
Java-файл. Этот пакет определяет следующие классы:
- netscape.javascript.JSObject даёт доступ Java-коду к методам и свойствам JavaScript;
- netscape.javascript.JSException даёт возможность Java-коду обрабатывать ошибки JavaScript.
Начиная с
JavaScript 1.2, эти классы поставляются в
.jar файле; в предыдущих версиях
JavaScript они поставлялись в
.zip файле.
Для доступа к классам
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
Примечание
Поскольку
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)
{
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.
Чтобы лучше понять, как работает
getMember, посмотрите на определение специального
JavaScript-объекта
Dog:
function Dog(breed,color,sex) {
this.breed = breed
this.color = color
this.sex = sex
}
Вы можете создать в
JavaScript экземпляр объекта
Dog под названием
gabby:
gabby = new Dog("lab","chocolate","female")
Если вы вычисляете
gabby.color, то увидите, что это свойство имеет значение
chocolate. Теперь предположим, что вы создаёте экземпляр
JavaDog в вашем
JavaScript-коде, передавая конструктору объект
gabby:
javaDog = new Packages.JavaDog(gabby)
Если вы вычисляете
javaDog.dogColor, то увидите, что это свойство также имеет значение
chocolate, потому что метод
getMember в
Java-конструкторе присваивает переменной
dogColor значение свойства
gabby.color.
Обработка Ошибок JavaScript в Java
Когда
JavaScript-код вызываемый из
Java, терпит неудачу на этапе прогона программы, он вызывает исключение. Если вы вызываете
JavaScript-код из
Java, вы можете отловить это исключение в операторе
try...catch. Исключение
JavaScript доступно в вашем
Java-коде как экземпляр
netscape.javascript.JSException.
JSException это
Java-оболочка вокруг исключения любого типа, вызываемого в
JavaScript, аналогично тому, как экземпляры
JSObject являются оболочками для
JavaScript-объектов. Используйте
JSException, если вы вычисляете
JavaScript-код в
Java.
Если вы вычисляете
JavaScript-код в
Java, следующие ситуации могут вызвать ошибки времени выполнения:
Например, предположим, что
Java-объект
eTest вычисляет строку
jsCode, которую вы ему передали. Вы можете отреагировать на любую ошибку времени выполнения, возникающую при вычислении, реализуя такой обработчик исключения:
import netscape.javascript.JSObject;
import netscape.javascript.JSException;
public class eTest {
public static Object doit(JSObject obj, String jsCode) {
try {
obj.eval(jsCode);
} catch (JSException e) {
if (e.getWrappedException()==null)
return e;
return e.getWrappedException();
}
return null;
}
}
В этом примере код блока
try пытается вычислить строку
jsCode, переданную ему вами. Скажем, вы передали строку
«myFunction()" в качестве значения
jsCode. Если
myFunction не определена как функция
JavaScript, интерпретатор
JavaScript не может вычислить
jsCode. Интерпретатор генерирует сообщение об ошибке,
Java-обработчик отлавливает сообщение, а метод
doit возвращает экземпляр объекта
netscape.javascript.JSException.
Предположим, однако, что
myFunction определена в
JavaScript так:
function myFunction() {
try {
if (theCondition == true) {
return "Everything's ok";
} else {
throw "JavaScript error occurred" ;
}
} catch (e) {
if (canHandle == true) {
handleIt();
} else {
throw e;
}
}
}
Если
theCondition –
false, функция вызывает исключение. Это исключение отлавливается в коде
JavaScript, и, если
canHandle –
true,
JavaScript обрабатывает исключение. Если
canHandle –
false, исключение повторно вызывается,
Java-обработчик отлавливает его, а метод
doit возвращает
Java-строку:
JavaScript error occurred
Обратная Совместимость
В
JavaScript 1.3 и ранее, класс
JSException имел три
public-конструктора, которые по выбору принимали строковой аргумент, специфицирующий детали сообщения или другую информацию для исключения. Метод
getWrappedException отсутствовал.
Используйте оператор
try...catch для обработки
LiveConnect-исключений в
JavaScript 1.3 и более ранних версиях таким образом:
try {
global.eval("foo.bar = 999;");
} catch (Exception e) {
if (e instanceof JSException) {
jsCodeFailed()";
} else {
otherCodeFailed();
}
}
В этом примере оператор
eval терпит неудачу, если
foo не определено. Блок
catch выполняет метод
jsCodeFailed, если оператор
eval в блоке
try вызывает
JSException; метод
otherCodeFailed выполняется в случае, если блок
try вызывает какую-либо иную ошибку.