
- •Амурский государственный университет Факультет математики и информатики
- •Допущено учебно-методическим объединением (умо) вузов
- •Методические указания к лабораторной работе
- •1. Простейшее приложение Hello
- •2. Структура Java-программы
- •2.1 Переменные
- •2.1.1 Примитивные типы
- •2.1.2 Ссылочные типы
- •2.2 Методы
- •2.3 Классы
- •2.3.1 Статические и динамические элементы (модификатор static)
- •2.3.2 Модификаторы доступа
- •2.3.3 Наследование классов
- •2.3.4 Специальные переменные
- •2.4 Пакеты и импортирование
- •2.4.1 Использование пакетов
- •2.4.2 Создание пакетов
- •Задания к лабораторной работе
- •Контрольные вопросы
- •Методические указания к лабораторной работе
- •1. Простейший апплет Hello
- •1.1 Апплет Неllo, управляемый мышью
- •2. Простейший апплет HelloApplet, созданный Java Applet Wizard
- •2.1 Создание шаблона апплета HelloApplet
- •2.2 Исходные файлы апплета HelloApplet
- •2.3 Упрощенный вариант исходного текста апплета HelloApplet
- •3. Аргументы апплета
- •3.1 Передача параметров апплету
- •3.2 Апплет, принимающий параметры
- •3.4 Двойная буферизация графического изображения
- •4. События и их обработка
- •4.1 Обработчики событий от мыши и клавиатуры
- •4.2 Обработка событий
- •4.3 Апплет, обрабатывающий события
- •4.4 Устранение мерцания при выводе, двойная буферизация
- •5. Апплеты двойного назначения
- •Задания к лабораторной работе
- •Контрольные вопросы
- •Методические указания к лабораторной работе
- •1. Рисование в окне
- •1.1 Графика
- •1.2 Цвет
- •1.3 Шрифты
- •1.4 Приложение FontsList
- •2. Обработка событий
- •2.1 Как обрабатываются события
- •2.2 События от мыши
- •2.3 Приложение LinesDraw
- •2.4 События от клавиатуры
- •2.5 Приложение KeyCodes
- •Задания к лабораторной работе
- •Контрольные вопросы
- •Методические указания к лабораторной работе
- •1. Компоненты gui
- •2. Устройства или элементы управления
- •2.1 Кнопки
- •2.2 Флажки (или переключатели)
- •2.3 Меню выбора (или выпадающие списки)
- •2.4 Раскрывающиеся списки
- •2.5 Полосы прокрутки
- •2.6 Метки
- •2.7 Текстовые компоненты
- •3. Приложение AllElements
- •Задания к лабораторной работе
- •Контрольные вопросы
- •Методические указания к лабораторной работе
- •1. Контейнеры
- •1.1 Панели
- •1.2 Окна
- •1.3 Рамки, фреймы
- •2. Менеджеры размещения компонентов
- •2.1 Типы менеджеров размещения
- •3. Поведение контейнера при наличии элементов управления
- •4. Приложение PanelsDemo1
- •5. Приложение PanelsDemo2
- •6. Приложение WindowsDemo
- •Задания к лабораторной работе
- •Контрольные вопросы
- •Методические указания к лабораторной работе
- •1. Процессы, задачи и приоритеты
- •2. Реализация многозадачности в Java
- •2.1 Создание подкласса Thread
- •2.2 Реализация интерфейса Runnable
- •2.3 Применение мультизадачности для анимации
- •2.4 Апплет двойного назначения, реализующий интерфейс Runnable
- •3. Потоки (нити)
- •3.1 Состояние потока
- •3.2 Исключительные ситуации для потоков
- •3.3 Приоритеты потоков
- •3.4 Группы потоков
- •4. Приложение VertScroller
- •Задания к лабораторной работе
- •Контрольные вопросы
- •Автономные приложения. Потоки данных. Работа с локальными файлами (2 часа) методические указания к лабораторной работе
- •1. Самостоятельные графические приложения
- •2. Потоки ввода-вывода в Java
- •2.1. Обзор классов Java для работы с потоками
- •2.2 Стандартные потоки ввода-вывода
- •2.3 Потоки, связанные с локальными файлами
- •2.3.1 Создание потоков, связанных с локальными файлами
- •2.3.2 Запись данных в поток и чтение их из потока
- •2.3.3 Закрытие потоков
- •2.3.4 Принудительный сброс буферов
- •2.3.5 Приложение StreamDemo
- •2.4 Потоки в оперативной памяти
- •3 Работа с локальной файловой система
- •3.1 Работа с файлами и каталогами
- •3.2 Приложение DirList
- •3.3 Произвольный доступ к файлам
- •3.4 Просмотр локальной файловой системы
- •3.5 Приложение FileDialogDemo
- •Задания к лабораторной работе
- •Контрольные вопросы
- •Сетевые приложения: передача данных с использованием сокетов (2 часа)
- •1. Сокеты
- •2. Протокол tcp/ip, адрес ip и класс InetAddress
- •3. Потоковые сокеты
- •3.1 Создание и использование канала передачи данных
- •3.2 Конструкторы и методы класса Socket
- •3.3 Пример использования потоковых сокетов
- •4. Датаграммные сокеты (несвязываемые датаграммы)
- •4.1 Конструкторы и методы класса DatagramSocket
- •4.3 Пример использования датаграммных сокетов
- •5 Приложения ServerSocketApp и ClientSocketApp
- •Задания к лабораторной работе
- •Контрольные вопросы
- •Связь по сети с помощью url (2 часа) методические указания к лабораторной работе
- •1. Универсальный адрес ресурсов url
- •2. Класс java.Net.Url в библиотеке классов Java
- •3. Использование класса java.Net.Url
- •3.1 Чтение из потока класса InputStream, полученного от объекта класса url
- •3.2 Получение содержимого файла, связанного с объектом класса url
- •4. Соединение с помощью объекта класса urlConnection
- •5. Приложение Diagram
- •Задания к лабораторной работе
- •Контрольные вопросы
- •Создание и использование сервлетов (2 часа) методические указания к лабораторной работе
- •1. Как устроен сервлет
- •2. Вспомогательные классы
- •3. Запуск и настройка сервлетов
- •4. Сервлет example, принимающий параметры
- •5. Сервлет, обрабатывающий запросы на основе методов cet и post
- •6. Сервлет MyselfInfo
- •Задания к лабораторной работе
- •Контрольные вопросы
- •Работа с базами данных, использование интерфейса jdbc(2 часа) методические указания к лабораторной работе
- •1. Написание апплетов, сервлетов и приложений jdbc
- •1.1 Соединение с базой данных
- •1.2 Применение интерфейса DatabaseMetaData
- •1.3 Посылка статичных sql-запросов
- •1.4 Посылка параметризированных и частовыполняемых sql-запросов
- •1.5 Выборка результатов
- •1.6 Применение интерфейса ResultSetMetaData
- •1.7 Доступ к хранимым функциям и процедурам
- •1.8 Применение выходных параметров
- •2. Обработка исключений jdbc
- •3. Отладка приложений jdbc
- •4. Сервлет, работающий с информацией из базы данных
- •Задания к лабораторной работе
- •Контрольные вопросы
- •Приложение 1 java-файл простейшего апплета и html-документ со ссылкой на него
- •Приложение 2 java-файл апплета, принимающего параметры, и html-документ со ссылкой на него
- •Приложение 3 java-файл апплета, обрабатывающего простые события мыши, и html-документ со ссылкой на него
- •Приложение 4 java-файлы апплета двойного назначения и html-документ со ссылкой на него
- •Приложение 5 java-файлы апплета двойного назначения, обрабатывающего сообщения от мыши, и html-документ со ссылкой на него
- •Приложение 6 java-файл апплета двойного назначения, реализующего интерфейс runnable, и html-документ со ссылкой на него
- •Приложение 7 самостоятельное графическое java-приложение
2. Обработка исключений jdbc
Обработка исключений была опущена в предыдущих примерах, поскольку этот вопрос требует отдельного рассмотрения. Почти всякий вызов интерфейса JDBC, который выполняется в приложении, способен активизировать исключение, и поэтому он должен быть заключен в блок try. В интерфейсе JDBC определены три исключения в иерархической взаимосвязи. Эта иерархия сверху вниз выглядит следующим образом:
SQLException
SQLWarning
DataTruncation
Исключение SQLException активизируется методами интерфейса JDBC в том случае, если в базе данных возникает ошибка. Существует ряд методов, которые могут быть вызваны для выборки информации об ошибке:
Метод int getErrorCodeO возвращает код ошибки конкретной базы данных
Метод String getSQLState() возвращает состояние X/Open SQLState, связанное с ошибкой
Метод String getMessage() наследуется из класса java.lang.Exception (возвращает описание ошибки)
Исключения JDBC могут быть связаны в цепочку, поэтому, если во время выполнения одной операции возникает более одной ошибки, информация обо всех ошибках сохраняется. Метод getNextException() возвращает ссылку на следующее исключение в цепочке или пустое значение, если исключений больше нет.
SQLWarning представляет собой такое исключение, которое не активизируется, но связывается в цепочку с конкретным объектом ResultSet или объектом оператора, к которому оно применяется. Как и в случае с исключениями SQLException, в цепочку может быть связано более одного исключения SQLWarning. Метод getNextWarning() класса SQLWarning возвращает следующее предупреждение в цепочке или пустое значение, если предупреждений больше нет. Например, при обработке результирующего набора в приложении наличие предупреждений можно проверить с помощью метода getWarnings() следующим образом:
java.sql.SQLWarning warn=rset.getWarnings();
while(warn!=null)
{
// сделать что-нибудь с предупреждением
. . . . .. . . . .
warn=warn.getNextWarning();
}
Исключение DataTruncation является особым случаем исключения SQLWarning, которое применяется к значениям столбцов и параметров. Исключение DataTruncation может быть связано в цепочку с объектом результирующего набора, однако оно активизируется при его применении к объекту оператора. Оно предоставляет дополнительные методы определения индекса столбца или параметра, к которому оно применяется, фактической и ожидаемой длины и т.д. При связывании исключения DataTruncation в цепочку с результирующим набором отличить его от других предупреждений можно на основании значения "01004" его состояния SQLState. Приведенный выше фрагмент кода можно расширить для проверки усечения данных:
int colNum, javaLen, dbLen;
java.sql.SQLWarning warn=rset.getWarnings();
while(warn!=null)
{
if(warn.getSQLState()=="01004")
{
colName=((DataTruncation)warn).getIndex();
javaLen=((DataTruncation)warn).getTransferSize();
dbLen=((DataTruncation)warn).getDataSize();
// сделать что-нибудь с этой информацией
. . . . .. . . . .
}
else
{
// это другое исключение java.sql.SQLWarning
. . . . .. . . . .
}
warn=warn.getNextWarning();
}
Методы getTransferSize() и getDataSize() применяются к длине столбца или параметра интерфейса JDBC, а также столбца или параметра базы данных. Исключение DataTruncation, скорее всего, будет активизировано тогда, когда значение параметра в результате окажется слишком длинным. В этом случае оно не связывается в цепочку в виде предупреждения, но активизируется в виде исключения, которое должно быть перехвачено:
int parmName, javaLen, dbLen;
try
{
cstmt.executeUpdate();
}
catch(SQLException e)
{
while(e!=null)
{
if(e.getSQLState()=="01004")
{
parmName=((DataTruncation)warn).getIndex();
javaLen=((DataTruncation)warn).getTransferSize();
dbLen=((DataTruncation)warn).getDataSize();
// сделать что-нибудь с этой информацией
. . . . .. . . . .
}
else
{
// это другое исключение SQLException
. . . . .. . . . .
}
e=e.getNextWarning();
}
}
Исключение DataTruncation может быть перехвачено как исключение SQLException, поскольку оно происходит от исключения SQLException. А когда оно перехватывается как исключение SQLException, то последнее необходимо явно привести к исключению DataTruncation, прежде чем получить доступ к методам этого интерфейса.
Обработка перехваченного исключения SQLException в значительной степени зависит от конкретных потребностей приложения. В некоторых случаях может оказаться полезной просто повторная активизация перехваченного исключения или активизация исключения специально для конкретного приложения, чтобы его можно было обработать на более высоком уровне. При активизации исключения из блока catch следует рассмотреть ряд вопросов. Для тех читателей, которые знакомы с языком Java, очевидным является первое положение: активизация исключений из вложенных блоков try — далеко не самая удачная идея. Рассмотрим следующий пример, в котором активизируется исключение, являющееся расширением класса java.lang.Exception и определенное в приложении как DBException:
try
{
// некоторые операции получения объектов Java, присвоения значений и т.д.
. . . . . . . . . . .
try
{
// некоторые вызовы интерфейса JDBC
}
catch(SQLException sqle)
{
// выполнить очистку и активизировать исключение, чтобы его можно было активизировать на более высоком уровне
. . . . . . .
throw new DBException(sqle.getMessage(),sqle.getErrorCode());
}
}
catch(java.lang.Exception e)
{
// выполнить что-нибудь
. . . . . . .
}
Новое исключение DBException, активизированное из внутреннего блока, перехватывается во внешнем блоке, поскольку исключение DBException является потомком класса java.lang.Exception. Добиться требуемого результата можно с помощью нескольких перехватов для внешнего блока try:
try
{
// некоторые операции получения объектов Java, присвоения значений и т.д.
// некоторые вызовы интерфейса JDBC
. . . . . . . . . . .
}
catch(SQLException sqle)
{
// выполнить очистку и активизировать исключение, чтобы его можно было активизировать на более высоком уровне
. . . . . . .
throw new DBException(sqle.getMessage(),sqle.getErrorCode());
}
catch(java.lang.Exception e)
{
// выполнить что-нибудь
. . . . . . .
}
Исключения должны перехватываться от низшего к высшему уровню иерархии. Если исключение java.lang.Exception перехватывается до исключения DBException, то блок DBException не будет достигнут. В предыдущем примере информация из первого перехваченного исключения SQLException копируется в новое исключение DBException. Если же несколько исключений связываются в цепочку, тогда эта информация не сохраняется. Цепочка может быть сохранена в том случае, если исключение DBException расширяет класс java.lang.Exception с помощью метода SetNextException():
catch(Exception sqle)
{
DBException first=new DBException(sqle.getMessage(),sqle.getErrorCode());
sqle=sqle.getNextException();
while(sqle!=null)
{
first.setNextException(sqle);
}
throw first;
}
Для перехвата исключения SQLException нередко требуются дополнительные действия, особенно в контексте транзакции. Допустим, что в приложении определен метод, который выполняет вставку строки в три отдельные таблицы в течение одной транзакции. Если при этом любая из операций вставки потерпит неудачу, должен быть осуществлен откат всей транзакции. В этом случае следует выдать команду отката в обработчике исключений. Это лишь один простой пример множества ситуаций, в которых исключение SQLException требует выполнения очистки. Следует иметь в виду, что в результате вызовов интерфейса JDBC распределяются внешние ресурсы и изменяется состояние базы данных, и поэтому обработчики исключений нужно проектировать соответствующим образом.