Главная страница

Java. Полное руководство. 8-е издание. С. Н. Тригуб Перевод с английского и редакция


Скачать 25.04 Mb.
НазваниеС. Н. Тригуб Перевод с английского и редакция
АнкорJava. Полное руководство. 8-е издание.pdf
Дата28.02.2017
Размер25.04 Mb.
Формат файлаpdf
Имя файлаJava. Полное руководство. 8-е издание.pdf
ТипДокументы
#3236
страница84 из 90
1   ...   80   81   82   83   84   85   86   87   ...   90

import java.rmi.*;
public interface AddServerlntf extends Remote {
double add(double d l ,
double d 2 )
throws Во втором исходном файле,
AddServerlmpl.
java, реализуется дистанционный интерфейс. Реализовать метод add
() несложно. Дистанционные объекты обычно расширяют
UnicastRemoteObject, который обеспечивает функциональные возможности, необходимые для того, чтобы сделать доступными объекты для дистанционных компьютеров java.rmi.*;

import java.r m i .server.*;

9 3 Часть II. Библиотека Java
public class AddServerlmpl extends UnicastRemoteObject
implements AddServerrntf {
public AddServerlmpl() throws RemoteException {
}
public double add(double d l ,
double d 2 )
throws RemoteException {
return dl + d 2 Третий исходный файл,
AddServer.
j ava, содержит главную программу для компьютера-сервера. Его главная задача — обновлять реестр RMI на этом компьютере. Это делается с помощью метода rebind (
) класса
Naming пакет j ava.
rmi). Этот метод связывает имя со ссылкой на объект. Первым параметром метода re­
bind () является строка, которая присваивает серверу имя
1 1
AddServer". Его второй параметр является ссылкой на экземпляр класса
AddServerlmpl.
import java.net.*;
import j a v a .r m i .*;
public class AddServer {
public static void main(String a r g s []) {
try {
AddServerlmpl addServerlmpl = new AddServerlmpl();
Naming.rebind("AddServer", addServerlmpl);
} catch(Exception e) Исключение " + e ) В четвертом исходном файле,
AddClient.
java, реализуется клиентская сторона распределенного приложения. Этому файлу требуется три аргумента командной строки. Первый из них является адресом или именем компьютера-сервера. Второй и третий параметры — два числа, которые необходимо суммировать.
Приложение начинае?ся сформирования строки, имеющей синтаксическую структуру адреса URL. Этот адрес URL использует протокол rmi. Строка включает адрес или имя сервера и строку "AddServer". Затем программа вызывает метод lookup
() класса
Naming. Этот метод принимает один параметр, адрес URL rmi, и возвращает ссылку на объект типа
AddServer
Int f
. Впоследствии всякий дистанционный вызов метода можно будет направлять этому объекту.
Затем программа отображает параметры и вызывает дистанционный метод add ()
, который возвращает результат суммирования, выводимый на экран j a v a .r m i .*;

public class AddClient {
public static void main(String a r g s []) {
try {
String addServerURL = "rmi://" + args[0] + "/AdciServer";
AddServerIntf addServerlntf =
(AddServerIntf)N a Первое число " + args[l]);
double dl = Второе число " + args[2]);
double d2 = Сумма " + addServerlntf.add(dl,
d 2 ));
} catch(Exception e) Исключение " + e ) ;
}
}
}
Глава 28. Регулярные выражения и другие пакеты 3 После того как введете весь код, используйте j a v a c для компиляции четырех созданных вами исходных файлов.
Этап второй создание заглушки вручную , если нужно Прежде чем сможете работать с клиентом и сервером, нужно создать заглушку. В контексте RMI заглушка представляет собой объект Java, который находится на компьютере-клиенте. Ее функция заключается в представлении тех же интерфейсов, которые предлагает дистанционный сервер. Дистанционные вызовы методов, создаваемые клиентом, направляются в заглушку. Заглушка работает с остальными частями системы RMI для формирования запроса, отправляемого дистанционному компьютеру
Дистанционный метод может принимать параметры, которые представляют собой простые типы или объекты. В последнем случае объект может иметь ссылки на другие объекты. Вся эта информация должна быть отправлена дистанционному компьютеру. То есть объект, передаваемый в качестве аргумента вызову дистанционного метода, должен быть сериализирован и отправлен на дистанционный компьютер. Вспомните, в главе 19 мы говорили, что при сериализации также рекурсивно обрабатываются все объекты, на которые имеются ссылки.
Если клиенту необходимо вернуть ответ, то весь процесс происходит в обратном порядке. Обратите внимание на то, что сериализация и десериализация используются также и при возвращении объектов клиенту.
До Java 5 заглушки приходилось создавать вручную, при помощи компилятора
rmi с. Для современных версий Java этот этап необязателен. Но если выработаете в устаревшей системе, то для создания заглушки можете использовать компилятор
rmi с следующим образом Эта команда создает файл
AddServerImpl_Stub.
class. В случае использования
rmic убедитесь в том, что текущий каталог включен в переменную Этап третий установка файлов на компьютерах сервера и клиента Файлы
AddClient.class, AddServerImpl_Stub.class если нужно) и
AddServerlnt f .
class скопируйте в каталог на компьютере-клиенте, а файлы если нужно) ив каталог на компьютере-сервере.
На заметку
RMI предоставляет технологии динамической загрузки классов, однако они не применяются в приведенных здесь примерах. Наоборот, все файлы, используемые приложениями клиента и сервера, должны быть установлены вручную на соответствующих компьютерах.
Этап четвертый запуск реестра RM I на ком пью тере-сер вере
В комплект JDK входит программа
rmi
registry, которая выполняется на стороне сервера. Она преобразует имена в ссылки на объекты. Для начала нужно проверить, включен ли каталог, в котором находятся ваши файлы, в переменную окружения
CLASSPATH. Затем потребуется запустить RMI Registry из командной строки, как показано ниже rmiregistry

