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