Wiki-учебник по веб-технологиям: JavaScript/ВзаимодействиеJavaИJavaScript ...

Главная | Каталог |

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


Если вы хотите использовать объекты JavaScript в Java, вы обязаны импортировать пакет netscape.javascript в ваш Java-файл. Этот пакет определяет следующие классы:


Начиная с JavaScript 1.2, эти классы поставляются в .jar файле; в предыдущих версиях JavaScript они поставлялись в .zip файле.

Для доступа к классам LiveConnect поместите .jar или .zip файл в CLASSPATH компилятора JDK одним из следующих способов:


Например, в 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)
    {
        // здесь try...catch используется для обработки JSExceptions
        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;
      }
   }
}


Если theConditionfalse, функция вызывает исключение. Это исключение отлавливается в коде JavaScript, и, если canHandletrue, JavaScript обрабатывает исключение. Если canHandlefalse, исключение повторно вызывается, 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 вызывает какую-либо иную ошибку.