- •Основні відомості про сервлети і JavaServer Pages
- •Базова структура сервлетів
- •Життєвий цикл сервлета
- •Метод init
- •Метод service
- •Інтерфейс SingleThreadModel
- •Метод destroy
- •Обробка клієнтських запитів
- •Заголовки http-запиту
- •Коди станів http
- •Заголовки http-відповіді
- •Обробка cookies
- •Атрибути cookie
- •Відслідкування сеансу
- •Отримання інформації про сеанс
- •Перегляд інформації про сеанс
- •Кодування адрес url, надісланих клієнту
- •Елементи сценарію jsp
- •Вирази jsp
- •Скриплети jsp
- •Оголошення jsp
- •Інші наперед визначенізмінні
- •Директива сторінки jsp
- •Включення файлів і аплетів у документи jsp
- •Використання JavaBeans з jsp
- •Основи використання bean-компонентів
- •Доступ до властивостей bean-компонентів
- •Сумісне використання bean-компонентів
- •Робота з базами даних
- •Завантаження тареєстрація драйвера
- •Визначення url для встановлення з’єднання
- •Встановлення з’єднання
- •Створення об’єкту для передачі операторів sql
- •Формування запиту для виконання
- •Виконання запиту
- •Обробка результатів
- •Завершення з’єднання
- •Попередньо відкомпільовані (підготовлені) запити
- •Пакетне виконання sql запитів
- •Виконання внутрішніх процедур
- •Інтегрування сервлетів і jsp-сторінок Перенаправлення запитів із сервлетів
- •Передача інформації на сторінки призначення
- •Перенаправлення запитів з jsp-сторінок
- •Використання аплетів у якості клієнтських інтерфейсів сервлетів
Перенаправлення запитів з jsp-сторінок
Для перенапрвлення запитів зі сторінок JSP використовують дію jsp:forward:
<jsp:forward page=”Relative URL” />
В атрибуті page можуть міститися JSP-вирази, отже сторінка призначення може обчислюватися під час запиту, наприклад:
<% String destination;
if (Math.random() > 0.5) {
destination = “/examples/page1.jsp”;
} else (
destination = “/examples/page2.jsp”;
}
%>
<jsp:forward page=”<%= destination %>” />
Використання аплетів у якості клієнтських інтерфейсів сервлетів
Використання HTML-форм це простий спосіб отримання від клієнта даних і пересилки їх сервлету чи JSP сторінці. Однак можливості таких форм обмежені. В ряді випадків необхідно отримати більш складний інтерфейс. В таких випадках можна використати аплети, які дозволяють управляти графікою та мають достатньо велику кількість елементів графічного інтерфейсу. Вони також дозволяють обробляти події та підтримують розробку нестандартних елементів управління для вводу даних користувачем.
При використанні HTML-форм запити методами GET та POST обробляються практично однаково. В аплетів це не так. Існують декілька підходів для використання аплетів у якості клієнтських інтерфейсів:
аплет імітує HTML-форму, яка використовується для пересилки даних методом GET, а підготовлена на основі даних користувача результуюча сторінка відображається браузером.
аплет посилає сервлету дані методом GET , а потім сам обробляє результати.
аплет посилає сервлети дані методом POST, а потім сам обробляє результати
обхід HTTP-сервера і звернення безпосередньо до серверної програми, яка виконується на домашній машині аплета.
Випадок 1.
Метод showDocument контекста аплета дає браузеру вказівку відобразити документ з вказаним URL. Надсилати дані сервлету можна створивши строку та додаючи їхв кінець (у відповідному форматі). Після цього з заданої строки формується URL адреса.
Приклад.
try{
URL someURL = new URL(someString +”?”+someData);
getAppletContext().showDocument(someURL);
} catch (MalformedURLException e) { . . . }
Однак при посиланні запиту браузером, URL кодується. Це означає що всі знаки пропуску замінюються пробілами, а кожен не алфавітно-цифровий символ замінюється занком % та кодом даного символа. В прикладі вважається, що URL вже правильно сформований. Тому, якщо у немає сформованого URL, то це можна здійснити за допомогою класу URLEncoder.
Приклад.
String someData = name1+”=”+URLEncoder(value1)+”&”+
name2+”=”+URLEncoder(value2)+”&”+
name3+”=”+URLEncoder(value1);
try{
URL someURL = new URL(someString +”?”+someData);
getAppletContext().showDocument(someURL);
} catch (MalformedURLException e) { . . . }
Випадок 2. (HTTP-тунелювання)
Другий випадок корисно використовувати, якщо ви розробляєте клієнтську та серверну частину програми. В таких випадках корисно повертати результати аплету, який надіслав дані. Після цього аплет може перетворити ці дані в будь яке необхідне для користувача представлення.
Існує два основні варіанти реалізації такого підходу. Для відкриття потоку з адреси URL обидва використовують класс URLConnection. Відмінність полягає лише в тому, який тип потоку вони використовують. Реалізація такого підходу на стороні клієнта складається з 7 етапів:
Створення об’єкта URL, який посилається на домашній хост аплета.
URL currentPage = getCodeBase();
String protocol = currentPage.getProtocol();
String host = currentPage.getHost();
Int port = currentPage.getPort();
String urlSufix = “/servlet/SomeServlet”;
URL dataURL = new URL(protocol,host,port,urlSufix);
Створити об’єкт класу URLConnection
URLConnection connection = dataURL.openConnection();
Дати браузеру вказівку не керувати дані URL.
Connection.setUseCaches(false);
Задати всі необхідні HTTP-заголовки
Connection.setRequestProperty(“header”,”value”);
Створити вхідний потік
BufferReader in = new BufferReader(new InputStream(connection.getInputStream()));
Прочитати документ по строчно. Специфікація НТТР визначає, що сервер закриває з’єднання, коли закінчене читання докумету
Закрити вхідний потік.
in.close();
При цьому сервлет як правило повертає дані у вигляді простого тексту
response.setContentType(“text/plain”);
Варіант 3. Даний варіант має більше кроків ніж попередній.
1-3 Кроки аналогічні варіанту 2.
Повідомити системі, що ви можете не тільки читати, а й посилати дані.
Connection.setDoOutput(true);
Створити об’єкт класу ByteOutputStream для буферизація даних.
ByteArrayOutputStream byStream = new ByteArrayOutputStream(512);
Під’єднати віхідний потік аплета до байтового потоку
PrintWriter out = new PrintWriter(byteStream,true);
Помістити дані в буфер
out.print(data);
out.flush();
Задати заголовок Content-Length (обов’язковий лише для методу POST) та Content-Type
Connection.setRequestProperty(“Content-Length”,String.valueOf(byteStream.size()));
Connection.setRequestProperty(“Content-Type”,”……”);
Послати дані
byteStream.writeTo(connection.getOutputStream());
Відкрити вхідний потік
BufferReader in = new BufferReader(new InputStream(connection.getInputStream()));
Прочитати результат
String line;
While((line=in.readLine())!=null)
{. . . . .}
Варіант 4. Передача даних між аплетом і сервлетом може здійснюватися за допомогою відкриття сокетного з’єднання між цими частинами програми. Сокетне з’єднання розглядалося в Java.