2000 г
IBM VisualAge for Java и сетевые вычисления
Russian/2 progect, http://os2.ru/
Сергей Посохов 24.11.1999
О чем эта статья
Что такое Ява
Первые шаги
Все, что вы хотели узнать про VisualAge, но боялись спросить
Давайте что-нибудь нарисуем!
Можно ли обойтись без построителя?
Написание апплетов для работы в сети
Соображения безопасности
Апплет для сетевых вычислений
Сервер, к которому он обращается
Примеры
О чем эта статья
В этой статье рассказывается о среде разработки IBM VisualAge for Java и ее использовании в вычислительных сетях. Все, что вы прочтете здесь, покажется вам знакомым и новым одновременно. Язык Ява (Java) очень похож на C++, но среда для разработки апплетов - шаг вперед по сравнению с существующими оболочками. Работать с ней очень удобно.
Используя сетевые возможности Явы, можно соединить несколько машин и заставить их работать как одно целое, управлять устройствами на других машинах, строить сети "клиент-сервер", и многое другое. О том, как это сделать, рассказывается отдельно.
Что такое Ява
Давным-давно, в далеком 1991 году, когда машины были большими, а приложения - маленькими, компания Sun переживала очередной кризис. Несмотря на то, что их машины опережали по скорости любой IBM PC, были надежнее PC и так далее, их брать никто не хотел. На выставках люди говорили одно и то же: "О, какая крутая тачка! А наши любимые приложения на ней пойдут? Нет? Тогда не будем покупать..."
Нет приложений - нет и пользователей, а значит, не будет и приложений. Чтобы разорвать замкнутый круг, было сделано многое, в том числе новые средства разработки, которые были предназначены не только для Sun-овских машин. Ява скачивается бесплатно и денег не требует. Попробуйте - Вам понравится. "Если Яву начнут использовать, будет написано большое число апплетов, и все они смогут работать на наших машинах. Вопрос с приложениями будет решен", - считали в Sun. Так оно и получилось.
Так что же они задумали? Что же такое Ява? Прежде всего, это язык для разработки апплетов - приложений, способных перемещаться по сети и работать в ней. Возможности Явы позволяют передавать любые данные в сети и вызывать методы на других машинах, так что сеть из нескольких машин может работать как одно целое, это поддерживается изначально.
В дополнение к языку программирования была разработана среда, в которой выполняются апплеты. Она обеспечивает их работу на любой платформе независимо от используемого процессора или ОС, обрабатывает исключения, следит за использованием памяти и так далее.
Первые шаги
Отзывы, полученные разработчиками в Sun после того, как первые версии Явы увидели свет, были самыми лучшими. Множество людей начали разрабатывать апплеты, так что вскоре была выпущена следующая версия, затем еще и еще.В то же время в IBM не только разработали свою собственную версию Явы, полностью совместимую с Sun-овской, но также дополнили ее редактором и отладчиком, а вскоре и мощной средой разработки. В рекламе к ней разработчики постарались показать, какую пользу может принести Ява. Они говорили: "Жизнь слишком коротка, чтобы переписывать код". С этим трудно не согласиться.
Кроме того, в IBM начали разрабатывать апплеты. Сейчас OS/2 можно настраивать не подходя к серверу, оболочка СУБД DB2 может быть доступна любому пользователю в сети, в дополнение к системе документооборота Lotus Notes сделана оболочка eSuite. Все это не зависит от платформы, не требует настройки - это очень удобно.
Больше всего Ява понравилась разработчикам. Один мой знакомый, его зовут Вадим, который в далеком 1988 году разрабатывал ПЭВМ "Агат", дал VisualAge такую оценку: "Это просто замечательно. По сравнению с тем, что делают в Sun и IBM, мелкомягкий Visual C++ выглядит как большая куча мусора, в которую они свалили все, что у них было".
Все, что вы хотели узнать про VisualAge, но боялись спросить
Как он выглядит-то? Ни разу не видел...
VisualAge отличается от других средств разработки тем, что позволяет разработчику сосредоточить свое внимание только на задаче, которую он должен решить, работать только с построителем или текстом и иногда попадать в отладчик - про все остальное можно забыть. Привычные для многих составляющие любого средства разработки - компилятор и командная строка, каталоги проектов и файлы исходников - скрыты или отсутствуют вообще.
Так как любой человек обрабатывает видимые данные быстрее, чем безличные файлы, ему проще работать с логической схемой программы и не беспокоиться об именах файлов или каталогов. Хорошо, если среда разработки сможет показать ее - например, вот так:
Окно рабочего пространства (600x400, 23 КБайта)
Если разработчик захочет исправить какой-нибудь метод в своей программе, ему достаточно будет выбрать этот метод и нажать на кнопку мыши. "Открывать и закрывать файлы" или совершать другие подобные действия - например "Создать ярлык", "Перейти на панель" и так далее, - ему теперь и в голову не придет. Нет никаких линеек и ярлыков - и времена файлов безвозвратно прошли. По крайней мере здесь :-)
А текстовый редактор там есть?
Есть в VisualAge текстовый редактор, но только не такой, к которому все привыкли. Ведь от использования файлов разработчики отказались - гораздо легче работать прямо с классами языка Ява, которые хранятся в самом VisualAge.
Каждый класс имеет внешнее представление - он может быть показан в построителе или в виде текста. Посмотреть и исправить исходный текст можно где угодно - в рабочем пространстве, в отладчике, при просмотре класса, поиске, сравнении текстов и так далее. Причем после исправления текста в одном окне он меняется в других окнах, так что следить за ними необязательно. Вот, например, окно для просмотра классов в пакете "java.lang" - как видите, это исходники Явы:
Текстовый редактор (600x400, 20 КБайт)
Чтобы увидеть их, в рабочем пространстве была выбрана закладка "Classes" и в списке выбран для просмотра метод "setDaemon" класса "java.lang.Thread". Исходный текст можно исправить и сохранить, поставить точку прерывания, провести поиск. Для просмотра можно открыть отдельное окно, и работать с ним.
Меня порадовало то, что разработчики в Sun и IBM не стали прятать свои исходники. Несколько раз это уже пригодилось, когда я долго не мог догадаться, где же ошибка :-)
А компилятор как работает?
Незаметно и очень быстро. Так как каждый класс Явы можно "собрать" отдельно, то для получения апплета не надо обрабатывать все исходники. VisualAge создает выполняемый код во время сохранения текста, причем в окне рабочего пространства можно всегда просмотреть список ошибок и быстро их исправить. И ни разу я не видел сообщений вроде "Too many errors".
А окошки вы чем рисуете?
В построителе можно разработать любой апплет, собирая вместе объекты различных классов (в Яве они называются "beans", то есть зерна) и соединяя их между собой. Обычно построитель используется для того, чтобы нарисовать окно с полями ввода и несколькими кнопками и задать действия, которые будут выполняться при нажатии на кнопки, причем эти действия также могут быть показаны в построителе.
Для того, чтобы задавать не только расположение "зерен", но и взаимодействие между ними, используются соединения-стрелки, которые задают правила вроде "когда возникнет такое-то событие выполни такое-то действие" или "установи такое-то свойство" - текст в этом случае набирать не надо.
Пусть у вас есть окно с кнопками "OK" и "Отмена". Для того, чтобы задать их расположение, достаточно бросить их в окно, а чтобы указать действия, которые будут выполняться при нажатии на каждую кнопку, надо соединить их с другими "зернами". Так, если вы хотите, чтобы при нажатии на кнопку "Отмена" окно было закрыто, вы должны соединить ее с окном и задать требуемое действие, как показано на рисунке:
Кроме кнопок, в апплете могут быть также невидимые "зерна", которые могут следить за набором текста в полях ввода, соединять апплет с другими приложениями в сети и так далее. Все зависит только от желания разработчика.
Вы можете попробовать самостоятельно сделать например, надпись, которая будет менять цвет когда над ней движется указатель мыши. Для этого вам потребуется два соединения: "Указатель мыши появился над надписью -> Задать для нее яркий цвет" и "Указатель мыши убрался -> Задать обычный цвет". При этом вы не напишете ни строчки.Этот пример мы рассмотрим ниже.
Однако это вовсе не означает, что в VisualAge можно работать не зная языка Ява. Дело в том, что возможность рисовать программу сделана в расчете на то, что человек заранее знает, что он хочет - никаких подсказок и "мастеров" в построителе нет. Так что лучше всего начинать с написания апплетов "руками", а затем уже попробовать эту возможность.
И отладчик навороченный?
Если рабочее пространство и построитель в VisualAge представляют собой что-то новое, делают его непохожим на другие средства разработки, то с отладчиком в IBM играться не стали - у них получился самый обычный отладчик. В нем можно выбрать поток, увидеть метод, который в нем работает, посмотреть доступные переменные и так далее:
Отладчик (600x400, 22 КБайта)
Особенно радует возможность исправлять текст прямо в отладчике, и продолжать выполнение программы с той же точки, где она была остановлена.
Так какой же для этого компьютер нужен?
Во-первых, даже не пытайтесь запускать VisualAge/Java на машине с 32 Мб памяти - работать все равно не будет, просто не влезет в доступные 25 Мб. Запустите его на машине где памяти много - и получите замечательную среду разработки. Больше ему и не нужно: открывайте в нем сколько угодно окон, запускайте сколько угодно апплетов - объем занимаемой памяти почти не увеличится.
Процессор подойдет любой, все летает даже на старом 100 МГц Pentium`e. Разрешение монитора должно быть 800x600 или выше, число цветов - от 256, слова "VGA" и т. п. следует забыть навсегда :-)
Руководство по VisualAge выполнено в виде HTML, и даже поиск ведется с помощью отдельного "поискового сервера", работающего через TCP/IP. Сначала мне показалось, что это лишнее, но рисунки в GIF и JPEG выглядят очень привлекательно. Тем более что я нашел одну хитрость - оказывается, Netscape для OS/2 может открывать отдельное окно для каждой новой странице, и в этом случае он работает ничуть не хуже, чем простой осевый справочник.
Утилита, которая позволит это сделать, называется "Netscape DDE Interface" и забрать ее можно здесь вместе с заменой для IBM Web Explorer. Эту связку - новый Explorer, DDE Interface и Netscape 2.02 можно использовать для чтения руководства, для этого надо настроить VisualAge так, чтобы он вызывал "Explore.exe".
Грабли?
Ну например... ставить VisualAge надо только в каталог с английским именем - русские названия он не понимает, танцы с бубном и ломом по голове на него не действуют.
Или вот еще - начальные настройки TCP/IP в OS/w Warp 4.0 могут не позволить справочнику видеть свой же компьютер, то есть "localhost", и получать от него данные он не сможет. Да и не только он - команда "ping localhost" иногда отвечает, что адрес неизвестен. В этом случае надо вызвать настройки TCP/IP и на первой же странице задать адрес для "loopback interface", а именно "127.0.0.1". Также можно добавить имя "localhost" с этим же адресом в список на второй странице после закладки "хосты". После этого справочник и команда "ping" будут работать правильно.
Нельзя удалять каталог "Eab\Ntq\Install", он может быть полезен. И надо отдельно сохранить файлы:
- Ide.ini
- Ivj10.ini
- Ivj10.ins
- Reg.reg
- Ivj.icx
- Ivjinit1.sav
Это настройки VisualAge. Если в нем что-то сломается, можно легко починить.
Давайте что-нибудь нарисуем!
Да легко! Можно попробовать сделать апплет, содержащий надпись, которая меняет цвет при появлении указателя мыши над ней. Сделать это довольно просто:
1. Прежде всего надо в окне рабочего пространства создать папку, в которой будет храниться ваш апплет. Для этого достаточно в полоске действий в верхней части окна нажать на кнопку с изображением папки-фолдера. После этого вы увидите окно, в котором надо указать название папки и нажать на кнопку "Finish":
Кнопка
Создание папки (700x400, 12 КБайт)
2. После создания папки надо создать в ней апплет. Для этого в полоске действий есть кнопка "Создать апплет", на которую надо нажать после того, как будет выбрана папка:
Кнопка
Создание апплета (700x500, 16 КБайт)
3. После того, как апплет будет создан, VisualAge открывает окно построителя, в котором можно что-нибудь нарисовать, например, надпись (Label). После этого можно задать ее свойства:
Окно построителя (600x500, 16 КБайт)
Рисование апплета (600x500, 16 КБайт)
4. Теперь, когда надпись нарисована, можно задать ее поведение. Это делается с помощью соединений-стрелок, описывающих действия, которые должны выполняться при возникновении различных событий в апплете. Так, если вы хотите, чтобы при появлении указателя мыши над надписью она меняла свой цвет, надо в ответ на событие "mouseEntered" вызвать в ней метод "setForeground()".
Для того, чтобы создать такое соединение, надо нажать правой кнопкой мыши на источник события, то есть на свеженарисованную Надпись, и выбрать в меню строки "Connect" и "All Features". Таким образом вы сообщаете построителю, что при возникновении некоторого события вы будете выполнять какое-то действие и что вам требуется список всех возможных событий:
Создание соединения (600x500, 19 КБайт)
В ответ на это построитель покажет вам окно с заголовком "Start connection", в котором вы сможете выбрать отслеживаемое событие, в данном случае это "mouseEntered":
Выбор события (500x400, 12 КБайт)
Теперь вам надо указать, где вы будете вызывать метод. Смело кликайте мышкой в ту же самую Надпись и снова требуйте "All Features", на этот раз список всех методов. Вам будет показано окно с заголовком "Connect event", в котором вы сможете выбрать нужный вам метод, вот так:
Выбор метода (500x400, 10 КБайт)
5. Теперь у вас есть соединение, которое указывает, что при появлении указателя мыши над надписью надо менять ее цвет. Но вы еще не указали, какой цвет вам нужен. Для того, чтобы это сделать, надо нажать правой кнопкой мыши на построенное соединение и выбрать в меню строку "Properties", вот так:
Задание свойств соединения (600x500, 19 КБайт)
В свойствах соединения можно задать новый цвет. VisualAge предложит вам выбрать цвет из палитры или смешать красный, зеленый и синий оттенки:
Выбор цвета (500x300, 8 КБайт)
6. После того, как задано первое действие, не забудьте задать второе - "восстановить цвет в случае, если указатель мыши ушел с надписи". Событие, которое надо отслеживать, называется "mouseExited", а метод надо вызывать тот же - "setForeground()".
Таким образом, у вас должно получиться два соединения для двух событий:
Обработка двух событий (600x500, 17 КБайт)
7. Семь шагов - и вы у цели. Можете запускать апплет. Для этого достаточно нажать на кнопку "Test" в полоске действий:
Кнопка
Апплет, содержащий надпись (400x300, 2 КБайта)
Когда вы наиграетесь с построителем, вам придет в голову мысль - а не проще ли все это сделать руками :-) Действительно, ведь достаточно написать новый класс на основе Label - например, ColoredLabel и отследить в нем два события от мышки. Весь текст набирается за полчаса - стоит ли огород городить...
Можно ли обойтись без построителя?
Да! Причем ни одна из возможностей VisualAge не будет при этом потеряна. Более того, при написании апплетов руками белый человек применяет разные хитрости, например:
- Все окна и поля ввода можно создать заранее и держать их скрытыми, так что как только они потребуются, их можно будет сразу же показать. Изображения и настройки также заранее загружаются с сервера. Это занимает некоторое время, но скачивать данные по сети можно одновременно с остальными действиями - например, пока пользователь наберет свое имя и пароль.
- Все созданные заранее надписи, кнопки и поля ввода можно разместить в отдельном классе и обращаться к нему в любом месте программы, набирая что-то вроде: "InputFieldsForMyApplet.большаяНадпись.setForeground(Color.red);" Если точно так же поступить со всеми изображениями, цветами, строками и настройками, программа становится намного проще.
- Действия, которые надо выполнять в ответ на возникающие события, можно перенести в потоки (Threads), чтобы не останавливать очередь событий. Если даже в потоке возникнет исключение, например, доступ по нулевому указателю, апплет все равно будет работать.
- Для того, чтобы задать расположение окон построитель на самом деле и не нужен - в Яве достаточно средств для этого. В примерах к этой статье вы найдете класс GroupBox, это "Рамка, которая может содержать несколько полей ввода (а также кнопок, надписей и так далее)". При изменении размеров апплета рамка меняет свой размер и передвигает все поля, которые расположены внутри нее, так что апплет всегда будет выглядеть одинаково, независимо от того, на какой машине он выполняется.
Как видите, в работе без построителя тоже есть свои преимущества, так что если вы решили обходиться без него - это только к лучшему. Последовательность действий при разработке апплета в этом случае выглядит так:
- Вы пишете апплет, который рисует окна и поля ввода и больше ничего не делает и проверяете то, что получилось.
- Затем вы добавляете к нему методы для отслеживания событий от мыши, клавиатуры, действий пользователя и так далее.
- После этого вы создаете потоки, которые могут потребоваться для выполнения всех действий и их отлаживаете.
Написание апплетов для работы в сети
Сетевые вычисления в Яве основаны на RMI - "Remote Method Invocation", то есть вызове методов, расположенных на других машинах. Для передачи и получения данных используются возможности сети TCP/IP, поэтому апплеты для сетевых вычислений можно использовать на любой машине, подключенной к сети Интернет.
Для того, чтобы начать работать с сетевым приложением, пользователь должен вызвать на своей машине любой браузер, например, Netscape или HotJava, и набрать в нем адрес сервера. После этого на машину скачивается апплет, который спрашивает его имя и пароль, например, вот так:
Подключение к сети (600x500, 61 КБайт)
После того как имя и пароль были указаны, апплет посылает эти данные на сервер, который постоянно работает в сети и отвечает на приходящие запросы. Данные можно посылать по-разному: через HTTP, UDP, сокеты, Named Pipes и так далее, но так как сервер пишется на том же языке, проще всего использовать RMI, то есть вызвать на сервере несколько методов и передать им необходимые значения. Ответ от сервера может быть получен как возвращаемое значение:
// Обращение к серверу.
ответ = сервер.обработатьЗапрос( команда, списокЗначений );
В этом примере апплет обращается к серверу и передает ему команду, которую он должен выполнить и список значений для нее. Когда команда выполняется апплет получает ответ от сервера, который он может использовать дальше. Список значений и ответ зависят от посылаемой команды и переменные для них могут содержать все что угодно - от целых чисел до рисунков и отчетов от базы данных.
Разве глядя на эти строки можно сказать, что источник данных расположен на другой машине, возможно, за несколько десятков километров? Но это так. Обращение к серверу не отличается от вызова методов внутри апплета. Да и на сервере команды разбираются и выполняются так же просто - примерно так же, как происходит обработка событий в апплетах или сообщений в приложениях для OS/2. Команда и данные как будто "падают" на сервер, ответ надо бросить в ту же сторону, вот и все :-)
Что можно сделать с помощью удаленного вызова методов? А что бы вам хотелось? Включать кофеварку по часам, исследовать изменение курса акций, построить сеть кассовых машин? Все это возможно. Причем скорость вычислений при использовании RMI во многих случаях возрастает: сервер может использовать память для хранения часто запрашиваемых данных, сжимать их при передаче по сети и так далее.
Соображения безопасности
Вызывать по сетке все методы нельзя, так любой посторонний человек сможет залезть на сервер. Должны быть доступны только некоторые методы, и для того, чтобы апплеты "знали", что они могут вызвать, для каждого сервера делается описание, в котором перечисляются разрешенные для вызова методы. Оно похоже на описание класса и называется интерфейсом (англ. "interface"). Таким образом сервер становится виден только частично, как будто вы смотрите на него через решето - где-то есть дырка, а где-то ее нет.
Кроме того, между сервером и апплетом есть еще несколько переходников, полезных и не очень, так что в VisualAge пришлось построить вот такую цепочку:
Апплет | <-> | Соединитель | --> | Интерфейс сервера |
| | | | | |
| | Сеть TCP/IP | |
| | | | | |
Переходники-"proxies" | --> | Сервер | <-> | Источники данных |
Отдельные ее части понятны сразу: источники данных - это, например, СУБД и текстовые файлы, сервер, интерфейс для него и апплет составляют программу, которую надо написать, что такое сеть TCP/IP я и сам не знаю :-) Осталось рассказать про остальные ее звенья.
Соединители в апплетах - это служебные классы, с помощью которых можно в любом месте программы обратиться к любому серверу независимо от того, как именно он работает. Дело в том, что апплет и сервер могут делаться разными разработчиками и данные, возможно, должны быть по-разному представлены. Поэтому для разных видов серверов обычно пишутся разные соединители, которые в программе выглядят одинаково.
Переходники-"proxies" возможно, когда-то были предназначены для решения тех же самых задач, но набивать их каждый раз руками никто не захотел. Сейчас VisualAge делает их самостоятельно, для этого надо выбрать в окне рабочего пространства несколько строк меню и нажать на несколько кнопок.
Апплет для сетевых вычислений
Апплет, предназначенный для работы в сети, мало отличается от обычных апплетов. Он может работать в окне обозревателя или как отдельное приложение. У него есть возможность передавать данные по сети, это делается с помощью соединителей, и он умеет отображать полученные значения, для этого надо написать несколько методов.
В примерах к этой статье есть апплет, который показывает список документов и умеет проводить поиск по ключевым словам. При этом он не выполняет никаких действий с текстами, например, не скачивает тексты по сети для проведения поиска - все действия выполняются на сервере. Так, если пользователь хочет просмотреть документ, сервер находит его и сообщает апплету его расположение (URL), используя которое документ можно открыть в обозревателе.
Апплет разрабатывался в OS/2 и на работу в Windows рассчитан не был. Те не менее он там работает и никаких глюков замечено не было.
Сервер, к которому он обращается
Обработка команд на сервере напоминает обработку событий в апплетах и сообщений в Presentation Manager. Обработка команд для работы с текстовыми документами выглядит примерно так:
public Storage выполнитьЗапрос( String команда, Storage списокЗначений )
{
// Обрабатываем команды.
if( команда.indexOf( "открыть" ) != -1 ) return открыть( списокЗначений );
if( команда.indexOf( "найти" ) != -1 ) return найти( списокЗначений );
return null;
}
Здесь сервер разбирает приходящие команды и выполняет какие-то действия. После того, как команда выполняется, он возвращает значение в ответ. Если получена неизвестная команда, возвращается пустое значение (null).
Примеры!
Все исходные тексты содержатся в одном файле, который может быть прочтен в VisualAge. Они были подготовлены в VA for Java 1.0 PE для OS/2. Забрать их можно здесь.
Чтобы перенести их в среду VisualAge, надо выполнить следующие действия:
- Выбрать в окне рабочего пространства в меню "File"сстроку "Import" и указать файл Serg.dat в качестве источника. Исходные тексты будут добавлены в среду VisualAge, но в окне рабочего пространства вы их увидите не сразу.
- Для того, чтобы перенести исходники в рабочее пространство, надо нажать в полоске действий на кнопку "Создать новую папку", и в появившемся окне указать, что вам нужны следующие тексты:
Containers | Служебные классы для хранения данных |
InternetAccess | Все что требуется для работы в сети |
Library | Пример апплета для сетевых вычислений |
OS2 | Часто используемые методы для работы в OS/2 и не только |
WindowControls | Всевозможные заставки, рамки и прочее |
Для того, чтобы апплет работал правильно не забудьте положить в каталог "Ibmvjava\Ide\Project_resources" изображения и тексты, которые он должен читать. Они содержатся вместе с исходниками в каталоге "Resources".
Рано или поздно у вас появится желание сохранить ваш собственный апплет на диске в виде файлов "*.java" . Вы найдете в каталоге "Export" очень полезный скрипт на Rexx, который можно использовать для этого.
Все вопросы присылайте по e-mail, постараюсь на них ответить :-) Успехов!