- •Амурский государственный университет Факультет математики и информатики
- •Допущено учебно-методическим объединением (умо) вузов
- •Методические указания к лабораторной работе
- •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. Вспомогательные классы
Чтобы успешно использовать сервлеты, необходимо ознакомиться с рядом вспомогательных классов. Для начала узнаем, какие методы предлагает интерфейс ServletRequest, передающий сервлету запрос от клиента. Конечно же, запрос поступает не в том виде, в котором он приходит на сервер. Поток данных от клиента сортируется и упаковывается. Далее, вызывая методы интерфейса ServerRequest, можно получать определенный тип данных, посланных клиентом. Так, метод getCharacterEncoding определяет символьную кодировку запроса, а методы getContentType и getProtocol - MIME-тип пришедшего запроса, а также название и версию протокола соответственно. Информацию об имени сервера, принявшего запрос, и порте, на котором запрос был "услышан" сервером, выдают методы getServerName и getServerPort. Интересные данные можно узнать и о клиенте, от имени которого пришел запрос. Его IP-адрес возвращается методом getRemoteAddr, а его имя - методом getRemoteHost.
Если вас интересует прямой доступ к содержимому полученного запроса, самый надежный способ получить его - вызвать метод getInputStream или getReader. Первый возвращает ссылку на объект класса ServletInputStream, а второй - на BufferedReader. После этого можно читать любой байт из полученного запроса, используя технику работы с потоками Java.
Если, обращаясь к серверу, клиент помимо универсального адреса задал параметры, сервлету может понадобиться узнать их значение. Примером может служить электронная анкета, выполненная в виде Web-страницы с формой ввода, значения полей и кнопок которой автоматически преобразуются в параметры URL. Три специальных метода в интерфейсе ServletRequest занимаются разбором параметров и "выдачей на-гора" их значений. Первый из них, getParameter, возвращает значение параметра по его имени или null, если параметра с таким именем нет. Похожий метод, getParameterValues, возвращает массив строк, если задан сложный параметр, скажем, значения полей формы. И еще один метод, getParameterNames, возвращает энумератор, позволяющий узнать имена всех присланных параметров.
В классе HttpServletRequest имеются различные дополнительные методы, обеспечивающие программисту доступ к деталям протокола HTTP. Так, вы можете запросить массив cookies, полученный с запросом, используя метод getCookies. Узнать о методе доступа к ресурсам, на основе которого построен запрос, можно с помощью вызова getMethod. Строку запроса HTTP можно получить методом getQueryString. Даже имя пользователя, выполнившего запрос, не укроется от сервлета, если применить метод getRemoteUser.
Это, разумеется, лишь малая толика тех возможностей, которыми обладают вышеупомянутые классы ServletRequest и HttpServletRequest. Поэтому следует внимательно прочитать документацию по Servlet API.
Генерируемые сервлетами данные пересылаются серверу-контейнеру с помощью объектов, наследующих интерфейс ServletResponse, а сервер, в свою очередь, пересылает ответ клиенту, инициировавшему запрос. У интерфейса ServletResponse всего несколько методов, причем полезными оказываются не все. Чаще всего приходится задавать MIME-тип генерируемых данных методом setContentType и находить ссылки на потоки вывода двумя другими методами: getOutputStream возвращает ссылку на поток ServletOutputStream, а метод getWriter вернет ссылку на поток типа PrintWriter. Вы увидите, как ими пользоваться, когда мы будем рассматривать практический пример.
В классе HttpServletResponse, реализующем интерфейс ServletResponse, обнаруживаются еще несколько полезных методов. Например, вы можете переслать cookie на клиентскую станцию, вызвав метод addCookie. О возникших ошибках сообщается вызовом sendError, которому в качестве параметра передается код ошибки и при необходимости текстовое сообщение. Кроме того, по мере надобности в заголовок ответа можно добавлять параметры, для чего служит метод setDateHeader.
Ранее уже упоминался метод getServletConfig, но не было сказано об объекте ServletConfig, у которого имеются очень полезные методы. Инсталлируя сервлет на сервере, вы можете задавать параметры инициализации, о которых будет сказано в следующей части. Имена этих параметров можно получить через энумератор, возвращаемый методом getInitParameterNames. Значение же конкретного параметра получают вызовом getInitParameter. Также важен метод получения контекста сервлета getServletContext, через обращение к которому можно узнать много полезного о среде, в которой запущен и выполняется сервлет.
Контекст выполнения сервлета интересен тем, что дает примитивные средства для общения с сервером. Скажем, для выполнения задачи требуется узнать MIME-тип того или иного файла. Всегда пожалуйста, вызовите метод getMimeType контекста. Или нужно узнать истинный маршрут файла относительно каталога, в котором сервер хранит документы. Тоже нет проблем, метод getRealPath к вашим услугам. Информация же о самом сервере предоставляется по вызову getServerInfo().
Отдельно стоят метод, загружающий сервлет по имени getServlet, и метод, возвращающий энумератор с именами всех установленных сервлетов getServletNames. Однако не рекомендуется пользоваться ими, так как в будущей версии Java Servlet Development Kit их может уже и не быть.
И напоследок самый важный метод log. С его помощью нужные текстовые данные пишутся в протокол работы сервлетов.
