Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lection_servlets.doc
Скачиваний:
30
Добавлен:
23.02.2016
Размер:
356.35 Кб
Скачать

Перенаправлення запитів з 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 обробляються практично однаково. В аплетів це не так. Існують декілька підходів для використання аплетів у якості клієнтських інтерфейсів:

  1. аплет імітує HTML-форму, яка використовується для пересилки даних методом GET, а підготовлена на основі даних користувача результуюча сторінка відображається браузером.

  2. аплет посилає сервлету дані методом GET , а потім сам обробляє результати.

  3. аплет посилає сервлети дані методом POST, а потім сам обробляє результати

  4. обхід 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 етапів:

  1. Створення об’єкта 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);

  1. Створити об’єкт класу URLConnection

URLConnection connection = dataURL.openConnection();

  1. Дати браузеру вказівку не керувати дані URL.

Connection.setUseCaches(false);

  1. Задати всі необхідні HTTP-заголовки

Connection.setRequestProperty(“header”,”value”);

  1. Створити вхідний потік

BufferReader in = new BufferReader(new InputStream(connection.getInputStream()));

  1. Прочитати документ по строчно. Специфікація НТТР визначає, що сервер закриває з’єднання, коли закінчене читання докумету

  2. Закрити вхідний потік.

in.close();

При цьому сервлет як правило повертає дані у вигляді простого тексту

response.setContentType(“text/plain”);

Варіант 3. Даний варіант має більше кроків ніж попередній.

1-3 Кроки аналогічні варіанту 2.

  1. Повідомити системі, що ви можете не тільки читати, а й посилати дані.

Connection.setDoOutput(true);

  1. Створити об’єкт класу ByteOutputStream для буферизація даних.

ByteArrayOutputStream byStream = new ByteArrayOutputStream(512);

  1. Під’єднати віхідний потік аплета до байтового потоку

PrintWriter out = new PrintWriter(byteStream,true);

  1. Помістити дані в буфер

out.print(data);

out.flush();

  1. Задати заголовок Content-Length (обов’язковий лише для методу POST) та Content-Type

Connection.setRequestProperty(“Content-Length”,String.valueOf(byteStream.size()));

Connection.setRequestProperty(“Content-Type”,”……”);

  1. Послати дані

byteStream.writeTo(connection.getOutputStream());

  1. Відкрити вхідний потік

BufferReader in = new BufferReader(new InputStream(connection.getInputStream()));

  1. Прочитати результат

String line;

While((line=in.readLine())!=null)

{. . . . .}

Варіант 4. Передача даних між аплетом і сервлетом може здійснюватися за допомогою відкриття сокетного з’єднання між цими частинами програми. Сокетне з’єднання розглядалося в Java.

25

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]