AMP версия сайта

Электронная библиотека

  • Современные работы
  • Бесплатно скачать книги
  • Бесплатно скачать книги
  • Высшая алгебра, геометрия
  • Математический анализ, ТФ
  • Дифференциальные уравнения
  • Численные методы алгоритмы
  • Математическая физика
  • Теория чисел и множеств
  • Специальные темы, книги
  • Общая высшая физика
  • Другие популярные издания
  • Программисту веб-дизайнеру

  • Документация - HTML, XML
  • Статьи пресс-релизы обзоры
  • Веб-дизайнеру - JavaScript
  • Другие материалы

  • Авторское право - помощь
  • Полиграфия, печать цвет
  • Библиография, статьи
  • Клиентский JavaScript. Руководство по Использованию

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

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

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

  • Что такое LiveConnect?
  • Включение LiveConnect
  • Консоль Java
  • Работа с оболочками
  • Взаимодействие JavaScript с Java
  • Взаимодействие Java с JavaScript
  • Конвертация типов данных
  • Дополнительно об использовании LiveConnect см. JavaScript technical notes на сайте DevEdge.

    Что такое LiveConnect?

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

  • JavaScript для прямого доступа к переменным, методам, классам и пакетам Java.
  • Управлять Java-аплетами и plug-in'ами с помощью JavaScript.
  • Код Java для доступа к методам и свойствам JavaScript.
  • Включение LiveConnect

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

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

    Консоль 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 оболочка\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


    Объект
    Описание

    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

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

    Работа с массивами 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 на пакеты и классы 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)

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

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

    c = new java.lang.Character(72)

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

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

    Пример 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.

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

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

    Рисунок 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-аплета.

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

    Использование классов 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.
    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

    Давайте теперь отдельно рассмотрим использование 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");
    }

    Вызов методов 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 такими объектами.

    Пример: 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-аплета. Например, добавьте следующую функцию в <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. Эта конвертация рассматривается в следующих разделах:

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

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

  • Числа
  • Булевы
  • Строки
  • Undefined-значения
  • Null-значения
  • Объекты JavaArray и JavaObject
  • JavaClass-объекты
  • Другие объекты JavaScript
  • Return-значения методов netscape.javascript.JSObject всегда конвертируются в экземпляры java.lang.Object. Правила конвертации этих return-значений также описаны в этих разделах.

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

    Числа

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

    Булевы

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

    Строковые

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

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

    Null-значения

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


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

    Любой класс
    Интерфейс любого типа

    Значение становится null.

    byte
    char
    double
    float
    int
    long
    short

    Значение становится 0.

    boolean

    Значение становится false.

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

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

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

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

    Передаваемые из Java в JavaScript значения конвертируются так:

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

    Оглавление | Назад | Вперед | Индекс

    AMP версия сайта
    Мобильная версия

    Сайт для компьютера
    http://www.mat.net.ua