Home | О проекте | Новости | Рекламные статейки

ВернутьсяВ начало

1.Рекламка: s |

Технология LiveConnect
2.Рекламка: s | ;
x |   

Технология LiveConnect обеспечивает совместную работу кодов, написанных на Java и JavaScript. LiveConnect даёт возможность подключать приложения JavaScript к Java-компонентам и классам.

Вашему приложению JavaScript может понадобиться соединиться с кодом, написанным на других языках, таких как Java или C. Для подключения к Java-коду Вы используете функциональность LiveConnect. Для взаимодействия с кодом, написанным на других языках, у Вас есть несколько вариантов:

  • Вы можете обернуть/wrap Ваш код как Java-объект и использовать LiveConnect непосредственно.
  • Вы можете обернуть Ваш код как распределённый объект CORBA и использовать LiveConnect совместно с object request broker (ORB).
  • Вы можете напрямую включать внешние библиотеки в Ваше приложение.
  • Наконец, LiveConnect даёт возможность объектам JavaScript Вашего приложения взаимодействовать с Java-объектами. Эти Java-объекты являются экземплярами классов в серверном CLASSPATH. LiveConnect работает и с клиентским, и серверным JavaScript, но имеет для каждой среды разные возможности.

Во всех доступных Java-классах Вы можете иметь доступ к статичным public-свойствам или методам или создавать экземпляры класса и получать доступ к public-свойствам и методам этих экземпляров. В отличие от клиентского, однако, Вы можете иметь доступ только к тем Java-объектам, которые были созданы Вашим приложением или другим приложением JavaScript, а затем сохранены как свойство объекта server.

Если Java-объект был создан серверным приложением, отличным от приложения на серверном JavaScript, Вы не можете иметь доступ к этому Java-объекту.

Например, Вы не можете получить доступ к Java-объекту, созданному WAI plug-in, расширением NSAPI или HTTP-аплетом.

Когда Вы вызываете метод Java-объекта, Вы можете передать объекты JavaScript в этот метод. Код Java может установить свойства и вызвать методы этих объектов JavaScript. Таким образом, Вы можете иметь и код JavaScript, вызывающий код Java, и код Java, вызывающий код JavaScript.

Код Java может иметь доступ к приложению JavaScript только таким способом. То есть Java-объект не может вызывать приложение JavaScript, если это приложение JavaScript (или другое приложение JavaScript) не имеет само доступа к соответствующему Java-объекту и не вызывает один из его методов.

 
Работа с Оболочками
В JavaScript оболочка - это объект целевого типа данных языка, содержащий объект исходного языка. При программировании на JavaScript Вы можете использовать объект-оболочку для доступа к методам и полям Java-объекта; вызов методов или доступ к свойству в wrapper вызывает Java-объект. На стороне Java объекты JavaScript "обёртываются" в экземпляры класса netscape.javascript.JSObject и передаются в Java.

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

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

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

Объект Описание
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

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

В JavaScript 1.4 и позднее Вы можете передавать строку из одного символа в Java-метод, который требует аргумент типа char. Например, Вы можете передать строку "H" в конструктор Character:

c = new java.lang.Character("H")

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

c = new java.lang.Character(72)

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

Если код Java прерывается на этапе прогона программы, он вызывает исключение. Если Ваш JavaScript-код имеет доступ к члену данных Java или методу и терпит неудачу, исключение Java передаётся в JavaScript для обработки. Начиная с JavaScript 1.4, Вы можете отловить это исключение в операторе try...catch.

Например, предположим, Вы используете Java-метод forName для присвоения имени Java-класа переменной theClass. Метод forName вызывает исключение, если передаваемое Вами значение не вычисляется в имя Java-класса. Поместите оператор присвоения forName в блок try для обработки исключения:

function getClass(javaClassName) {
try {
var theClass = java.lang.Class.forName(javaClassName);
} catch (e) {
return ("The Java exception is " + e);
}
return theClass
}

