Использование класса JSObject в апплетах

Содержание

1 Введение
2 Класс JSObject
3 Вывод содержимого TextArea
4 Готовый пример
5 Ссылки

Введение

Апплеты - это Java-программы, выполняющиеся в броузере. В большинстве случаев апплеты выполняют свою работу в среде Java Runtime Environment (JRE). Однако иногда необходимо выйти за пределы безопасной исполняющей среды апплета ("песочница") и связаться с броузером. Взаимодействие с броузером осуществляется при помощи возможности LiveConnect и разрешением апплетам работы с JavaScript. Основная часть этого взаимодействия осуществляется через класс netscape.javascript.JSObject.

Этот пакет первоначально являлся частью среды броузера Netscape. Но со временем Microsoft добавила этот пакет в Internet Explorer. Кроме того, он в настоящий момент является стандартной частью Java Runtime Environment, установленной с Java Plug-in. Это означает, что апплеты могут использовать пакет и смогут найти его во время выполнения. Нет необходимости включать классы в поставляемую программу.

Для разработки апплетов, использующих преимущества этого пакета, необходимо добавить необходимые классы в вашу переменную CLASSPATH. Исполняющая среда Java добавляет эти классы в CLASSPATH по умолчанию. Однако среда разработки этого не делает. Поэтому вам нужно сделать доступными для среды разработки файл jaws.jar (Windows) или javaplugin.jar (Solaris), поставляемые с пакетом Java Runtime.

Если вы используете Java 2 Standard Edition (J2SE) версии 1.3 Software Development Kit (SDK), вы можете разместить файл jaws.jar (Windows) в подкаталоге jre\lib\ext directory, или файл javaplugin.jar (Solaris) в подкаталоге jre/lib/ext каталога установки вашего SDK. Будучи скопированы один раз, соответствующие классы (и другие) станут доступными для ваших программ.

Класс JSObject

Как упоминалось ранее, ключевым классом для взаимодействия апплет-JavaScript является класс JSObject. Этот класс предоставляет, среди прочих функций, средство вызова методов JavaScript и выражения синтаксиса JavaScript. Для демонстрации этих возможностей создадим апплет, запрашивающий необработанный код HTML в своей TextArea. Затем откроем новое окно броузера для отображения HTML. Поскольку HTML-код находится в TextArea, а не в файле, вы можете просто вызвать метод showDocument() для открытия нового URL.

Прежде всего, для взаимодействия с JavaScript необходимо получить экземпляр JSObject. Этот класс не имеет конструктора. Вместо него вы вызываете метод getWindow класса, передавая параметр - экземпляр апплета:

JSObject topWindow = JSObject.getWindow(this);

Вызов методов объекта JSObject осуществляется при помощи метода call. В этот метод передается строковое название вызываемого метода и массив аргументов Object.

public Object call(String name, Object args[])

Для передачи аргументов создается массив, который заполняется необходимым количеством аргументов:

Object args[] = new args[x]
args[0] = ...;
args
[1] = ...;
...
args
[x] = ...;

Например, для открытия окна необходимо вызвать метод open объекта window. Поскольку getWindow возвращает объект window, связанный с апплетом, вы уже имеете объект window. Метод open принимает три аргумента:

  • Открываемый URL

  • Название окна

  • Любые атрибуты, разделенные запятыми

Атрибуты описывают внешний вид окна. Вот некоторые из наиболее стандартных:

  • width (number)

  • height (number)

  • location (boolean)

  • menubar (boolean)

  • scrollbars (boolean)

  • status (boolean)

  • toolbar (boolean)

Булевы значения могут быть yes, no, 1, или 0.

Например, если вам нужно окно 300x300 без строки месторасположения, меню, статусной строки и панели инструментов, строка атрибутов может выглядеть так:

"width=300,height=300,location=0,menubar=0,status=0,toolbar=0"

Используя эту строку атрибутов можно открыть непоименованное окно (без содержимого) при помощи массива из трех элементов, в котором установлен только третий элемент:

Object args[] = {"","","width=..."};

Затем передайте эти аргументы и имя метода в метод call объекта window, полученного из предыдущего вызова getWindow.

topWindow.call("open", args);

Вывод содержимого TextArea

Для заполнения окна содержимым из TextArea вы должны вызвать метод write с именованным элементом "document" в window.

Получение элемента document включает вызов метода getMember и передачу названия необходимого вам элемента, в данном случае - document:

JSObject document = (JSObject)popupWindow.getMember("document");

Затем нужно вызвать метод документа write для изменения содержимого окна. В нашем примере вы просто создаете еще один массив аргументов, на этот раз с только одним элементом для текста:

String htmlText = ...;
args =
new Object[] {htmlText};

Затем вызовите метод write:

document.call("write", args);

Вот, по существу, и все, что нужно для взаимодействия с объектом JSObject. Еще одной задачей, которую вы, возможно, захотите сделать с JSObject, является вызов метода eval. Получая строку, метод eval обрабатывает строку как выражение JavaScript и вычисляет его.

Готовый пример

Ниже приведен апплет, который охватывает все темы, рассмотренные в данной статье.

import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import netscape.javascript.*;

public class JSPopup extends Applet {
 
public void init() {
   
final TextArea ta = new TextArea();
    Button button =
new Button("Launch");
    ActionListener listener =
new ActionListener() {
     
public void actionPerformed(ActionEvent e) {
       
String htmlText = ta.getText();
        JSObject topWindow = JSObject.getWindow
(JSPopup.this);
        Object args
[] = new Object[3];
        args
[2] = "width=300,height=300,"
           
+ "location=0,menubar=0,status=0,toolbar=0";
        JSObject popupWindow =
(JSObject) topWindow.call("open", args);
        JSObject document =
(JSObject) popupWindow
            .getMember
("document");
        args =
new Object[] { htmlText };
        document.call
("write", args);
     
}
    }
;
    button.addActionListener
(listener);
    setLayout
(new BorderLayout());
    add
(ta, BorderLayout.CENTER);
    add
(button, BorderLayout.SOUTH);
 
}
}

При использовании взаимодействия апплет-JavaScript вы должны установить параметр MAYSCRIPT. Это дает указание системе безопасности разрешить взаимодействие двух систем.

<applet code=JSPopup width=300 height=300>
<PARAM NAME="MAYSCRIPT" VALUE="TRUE">
</applet>

Откомпилируйте этот апплет и запустите в своем броузере. Затем введите какой-либо HTML-текст в текстовую область:

<H1>Hello, World</H1>

Нажмите на кнопку Launch в апплете. Вы должны увидеть новое окно. Если этого не произойдет, попробуйте использовать другой броузер (было выявлено большое количество ошибок в реализации взаимодействия Java-JavaScript в 1.3.1 Plugin и Netscape).

Эту технику можно также использовать для отображения ответа при взаимодействии апплет-сервлет в ситуациях, когда апплет должен сам послать запрос POST в сервлет.

Ссылки

Даже без установленного пакета Java Plugin вы можете использовать класс netscape.javascript.JSObject со встроенной виртуальной машиной в броузерах Internet Explorer 4.x - 6.x и Netscape Communicator 4.7x. Поддержка взаимодействия с JavaScript во встроенных виртуальных машинах отличается от реализованной в Java Plug-in. Но основные положения, описанные в этой статье, остаются такими же. Однако встроенные виртуальные машины основываются на более старой версии пакета. Документация по более старым пакетам находится на странице http://home.netscape.com/eng/mozilla/3.0/handbook/plugins/doc/Package-netscape.javascript.html

Теги: applet JSObject