Изучаем Java

Привет, любимый читатель.
Сегодня ты узнаешь как подписать JAVA апплет. Для начала скажу, что JAVA апплеты имеют ограниченную функциональность, пока они не подписаны. Например, неподписанные апплеты не могут:

Вариантов решения проблемы несколько:
1. Разрешить выполнение на каждой локальной машине клиентов. Для этого можно отредактировать файл java.policy, который находится в папке с установленным JRE (по умолчанию в C:\Program Files\Java\jre6\lib\security). И добавить необходимые разрешения. Например, чтобы разрешить все, что можно, нужно вставить строчку:

Grant { ... permission java.security.AllPermission; }

А если нужно разрешить только работу с буфером обмена для сайта hackmeplease.com :

Grant codeBase "http://hackmeplease.com/*" { permission java.awt.AWTPermission "accessClipboard"; };

Этот способ будет удобен только в том случае, если кол-во конечных пользователей твоего сайта ограничено и тебе не в лом на каждом компьютере править этот файл. Кроме того безопасность этого решения не очень высока.

2. Подписать свой Java-апплет. Итак, что имеем на входе:
- установленные JDK и JRE;
- jar-файл своего апплета (есть некоторые особенности написания исходного кода, см. ниже);
- желание работать с буфером обмена. Для этого нужно, чтобы корректно работала строчка:

Toolkit toolkit = Toolkit.getDefaultToolkit();
Clipboard clipboard = toolkit.getSystemClipboard();

В случае вызова этих строчек, из неподписанного апплета получим следующее исключение:
java.security.AccessControlException: access denied (java.awt.AWTPermission accessClipboard)

Итак, приступим:
0. Переходим в папку BIN нашего JDK (например, C:\Program Files\Java\jdk1.6.0_23\bin).
I. Создаем локальное хранилище нашего сертификата (keystore):
keytool -genkey -keystore .keystore -alias «Terrasoft» -validity 99999

99999 - срок в месяцах валидности сертификата;
.keystore - имя файла создаваемого хранилища.

В случае успешного запуска команды, система спросит нас пароль нашего хранилища, а также некоторую информацию о сертификате (твои ФИО, название компании, город, страну и группу крови)

В результате будем иметь файл.keystore. Это и есть наше хранилище, которым мы будем подписывать разные апплеты.
II. Копируем в папку BIN нашего JDK наш JAR-файл. Подписываем его с помощью следующей команды:
jarsigner.exe -keystore .keystore ClipboardLibrary.jar «Terrasoft»
где Terrasoft - название alias нашего сертификата;
.keystore - имя файла хранилища;
ClipboardLibrary.jar - название JAR-файла.
Система спросит нас пароль - вводим тот, что ввели в п. I.

Вроде как готово… Да щас, наивный…
Итак, при запуске страницы с нашим апплетом на борту пользователь получит дружественное сообщения вида:

Что означает, «Пользователь, нажми Да и попрощайся со своей системой, ибо мы сможем с ней делать, что захотим».
Кстати, обратите внимание на NOT VERIFIED. Означает, что у нас не доверительный сертификат. Чтобы получить доверительный, нужно обращаться в специальные службы в инете и даже платить деньгу.

Но вернемся к нашим баранам. При обращении к буферу обмена мы снова получим исключение вида:
java.security.AccessControlException: access denied (java.awt.AWTPermission accessClipboard)

Очень жаль. Ну что же, не получилось сейчас - получится в другой раз. До свидания.

Шучу. На самом деле на этом моменте останавливаются все руководства по подписыванию апплетов, которые я встречал. Мол, подписанному апплету ничего не страшно. Пусть им всем будет стыдно.
Короче, следующий финт для того, чтобы наше обращение к буферу обмена заработало:

III. Изменить исходный код.
Вместо вызова вида:
clipboard = toolkit.getSystemClipboard()
нужно написать вызов вида:
clipboard = (Clipboard) AccessController.doPrivileged(new PrivilegedAction() { public Object run() { return toolkit.getSystemClipboard(); } });
После этого нужно перекомпилировать свой JAR и повторить шаг II (тем, кто читал с конца мое сообщение - респект).