В этом примере, если javaClassName вычисляется в верное имя класса, такое как "java.lang.String", присвоение проходит успешно. Если javaClassName вычисляется в неверное имя класса, такое как "String", функция getClass отлавливает исключение и возвращает нечто подобное:

The Java exception is java.lang.ClassNotFoundException: String

Взаимодействие 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
См. в документации 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 в Java
Когда JavaScript-код вызываемый из Java, терпит неудачу на этапе прогона программы, он вызывает исключение. Если Вы вызываете JavaScript-код из Java, Вы можете отловить это исключение в операторе try...catch. Исключение JavaScript доступно в Вашем Java-коде как экземпляр netscape.javascript.JSException.

JSException это Java-оболочка вокруг исключения любого типа, вызываемого в JavaScript, аналогично тому, как экземпляры JSObject являются оболочками для JavaScript-объектов. Используйте JSException, если Вы вычисляете JavaScript-код в Java.

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

  • Код JavaScript не вычисляется или из-за ошибки компиляции JavaScript, или из-за какой-нибудь другой ошибки времени выполнения.
    Интерпретатор JavaScript генерирует сообщение об ошибке, которое конвертируется в экземпляр JSException.
  • Java успешно вычисляет JavaScript-код, но JavaScript-код выполняет необработанный оператор throw.
    JavaScript вызывает исключение, которое обёрнуто как экземпляр JSException. Используйте метод getWrappedException из JSException для развёртывания этого исключения в Java.
 
