Учебное пособие: Аплеты
Учебное пособие: Аплеты
Факультет "Информатика и системы управления"
Методические указания к лабораторной работе
по курсу "Распределенные системы обработки
информации"
Аплеты
Москва 2004 г.
Оглавление.
Цель работы
Задание для домашней подготовки
Задание к лабораторной работе
Содержание отчета
Контрольные вопросы.
Литература.
Приложение. Аплеты.
Передача параметров
Параметры тега <applet>
Сведения об окружении аплета
Защита от аплета
Цель
работы
1.
Познакомиться с
библиотекой java.applet и классом java.applet.Applet
2.
Научится
обрабатывать события в аплетах.
3.
Освоить работу с
управляющими компонентами и менеджерами размещения.
4.
Применить
полученные знания на практике
Задание
для домашней подготовки
Ознакомиться с
материалом, предоставленным в приложениях к данным методическим указаниям.
Ознакомиться с текстом задания к лабораторной работе и написать программу.
Задание к лабораторной работе
o
На основе
оконного приложения, созданного в лабораторной работе №5 «Программирование
графики и обработка событий», разработать аплет – калькулятор
Содержание
отчета
Отчет должен содержать:
1.
Постановку
задачи, решаемой отлаженной программой.
2.
Руководство
пользователя отлаженной программы, содержащее описание интерфейсов всех
функций программы.
3.
Листинг программы
с необходимыми комментариями.
Контрольные вопросы.
1.
В случае, если
программа – аплет состоит из нескольких классов и после компиляции
сгенерировано несколько файлов *.class,
как внутри контейнера <applet></applet> html – файла это необходимо указать?
2.
Сколько классов в
пакете java.applet?
3.
Как изменится
работа программы, если внутри блока switch(){} не записывать операторы break.
4.
Модифицируйте
аплет так, чтобы коэффициент, на который умножается результат, был случайным
числом (метод random() класса java.lang.Math)
5.
Добавьте
текстовым полям слушателей и обработчики событий ActionEvent(). Обработчики также должны вызывать
метод вывода результата.
Литература.
Официальные источники:
1.
Кен Арнольд,
Джеймс Гослинг, Дэвид Холмс. Язык программирования Java™.
2.
Официальный сайт Java — http://java.sun.com/ (есть раздел на русском языке с учебником).
3.
Java™ 2
SDK, Standard Edition Documentation —
4.
Джеймс Гослинг,
Билл Джой, Гай Стил. Спецификация языка Java (The Java Language Specification. Перевод на русский язык — http://www.uni-vologda.ac.ru/java/jls/index.html
5.
Официальный сайт
проекта Eclipse — http://www.eclipse.org/.
Другое:
1.
Дмитрий Рамодин.
Начинаем программировать на языке Java.
2.
Николай Смирнов. Java 2: Учебное пособие.
3.
Картузов А. В.
Программирование на языке Java.
4.
Вязовик Н.А.
Программирование на Java.
5.
Алексей Литвинюк.
Введение в интегрированную среду разработки Eclipse.
Приложение.
Аплеты.
Аплеты —
это программы, работающие в среде другой программы — браузера. Аплеты не
нуждаются в окне верхнего уровня — им служит окно браузера. Они не запускаются
JVM — их загружает браузер, который сам запускает JVM для выполнения аплета.
Эти особенности отражаются на написании программы – аплета.
С точки
зрения языка Java, аплет — это всякое расширение класса Applet, который, в свою
очередь, расширяет класс panel. Таким образом, аплет — это панель специального
вида, контейнер для размещения компонентов с дополнительными свойствами и
методами. Менеджером размещения компонентов по умолчанию, как и в классе Panel,
служит FlowLayout. Класс Applet находится в
пакете java.applet, в котором кроме него есть только три интерфейса,
реализованные в браузере. Надо заметить, что не все браузеры реализуют эти
интерфейсы полностью.
Поскольку JVM
не запускает аплет, отпадает необходимость в методе main(), его нет в аплетах.
В аплетах
редко встречается конструктор. Дело в том, что при запуске первого создается
его контекст. Во время выполнения конструктора контекст еще не сформирован,
поэтому не все начальные значения удается определить в конструкторе.
Начальные
действия, обычно выполняемые в конструкторе и методе main(), в аплете записываются в метод init() класса Applet. Этот
метод автоматически запускается исполняющей системой Java браузера сразу же
после загрузки аплета. Вот как он выглядит:
public void
init(){}
Метод init ()
не имеет аргументов, не возвращает значения и должен переопределяться в каждом
аплете — подклассе класса Applet. Обратные действия — завершение работы,
освобождение ресурсов — записываются при необходимости в метод destroy(), тоже
выполняющийся автоматически при выгрузке аплета. В классе Applet есть пустая
реализация этого метода.
Кроме методов
init() и destroy() в классе Applet присутствуют еще два пустых метода,
выполняющихся автоматически. Браузер должен обращаться к методу start() при
каждом появлении аплета на экране и обращаться к методу stop(), когда
аплет уходит с экрана. В методе stop() можно определить действия, приостанавливающие
работу аплета, в методе start() — возобновляющие ее. Надо сразу же заметить,
что не все браузеры обращаются к этим методам как должно. Работу указанных
методов можно пояснить простым житейским примером.
Приехав
весной на дачный участок, вы прокладываете водопроводные трубы, прикручиваете
краны, протягиваете шланги — выполняете метод init() для своей оросительной
системы. После этого, приходя на участок, включаете краны — запускаете метод
start(), а уходя, выключаете их — выполняете метод stop(). Наконец, осенью вы
разбираете оросительную систему, отвинчиваете краны, просушиваете и укладываете
водопроводные трубы — выполняете метод destroy().
Все эти
методы в аплете необязательны. В примере 1 записан простейший аплет,
выполняющий программу HelloWorld.
Пример 1. аплет HelloWorld
import
java.awt.*;
import
java.applet.*;
public
class HelloWorld extends Applet{
public
void paint(Graphics g){
g.drawstring("Hello,
XXI century World!", 10, 30);
}
}
Эта программа
записывается в файл HelloWorld.java и компилируется как обычное
приложение:
Компилятор
создает файл HelloWorld.class,
но воспользоваться для его выполнения интерпретатором java теперь нельзя — нет
метода main(). Вместо интерпретации надо дать
указание браузеру для запуска аплета.
Указание
браузеру на запуск аплета дается в теге <applet>. В нем обязательно
задаются:
имя файла с
классом аплета параметром code;
ширина width
и высота height панели аплета в пикселах. Полностью текст HTML для нашего
аплета приведен в примере 2.
Пример 2. Файл HTML для загрузки аплета
HelloWorld
<html>
<head><title>
Applet</title></head> <body>
Ниже выполняется аплет.<br>
<applet
code = "HelloWorld.class" width = "200" height =
"100">
</applet>
</body>
</html>
Этот текст
заносится в файл с расширением html или htm, например, HelloWorld.html. Имя
файла произвольно, никак не связано с аплетом или классом аплета.
Оба файла —
HelloWorld.html и HelloWorld.class — помещаются в один каталог на сервере, и
файл HelloWorld.html загружается в браузер, который может находиться в любом
месте сервера. Браузер, просматривая HTML-файл, выполнит тег <applet> и загрузит аплет. После
загрузки аплет появится в окне браузера, как показано на рисунке 1.

Рисунок 1. Аплет HelloWorld в окне Internet Explorer
В этом
простом примере можно заметить еще две особенности аплетов. Во-первых, размер
аплета задается не в нем, а в теге <applet>. Это очень удобно, можно
менять размер аплета, не компилируя его заново. Можно организовать аплет
невидимым, сделав его размером в один пиксел. Кроме того, размер аплета
разрешается задать в процентах по отношению к размеру окна браузера, например,
<applet
code = "HelloWorld.class" width = "100%" height =
"100%">
Во-вторых,
как видно на рис. 1, у аплета серый фон. Такой фон был в первых браузерах, и
аплет не выделялся из текста в окне браузера. Теперь в браузерах принят белый
фон, его можно установить обычным для компонентов методом
setBackground(Color.white), обратившись к нему в методе init ().
В состав JDK
любой версии входит программа appietviewer. Это простейший браузер,
предназначенный для запуска аплетов в целях отладки.
На рисунке 2 appletviewer показывает аплет HelloWorld.

Рисунок 2.
Аплет
HelloWorld в окне программы appletviewer
Замечание
по отладке
Браузеры
помещают загруженные аплеты в свой кэш, поэтому после щелчка кнопкой мыши по
кнопке Refresh или Reload запускается старая копия аплета из кэша Для загрузки
новой копии надо при щелчке по кнопке Refresh в IE (Internet Explorer) держать
нажатой клавишу <Ctrl>, а при щелчке по кнопке Reload в NC (Netscape
Communicator) — клавишу <Shift> Иногда и это не помогает. Не спасает даже
перезапуск браузера. Тогда следует очистить оба КЭШа – и дисковый, и кэш в
памяти. В IE это выполняется кнопкой Delete Files в окне, вызываемом выбором
команды Tools | Internet Options. B NC необходимо открыть окно Cache командой
Edit | Preferences | Advanced.
При запуске
приложения интерпретатором java из командной строки в него можно передать
параметры в виде аргумента метода main (string [] args). В аплеты также
передаются параметры, но другим путем.
Передача параметров
Передача
параметров в аплет производится с помощью тегов <param>, располагаемых
между открывающим тегом <applet>
и закрывающим тегом </applet>
в HTML-файле. В тегах <param> указывается название параметра name и его
значение value.
В аплете для
приема каждого параметра надо воспользоваться методом getParameter (String
name) класса Applet, Возвращающим строку типа String. В качестве аргумента
этого метода задается значение параметра name в виде строки, причем здесь не
различается регистр букв, а метод возвращает, значение параметра value тоже в
виде строки.
Надеясь на
то, что параметры будут заданы в HTML-файле, все-таки присвойте начальные
значения переменным в аплете.
Замечание
по отладке
Операторы
System.out.println(), обычно записываемые в аплет для отладки, выводят
указанные в них аргументы в специальное окно браузера Java Console. Сначала
надо установить возможность показа этого окна. В Internet Explorer это делается
установкой флажка Java Console enabled выбором команды Tools | Internet Options
| Advanced. После перезапуска IE в меню View появляется команда Java Console.
Параметры тега <applet>
Обязательные
параметры:
·
code — URL-адрес
файла с классом аплета или архивного файла;
·
width и height —
ширина и высота аплета в пикселах.
Необязательные
параметры:
·
codebase —
URL-адрес каталога, в котором расположен файл класса аплета. Если этот параметр
отсутствует, браузер будет искать файл в том же каталоге, где размещен
соответствующий HTML-файл;
·
archive — файлы
всех классов, составляющих аплет, могут быть упакованы архиватором ZIP или
специальным архиватором JAR в один или несколько архивных файлов. Параметр
задает URL-адреса этих файлов через запятую;
·
align —
выравнивание аплета в окне браузера. Этот параметр имеет одно из следующих
значений: ABSBOTTOM, ABSMIDDLE, BASELINE, BOTTOM, CENTER, LEFT, MIDDLE, RIGHT,
TEXTTOP, TOP;
·
hspace и vspace —
горизонтальные и вертикальные поля, отделяющие аплет от других объектов в окне
браузера в пикселах;
·
download — задает
порядок загрузки изображений аплетом. Имена изображений перечисляются через
запятую в порядке загрузки;
·
name — имя
аплета. Параметр нужен, если загружаются несколько аплетов с одинаковыми
значениями code и codebase;
·
style —
информация о стиле CSS (Cascading Style Sheet); title — текст, отображаемый в
процессе выполнения аплета;
·
alt — текст,
выводимый вместо аплета, если браузер не может загрузить его;
·
mayscript — не
имеет значения. Это слово указывает на то, что аплет будет обращаться к тексту
JavaScript.
Между тегами
<applet> и </applet> можно написать текст, который будет выведен,
если браузер не сможет понять тег <applet>. Вот полный
пример:
<applet
name = "AnApplet" code = "AnApplet.class"
archive
= "anapplet.zip, myclasses.zip"
codebase
= "
width
= "300" height = "200" align = "TOP"
vspace
= "5" hspace = "5" mayscript
alt
= "If you have a Java-enabled browser,
you
would see an applet here.">
<hr>If
your browser recognized the applet tag,
you
would see an applet here.<hr>
</applet>
Обязательно
упаковывайте все классы аплета в zip- и jar-архивы и указывайте их в параметре archive в
HTML-файле. Это значительно ускорит загрузку аплета.
Следует еще
сказать, что, начиная с версии HTML 4.0, есть тег <object>,
предназначенный для загрузки и аплетов, и других объектов, например, ActiveX.
Кроме того, некоторые браузеры могут использовать для загрузки аплетов тег
<embed>.
Сведения об окружении аплета
Метод
getCodeBase () возвращает URL-адрес каталога, в котором лежит файл класса
аплета.
Метод getDocumentBase () возвращает URL-адрес
каталога, в котором лежит HTML-файл, вызвавший аплет.
Браузер
реализует интерфейс AppletContext,
находящийся в пакете java.applet. Аплет может получить ссылку на этот интерфейс
методом getAppletContext().
С помощью
методов getApplet (String name) и getApplets() интерфейса AppletСontext можно
получить ссылку на указанный аргументом name аплет или на все аплеты,
загруженные в браузер.
Метод
showDocument(URL address) загружает в браузер HTML-файл с адреса address.
Метод
showDocument (URL address, String target) загружает файл во фрейм, указанный
вторым аргументом target. Этот аргумент может принимать следующие значения:
·
_seif — то же
окно и тот же фрейм, в котором работает аплет;
·
_parent —
родительский фрейм аплета;
·
_top — фрейм
верхнего уровня окна аплета;
·
_biank — новое
окно верхнего уровня;
·
name — фрейм или
окно с именем name, если оно не существует, то будет создано.
Защита от аплета
Браузер может
вообще отказаться от загрузки аплетов. В Netscape Communicator это делается с
помощью флажка Enable Java в окне, вызываемом командой Edit | Preferences |
Advanced, в Internet Explorer — в окне после выбора команды Tools | Internet
Options | Security.
Если браузер
загружает аплет, то создает ему ограничения, так называемую "ящик для
песка" (sandbox), в которой резвится аплет, но выйти из которой не
может. Каждый браузер создает свои ограничения, но обычно они заключаются в
том, что аплет:
·
не может
обращаться к файловой системе машины, на которой он выполняется, даже для чтения
файлов или просмотра каталогов;
·
может связаться
по сети только с тем сайтом, с которого он был загружен;
·
не может
прочитать системные свойства;
·
не может печатать
на принтере, подключенном к тому компьютеру, на котором он выполняется;
·
не может
воспользоваться буфером обмена (clipboard); не может запустить приложение
методом ехес();
·
не может
использовать "родные" методы или загрузить библиотеку методом load();
·
не может
остановить JVM методом exit();
·
не может
создавать классы в пакетах java.*, а классы пакетов sun.* не может даже
загружать.
Браузеры
могут усилить или ослабить эти ограничения, например, разрешить локальным
аплетам, загруженным с той же машины, где они выполняются, доступ к файловой
системе. Наименьшие ограничения имеют доверенные (trusted) аплеты,
снабженные электронной подписью с помощью классов из пакетов java.security.*.
При создании
приложения, загружающего аплеты, необходимо обеспечить средства проверки аплета
и задать ограничения. Их предоставляет класс SecurityManager. Экземпляр этого класса или его наследника
устанавливается в JVM при запуске виртуальной машины статическим методом
setSecurityManager(SecurityManager sm) класса System. Обычные приложения не
могут использовать данный метод.
Каждый
браузер расширяет класс SecurityManager по-своему, устанавливая те или иные
ограничения. Единственный экземпляр этого класса создается при запуске JVM в
браузере и не может быть изменен.