Использованиеиауа Beans в других средах в Java

Цель занятия

Целью настоящего занятия является демонстрация возможностей применения технологии Java Beans. Предполагается решить следующие задачи: изучить способы создания компонентов ActiveX из бинов {bean — боб), а также рассмотреть их включение в приложения, созданные на других платформах. Требуется построить бин на базе собственного класса пользователя. В качестве дополнительных источников информации отметим [2, 5, 13].

Краткие теоретические сведения

Прежде всего следует научиться создавать компоненты ActiveX из бинов. Под ActiveX понимается объект, созданный в одной среде программирования и используемый в других средах. В Java имеется утилита sun.beans.ole.Packager, которая выполняет требуемую задачу. Следовательно, чтобы успешно выполнить работу, нужно иметь уже созданные бины. В настоящей работе воспользуемся архивом бинов, поставляемым вместе с Java.

Имейте в виду, что бины предназначены для вставки объектов Java в чужеродные приложения, например, приложения Visual

Basic или HTML. В этой работе мы как раз и внедрим бины в HTML-документы.

Итак, по порядку.

Прежде всего, нужно из имеющегося бина создать объект ActiveX. Запустите из командной строки следующее приложение:

>java -cp rt.jar; jaws.jar sun.beans.ole.Packager

Предварительно убедитесь, что файлы rt.jar, jaws.jar находятся в текущем каталоге (откуда запускается программа java.exe). В противном случае либо скопируйте их в текущий каталог, либо пропишите полный путь к этим файлам. (Вообще говоря, можно не указывать rt.jar — бин создается и без него.)

В результате должно быть запущено приложение с таким окном, как показано на рис. 2.18.

Рис. 2.18. Окно приложения sun.beans.ole.Packager

Нажмите кнопку Browse и выберите нужный бин. Эти бины следует искать в подкаталоге lib/dt. Выбрав этот подкаталог, нажмите кнопку Next. Затем в списке бинов выберите jtextFieid (например) и снова нажмите Next. На приглашение зарегистрировать компонент дайте подтверждение и укажите, куда поместить регистрационный файл. Регистрационный файл имеет расширение reg. Этот текстовый файл можно просмотреть. Вот каково его содержимое (листинг 2.27).

Листинг 2.27. Содержимое файла регистрации бина

REGEDIT4

[HKEY_CLASSES_ROOT\JTextField.Bean]

0= "JTextField Bean Control" [HKEY_CLASSES_ROOT\JTextField.Bean\CLSID]

0= "{F84A504 0-0873-llD7-8D09-4 4 455354 0001}"

[HKEY_CLASSES_ROOT\JText Fie1d.Bean\CurVe r]

0= "1"

[HKEY_CLASSES_ROOT\JText Fie1d.Bean.1]

0= "JTextField Bean Control"

[HKEY_CLASSES_ROOT\JTextField.Bean.l\Insertable]

[HKEY_CLASSES_ROOT\JTextField.Bean.l\CLSID]

0= "{F84A504 0-0873-llD7-8D09-4 4 455354 0001}"

[HKEY_CLASSES_ROOT\CLSID\{F84A504 0-0873-llD7-8D09444553540001}]

0= "JTextField Bean Control"

[HKEY_CLASSES_ROOT\CLSID\{F84A504 0-0873-llD7-8D094 4 455354 0001}\InprocServer32]

0= "C:\\Program Files\\JavaSoft\\JRE\\1.2\\bin\\beans.ocx" "ThreadingModel" = "Apartment"

[HKEY_CLASSES_ROOT\CLSID\{F84A504 0-0873-llD7-8D094 4 455354 0001}\ToolboxBitmap32]

0= "C:\\Program Files\\JavaSoft\\JRE\\1.2\\bin\\beans.ocx,0"

[HKEY_CLASSES_ROOT\CLSID\{F84A504 0-0873-llD7-8D094 4 455354 0001}\TypeLib]

0= "{F84A5041-0873-llD7-8D09-4 4 455354 0001}" [HKEY_CLASSES_ROOT\CLSID\{F84A504 0-0873-llD7-8D094 4 455354 0001}\ProgID]

0= "JTextField.Bean.1"

[HKEY_CLASSES_ROOT\CLSID\{F84A504 0-0873-llD7-8D09444553540001}\VersionIndependentProgID]

0= "JTextField.Bean"

[HKEY_CLASSES_ROOT\CLSID\{F84A504 0-0873-llD7-8D09444553540001}\JarFileName]

0= "C:\\Program Files\\bin\\servlet\\lib\\dt.jar"

[HKEY_CLASSES_ROOT\CLSID\{F84A504 0-0873-llD7-8D094 4 455354 0001}\JavaClass]

0= "javax.swing.JTextField"

[HKEY_CLASSES_ROOT\CLSID\{F84A504 0-0873-llD7-8D094 4 455354 0001}\InterfaceClass]

0= "sun/beans/ole/OleBeanInterface"

[HKEY_CLASSES_ROOT\CLSID\{F84A504 0-0873-llD7-8D094 4 455354 0001}\Control]