Вот в общем-то и все. Должно работать. Надеюсь, что кому-то это пригодится, и он не будет столько своей жизни тратить на эту ерунду, сколько потратил я. Нехай проблеми i негоди не роблять вам в життi погоди (С). До новых встреч в эфире.

Графические интерфейсы, рисунки и изображения могут быть реализованы в апплетах. Апплеты представляют собой разновидность графических приложений, реализованных в виде классов языка Java, которые размещаются на серверах Internet, транспортируются клиенту по сети, автоматически устанавливаются и запускаются браузером как часть документа HTML. Апплеты позволяют вставлять в документы поля, содержание которых меняется во времени, организовывать "бегущие строки", меню, мультипликацию, производить вычис­ления на клиентской странице. Апплеты выполняются браузером при отображении HTML-документа или просматриваются программой appletviewer. Апплеты не могут записывать файлы и читать информацию из файлов. Эти ограничения связаны с проблемой безопасности клиентского компьютера, поскольку клиенты не желают запускать «троянского коня» в свой компьютер. Существует несколько уровней безопасности, устанавливаемых клиентом для апплетов, загружаемых с сервера (надежные апплеты). КлассApplet обеспечи­вает интерфейс между апплетами и их окружением. Апплеты являются наследниками класса Applet из пакета java . applet из пакета AWT или его подкласса JApplet из пакета Swing.

Есть несколько методов класса Applet , которые управляют созданием и выполнением апплета на Web-странице. Апплету не нужен метод main() ,код запуска помещается в методе init() . Перегружаемый метод init() автома­тически вызывается при загрузке апплета для выполнения начальной инициализации. Методstart() вызывается каждый раз, когда апплет переносится в поле зрения браузера, чтобы начать операции. Метод stop() вызывается каждый раз, когда апплет выходит из поля зрения Web-браузера, чтобы позволить апплету завершить операции. Метод d estroy() вызывается, когда апплет начинает выгружаться со страницы для выполнения финального осво­бождения ресурсов. Кроме этих методов, при выполнении апплета автоматически запускается метод paint () класса Component . Метод paint () не вызывается явно, а только из других методов, например из метода repaint () , если необходима перерисовка.

Ниже приведен пример апплета, в котором используются методы init () , paint () , методsetColor () установки цвета символов и метод drawString () рисования строк.

/* пример # 1: вывод даты: DateApplet .java */

package chapt11;

import java.awt.Color;

import java.awt.Graphics;

import java.util.Calendar;

import java.util.Formatter;

import javax.swing.JApplet;