9 3 Часть II. Библиотека После выполнения этой команды на экране появится новое окно. Это окно нужно оставлять открытым все время, пока выбудете экспериментировать с примером Этап пятый запуск сервера
Код сервера запускается из командной строки, как показано ниже, java Вспомните, что код класса
AddServer реализует класс
AddServerlmpl и регистрирует этот объект под именем "Этап шестой запуск клиента

Программное обеспечение
AddClient требует для своей работы три аргумента — имя или адрес компьютера-сервера и два числа, которые будут просуммированы. Вы можете вызвать его из командной строки, используя один из следующих форматов AddClient serverl 8 9

java AddClient 11.12.13.14 8 Впервой строке указывается имя сервера. Во второй строке используется его адрес (Можно попытаться выполнить этот пример и без дистанционного сервера. Для этого достаточно установить все программы на одном и том же компьютере, запустить rmiregistry, AddServer и после этого запустить
AddClient следующим образом AddClient 127.0.0.1 8 Здесь адрес 127.0.0.1 является адресом ответа для локального компьютера. Использование этого адреса позволит выполнить весь механизм RMI, не устанавливая сервер на дистанционном компьютере.
В любом случае результат выполнения этой программы будет таким.
Первое число 8 Второе число 9
Сумма На заметку При работе св реальном приложении, для сервера может понадобиться установить диспетчер безопасности.
Форматирование текста
Пакет java. text позволяет форматировать, производить поиски манипулировать текстом. В главе 33 продемонстрирован класс
NumberFormat, который используется для форматирования числовых данных. В этом разделе рассматриваются два наиболее часто используемых класса, предназначенные для форматирования даты и времени.
Класс
D a t e F o r m a Класс
DateFormat является абстрактным классом, с помощью которого можно форматировать и анализировать показания даты и времени. Метод getDateln- stance
() возвращает экземпляр класса
DateFormat, который может форматировать информацию о дате. Можно использовать одну из следующих его форм
Глава 28. Регулярные выражения и другие пакеты 3 5
static final DateFormat getDatelnstance()
static final DateFormat getDatelnstance(int стиль final DateFormat getDatelnstance(int стиль Locale
регион)
Параметр стиль может принимать следующие значения
DEFAULT, SHORT,
MEDIUM, LONG или
FULL. Они представляют собой константы типа int, определяемые в классе
DateFormat. Сих помощью можно представлять различные подробные сведения, связанные с датой. Параметр регион представляет одну из статических ссылок, определяемых классом
Locale см. главу 18). Если параметры стиль и или регион не будут заданы, используются значения, принятые по умолчанию.
Одним из наиболее часто используемых методов в этом классе является f or- mat ()
. Он имеет несколько перегруженных форм, среди которых можно выделить следующую String format(Date Параметром является объект класса
Date, который необходимо отобразить. Метод возвращает строку, содержащую отформатированную информацию.
В следующем коде показано, как производится форматирование информации о дате. Он начинается с создания объекта класса
Date. Этот объект хранит информацию о текущих дате и времени. Затем он выводит информацию о дате с использованием различных стилей и с учетом местной специфики представления времени Иллюстрация форматов даты
import j a v a . t e x t . *;
import java.util.*;
public class DateFormatDemo {
public static void main(String a r g s []) {
Date date = new D a t e O ;
DateFormat df;
df = DateFormat.getDatelnstance(DateFormat.SHORT, Locale.JAPAN); Япония " + d f .format(date));
df = DateFormat.getDatelnstance(DateFormat.MEDIUM, Locale.KOREA); Корея " + d f .format(date));
df = DateFormat.getDatelnstance(DateFormat.LONG, Великобритания " + d f .format(date));
df = DateFormat.getDatelnstance(DateFormat.FULL, США " + d f Ниже представлен пример результатов выполнения этой программы.
Япония
:
11/01/01 Корея

2 011. 1. 1 Великобритания
01 January 2 011 США Saturday, January 1, 2 Метод get
Time
Instance
() возвращает экземпляр класса
DateFormat, который может форматировать информацию о времени. Он имеет следующие варианты final
DateFormat
getTimelnstance()
static final
DateFormat
getTimelnstance(int стиль стиль Locale
регион)
Параметр стиль принимает одно из следующих значений
DEFAULT, SHORT,
MEDIUM, LONG и
FULL. Они являются константами типа int, определяемыми

9 3 6 Часть II. Библиотека в классе
DateFormat. Сих помощью можно определить, насколько подробным будет представление времени. Параметр регион является одной из статических ссылок, определенных в классе
Locale. Если параметры стиль и регион не будут заданы, используются значения, принятые по умолчанию.
В следующем коде показано, как производится форматирование информации о времени. Он начинается с создания объекта класса
Date, который получает информацию о текущих дате и времени, а затем выводит информацию о времени, используя различные стили и местную специфику представления времени Иллюстрация форматов времени java.text.*;

import java.util.*;
public class TimeFormatDemo {
public static void m a m (String args [ ]
)
{
Date date = new Date();
DateFormat df;
df = DateFormat.getTimelnstance(DateFormat.SHORT,
Япония " + d f .format(date));
df = DateFormat.getTimelnstance(DateFormat.L O N G ,
Великобритания " + d f .format(date));
df = DateFormat.getTimelnstance(DateFormat.FUL L ,
Locale.CANADA);
System.out.pri n t l n (Канада " + d f Ниже показан пример результатов выполнения этой программы.
Япония:
2 Великобритания 20:25:14 CDT Канада 8:25:14 o'clock PM Класс
DateFormat имеет также метод getDateTimelnstance ()
, который может форматировать информацию о дате и времени. Если хотите, поэкспериментируйте с ним самостоятельно.
Класс
S i m p l e d a t e F o r m a Класс
SimpleDateFormat является конкретным подклассом класса
DateFormat. Он позволяет определять собственные шаблоны форматирования, которые можно будет использовать для отображения информации о дате и времени.
Ниже показан один из его конструкторов

строкаФормата)
Параметр
строкаФормата описывает способ отображения даты и времени. Ниже показан один из примеров его применения sdf = SimpleDateFormat("dd МММ yyyy hh:mm:ss Символы, используемые в строке форматирования, определяют отображаемую информацию. В табл. 28.5 приводятся эти символы и дается описание каждого из них.
Таблица 28.5. Символы форматирования строки для класса Символ Описание
А
A M или РМ
D День месяца (1-31)
Глава 28. Регулярные выражения и другие пакеты 3 Окончание табл. 28.5
C k m Описание
r. ’ ** VL ,
' V

1; t • L :
V- 5
. 1 : ”'' >
Часы в формате AM/PM (1-12)
к
Часы в формате суток (Минуты (Секунды (Неделя в году (1-52)
У
Год
z
Часовой пояс
D
День в году (День недели (например, День недели в месяце
G
Эпоха (те. AD
— после Рождества Христова, ВС
— до Рождества Христова)
H
Часы в сутках (0-23)
К
Часы в формате AM/РМ (0-11)
M
Месяц
S
Миллисекунды в секунде
W
Неделя в месяце (Часовой пояс в формате, описанном в документе RFC В большинстве случаев количество повторений символа определяет способ представления даты. Текстовая информация отображается в виде аббревиатуры, если буква шаблона повторяется менее четырех раз. В противном случае используется форма без применения аббревиатуры. Например, шаблон zzzz может отобразить Pacific Daylight Time (тихоокеанское время, а шаблон zzz — Для чисел количество повторений буквы шаблона определяет количество цифр в представлении. Например, hh:mm:ss может представить 01:51:15, в то время как h:m:s показывает тоже время в виде И наконец, Мили ММ отвечает за отображение месяца в виде одной или двух цифр. Три или более повторений М приведут к тому, что месяц будет отображаться в виде текстовой строки.
В следующей программе демонстрируется использование этого класса Демонстрация применения SimpleDateFormat.
import java.text.*;
import java.util.*;
public class SimpleDateFormatDemo {
public static void main(String a r g s []) {
Date date = new D a t e ();
SimpleDateFormat sdf;
sdf = new SimpleDateFormat("hh:m m :ss");
System.out.println(s d f .format(date));
sdf = new SimpleDateFormat("dd МММ yyyy hh:mm:ss zzz");

9 3 Часть II. Библиотека Java
S y s t e m . o u t . p r i n t l n (s d f .fo r m a t ( d a t e ) );
sdf = n ew S i m p l e D a t e F o r m a t (
"E МММ
dd yyyy");
S y s t e m . o u t . p r i n t l n ( s d f .f o rm a t ( d a t e ) Ниже приведен пример результатов выполнения этой программы
Jan
2011 12:46:49
CST
Sat Jan
01 2011


ГЛАВА
Компоненты
Java В этой главе представлен обзор компонентов Java Beans. Важность этих компонентов бесспорна, так как они позволяют строить сложные системы на основе программных компонентов. Эти компоненты можно создавать самостоятельно, а также приобретать у сторонних разработчиков. Компоненты Java Beans определяют архитектуру, устанавливающую порядок взаимодействия строительных блоков.
Чтобы легче было понять, что представляют собой компоненты Java Beans, рассмотрим пример. У разработчиков компьютерного оборудования имеется множество компонентов, которые можно интегрировать друг с другом для построения системы. Резисторы, конденсаторы и катушки индуктивности являются примерами простых компоновочных блоков. Интегральные схемы предлагают еще больше функциональных возможностей. При этом каждая из этих частей пригодна для многократного использования. Их ненужно компоновать заново каждый раз, когда возникает необходимость в новой системе. А еще эти же элементы могут использоваться в схемах различных типов. Это возможно благодаря тому, что поведение данных компонентов понятно и хорошо документировано.
В индустрии программного обеспечения также пытались воспользоваться преимуществами многократного использования компонентов и их способностью к взаимодействию. Для этого необходимо было разработать такую компонентную архитектуру, которая позволила бы собирать программы на основе программных компоновочных блоков, пусть даже и предлагаемых сторонними разработчиками. Кроме того, проектировщик должен был иметь возможность выбрать компонент, разобраться сего функциями и внедрить в приложение. С появлением новой версии компонента необходимо, чтобы его функциональные возможности можно было без труда внедрять в существующий код. К счастью, такую архитектуру как рази предлагают компоненты Java Beans.
Java Beans
— это компонент программного обеспечения, предназначенный для многократного использования во множестве различных средне имеет ограничений в плане функциональных возможностей. Он может выполнять простую функцию, например получать стоимость товарно-материальных запасов, а может реализовать и более сложную функцию, например предсказывать котировку акций компании.
KoMnoHeHTjava Beans может быть видимым для конечного пользователя. Одним из примеров такого компонента является кнопка графического интерфейса пользователя.
KoMnoHeHTjava Beans может быть также и невидимым для пользователя. Таким компоновочным блоком является ПО для декодирования потока мультимедийной информации в реальном времени. И наконец, компонент
Java Beans может быть предназначен для работы в автономном режиме на рабочей
Что такое Java Beans

9 4 Часть III. Разработка программного обеспечения с использованием станции пользователя или в комплексе с другими распространяемыми компонентами. Примером компонента Java Beans, который может работать локально, является ПО для создания секторной диаграммы на основе набора точек данных. А, например, KoMnoHeHTjava Beans, предоставляющий информацию о ценах на фондовой или товарной бирже в реальном времени, может работать только в комплексе с другим распространяемым ПО, получая от него необходимые данные.
Преимущества компонентов Java В следующем списке перечислены некоторые преимущества, которые предлагает технология компонентов Java Beans разработчику компонентов Beans обладает всеми преимуществами парадигмы
Java, гласящей следующее написано однажды, работает везде”.
• Можно управлять свойствами, событиями и методами компонента Java
Beans, доступными другому приложению.
• Для конфигурирования компонента Java Beans можно применять вспомогательное ПО. Оно необходимо только при настройке параметров времени проектирования данного компонента. В среду выполнения его включать не нужно.
• Н астройки параметров конфигурации компонента Java Beans можно хранить на постоянном носителе информации и восстанавливать по мере необходимости Beans может регистрироваться на получение извещений о событиях от других объектов и может извещать о событиях, происходящих в других объектах.
Самодиагностика
В основе кoмпoнeнтoвJavaBeansлeжитcвoйcтвo самодиагностики (introspection).
Самодиагностика — это процесс анализа компонента Java Beans, при котором определяются его характеристики. На самом деле это очень важная особенность
API Java Beanss, поскольку с ее помощью другое приложение, например инструмент разработки, может получать информацию о данном компоненте. Без само­
диагностики технология компонентов Java Beans работать не будет.
Существует два способа, с помощью которых разработчик компонента Java
Beans может показать, какие его свойства, события и методы будут доступны. Водном случае используются простые соглашения об именовании. Они позволяют механизмам самодиагностики логически выводить информацию о компоненте
Java Beans. В другом случае применяется дополнительный класс, расширяющий интерфейс B eans I n f о, который явным образом предоставляет эту информацию. Рассмотрением этих способов мы сейчас и займемся.
Проектные шаблоны для свойств
Свойство (property) компонента Java Beans представляет собой сокращенный вариант его состояния. Значения, присваиваемые свойствам, определяют поведение и появление этого компонента. Настройка свойства осуществляется при помощи метода записи (setter m ethod), а его получение — при помощи метода чтения
(getter m ethod). Свойства бывают двух видов простые и индексированные
Глава 29. Компоненты Java Beans
9 4 Простые свойства
Простое свойство имеет одно значение. Его можно идентифицировать с помощью следующих проектных шаблонов, в которых
N — это имя свойства, а Т —
его тип Т get
N{ ) ;
public void set
N( T a p r ) Каждый метод имеет свойство чтения и записи для доступа к своим значениям. Свойство только для чтения имеет только метод g e t. Свойство только для записи имеет только метод s e t Ниже представлен пример трех простых свойств чтения записи, а также их методов чтения и записи double depth, height, width;
public double getDepth( ) {
return depth;
}
public v oid setDepth(double d) {
depth = d;
}
public double g e t H e i g h t (
)
{
return height;
}
public voi d setHeight(double h) {
height = h;
}
public double getWidth( )
{
return width;
}
public v oid setWidth(double w) {
w idth = Индексированные свойства
Индексированное свойство состоит из нескольких значений. Его можно идентифицировать с помощью следующих проектных шаблонов, в которых
N
это имя свойства, а Т
— его тип Т getN(int индекс индекс, Т значение Т get
N{ ) ;
public v oid set
N { T значения) Ниже показан пример индексированного свойства по имени d a t a , а также его методов чтения и записи double data[ ];
public double getData(int index) {
return data[index];
}
public v oid setData(int index, double value) {
data[index] = value;

9 4 4 Часть III. Разработка программного обеспечения с использованием Java
}
public double[ ]
getData( )
{
return data;
}
public void setData(double[
] values) {
data = new double[values.length];
System.arraycopy(values,
0, data, 0, Проектные шаблоны для событий
Компоненты Java Beans используют модель делегирования событий, которая уже была рассмотрена в этой книге. Они способны извещать о событиях другие объекты. События могут идентифицироваться с помощью следующих проектных шаблонов, в которых
Т
представляет тип события void addTbistener(TListener
слушательСобытия)
public void addTbistener(TListener
слушательСобытия)
throws j a v a .u ti l .TooManyListenersException
public void remove
Tbistener(
Tbistener
слушательСобытия)
Эти методы используются для того, чтобы добавить или удалить слушателя для указанного события. Вариант метода A d d T b i s t e n e r ( ), который не передает исключение, можно применять для групповой передачи события. Под групповой передачей понимается то, что на получение извещений о событии может быть зарегистрировано несколько слушателей. Вариант метода, создающего исключение T o o M a n y L is te n e rs E x c e p t io n , передает извещение о событии индивидуально —
извещение о нем может получить только один слушатель. В любом случае метод r e m o v e T b is te n e г () служит для удаления слушателя. Например, если предположить, что существует тип интерфейса события, называемый
T e m p e r a t u r e L i s t e n e r , то
KoMnoHeHTjava
Beans, который следит за температурой, может предложить следующие методы void addTemperatureListener(TemperatureListener tl) {
}
public void removeTemperatureListener(TemperatureListener tl) Методы и проектные шаблоны
Проектные шаблоны не используются для именования методов, несвязанных со свойствами. Механизм самодиагностики находит все открытые методы компонента Java Beans. Защищенные и закрытые методы остаются недоступными.
Использование интерфейса
B e a n s i n f о
Как было сказано выше, проектные шаблоны неявно определяют, какая информация является доступной пользователю компонента Java Beans. Интерфейс
Beans
Info позволяет явно управлять доступом к информации. Интерфейс о определяет несколько методов, включая перечисленные ниже
Глава 29. Компоненты Java Beans
9 4 5
P r o p e r t y D e s c r i p t o r []
g e t P r o p e r t y D e s c r i p t o r s ()
E v e n t S e t D e s c r i p t o r []
g e t E v e n t S e t D e s c r i p t o r s ()
M e t h o d D e s c r i p t o r []
g e t M e t h o d D e s c r i p t o r s (Эти методы возвращают массивы объектов, содержащие информацию освой ствах, событиях и методах KOMnoHeHTaJava Beans. Классы
PropertyDescriptor,
EventSetDescriptor и
MethodDescriptor определены в пакете
j a v a .
beans и описывают указанные элементы. Реализуя эти методы, разработчик может в точности определить, что конкретно доступно пользователю, не прибегая к самоди­
агностике, выполняемой на основе проектных шаблонов.
При создании класса, реализующего интерфейс
Beans
Info, его нужно называть в формате о, где имя имя
KOMnoHeHTaJava
Beans. Например, если компонент Java Beans называется
MyBeans, то информационный класс должен выглядеть как
MyBeans
Beans Чтобы упростить использование интерфейса
Beans
Info, компоненты Java
Beans предлагают класс о. Он обеспечивает стандартные реализации интерфейса
Beans
Info, включая только что представленные три метода. Можно расширить этот класс и переопределить один или более методов, чтобы явно управлять доступными аспектами KOMnoHeHTaJava Beans. Если метод не переопределить, будет использоваться самодиагностика проектного шаблона. Например, если не переопределить метод
getPropertyDescriptors ()
, то для определения свойств KOMnoHeHTaJava Beans будут применяться проектные шаблоны. Далее в этой главе вы сможете увидеть классов действии.
Связанные и ограниченные свойства
Компонент Java Beans, имеющий связанное (bound) свойство, передает извещение о событии вовремя изменения свойства. Происходящее событие имеет тип
PropertyChangeEvent, и извещение о нем отправляется объектам, которые предварительно зарегистрировались на получение таких уведомлений. Класс, осуществляющий обработку этого события, должен реализовать интерфейс Компонент Java Beans, имеющий ограниченное (constrained) свойство, передает извещение о событии при попытке изменения его значения. Он также передает извещение о событии, имеющее тип
PropertyChangeEvent. Это извещение о событии посылается объектам, предварительно зарегистрировавшимся на получение таких уведомлений. Однако эти объекты могут отклонить предложенное изменение, передав исключение
PropertyVetoExcept
ion. Благодаря этой особенности компонент Java Beans может работать по-разному в зависимости от среды времени выполнения. Класс, осуществляющий обработку этого события, должен реализовать интерфейс
VetoableChangeListener.
Постоянство
Постоянство (persistence) — это способность сохранять текущее состояние компонента Java Beans (включая значения свойств компонентов Java Beans и переменные экземпляров) на энергонезависимом запоминающем устройстве и извлекать его по мере необходимости

9 4 6 Часть III. Разработка программного обеспечения с использованием Для обеспечения постоянства компонентов Java Beans используются возможности сериализации, которые предлагают библиотеки классов Самый простой способ сериализировать компонент Java Beans заключается в том, чтобы он реализовывал интерфейс j ava.
io.
Serializable, который является просто маркерным интерфейсом. Реализация интерфейса java. io. Serializable обеспечит автоматическое выполнение сериализации. Вашему компоненту Java Beans ненужно будет предпринимать никаких других действий. Автоматическую сериализацию также можно наследовать. Другими словами, если какой-то суперкласс компонента Java Beans будет реализовывать интерфейс j ava.
io.
Serializable, он приобретет возможность автоматической сериализации. Существует одно важное ограничение любой класс, реализующий интерфейс j ava .io. Serializable, должен предоставлять конструктор без параметров.
При автоматической сериализации можно выборочно отключить сохранение отдельного поля с помощью ключевого слова transient. Таким образом, элементы данных компонента Java Beans, определенные как transient, сериализиро- ваться не будут.
Если
KoMnoHeHTjava
Beans не реализует интерфейс j ava.
io.
Serializable, вы должны обеспечить возможность сериализации самостоятельно (например, с помощью интерфейса java.
io .
Externalizable). В противном случае контейнеры не смогут хранить конфигурацию вашего компонента.
Разработчик компонентов Java Beans может предусмотреть возможность использования конфигуратора (customizer), с помощью которого другой разработчик сможет конфигурировать эти компоненты Java Beans. Конфигуратор может обеспечивать поэтапное руководство всем процессом конфигурирования, выполняя указания которого можно добиться того, чтобы компонент использовался в определенном контексте. Можно также предоставить интерактивную документацию. У разработчика компонентов Java Beans будет достаточно возможностей для того, чтобы разработать такой конфигуратор, который сможет обособить его продукт на рынке.
Функциональные возможности компонентов Java Beans обеспечиваются классами и интерфейсами пакета j a v a . b e a n s . В этом разделе приводится краткий обзор содержимого данного пакета. В табл. 29.1 представлен список интерфейсов пакета j a v a . b e a n s с кратким описанием их функциональных возможностей. В табл. 29.2 приведен список классов пакета j a v a . b e a n s .
Конфигураторы
API Java Таблица
2 9 .1 . Интерфейсы пакета
j a v a . b e a n s
Интерфейс
Описание
AppletInitializer
Методы этого интерфейса используются для инициализации компонентов Java Beans, которые также являются аплетами
B e ansinfо
Этот интерфейс позволяет разработчику определять информацию о свойствах, событиях и методах компонента
Java Beans
Глава 29. Компоненты Java Beans
9 4 Окончание табл. 29.1
Описание
Customizer
DesignMode
ExceptionListener
PropertyChangeListener
PropertyEditor
VetoableChangeListener
Visibility
Этот интерфейс позволяет разработчику предоставить графический интерфейс пользователя, при помощи которого можно конфигурировать компонент Java Методы этого интерфейса определяют, выполняется ли компонент Java Beans в режиме проектирования
Метод этого интерфейса вызывается вовремя возникновения исключения
Метод этого интерфейса вызывается при изменении ограниченного свойства
Объекты, реализующие этот интерфейс, позволяют разработчикам изменять и отображать значения свойств
Метод этого интерфейса вызывается при изменении ограниченного свойства
Методы этого интерфейса позволяют компоненту Java
Beans работать в тех средах, в которых нет графического интерфейса пользователя
Таблица
29.2. Классы пакета
java.beans
Класс
Описание
BeansDescriptor
Beans
DefaultPersistenceDelegate Этот класс предлагает информацию о компоненте Java
Beans. Он также позволяет связывать конфигуратор с компонентом Java Этот класс используется для получения информации о компоненте Java Подкласс класса Зашифровывает состояние совокупности компонентов
Java Beans. Может использоваться для записи этой информации в поток
Поддерживает динамическое создание слушателя со­
бытий
Экземпляры этого класса описывают событие, которое может создаваться компонентом Java Beans
Инкапсулирует вызов метода, возвращающего результат
Суперкласс классов
Propertydescriptor,
EventSetDescriptor и Подкласс класса
PropertyChangeEvent, представляющий изменение индексированного свойства
Экземпляры этого класса описывают индексированное свойство KOMnoHeHTaJava Выражение этого типа создается, если вовремя анализа
KOMnoHeHTaJava Beans возникает ошибка
Этот класс анализирует компонент Java Beans и создает объект
Beans
Inf о, описывающий компонент
Экземпляры этого класса описывают метод компонента
Java Beans

9 4 8 Часть III. Разработка программного обеспечения с использованием Окончание табл. 29.2
Класс
Описание
ParameterDescriptor
PersistenceDelegate
PropertyChangeEvent
PropertyChangeListenerProxy
PropertyChangeSupport
PropertyDescriptor
PropertyEditorManager
PropertyEditorSupport
PropertyVetoException
SimpleBeansInfo
Statement
VetoableChangeListenerProxy Экземпляры этого класса описывают параметр метода
Обрабатывает информацию о состоянии объекта
Это событие происходит при изменении связанных или ограниченных свойств. Извещение о нем посылается объектам, которые зарегистрировались на получение извещений об этих событиях и реализуют один из интерфейсов
PopertyChangeListener и Расширяет класс
EventListenerProxy и реализует интерфейс Компоненты Java Beans, поддерживающие ограниченные свойства, могут использовать этот класс для уведомления объектов интерфейса
s
t Экземпляры этого класса описывают свойство компо-
HeHTaJava Этот класс обнаруживает объект
PropertyEditor для данного типа
Этот класс предлагает функциональные возможности, которые могут использоваться при написании редакторов свойств
Исключение данного типа создается при отклонении изменения ограниченного свойства
Этот класс предлагает функциональные возможности, которые могут использоваться при написании классов
Beanslnfo
Инкапсулирует вызов метода
Расширяет класс
EventListenerproxy и реализует интерфейс Компоненты Java Beans, которые поддерживают ограниченные свойства, могут использовать этот класс для уведомления объектов интерфейса
VetoableChangeListener
Используется для чтения компонента Java Beans из документа Используется для записи компонента Java Beans в документ Хотя эта глава не позволяет рассказать обо всех классах, мы поговорим о четырех из них, представляющих определенный интерес, —
Introspector,
PropertyDescriptor, EventSetDescriptor и Класс Этот класс предлагает несколько статических методов, поддерживающих само­
диагностику. Наиболее интересным из них является метод getBeansinfo
(). Он возвращает объект
Beanslnfo, который может использоваться для получения информации о компоненте Java Beans.
Глава 29. Компоненты Java Beans
9 4 Метод
getBeansInfo () имеет несколько форм, включая следующую Beanslnfo getBeansInfo(Class
Beans)
throws Возвращаемый объект содержит информацию о заданном компоненте Java Класс

P r o p e r t y D e s c r i p t o Класс
PropertyDescriptor описывает свойство
K O M n o H e H T a J a v a
Beans. Он поддерживает несколько методов, которые управляют свойствами и описывают их. Например, вы можете определить, ограничено ли свойство, вызовом функции
isBound ()
. Чтобы определить, является ли свойство ограниченным, нужно вызвать функцию
isConstrained
(). Имя свойства можно получить при помощи вызова функции
getName (Класс
E v e n t S e t D e s c r i p t o Класс E v e n t S e t D e s c r i p t o r представляет событие KOMnoHeHTaJava Beans. Он поддерживает несколько методов, которые получают методы, используемые компонентом Java Beans для добавления/удаления слушателей событий или для управления событиями. Например, чтобы получить метод, служащий для добавления слушателей, нужно вызвать метод g e tA d d L is te n e rM e th o d (). Чтобы получить метод, используемый для удаления слушателей, необходимо вызвать метод getR em oveL - is te n e r M e th o d (). Чтобы получить тип слушателя, следует вызвать метод ge t L i s ­
t e n e r Туре (). Имя события можно получить, если вызвать метод getName (Класс

M e t h o d D e s c r i p t o Класс
MethodDescriptor представляет метод KOMnoHeHTaJava Beans. Чтобы получить имя метода, нужно вызвать метод
getName ()
. Информацию о методе можно получить с помощью метода
getMethod ()
, который показан ниже При этом возвращается объект класса
Method, описывающий данный метод.
Пример компонента Java В завершение главы предлагается пример, иллюстрирующий различные аспекты программирования компонентов Java, включая самодиагностику и использование класса
Beanslnfo. В нем также участвуют классы
Introspect
or,
PropertyDesciptor и
EventSetDescriptor. В примере используется три класса. Первый из них, являющийся компонентом Beans
Colors, показан ниже Простой компонент Java Beans,
impprt j a v a .a w t .*;
import j a v a .a w t .event.*;
import jav a .i o .Serializable;
public class Colors extends Canvas implements Serializable {
transient private Color color; // непостоянный
private boolean rectangular;
// постоянный Colors() {

9 5 Часть III. Разработка программного обеспечения с использованием Java
addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent me) {
change();
}
lb-
rectangular = false;
setSize(200, 100);
change();
}
public boolean getRectangular() {
return rectangular;
}
public void setRectangular(boolean flag) {
t h i s .rectangular = flag;
repaint();
}
public void change() {
color = randomColor();
repaint();
}
private Color randomColor() {
int r = (int)(2 55*Math.random());
int g = (int)(255*Math.random());
int b = (int) (2 55*Math.random());
return new Color(r, g, b ) ;
}
public void paint(Graphics g) {
Dimension d = g e tSizeO;
int h = d.height;
int w = d.width;
g. setColor(color);
if(rectangular) {
g .fillRect(0, 0, w-1, h-1);
}
else {
g .fillOval(0, 0, w-1, Компонент Beans
Colors отображает цветной объект в рамке. Цвет компонента определяется закрытой переменной color типа
Color, а его форма — закрытой переменной rectangular типа boolean. Конструктор определяет анонимный внутренний класс, расширяющий класс
MouseAdapter, и переопределяет метод mousePressed
(). Метод change
() вызывается в ответ на щелчок кнопкой мыши. Он выбирает случайный цвет и перекрашивает компонент. Методы get­
Rectangular
() и setRectangular
() обеспечивают доступ к одному свойству данного компонента Java Beans. Метод change
() вызывает метод randomColor
() для выбора цвета, а затем вызывает метод repaint ()
, чтобы сделать изменение видимым. Обратите внимание на то, что метод paint
() использует переменные rectangular и color для определения представления компонента Java Следующим классом является
ColorsBeansInf о. Это подкласс класса
SimpleBeansInf о, который предлагает явную информацию о цвете. В нем переопределяется метод getPropertyDescriptors
() для указания того, какие свойства будут доступны пользователю компонента Java Beans. В данном случае поль-
Глава 29. Компоненты Java Beans
951
зователю доступно только свойство rectangular. Метод создает и возвращает объект класса
PropertyDescriptor для свойства rectangular. Ниже показан используемый конструктор класса
PropertyDescriptor.
PropertyDescriptor(String свойство Class
B ea n sC ls)
throws IntrospectionException Два параметра представляют, соответственно, имя свойства и класс компонента Java Beans.
// Информационный класс компонента Java Beans,
import java.beans.
*;
public class о extends о {
public PropertyDescriptor[] getPropertyDescriptors() {
try {
PropertyDescriptor rectangular = new
PropertyDescriptor("rectangular", Colors.class);
PropertyDescriptor p d [] = {rectangular};
return pd;
} catch(Exception e) Передано исключение. " + e ) ;
}
return Последним классом является
IntrospectorDemo. Он использует самодиагно­
стику для отображения свойств и событий, доступных в компоненте Java Beans
Colors.
// Демонстрация свойств и событий
import j a v a .a w t .*;
import j a v a . b e a n s ;
public class IntrospectorDemo {
public static void main(String a r g s []) {
try {
Class с = Cla s s .forName("Colors");
Beanslnfo Beanslnfo = с Свойства propertyDescriptor[] =
Beanslnfo.getPropertyDescriptors();
for(int i = 0; i < propertyDescriptor.length; i++) {
System.out.println("\t" +
propertyDescriptor[i События eventSetDescriptor[] =
Beanslnfo.getEventSetDescriptors();
for(int i = 0; i < eventSetDescriptor.length; i
+
+) {
System.out.println("\t" +
eventSetDescriptor[i ].getName());
}
} catch(Exception e) Передано исключение. " + e ) Ниже показан вывод, полученный в результате выполнения этой программы

События:
mouseWheel
mouse
mouseMotion
component
hierarchyBounds
focus
hierarchy
propertyChange
inputMethod
key
В этом выводе следует обратить внимание наследующее. Поскольку класс о заменяет метод getPropertyDescriptors
() так, что единственным возвращаемым свойством является rectangular, отображается только свойство rectangular. Однако поскольку метод getEventSetDescriptors () не переопределяется в классе
ColorsBeansInfo, используется самодиагностика проектного шаблона и обнаруживаются все события, включая те, которые принадлежат классу
Colors суперкласса
Canvas. Помните, что если не переопределить один из методов “get”, определенных в классе
SimpleBeansInfo, то по умолчанию будет использована самодиагностика проектного шаблона. Чтобы увидеть, какие изменения были произведены классом
ColorsBeansInf о, нужно удалить его файл класса и запустить еще раз
IntrospectorDemo. На этот раз он предоставит отчет по большему количеству свойств 5 2 Часть III. Разработка программного обеспечения с использованием Java


1   ...   80   81   82   83   84   85   86   87   ...   90



написать администратору сайта