[HKEY_CLASSES_ROOT\CLSID\{F84A504 0-0873-llD7-8D09444553540001}\Programmable]

[HKEY_CLASSES_ROOT\CLSID\{F84A504 0-0873-llD7-8D094 4 455354 0001}\Insertable]

[HKEY_CLASSES_ROOT\CLSID\{F84A504 0-0873-llD7-8D094 4 455354 0001}\MiscStatus]

0= "0"

[HKEY_CLASSES_ROOT\CLSID\{F84A504 0-0873-llD7-8D094 4 455354 0001}\MiscStatus\l]

0= "18833"

[HKEY_CLASSES_ROOT\CLSID\{F84A504 0-0873-llD7-8D094 4 455354 0001}\DefaultIcon]

0= "C:\\Program Files\\bin\\servlet\\bin\\awt.ico"

[HKEY_CLASSES_ROOT\CLSID\{F84A504 0-0873-llD7-8D094 4 455354 0001}\Version]

0= "1.0"

[HKEY_CLASSES_ROOT\CLSID\{F84A504 0-0873-llD7-8D09444553540001}\DataFormats\GetSet\0]

0= "2,1,16,1"

[HKEY_CLASSES_ROOT\CLSID\{F84A504 0-0873-llD7-8D09444553540001}\DataFormats\GetSet\l]

0= "3,1,32,1"

[HKEY_CLASSES_ROOT\CLSID\{F84A504 0-0873-llD7-8D094 4 455354 0001}\DataFormats\GetSet\2]

0= "14,1,64,1"

[HKEY_CLASSES_ROOT\CLSID\{F84A504 0-0873-llD7-8D09444553540001}\DataFormats\GetSet\3]

0= "1,1,1,1"

[HKEY_CLASSES_ROOT\CLSID\{F84A504 0-0873-llD7-8D094 4 455354 0001}\verb\0]

0= "&Edit,0,2"

[HKEY_CLASSES_ROOT\CLSID\{F84A504 0-0873-llD7-8D094 4 455354 0001}\verb\-l]

0= "Show,0,0"

[HKEY_CLASSES_ROOT\CLSID\{F84A504 0-0873-llD7-8D094 4 455354 0001}\verb\-2]

0= "0pen,0,0"

[HKEY_CLASSES_ROOT\CLSID\{F84A504 0-0873-llD7-8D094 4 455354 0001}\verb\-3]

0= "Hide,0,l"

[HKEY_CLASSES_ROOT\TypeLib\{F84A5041-0873-llD7-8D09444553540001}]

0= "JTextField Bean Control Type Library"

[HKEY_CLASSES_ROOT\TypeLib\{F84A5041-0873-llD7-8D094 4 455354 0001}\1.0]

0= "JTextField Bean Control "

[HKEY_CLASSES_ROOT\TypeLib\{F84A5041-0873-llD7-8D094 4 455354 0001}\1.0\0\win32]

0= "C:\\Program Files\\bin\\servlet\\bin\\JTextField.tlb"

[HKEY_CLASSES_ROOT\TypeLib\{F84A5041-0873-llD7-8D094 4 455354 0001}\1.0\FLAGS]

0= "2"

[HKEY_CLASSES_ROOT\TypeLib\{F84A5041-0873-llD7-8D094 4 455354 0001}\1.0\HELPDIR]

0= "C:\\Program Files\\bin\\servlet\\bin"

Несмотря на обилие регистрационной информации, вам потребуется не так много. Прежде всего, это регистрационный номер,

задаваемый параметром CLSiD, под которым компонент зарегистрирован в Windows:

[HKEY_CLASSES_ROOT\JTextField.Bean\CLSID]

0= "{F84A5040-0873-llD7-8D09-444553540001}" // Это требуемый

// номер

Теперь создадим HTML-файл, например такой (листинг 2.28).

Листинг 2.28. HTML-документ с внедренными в него бинами

<HTML>

<H1> CALLING BEANS</H1>

<body bgcolor=coral>

<form name=fora>

<br>

<Input type="Button" value="Show BEAN" name=bl onClick="fl()"> <br>

<OBJECT ID="TXT" CLASSID="CLSID:F84A504 0-0873-llD7-8D09444553540001"

WIDTH=150 HEIGHT=20>

</OBJECT>

<br>

<br>

<OBJECT ID="Area" CLASSID="CLSID:B4D08C60-0893-llD7-8D09444553540001"

WIDTH=250 HEIGHT=100>

</OBJECT>

<br>

<OBJECT ID="Prg" CLASSID="CLSID:C894CDE0-089A-llD7-8D09444553540001"

WIDTH=250 HEIGHT=10>

</OBJECT>

<SCRIPT language="JavaScript">

<! —

function fl()

{

d= new Array("\none","\ntwo","\nthree");

fora.TXT.setText("FROM BEAN"); fora.Area.append(d[2]); fora.Prg.setValue(x); x+=10; if(x==50){x=0;}

}

—>

</SCRIPT>

</form>

</body>

</HTML>

Обратите внимание на то, как в сайт вставляется объект ActiveX, созданный нами:

<OBJECT ID="TXT" CLASSID="CLSID:F84A504 0-0873-llD7-8D09444553540001"

