Записки начинающего веб-программиста.
`
Автору этрих строк довелось освоить основы
программирования по технологиям Java Servlet и JSP.
К сожалению, по независящим от автора причинам
работа осталась незавершённой. Однако рассказ о
проделанной работе, возможно, может быть интересным
или полезным для других; реально для меня
наибольшей сложностью было то, что при огромном
количестве документации сложно понять, что из этой
документации имеет отношение к твоей работе, а что
- нет, и как вообще запустить систему, реализующую
динамическую генерацию html-страниц. Я старался
особое внимание уделить деталям, вызвавшим
трудности у меня лично. Для вопросов и замечаний
просьба использовать адрес aravidze@yandex.ru .
`
Принятые решения:
`
- Решено использовать технологии, связанные с
языком ява (чтобы иметь возможность задействовать
сотрудника, ранее работавшего для фирмы);
- Первоначально работать под Windows XP Home
Edition, уже установленной на выделенной для работы
машине, а позже рассмотреть возможность перехода на
Linux;
- Для набивки структурных формул использовать
коммерческую программу ISIS Draw, уже закупленную
фирмой (мотивировка: партнёры фирмы желают файлы
именно в формате *.mol, создаваемые этой
программой);
- Использовать стандартную систему исполнения
языка ява от фирмы Sun;
- Как сервер использовать Tomcat (как
рекомендуемый для разработки технологий на основе
явы).
- Для ведения БД впоследствии перейти на систему
ведения реляционных баз данных MySQL, но
первоначальную версию БД делать в собственном
формате (это решение было принято с целью
обеспечить аварийное вмешательство в случае
непонятного поведения СУБД, а также в связи с тем,
что под Windows XP Professional Edition,
установленной у разработчика, сервер
MySQL примерно через полсекунды работы отключался,
предположительно - за счёт нарушения границ
отведенной памяти, что затрудняло освоение MySQL).
`
Ниже описана методика скачивания необходимых
компонентов системы, их установки и работы с ними,
а также существенные детали написанного кода.
`
--------
`
Общие замечания.
`
- Смысл используемых технологий - Java Servlet и
JSP (Java Server Pages) - сводится к тому, чтобы
обеспечить написание программ порождения
на центральной машине (сервере)
ответа на запрос пользователя. Пример: пусть
на сайте хранится база данных по выпускаемым
соединениям, и пусть пользователя интересует,
выпускается ли конкретное соединение;
можно дать пользователю возможность скачать всю
базу данных и у себя на машине искать, есть ли в
ней нужное соединение, но это непроизводительно и
неудобно, и разумнее дать пользователю возможность
составить запрос - например, указать, что его
интересуют лишь соединения с заданной
брутто-формулой - и чтобы на сервере программа сама
просмотрела базу данных, породила и выдала
пользователю список соединений с данной формулой.
Чтобы разъяснить восприятие технологий Java
Servlet и JSP с точки зрения программиста и
различие между ними, вначале разъясним
представление информации, получаемой пользователем.
Чтобы выдать пользователю в браузере строку "Hello
world!", сервер посылает клиенту хранящийся или
динамически порождаемый текст примерно следующего
вида:
`
<html>
<head>
<title>Marasmo</title>
</head>
<body>
Hello world!<br>
</body>
</html>
`
. Именно так выглядят документы, сохранённые в
браузере как *.htm . Так вот, исходник сервлета,
порождающего такой текст, выглядит по типу
`
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class Test extends HttpServlet {
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws IOException, ServletException
{
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<head>");
out.println("<title>Marasmo</title>");
out.println("</head>");
out.println("<body>");
out.println("Hello world 1.<br>");
out.println("</body>");
out.println("</html>");
}
public void doPost(HttpServletRequest request,
HttpServletResponse response)
throws IOException, ServletException
{
doGet(request, response);
}
}
`
Как видим, если отвлечься от шапки (формальных
указаний на импорт, наследование от класса
HttpServlet и т.п.), рабочая часть представляет
собой просто вывод нужных строк ('<html>' и т.п.) в
поток вывода. (Разумеется, имеются методы, чтобы
опросить переданные сервлету параметры, и можно
использовать все конструкции явы, чтобы в
зависимости от условий выдавать разные результаты).
В целом это полноценный текст на языке ява; перед
исполнением он должен быть оттранслирован.
Технология JSP позволяет избавиться от шапки,
сохраняя возможность вставлять произвольные
конструкции языка ява. Приденный выше пример можно
записать как *.jsp, например, следующим образом:
`
<html>
<head>
<title>Marasmo</title>
</head>
<body>
<%
out.println("Hello world 2.<br>");
%>
</body>
</html>
`
; при этом возможна ситуация, когда цикл на яве
открывается в одной вставке, а закрывается в
другой. Файлы типа *.jsp преобразуются системой в
файлы типа *.java, те транслируются и исполняются
подобно сервлетам (но хранятся отдельно, и шапка у
полученных файлов типа *.java отличается от шапки у
сервлетов).
Имеются ещё иные технологии на базе языка ява,
напр., Java Beans ("яванские бобы" - т.е. кофейные
зёрна; обыгрывается ассоциация с яванским кофе
и рисунком чашки со струйками пара над ней как
символом языка ява и фирмы Sun), но они нам
пока не понадобились.
`
- Ниже при обсуждении системы исполнения языка ява
подчёркнута важность хорошей скорости скачивания из
интернета; это же относится и к другим пакетам,
везде скачиваются файлы по >~10 Мб, просто сист.
исполн. явы с её 52 Mb - рекордсмен.
`
- Документацию по классам, интерфейсам и их
методам наиболее удобно получать следующим образом:
в поисковике (напр., www.google.com/search) задаём:
sun java method + название интересующего нас
класса, метода и т.п. - Vector, RandomAccessFile
и т.п. (Внимание: именно 'method', а
не 'methods' - там написано 'method summary!'). В
ответ на первом месте или вблизи него обычно
оказывается фирменная документация фирмы Sun,
которую можно сохранить и в дальнейшем использовать
как справочный материал.
`
- В каталоге d:\sekirin\p1\izuchen\evm\java\jav\
имеется подборка файлов типа *.java от простого к
сложному, написанных автором в ходе изучения языка;
в подкаталогах хранятся скачанные из Интернета
файлы *.java других авторов.
`
- Система исполнения языка Ява принимает на входе
текст программы и порождает тексты - например,
html'евские страницы (для их просмотра браузером
пользователя) и листинги для отладки. Поэтому для
работы с ней используются консольные (а не
графические) оболочки. У нас используется оболочка
far (d:\sekirin\far\far.exe).
`
- Для работы системы исполнения языка ява
требуется задать переменные среды; концепция
переменных среды широко используется в Линуксе; она
была реализована в MS DOS (команда set и
возможность опроса) и в эмуляторах DOS под Windows.
Проблема для всех версий MS DOS/Windows -
недостаточное количество памяти, выделяемой под
переменные среды по умолчанию. В Win9X, как и в MS
DOS, увеличить количество выделяемой памяти можно
по типу: в файл c:\config.sys вставляется строка
shell=c:\command.com /e:4096 /p ;
в более поздних версиях Windows, включая WinXP,
файлы config.sys и autoexec.bat не поддерживаются,
вместо них используются файлы с именами типа
c:\windows\system32\config.nt и
c:\windows\system32\autoexec.nt; их исполнение
имитируется не при запуске системы, а - насколько
удалось понять из разъяснений коллег и из
документации из Интернета - при запуске
16-разрядных приложений (!). В целом логика - когда
они запускаются и к чему относятся заданные в них
параметры - не вполне ясна (в частности, похоже,
при запуске одного 16-разрядного приложения из
другого, напр., bat-файла из-под Volkov
Commander'а, config.nt не имитируется, и
запускаемому приложению выделяется очень мало
памяти под переменные среды).
Ещё одна проблема с указанными файлами *.nt:
по некоторым данным, вместо '\' в них везде следует
писать '\\'; экспериментальная проверка не
проведена, но, во всяком случае, в текущем виде в
сочетании с d:\sekirin\set_.bat всё работает.
Рекомендуемый порядок действий, при котором
эта проблема оказывается решена:
- В файл c:\windows\system32\config.nt вписывается
строка
c:\windows\system32\command.com /e:4096
(именно так - без shell= и без /p !).
- После запуска WinXP сочетаниями Ctrl+Esc
(=Start), Run, c:\windows\system32\cmd (в
русифицир. версии - Start -> Пуск, Run ->
Выполнить) запускаем эмулятор DOS. Возникает
DOS'овский экран с подсказкой '>' и мигающим
курсором - набираем d:\sekirin\set_.bat - этот
bat-файл устанавливает необходимые переменные
среды, после чего запускает оболочку far
(d:\sekirin\far\far.exe). После этого из-под far
можно запускать транслятор с явы, bat-файлы
tomcat'а и т.п.
В конце работы следует выйти из far'а нажатием
с клавиатуры F10, Yes, а затем из cmd - командой
exit.
Примечание: при попытке использовать Volkov
Commander вместо far'а -> сообщ. о нехватке памяти
под переменные среды, но если выйти из vc в cmd и
запускать *.bat непосредственно из cmd - проходит.
Поскольку vc всё равно не поддерживает длинные
имена, это не принципиально и упоминается лишь как
предостережение.
Какие именно переменные нужно задавать - более
конкретно планируется указать ниже при описании
отдельных компонентов.
`
- Для набивки программ использовался встроенный
редактор far'а. Он позволяет копировать в буфер
Windows и из него по типу Notepad'а (помечение -
Shift + движение курсора, Ctrl+X - Cut, Ctrl+C -
Copy, Ctrl+V - Paste), но, в отличие от Notepad'а,
позволяет просматривать 16-ичное представление.
`
- Из имеющихся браузеров (Mozilla и Internet
Explorer), согласно литературным данным, Mozilla
предпочтительнее, т.к. Internet Explorer считает,
что он умнее пользователя и что если он скачал
страницу, то можно её сохранить и при повторных
обращениях по тому же адресу выдавать сохранённую
страницу, а не лазить снова на сервер скачивать её;
при этом явные указания - не запоминать страницу -
он, согласно литературе, порой игнорирует; т.о.,
возможна ситуация: мы хотим модифицировать данные в
базе данных, даём указание записать новые данные -
и видим, что якобы у нас часть изменений не
записалась - и мы не знаем, то ли они действительно
не записались, то ли это Internet Explorer
демонстрирует нам свою интеллектуальную мощь. К
сожалению, в случае рисунков Mozilla показывает тот
же самый эффект, что вынуждает усложнять логику и
заботиться о том, чтобы разные рисунки имели разные
имена - даже там, где было бы достаточно иметь один
файл с именем, например, raboch.bmp .
`
(Конец общих замечаний).
`
--------
`
Описание необходимых компонентов - получение,
установка, запуск.
`
ISIS.
`
Коммерческая программа ISIS (ISIS Draw и ISIS
Base) закуплена фирмой; инсталляционник - у
директора; установлена на машине для разработчика -
c:\progra~1\mdlisi~1\idraw32.exe и там же -
ibase32.exe . О методах работы см. osvoisis.chi .
В докум. было напис., что из лицензионн.
сообр. программа порождения названий по
номенклатуре IUPAC на диск на записана, и её надо
скачать из Интернета; скачиваем
(d:\sekirin\p1\programs\isis\autonom\) и
инсталлируем - в меню появ. пункт порождения
названий.
О методах работы см. osvoisis.chi .
`
-----
`
Система исполнения языка ява.
`
Система бесплатно скачивается с java.sun.com .
Следует скачать пакеты J2SE SDK (Java 2 Standard
Edition, Software Development Kit - транслятор,
базисные библиотеки) и J2EE SDK
(аналогично - Enterprise Edition - библиотеки для
написания серверных приложений). Версии
периодически обновляются, ссылки - похоже, тоже,
более того, при разных обращениях в ссылки для
скачивания вводятся разные буквенно-цифровые
комбинации, докачка по download не проходит, так
что скачивать надо на машине с хорошей скоростью
скачивания из интернета (J2SE SDK занимает >50 Мб).
`
Установка системы: запускаем
экзешники-инсталляторы, указываем, в какой каталог
записать файлы пакетов J2SE и J2EE - инсталлятор их
записывает. Затем в set_.bat (установка переменных
и запуск оболочки far) вписываем строки по типу
path d:\j2sdk\bin;%path%
set java_home=d:\j2sdk
set j2ee_home=d:\j2sdkee
set classpath=.;d:\j2sdkee\lib\j2ee.jar;d:\programs\jdbc
; важно в classpath задать среди прочего точку,
иначе не будет искать файлы *.class в текущем
каталоге (что важно для отладки подпрограмм и для
проверки работоспособности); j2ee.jar - библиотека
методов J2EE, jdbc - Java DataBase Connectivity -
библиотека для связи с сервером базы данных.
`
Проверка работоспособности системы - по типу:
`
- Набиваем файл с именем, напр., Test.java
нижеприведенного вида.
Внимание:
(1) Надо следить за различием прописных и
строчных букв и в тексте, и в имени!
(2) Имя файла и имя класса - здесь 'Test' -
обязаны совпадать!
`
public class Test {
public static void main(String[] args) {
System.out.println("Ha-ha-ha.");
}
}
`
- Нижеприведенными командами транслируем и
запускаем этот файл.
Внимание:
(1) При обращении к javac (Java Compiler) обязательно
ПИСАТЬ расширение ('.java');
(2) При обращении к java (система исполнения
оттранслированного файла) столь же обязательно НЕ
ПИСАТЬ расширение (оттранслированный файл имеет
расширение '.class' - так его надо НЕ ПИСАТЬ).
`
javac Test.java
java Test
`
Если всё установлено нормально - программа
должна выдать 'Ha-ha-ha.' и вернуть управление.
-----
`
Tomcat.
`
Скачивается бесплатно с
http://jakarta.apache.org/tomcat/ .
У нас скачаны версии 3.3.2 и 5.0.25;
инсталляционники хранятся в
d:\sekirin\p2\programs\TOMCAT.
jakart~1.zip (7 Мб) - верс. 3.3.2,
jakart~2.zip (12 Мб) - верс. 5.0.25.
Инсталлирована версия 3.3.2; расположена в
d:\tomcat.
Для инсталляции архив просто распаковывается в
нужный каталог, и в файле set_.bat или аналогичном
вписывается
set tomcat_home=d:\tomcat .
`
Минимальная проверка работоспособности:
`
- запускаем ДВА экземпляра оболочки (Start, Run,
cmd, d:\sekirin\set_). Это необходимо в связи с
необходимостью в случае аварийного останова
Tomcat'а сохранить сообщение об ошибке; исходно в
файле tomcat.bat запуск был эквивалентен start java
с поиском классов в tomcat.jar; при этом
запускалось отдельное окно, вывод шёл в него, при
авосте оно закрывалось, и выведенное в него
сообщение пропадало. Желательно уточнить, но вроде
при таком запуске переназначение вывода (по типу
1>3.txt 2>4.txt) не работало, и пришлось вместо
эквивалента start java сделать эквивалент просто
java - тогда переназначение удаётся, и сообщение об
ошибке сохраняется. (Кстати, под Win9X сообщения об
ошибках вообще не переназначаются - такое есть лишь
под Win2000 и более поздних версиях, включая
WinXP). Но за это приходится платить: в окне
пользователя, из которого мы запускаем tomcat, пока
он работает, мы видим лишь сообщение о том, что он
запущен и что его вывод переназначен, и ввести
команду его останова мы не можем. Для того, чтобы
остановить tomcat (и заниматься другими делами), и
нужно второе окно.
`
- заходим в каталог d:\tomcat\bin и запускаем
startup.bat . Он запускает упомянутый выше
tomcat.bat .
`
- запускаем любой браузер и в нём набираем
http://localhost:8080/ ;
при этом должна запуститься локальная страница с
аляповатым изображением кота и предложением
запустить готовые тест-примеры типа сервлетов и
типа jsp (щёлкая на соответствующих ссылках). Для
проверки рекомендуется пощёлкать и убедиться, что
всё работает.
(Дополнение: если используется прокси, в
настройках браузера следует найти пункт о том, что
к определённым адресам следует обращаться, минуя
прокси, и прописать в этом пункте localhost).
`
- в конце для остановки tomcat'а в d:\tomcat\bin
запускаем shutdown.bat .
`
Проверка трансляции собственного
web-приложения:
`
В разных - используя термин с сайта фирмы Sun
- контейнерах сервлетов и JSP возможны разные
соглашения о том, где какие файлы размещать; ниже
изложено, как их размещать в Tomcat'е.
Отвлекаемся от подкаталога ROOT (вроде он
позволяет добиться, чтобы пользователь набирал имя
файла сразу после http://localhost:8080/) и
рассматриваем web-приложение (т.е. набор
логически связанных друг с другом статических страниц,
рисунков, файлов данных, программ для порождения
динамически генерируемых в ответ на запрос страниц
и т.п. - утрированно говоря, мини-сайт),
размещаемое в подкаталоге.
Вначале в каталоге d:\tomcat\webapps\ создаём
подкаталог для приложения - назовём его, напр.,
test. Заходим в него и выполняем последовательность
команд
md WEB-INF
cd WEB-INF
md classes
(именно с указанным сочетанием прописных и строчных
букв!).
Далее, берём указанные выше (в предварительных
рассуждениях, при объяснении технологий Java
Servlet и JSP) исходники сервлета и *.jsp и
сохраняем их под именами Test.java и test2.jsp
соответственно. Файл Test.java транслируем (javac
Test.java).
Далее, для сервлетов следует создать таблицу
соответствия истинных и представляемых имён.
Делается это весьма громоздким способом, а именно:
в каталоге WEB-INF создаётся файл web.xml
следующего содержания:
`
<?xml version="1.0" ?>
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN"
"http://java.sun.com/j2ee/dtds/web-app_2_2.dtd">
<web-app>
<servlet>
<servlet-name>hua1</servlet-name>
<servlet-class>Test</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>hua1</servlet-name>
<url-pattern>/test1</url-pattern>
</servlet-mapping>
</web-app>
`
.
Внимание:
(1) Test - это имя класса, test1 - то, что нужно
набирать в браузере, hua1 - ещё одно имя, нигде
больше не фигурирующее, а здесь использующееся лишь
для того, чтобы через него была задана связь имён
Test и test1;
(2) Если сервлетов несколько, то в файле web.xml
вначале перечисляются соответствия name/class, а
потом - name/pattern; в итоге информация о
соответствии name/pattern оказывается разнесена по
далеко отстоящим участкам файла web.xml .
Есть ли у такого представления информации
достоинства - автору неизвестно.
`
Далее запускаем tomcat (как выше).
Далее набираем в браузере:
http://localhost:80/test/test1
- без расширения в конце; здесь test в середине
адреса - имя подкаталога; при этом из web.xml
система должна найти, что имени test1 в конце
адреса соответствует сервлет Test, запустить его и
вывести результат. В результате должно вывестись
'Hello world 1.' .
Аналогично набираем
http://localhost:80/test/test2.jsp
- теперь с расширением '.jsp'; должно само
оттранслировать test2.jsp, запустить и вывести
'Hello world 2.' .
В конце останавливаем tomcat (как выше).
`
(Конец проверки трансляции собственного
web-приложения)
`
Что касается иных деталей указанных технологий
(как из *.jsp обратиться к раздельно
оттранслированному классу на яве, где размещать
файлы данных для чтения и т.п., как организовать
диалог с пользователем) - рекомендуется просмотреть
в d:\sekirin\p1\izuchen\evm\java\java_web\osvoen\
подкаталоги s1..s12 - в них от простого к сложному
приведены собственные примеры работы с этими
технологиями (созданы в ходе их освоения).
(Примечание: в Интернет автор выставляет s1, s2 и
s7 - см.
).
`
-----
`
MySQL (My + Structured Query Language).
`
Бесплатно скачивается с www.mysql.com (более
конкретно: dev.mysql.com/downloads/index.html).
Скачанные файлы хранятся в
d:\sekirin\p2\programs\my_sql .
Проинсталлирована в d:\mysql . При этом
неясно, которая из версий была проинсталлирована (!).
Согл. osvomysq.chi, в c:\ записан файл my.ini, но
первоначальный вариант не подошёл - был найден
аналог из Интернета, с которым пошло.
Не пытались задавать автомат. запуск сервера
MYSQL при запуске WinXP - тк. экспериментировали,
но случайно установили, и не записали, как; теперь
сервер MySQL запускается при запуске WinXP и готов
отвечать на запросы, пока его не снимут
проинудительно (щёлкнуть левой кнопкой мыши на
пиктограмме с изобр. светофора и закрыть возникшее
окно щелчком на крестике в правом верхнем углу). В
связи с возможными сложностями при его установке
под WinXP (см. следующий абзац) оставляем его в
таком состоянии.
При попытке установить его под WinXP
Professional (на фирме - WinXP Home Edition)
обнаружилось, что примерно через полсекунды работы
сервер MyXQL прекращает отвечать. Предположение -
по аналогии с другими программами, отказывающимися
работать под WinXP Prof., напр., Watcom'овским
транслятором с фортрана версии 10 или 11 -
нарушаются границы выделенной памяти, и система
снимает задачу, но для обычных программ выдаётся
сообщение пользователю, а для сервера, запущенного
как фоновая задача, сообщений не выдаётся.
`
Проверка работоспособности:
`
Заходим в d:\mysql\bin и там набираем:
mysql -u root
show databases;
use mysql;
show tables;
show fields from host;
quit;
Если всё нормально, в ответ на запросы выводит
информацию.
`
-----
`
JDBC (Java DataBase Connectivity)
`
Найти инсталляционник не удаётся (в т.ч. на
записанных ранее CD).
Проинсталлировано в d:\programs\jdbc\ .
На http://java.sun.com/products/jdbc/download.html утв.,
что в J2SE уже есть java.sql и javax.sql, и вроде ничего
с данной страницы скачивать не нужно (и тогда неясно,
зачем эта страница вообще нужна). На всякий случай в
d:\sekirin\p2\programs\jdbc\ заносим содержимое из
d:\programs\jdbc\ .
Перед проверкой работоспособности следует
вначале добиться работы системы выполнения явы и
MySQL. Затем для проверки собственно JDBC: из
d:\sekirin\p1\izuchen\evm\java\jdbc\ взять
Show_db.java, оттранслир. и запустить. Если всё
нормально, программа должна сообщить, что найдена
единственная база - mysql. Поскольку исходник
занимает ~3 кб, здесь его не приводим.
Prime`anie: a pri wystawlenii w Internet priwodim.
// Zamysel: pokazatx wse dostupnye bazy, dlq kavd. bazy - tablicy,
// dlq kavd. tablicy - `islo zapisej, a esli polu`itsq - imena polej.
// Uve pokazywaet spisok baz dannyh.
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.ResultSet;
public class Show_db {
static Connection conn;
static Statement stmt;
static ResultSet rs;
public static void initio() {
String url;
System.out.println(" initio poluch. upr.");
try {
Class.forName("com.mysql.jdbc.Driver").newInstance();
System.out.println(" Class.forName otrabotal.");
url = "jdbc:mysql://localhost/?user=root&password=";
conn = DriverManager.getConnection(url);
System.out.println(" DriverManager.getConnection otrab.");
stmt = conn.createStatement();
} catch ( Exception ex2) {
// newInstance movet -> java.lang.InstantiationException .
System.out.println("Exception ex2: " + ex2.getMessage());
}
System.out.println(" initio: wozwr.");
}
public static void finali() {
System.out.println(" finali poluch. upr.");
try {
stmt.close();
conn.close();
System.out.println(" conn.close otrabotal.");
} catch (SQLException ex1) {
// stmt.close i conn.close mogut -> java.sql.SQLException .
System.out.println("SQLException: " + ex1.getMessage());
System.out.println("SQLState: " + ex1.getSQLState());
System.out.println("VendorError: " + ex1.getErrorCode());
}
System.out.println(" finali: wozwr.");
}
public static void main(String args[]) {
stmt = null;
rs = null;
String s0,s,nazw,ispolnitelx;
boolean gef,g;
int i,j;
System.out.println("main poluch. upr.");
initio();
try {
rs = stmt.executeQuery("show databases");
System.out.println("\n- databases \\");
while (rs.next()) {
s = rs.getString(1);
System.out.println(" ----- " + s);
}
System.out.println("- databases /\n");
rs.close();
} catch (SQLException ex1) {
// rs.close movet -> java.sql.SQLException .
System.out.println("SQLException: " + ex1.getMessage());
System.out.println("SQLState: " + ex1.getSQLState());
System.out.println("VendorError: " + ex1.getErrorCode());
}
finali();
System.out.println("main: konec.");
}
}
`
Возм., этот пакет вообще не используется.
`
-----
`
Fujaba.
`
Угаров говорил о важности UML (Universal
Modeling Language); по этому названию найден пакет
Fujaba (From UML to Java And Back Again).
Инсталляционник - в
d:\sekirin\p1\programs\fujaba\ ;
проинсталлирована в d:\programs\fujaba .
Пока лишь убедились, что пакет дышит, но не
освоили его.
`
-----
`
(Конец описания необходимых компонентов)