public class DateApplet extends JApplet {

private Formatter dateFmt = new Formatter();

private Formatter timeFmt = new Formatter();

public void init() {

setSize(180, 100);

Calendar c = Calendar.getInstance();

String era = "";

if (c.get(Calendar.ERA) == 1)

dateFmt.format("%tA %td.%tm.%tY года "

Era, c, c, c, c);

timeFmt.format("%tT", c);

public void paint(Graphics g) {

g.setColor(Color.RED);

g.drawString("Апплет стартовал в " + timeFmt,

10, getHeight()/2);

g.setColor(new Color(0,87,127));

g.drawString(dateFmt.toString(), 13,

getHeight() – 10);

Рис. 11.2. Вывод строки и даты

Доступ к элементам даты осуществлен с помощью класса java . util . Calendar . Цвет выводимых символов устанавливается с помощью полей класса Color .

После выполнения компиляции имя класса, содержащего байт-код апплета, помещается в тег < applet параметры> applet > документа HTML. Например:

DateApplet .class

width = 250 height = 250>

Исполнителем HTML-документа является браузер, который и запускает соответствующий ссылке апплет.

Большинство используемых в апплетах графических методов, как и исполь­зованные в примере методы setColor () , drawString() , – методы абстрактного базового класса java . awt . Graphics . КлассGraphics представляет гра­фический контекст для рисования, который затем отображается на физическое устройство. Методы апплета получают объект класса Graphics (графический кон­текст) в качестве параметра и вместе с ним – текущий цвет, шрифт, положение курсора. Установку контекста обычно осуществляют методы update () или paint () .

Ниже перечислены некоторые методы класса Graphics :

drawLine (int x1, int y1, int x2, int y2) – рисует линию;

drawRect (int x, int y, int width, int height) и fillRect(int x, int y, int width, int height) – рисуют прямоугольник и заполненный прямоугольник;

draw3DRect(int x, int y, int width, int height, boolean raised) – рисует трехмерный прямоугольник;

drawRoundRect(int x, int y, int width, int height, int arcWidth, int arcHeight) – рисует округленный прямоугольник;

drawOval(int x, int y, int width, int height) – рисует овал;

drawPolygon(int xPoints, int yPoints, int nPoints) – рисует полигон (многоугольник), заданный массивами координат x и y ;

drawPolygon (Polygon p ) – рисует полигон, заданный объектом Polygon ;

drawPolyline (int xPoints , int yPoints , int nPoints ) – рисует последовательность связных линий, заданных массивами x и y ;

drawArc(int x, int y, int width, int height, int startAngle, int arcAngle) – рисует дугу окружности;

drawImage(Image img, int x, int y, Color bgcolor, ImageObserver observer) – вставляет изображение;

drawString (String str, int x, int y) – рисует строку;

setColor(Color c) , getColor() – устанавливает и возвращает текущий цвет;

getFont() – возвращает текущий шрифт;

setFont(Font font) – устанавливает новый шрифт.

Методы класса Graphics используются для отображения графики как для классов Applet , так и для классов JApplet .

В примерах 2–4, приведенных ниже, демонстрируется использование ме­тодов класса Graphics для вывода графических изображений в окно апплета.

/* пример # 2: трехмерные прямоугольники: Th rRect . java */

package chapt11;

import java.awt.Color;

import java.awt.Graphics;

import javax.swing.JApplet;

public class ThrRect extends JApplet {

public void draw3D(Graphics g, int x, int y, int width, int height, boolean isRaised, boolean isFilled) {

g.draw3DRect(x, y, width – 1, height – 1,

g.draw3DRect(x + 1, y + 1, width – 3,

height – 3, isRaised);

g.draw3DRect(x + 2, y + 2, width – 5,

height – 5, isRaised);

if (isFilled)

g.fillRect(x + 3, y + 3, width – 6,

public void paint(Graphics g) {

g.setColor(Color.GRAY);

draw3D(g, 10, 5, 80, 40, true , false );

draw3D(g, 130, 5, 80, 40, false , false );

draw3D(g, 10, 55, 80, 40, true , true );

draw3D(g, 130, 55, 80, 40, false , true );

Рис . 11.3. Трехмерные прямоугольники

Пакет java.awt содержит большое число классов, используемых для вывода изображения: Color , Font , Image , Shape , Canvas и т.д. Кроме того, возможности этого пакета расширяют пакеты java.awt.geom , java.awt.color , java.awt.image и другие.

/* пример # 3: построение фигур : BuildShape. java */

package chapt11;

import java.awt.Color;

import java.awt.Graphics;

import java.awt.Graphics2D;

import java.awt.Shape;

import java.awt.geom.*;

import javax.swing.JApplet;

public class BuildShape extends JApplet {

public void init() {

setSize(200, 205);

public void paint(Graphics g) {

Graphics2D g2 = (Graphics2D) g;

g2.rotate(Math.PI / 6);

drawChessBoard(g);

//поворот

g2.rotate(-Math.PI / 6);

g.setXORMode(new Color(200, 255, 250));

Shape e = new Ellipse2D.Float(70, 75, 70, 50);

//рисование эллипса

//рисование шахматной доски

public void drawChessBoard(Graphics g) {

int size = 16;

for (int y = 0; y < 8; y++) {

for (int x = 0; x < 8; x++) {

if ((x + y) % 2 == 0)

g.setColor(Color.BLUE);

g.setColor(Color.WHITE);

g.fillRect(75 + x * size, y * size – 25, size, size);

g.setColor(Color.BLACK);

g.drawString(new Character(

(char ) (‘8’ – y)).toString(), 66, y * size – 13);

g.drawString(new Character(

(char ) (y + ‘a’)).toString(),

79 + y * size, 8 * size – 14);

Рис. 11.4. Построение различных фигур

// пример # 4: вывод GIF -изображения: DrawImage . java

package chapt11;

import java.awt.Graphics;

import java.awt.Image;

import javax.swing.JApplet;

public class DrawImage extends JApplet {

private Image img;

public void init() {

img = getImage(getCodeBase(), "joli.gif");

public void paint(Graphics g){

g.drawImage(img, 0, 0, this );

При использовании свойств тега существует возможность передать параметры из HTML-документа в код апплета. Пусть HTML-документ имеет вид:

Параметры апплета

width=250 height=300>

applet >

Тогда для чтения и обработки параметров bNumber и state апплет должен выглядеть следующим образом:

/* пример # 5: передача параметров апплету: ReadParam.java */

package chapt11;

import java.awt.Color;

import java.awt.Graphics;

import java.applet.Applet;

public class ReadParam extends Applet {

private int bNum;

private boolean state;

public void start() {// чтение параметров

param = getParameter("state");

if (param != null )

state = new Boolean(param);

param = getParameter("bNumber");

if (param != null )

bNum = Integer.parseInt(param);

} catch (NumberFormatException e) {

state = false ;

public void paint(Graphics g) {

double d = 0;

if (state) d = Math.pow(bNum, 2);

else g.drawString("Error Parameter", 0, 11);

g.drawString("Statement: " + state, 0, 28);

g.drawString("Value b: " + bNum, 0, 45);

g.drawString("b power 2: " + d, 0, 62);

Рис. 11.5. Передача параметров в апплет

Если параметр недоступен, метод getParameter () возвращает null .

При применении управляющих компонентов в апплетах принято использовать классы из пакета javax . swing , в которых компонент на экране создается средствами Java и в минимальной степени зависит от платформы и оборудования. Такими классами-компонентами являются JButton , JCheckBox , JDialog , JMenu , JComboBox , JMenu , JTextField , JTextArea и другие. Компоненты, как правило, размещают в контейнер (класс C ontainer ), являющийся неявным объектом любого графического приложения. Явную ссылку на контейнер можно получить с помощью метода getContentPane () .

// пример # 6: апплет с компонентом: MyJApplet.java

package chapt11;

import java.awt.Container;

import javax.swing.JApplet;

import javax.swing.JLabel;

public class MyJApplet extends JApplet {

private JLabel lbl = new JLabel("Swing-applet!");

public void init() {

Container c = getContentPane();

Рис. 11.6. Апплет с меткой

В этой программе производится помещение текстовой метки JLabel на форму в апплете. Конструктор класса JLabel принимает объект String и использует его значение для создания метки. Автоматически вызываемый при загрузке апплета метод init() обычно отвечает за инициализацию полей и размещение компонента на форму. Для этого вызывается метод add() класса Container , который помещает компонент в контейнер. Метод add() сразу не вызывается, как можно сделать в библиотеке AWT. Пакет Swing требует, чтобы все компоненты добавлялись в "панель содержания" формы ContentPane , так что требуется сначала вызывать метод getContentPane() классаJApplet для создания ссылки на объект, как часть процесса add() .

// пример # 7: жизненный цикл апплета: DemoLC . java

package chapt11;

import java.awt.Color;

import java.awt.Graphics;

import javax.swing.JApplet;

public class DemoLC extends JApplet {

private int starX =

{ 112, 87, 6, 71, 47, 112, 176, 151, 215, 136 };

private int starY =

{ 0, 76, 76, 124, 200, 152, 200, 124, 76, 76 };

private int i;

private Color c;

public void init() {

c = new Color(0, 0, 255);

setBackground(Color.LIGHT_GRAY);

public void start() {

int j = i * 25;

if (j < 255)

c = new Color(j, j, 255 – j);

else i = 1;

public void paint(Graphics g) {

g.fillPolygon(starX, starY, starX.length);

g.setColor(Color.BLACK);

g.drawPolygon(starX, starY, starX.length);

public void stop() {

Рис. 11.7. Цвет полигона и жизненный цикл апплета

При работе со шрифтами можно узнать, какие из них доступны на компьютере, и использовать их. Для получения этой информации применяется метод getAvailableFontFamilyNames() класса GraphicsEnvironment . Метод возвращает массив строк, содержащий имена всех доступных семейств шрифтов, зарегистрированных на данном компьютере.

// пример # 8: доступ к шрифтам ОС: Fon ts .java

package chapt11;

import java.awt.Font;

import java.awt.Graphics;

import java.awt.GraphicsEnvironment;

import javax.swing.JApplet;

public class Fonts extends JApplet {

private String fonts;

public void init() {

GraphicsEnvironment ge =

GraphicsEnvironment.getLocalGraphicsEnvironment();

fonts = ge.getAvailableFontFamilyNames();

setSize(700, 400);

public void paint(Graphics g) {

int xSize = getWidth() / 170;

for (int i = 0; i < fonts.length; i++) {

g.setFont(new Font(

fonts[i], Font.PLAIN, 12)); // название, стиль, размер

g.drawString(fonts[i],

170 * (i % xSize), 13 * (i / xSize + 1));

Рис. 11.8. Вывод списка шрифтов

15 ответов

Я думаю, что Java-апплеты были омрачены Flash и ActionScript (каламбур непреднамеренно), что намного проще в использовании для того, что Java-апплеты использовались в то время (анимации + приложения с поддержкой состояния).

Успех Flash в этом отношении, в свою очередь, связан с гораздо меньшими размерами файлов, а также выгодой от решения Sun против Microsoft, в результате которого Microsoft удалила MSJVM из Internet Explorer во время кончины Netscape и тяжелого доминирования IE.

1) AWT сделал для ужасных пользовательских интерфейсов. Свинг улучшился, но было уже слишком поздно, потому что... 2) Microsoft отказалась от поддержки Java в браузере (ее проприетарный MSJVM), и до этого он поддерживал бы только последнюю версию, выпущенную, которая была примерно совместима с JDK 1.1.
3) Итак, сегодня вы не можете быть уверены, что апплет будет работать на большинстве машин, не являющихся разработчиками, в отличие от flash.

То же самое можно сказать об ActiveX.

Для чего это стоит, Солнце снова наливает деньги и ресурсы в апплеты. Они внесли некоторые существенные улучшения в JDK 1.6.10 , чтобы смягчить множество апплетов "clunkiness", которые были выставлены. Например, с помощью этого обновления вы можете отображать собственный пользовательский загрузочный образ/анимацию, пока загружается апплет, а плагин добавлен в основную диету для повышения производительности.

Они также приступили к инициативе напрямую конкурировать с Flash и Silverlight - JavaFX .

Будет ли рынок реагировать на все это, еще предстоит увидеть, но это, безусловно, захватывающий шаг на стороне Солнца, учитывая доминирование Flash на рынке.

Я предполагаю это, потому что java является "реальным", т.е. язык общего назначения. Чтобы сделать апплет, вам нужно написать код, и нет ярлыков.

Теперь, когда появилась флешка и т.д., вы можете в значительной степени просто драпировать и бросить свой путь, создав классную анимацию для своего сайта. Это гораздо более низкий барьер для входа - вам не обязательно знать, как программировать, чтобы заставить работать flash-анимацию. Таким образом, flash распространяется, а java-апплеты почти не используются.

Я думаю, что апплеты являются побочным ущербом в битве между Microsoft и Sun.

Во-первых, JVM очень медленно загружался и требовал слишком много памяти. Затем, когда увеличение вычислительной мощности сделало JVM возможным, Sun играло тяжело, поскольку пыталось контролировать все вещи Java:

В рамках еще одного частного антимонопольного иска, поданного против Microsoft компанией Sun в марте, Sun запросила предварительный судебный запрет, требующий от Microsoft включить текущую виртуальную машину Java (JVM) в операционную систему Windows XP. Microsoft заявила, что решение о включении JVM на этой неделе является прямым результатом последней юридической запутанности с Sun, но Microsoft планирует расформировать поддержку Java в Windows после 1 января 2004 года. Курс Microsoft Reverses, включит Java VM в Windows XP - сейчас

Они взяли навсегда, чтобы загрузить и войти в браузер, а затем для многих людей они не работали. Когда они, наконец, загрузились, интерфейсы были уродливыми и неуклюжими. Я думаю, что плохой пользовательский опыт стал большим шагом в сторону устаревания апплетов.

Итак, чтобы ответить на исходный вопрос, у меня есть собственный вопрос - вы спрашиваете: "Почему сайты не используют java-апплеты больше", и мой ответ "зачем кому-то захотеть?"

Я вижу их много в acedemic настройках (размещенных на факультетах или факультетах), но вы правы в том, что они не очень популярны.

Однако помните, что большие обещания Java достигнуты. У нас есть Flash, Java-апплеты, Silverlight и постоянно совершенствующиеся фреймворки JavaScript.

Теперь, если я сделал личное мнение - я думаю, что Java-апплеты неэлегантны. Они, как правило, выглядят уродливыми, среда выполнения Java делает его присутствие в ОС слишком известным (с точки зрения визуализации времени выполнения, обновлений и уродливого установщика). Flash намного лучше сочетается с богатой медиа-средой и ее прозрачным (и повсеместным) развертыванием.

Я считаю, что проблемы совместимости были большой проблемой. В особенности с IE и Microsoft Java VM, которые не соответствовали стандартам, как это могло бы быть.

Даже с Sun JVM у вас могут быть проблемы. Мне было весело, где у меня было два сторонних апплета, требующих разные версии Java, которые вызывают всевозможные проблемы. Sun попыталась решить эту проблему, заменив апплеты на Java Web Start , в котором содержится ссылка в браузере, запускающая приложение в его собственное окно а не внутри браузера. (В теории с JWS у вас могут быть разные приложения, использующие разные виртуальные машины, но они никогда не работают для меня, как и должны.)

Продвижение с помощью JavaScript также позволило разработчику гораздо более богатых веб-страниц, поэтому многие вещи в прошлом, которые вы могли сделать только в Applets, теперь можно сделать просто с AJAX.

Во-первых, они не ушли. Вы все еще можете найти много апплетов в Интернете, многие люди используют их, в частности, для демонстрации алгоритмов и т.д.
Преимущества: можно использовать существующие библиотеки (математика, физика, сортировка, граф и т.д.), И это быстрее, чем Flash.
Неудобство: возможно, было бы рискованно нацелиться на недавнюю JVM (хотя Sun сделала хорошую работу по автоматическим обновлениям, похоже, что многие люди уже используют Java 1.6), время загрузки немного медленное (даже несмотря на большой прогресс в этом).

Вы также можете найти множество игровых апплетов, например Bookworm , с дополнительным преимуществом, возможно, выполнить часть уже выполненной работы, чтобы запустить их на мобильных телефонах...

Во-вторых, я могу предсказать интерес к JavaFX. Апплеты на стероидах, способные нарушить легенду "апплеты уродливые"...: -)

Наконец, библиотека, подобная Processing , позволяет легко создавать графические интенсивные апплеты, и вы можете найти много из них в Сети, например. на OpenProcessing , где самые худшие (новички в программировании) близки к лучшему!

Интересно, насколько широко распространена JVM? В случае Flash IE5 предустановил его, предоставив ему большую автоматическую базу пользователей. Но если JVM не был включен с установкой ОС, у пользователей этого не было бы. Я полагаю, что в качестве разработчика вы нацеливаете самую большую базу установки, что означает выбор Flash поверх Java.

Здесь и там есть Java-апплеты; определенно не повсеместно.

Апплеты

Первые два примера, представленные в этой книге, - это приложения, написанные на языке Java, т.е самостоятельные программы, аналогичные обычным машинозависимым программам.
С другой стороны, как упоминалось в предыдущей главе, ажиотаж вокруг языка Java был вызван, в основном, его возможностями выполнять апплеты под управлением Web-броузеров.

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

Затем мы загрузим этот апплет в программу для просмотра апплетов (appletviewer), входящую в состав пакета JDK.
В заключение мы отобразим его в Web-броузере.

Перейдите в каталог CoreJavaBook/vlch2/WelcomeApplet, а затем введите
следующие команды.
javac WelcomeApplet. java
appletviewer WelcomeApplet.html

На рис. 2.12 показано то, что вы увидите в окне программы для просмотра апплетов.

Рис. 2.12. Вид апплета WelcomeApplet в окне программы просмотра апплетов

Первая команда нам уже знакома - она вызывает компилятор языка Java. Он компилирует исходный текст апплета, содержащийся в файле WelcomeApplet. java, создавая файл байт-кода WelcomeApplet. class.

Однако на этот раз мы не запускаем интерпретатор языка Java. Вместо этого мы вызываем программу appletviewer. Эта программа специально предназначена для быстрого тестирования апплетов и входит в пакет Java SDK. Она работает не с файлом класса, а с файлом в формате HTML. Содержание файла WelcomeApplet.html показано в листинге 2.3.

Листинг 2.3
Файл WelcomeApplet.java


WelcomeApplet



This applet is from the book

Core Java by Cay Horstmann and
Gary Cornell, published by Sun Microsystems Press.






The source .



Если вы знаете язык HTML, то заметите некоторые стандартные команды языка HTML и дескриптор applet, приказывающие программе просмотра апплетов загрузить апплет, код которого содержится в файле WelcomeApplet, class. Программа аррletviewer игнорирует все дескрипторы языка HTML, за исключением дескриптора applet.

Другие дескрипторы языка HTML распознаются, когда файл в формате HTML просматривается броузером, поддерживающим язы к Java 2. Однако тут есть одна проблема.

Версии броузера Netscape 6, броузеры Mozilla и Opera поддерживают язык Java 2 как в среде Windows, так й на платформе Linux, хотя эта возможность является факультативной. Для того чтобы поэкспериментировать с апплетами, просто загрузите самую последнюю версию и убедитесь, она поддерживает Java.

Некоторые версии броузера Internet Explorer вообще не поддерживают язык Java. Другие версии поддерживают лишь очень старую виртуальную машину Java компании Microsoft (Java Virtual Machine). Если вы работаете с броузером Internet Explorer под управлением операционной системы Windows, зайдите на сайт http: //java. sun. com/get Java и загрузите программу Java Plug-In. Она добавит в броузер Internet Explorer возможности Java 2.

На платформе Macintosh под управлением операционной системы OS X возможности языка Java уже интегрированы в броузер Internet Explorer. В частности, на момент написания книги этот броузер поддерживал работу с пакетом J2SE версии 1.3. Система OS 9 поддерживает лишь устаревшую версию 1.1.

Если вы работаете с броузером Netscape 4, можете воспользоваться поддержкой языка Java 2, обеспечиваемой программой Java Plug-In. Однако при работе с апплетами, загружаемыми с помощью дескриптора applet, броузер будет по- прежнему использовать устаревшую виртуальную машину языка Java. Следовательно, придется переписать HTML-файл и вместо дескриптора applet использовать довольно неудобный дескриптор embed. Этот подход нельзя назвать удовлетворительным.

Если ваш броузер поддерживает платформу Java 2, попробуйте загрузить в него апплет. Для этого выполните следующие операции.

Запустите ваш броузер.

Выберите в меню опцию File -> Open File (или эквивалентную опцию).
Перейдите в каталог CoreJavaBook/vlch2/WelcomeApplet.

В диалоговом окне вы должны увидеть файлы WelcomeApplet .html и WelcomeAppletPlugin.html.
Загрузите файл, соответствующий вашей настройке. Броузер загрузит апплет вместе с окружающим его текстом. Он будет выглядеть примерно так, как показано на рис. 2.13.

Легко видеть, что это приложение действительно интерактивно и взаимодействует с Интернет. Нажмите на кнопку "Cay Horstmann". Апплет заставит броузер открыть Web- страницу Кея Хорстманна. Щелкните на кнопке "Gary Cornell". Апплет откроет окно для электронной почты, в котором уже указан адрес электронной почты Гари Корнелла.

Рис, 2.13. Запуск апплета WelcomeApplet с помощью броузера

Заметьте, что ни одна из этих кнопок не работает с программой просмотра аплетов. Эта программа не может посылать почту или отображать на экране Web-страницу, поэтому она просто проигнорирует ваши запросы. Программа просмотра апплетов хороша для тестирования изолированных апплетов, однако для реального взаимодействия апплета с Интернет и другими программами следует загрузить свой апплет в какой-либо броузер.

Апплет можно запустить из вашего текстового редактора или интегрированной среды разработки. При работе с редактором Emacs выберите в меню опцию JDE -> Run Applet.

При работе с редактором TextPad выберите опцию Tools -> Run Java Applet или используйте комбинацию клавиш . Перед вами откроется диалоговое окно, в котором будут представлены все HTML – файлы, хранящиеся в текущем каталоге. Если вы нажмете клавишу , редактор TextPad автоматически создаст минимальный HTML-файл.

В среде Sun ONE Studio нужно просто загрузить HTML-файл с дескрипторами апплета. Эта среда содержит небольшой броузер, выполняющий апплет на соответствующей Web-странице. В качестве альтернативы можно щелкнуть правой кнопкой мыши на файле с исходным текстом апплета и установить значение свойства "Executor" на закладке равным
"Applet Execution".

Код апплета Welcome показан в листинге 2.4. В данный момент его нужно лишь бегло просмотреть. К созданию апплетов мы еще вернемся в главе 10.

Import javax.swing.*;
import java.awt.*;
import java.awt.event.*,
import java.net.*;

public class WelcomeApplet extends JApplet
{
public void init()
{
Container contentPane = getContentPane();
contentPane.setLayout(new BorderLayout());

JLabel label = new JLabel(getParameter("greeting") ,
SwingConstants.CENTER);
label.setFont(new Font("Serif", Font.BOLD, 18));
contentPane.add(label, BorderLayout.CENTER);

JPanel panel = new JPanel();

JButton cayButton = new JButton("Cay Horstmann");
cayButton.addActionListener(makeURLActionListener
("http://www.horstmann.com"));
Jbutton garyButton = new Jbutton("Gary Cornell");
garyButton.addActionListener(makeURLActionListener
("mailto:garyOthecornells.com"));
panel.add(garyButton);
contentPane.add(panel, BorderLayout.South);
}
public ActionListener makeURLActionListener(fina1 string u)
{
return new
ActionListener ()
{
public void actionPerformed(ActionEvent event)
{
try {
getAppleContext().showDocument(u);
}
catch(Exeption e) (e.printStackTrace (); }
{
e. printStackTrace ();
}
}
} ;

В этой главе мы изучили механизмы компиляции и запуска программ, написанных на языке Java. Теперь мы готовы перейти к главе 3, в которой приступим к изучению языка Java.

В этой статье я постараюсь максимально просто и понятно изложить основы программирования на языке Delphi

Java для чайников. Урок 3. Простой апплет.

Наконец то мы подошли к самому главному: программированию на Java для Web, ибо сегодня мы напишем свой первый апплет. Конечно, начнем с самого простого, с "Hello World!". И так, вот текст этого апплета:

import java . applet . Applet ;

import java . awt . Graphics ;

Public class HelloApplet extends Applet {

Public void paint ( Graphics g ) {

G . drawString ( "Hello, world!" , 0 , 50 );

}

}

В данном примере мы подключаем библиотеки Applet - для доступа к классу апплета и Graphics - для использования графических функций. В апплетах мы не можем выводить на экран текст средствами библиотеки System, как мы это делали при написании консольного приложения (см. и ). Поэтому тут мы будем использовать немножко другие методы. В частности, класс Graphics , который предназначен для рисования в области поля апплета. И еще одно отличие от консольного приложения. Тут нет класса с методом main(). Для реализации апплета мы объявляем класс, дочерний от класса Applet:

public class HelloApplet extends Applet

Это значит, что наш новый класс HelloApplet - будет иметь все те же поля и методы, что и Applet, за исключением тех методов, что мы переопределили. В данном случае это paint - метод, отвечающий за прорисовку объекта. Программа, помещенная в нем, будет запускаться каждый раз, когда будет происходить отрисовка апплета. В данном случае эта программа, состоящая всего из одной строки:

g . drawString ( "Hello, world!" , 0 , 50 );

будет рисовать на экране текст "Hello, world!" в точке с координатами 0,50.

И так, компилируем программу. У нас должен появиться файл HelloApplet.class. Теперь тестируем его, создав простейший апплет содержащий HTML- файл:

"HelloApplet.class" Width = 200 Height = 200 >