WIDTH=150 HEIGHT=20>

</OBJECT>

Теперь должно быть ясно, где используется регистрационный номер компонента. Помимо текстового поля мы добавили компонент progressbar и текстовую область, также построенные из бинов.

На рис. 2.19 представлен результат открытия документа из листинга 2.28.

Лишь кнопка Show BEAN не является бином. Слово "three" выведено в текстовой области JtextArea. Видим также объект прогресс-бар (progressbar), заполняемый с каждым нажатием кнопки. Но для того, чтобы заставить элементы работать, нам потребовалось использовать язык JavaScript. В этой работе, как и ранее, обходимся лишь минимумом этого языка. Достаточно напомнить, что JavaScript использует синтаксис языка С, а тело JavaScript собрано из функций.

Рис. 2.19. Окно документа с бинами

<SCRIPT language="JavaScript">

<! — var x=0; function fl()

{

d= new Array("\none","\ntwo","\nthree");

fora.TXT.setText("FROM BEAN"); // Эта команда выводит текст

//в текстовое поле, используя стандартный метод компонента JTextField – setText()

fora.Area.append(d[2]); // Добавление элемента массива d

// в текстовую область

fora.Prg.setValue(x); x+=10;

if(x==50){x=0;}

—>

</SCRIPT>

Вызов функции привязан к кнопке Show BEAN.

В этом занятии потребуется использовать таймер в среде JavaScript. Для этой цели используйте команду setTimeout ("fl () ", 1000).

Во-первых вспомните, что JavaScript чувствителен к написанию заглавных и строчных букв. Что касается комавды setTimeout (), то первый ее аргумент — это имя функции, которая запускается через число миллисекунд, указываемое вторым аргументом. При этом запуск выполняется однократно, а не каждые 1000 мс. Следовательно, внутри функции fl() нужно сбросить таймер, а затем вызвать снова саму себя. Это делается так:

<HTML>

<H1> CALLING BEANS</H1>

<body bgcolor=coral>

<form name=fora>

<br>

<Input type="Button" value="Show BEAN" name=bl onClick="fl ()"> <br>

<OBJECT ID="TXT" CLASSID="CLSID:F84A504 0-0873-llD7-8D09444553540001"

WIDTH=350 HEIGHT=20>

</OBJECT>

<br>

<br>

<OBJECT ID="Area" CLASSID="CLSID:B4D08C60-0893-llD7-8D09444553540001"

WIDTH=250 HEIGHT=100>

</OBJECT>

<br>

<OBJECT ID="Prg" CLASSID="CLSID:C894CDE0-089A-llD7-8D09444553540001"

WIDTH=250 HEIGHT=10>

</OBJECT>

<SCRIPT language="JavaScript">

<! —

var id; function fl()

{id=setTimeout("f2()", 1000);} function f2()

{

clearTimeout(id); d=new Date(); scs=d.toLocaleString(); fora.TXT.setText(scs); fora.Prg.setValue(x); x+=10; if(x==50){x=0;} fl () ;

}

—>

</SCRIPT>

</form>

</body>

Откройте этот документ и посмотрите его в действии.

Более интересно создавать бины на основе собственных классов. Такие бины должны быть упакованы в jar-архивы. Посмотрим, как это сделать. В качестве базового класса для бина используем следующий класс.

import java.awt.*;

import java.io.Serializable; // Этот пакет обязателен import java.util.*;

public class MyBean implements Serializable // Интерфейс

// Serializable // обязателен

public Date dt; // Переменные и методы сериализуемого класса // обязаны быть public public String getData()

dt=new Date();

return dt.toLocaleString(); // Метод getData() возвращает

// строку с датой-временем

}

Итак, наш бин содержит один-единственный метод getData(), возвращающий в строковом формате дату и время. Запомним, что класс бина должен реализовывать интерфейс seriaiizabie и содержать только публичные (public) методы. Скомпилируем этот файл и, если компиляция пройдет успешно, получим файл MyBean.class.

Теперь следует создать так называемый манифест-файл, например, с именем manifest.tmp:

Manifest-Version: 1.0 Name: MyBean.class Java-Bean: True

Запускаем Java-архиватор:

jar cfvm MyBean.jar manifest.tmp MyBean.class

Аргументами здесь являются: имя создаваемого jar-файла, имя манифест-файла и имя класса бина.

Теперь следует преобразовать jar-файл в объект ActiveX. Для этого следует сделать так, как мы описали в начале этого занятия, т. e. использовать утилиту:

>java —ср rt.jar; jaws.jar sun.beans.ole.Packager

А затем указать созданный jar-файл MyBean.jar при выборе файла В процедуре sun.beans.ole.Packager.

Источник: Герман О. B., Герман Ю. О., Программирование на Java и C# для студента. — СПб.: БХВ-Петербург, 2005. — 512 c.: ил.

Вы можете следить за любыми ответами на эту запись через RSS 2.0 ленту. Вы можете оставить ответ, или trackback с вашего собственного сайта.

Оставьте отзыв

XHTML: Вы можете использовать следующие теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

 
Rambler's Top100