Конвертация Типов Данных

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

  • Числа
    Если Вы передаёте числовые типы JavaScript в качестве параметров методам Java, Java конвертирует эти значения в соответствии с правилами, описанными в следующей таблице:
    Тип Java-параметра Правила Конверсии
    double Точное значение переносится в Java без округления и без потери точности или знака.
    lava.lang.Double
    java.lang.Object
    Создаётся новый экземпляр java.lang.Double, и точное значение передаётся в Java без округления и без потери точности или знака.
    float Значения округляются до чисел с плавающей точкой.

    Значения, которые слишком малы или велики, чтобы быть представленными, округляются до +infinity или -infinity.

    byte
    char
    int
    long
    short
    Значения округляются с использованием режима round-to-negative-infinity/округление-в-сторону-отрицательной-бесконечности.

    Значения, которые слишком малы или велики, чтобы быть представленными, дают ошибку времени выполнения.

    Значения NaN конвертируются до нуля.

    java.lang.String Значения конвертируются в строки. Например, 237 становится "237"
    boolean Значения 0 и NaN конвертируются в false.

    Другие значения конвертируются в true.

    Если число JavaScript передаётся в качестве параметра в Java-метод, который ожидает экземпляр объекта java.lang.String, это число конвертируется в строку. Используйте метод equals() для сравнения результата этой конвертации с другими строковыми значениями
  • Булевы Значения
    Если Вы передаёте Булевы типы 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 передаётся в качестве параметра Java-методу, ожидающему экземпляр объекта java.lang.String, Булево значение конвертируется в строку. Используйте операцию == для сравнения результата этой конвертации с другими строковыми значениями.
  • Строковые Значения
    Если Вы передаёте строковые типы JavaScript как параметры для Java-методов, Java конвертирует значения в соответствии с правилами, описанными в следующей таблице:
    Тип Java-параметра Правила Конверсии
    lava.lang.String
    java.lang.Object
    JavaScript 1.4:

    Строка JavaScript конвертируется в экземпляр объекта java.lang.String со значением Unicode.

    JavaScript 1.3 и ранее:

    Строка JavaScript конвертируется в экземпляр объекта java.lang.String со значением ASCII.

    byte
    double
    float
    int
    long
    short

    Все значения конвертируются в числа так, как описано в ECMA-262.

    Строковые значения JavaScript конвертируются в числа в соответствии с правилами ECMA-262

    char

    JavaScript 1.4:

    Односимвольные строки конвертируются в Unicode-символы.

    Все иные значения конвертируются в числа.

    JavaScript 1.3 и ранее:

    Все значения конвертируются в числа.

    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. Если значение undefined JavaScript передаётся в качестве параметра Java-методу, который ожидает экземпляр объекта java.lang.String, значение undefined конвертируется в строку. Используйте операцию == для сравнения результата этой конвертации с другими строковыми значениями.
  • Null-Значения
    Если Вы передаёте значения null JavaScript в качестве параметра Java-методам, Java конвертирует значения в соответствии с правилами, описанными в следующей таблице:
    Тип Java-параметра Правила Конверсии
    Любой класс
    Любой тип интерфейса
    Значение становится null.
    byte
    char
    double
    float
    int
    long
    short
    Значение становится 0
    boolean Значение становится false
  • Объекты JavaArray и JavaObject
    В большинстве случаев, если Вы передаёте JavaArray или JavaObject JavaScript в качестве параметра Java-методу, Java просто снимает оболочку с объекта; в некоторых случаях объект приводится к другому типу данных в соответствии с правилами, описанными в следующей таблице:
    Тип Java-параметра Правила Конверсии
    Любой интерфейс или класс, совместимый при присвоении с развёрнутым /unwrapped объектом. Объект разворачивается.
    java.lang.String Объект разворачивается, вызывается метод toString развёрнутого Java-объекта, и результат возвращается как новый экземпляр объекта java.lang.String
    byte
    char
    double
    float
    int
    long
    short
    Объект разворачивается, и возникает одна из следующих ситуаций:

    Если развёрнутый Java-объект имеет метод doubleValue, the JavaArray или JavaObject конвертируется в значение, возвращаемое этим методом.

    Если развёрнутый Java-объект не имеет метода doubleValue, возникает ошибка.

    boolean

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

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

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

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

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

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

    Интерфейс или класс совместим для присвоения с развёрнутым объектом, если развёрнутый объект является экземпляром типа Java-параметра
  • Объекты JavaClass
    Если Вы передаёте объект JavaClass из JavaScript в качестве параметра Java-методу, Java конвертирует значение в соответствии с правилами, описанными в следующей таблице:
    Тип Java-параметра Правила Конверсии
    java.lang.Class Объект разворачивается.
    java.lang.JSObject
    java.lang.Object
    Объект JavaClas разворачивается в новый экземпляр объекта java.lang.JSObject
    java.lang.String Объект разворачивается, вызывается метод toString развёрнутого Java-объекта и результат возвращается как новый экземпляр объекта java.lang.String.
    boolean В JavaScript 1.3 и позднее, объект разворачивается, и возникает одна из следующих ситуаций:

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

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

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

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

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

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

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

  • Java-значения byte, char, short, int, long, float и double конвертируются в числа JavaScript.
  • Булево значение Java конвертируется в булево значение JavaScript.
  • Объект класса netscape.javascript.JSObject конвертируется в оригинальный JavaScript-объект.
  • Массивы Java конвертируются в объект псевдо-Array JavaScript; поведение этого объекта похоже на объект Array из JavaScript: Вы можете получить к нему доступ через синтаксис 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 + "";

 
Языки на Базе Классов и Языки на Базе Прототипов
Объектно-ориентированные языки на базе классов, такие как Java и C++, основаны на концепции двух различных сущностей: классов и экземпляров.
  • Класс определяет все свойства (если рассматривать методы и поля Java или члены C++ как свойства), которые характеризуют определённый набор объектов. Класс это абстракция, а не какой-то определённый член набора объектов, которые он описывает. Например, класс Employee может представлять набор всех служащих/employees.
  • Экземпляр, с другой стороны, это инстанциация класса; то есть один из его членов. Например, Victoria может быть экземпляром класса Employee, представляя отдельного индивидуума как служащего/employee. Экземпляр имеет в точности те свойства, которые имеет его родительский класс (ни больше, ни меньше).

