JavaScript (основы). Глава 15. LiveConnect. Обзор

JavaScript (основы). Глава 15. LiveConnect. Обзор

Создание и раскрутка сайтов

Вбиваю в ТОП-10, как гвозди

8-965-148-98-02, diplom07@mail.ru

Создание и раскрутка сайтов

Вбиваю в ТОП-10, как гвозди

8-965-148-98-02, diplom07@mail.ru

JavaScript (основы). Глава 15. LiveConnect. Обзор

JavaScript (основы). Глава 15. LiveConnect. Обзор

www.homa.xp3.bizОглавление | Назад | Вперёд | Индекс

Глава 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, Вы используете 1 из специальных объектов 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. Каждый параметр создаёт новый экземпляр, а не 1 экземпляр, того же примитивного типа.
    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 + "";

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

  • Отвечу на любые вопросы. С уважением, Дмитрий Владимирович:
    8-965-148-98-02, diplom07@mail.ru.
    Печатать страницу: JavaScript (основы). Глава 15. LiveConnect. Обзор

    JavaScript (основы), Глава 15, LiveConnect, Обзор, JavaScript, (основы), Глава, 15, LiveConnect, Обзор, создание, сайта, веб, заказ, web, дизайн, раскрутка, продвижение, новый, сайт, рейтинг, сео, seo, Создание сайтов, web-программирование, seo-продвижение, создание и раскрутка сайтов, вбиваю в топ-10, как гвозди, попробуйте бесплатно, Создание сайтов, web-программирование, seo-продвижение, JavaScript, (основы), Глава, 15, LiveConnect, Обзор, создание, сайта, веб, заказ, web, дизайн, раскрутка, продвижение, новый, сайт, рейтинг, сео, seo, создание, сайта, веб, заказ, web, дизайн, раскрутка, продвижение, новый, сайт, рейтинг, сео, seo, раскрутка сайтов, Вбиваю в ТОП-10, как гвозди, раскрутка сайтов, Делаю и раскручиваю сайты, Дмитрий Владимирович

    ×

    Ваше письмо