Язык на базе прототипов, такой как JavaScript, не имеет таких различий: в нем просто имеются объекты. Язык на базе прототипов содержит понятие prototypical object\прототипичный объект - объект, используемый как шаблон, из которого получаются начальные свойства для нового объекта. Любой объект может специфицировать свои собственные свойства, либо когда Вы создаёте его, либо на этапе прогона. Кроме того, любой объект может быть ассоциирован как прототип для другого объекта, давая другому объекту возможность использовать свойства первого объекта.

 
Определение Класса
В языках на базе классов Вы определяете класс в отдельном определении класса. В этом определении Вы можете специфицировать специальные методы, называемые конструкторами, которые служат для создания экземпляров класса. Конструктор метода может специфицировать начальные значения для свойств экземпляров и выполнять другую обработку на этапе создания. Вы используете оператор new вместе с конструктором метода для создания экземпляров класса.

JavaScript следует простой модели, но не имеет определения класса отдельно от его конструктора. Вместо этого Вы определяете конструктор функции для создания объектов с определённым начальным набором свойств и значений. Любая функция JavaScript может использоваться как конструктор. Вы используете оператор new вместе с конструктором функции для создания новых объектов.

 

 
Подклассы и Наследование
В языках на базе классов Вы создаёте иерархию классов через определения классов. В определении класса Вы можете специфицировать, что новый класс является subclass\подклассом уже существующего класса. Подкласс наследует все свойства суперкласса (родительского) и может дополнительно вводить новые свойства и модифицировать унаследованные. Например, предположим, что класс Employee имеет только свойства name и dept и что Manager является подклассом от Employee, добавляющим свойство reports. В этом случае экземпляр класса Manager будет иметь все три свойства: name, dept и reports.

JavaScript реализует наследование, позволяя Вам ассоциировать прототипичный объект с любым конструктором функции. Так, Вы можете создать пример Employee-Manager, но используя при этом слегка иную терминологию. Во-первых, Вы определяете конструктор функции Employee, специфицируя свойства name и dept. Затем Вы определяете конструктор функции Manager, специфицируя свойство reports. Наконец, Вы присваиваете новый Employee-объект как прототип конструктору функции Manager. После этого, когда Вы создаёте новый Manager-объект, он наследует it свойства name и dept от объекта Employee.

 
Добавление и Удаление Свойств
В языках на базе классов Вы обычно создаёте класс на этапе компиляции и затем создаёте экземпляры класса на этапе компиляции или на этапе прогона программы. Вы не можете изменить количество или типы свойств класса после того, как Вы определили этот класс. В JavaScript, напротив, на этапе прогона Вы можете добавлять и удалять свойства любого объекта. Если Вы добавляете свойство к объекту, который используется как прототип для набора объектов, эти объекты также получают новое свойство.
Различия

В таблице дано краткое резюме по некоторым отличиям

На базе классов (Java) На базе прототипов (JavaScript)
Класс и экземпляр класса являются разными сущностями. Все объекты являются экземплярами.
Определяет класс в определении класса; инстанциирует класс методами-конструкторами. Определяет и создаёт набор объектов с помощью конструкторов функций.
Создаёт отдельный объект оператором new. То же самое.
Иерархия объектов конструируется путём использования определения класса для определения подклассов существующих классов. Иерархия объектов конструируется присвоением объекта как прототипа, ассоциированного с конструктором функции.
Наследует свойства по цепочке классов. Наследует свойства по цепочке прототипов.
Определение класса специфицирует все свойства всех экземпляров класса. Свойства не могут добавляться динамически на этапе прогона программы. Конструктор функции или прототип специфицирует начальный набор свойств. Свойства могут удаляться и добавляться динамически в отдельных объектах или сразу для набора объектов.

footer:
Rambler's Top100