- •Основні відомості про сервлети і 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-сторінок
- •Використання аплетів у якості клієнтських інтерфейсів сервлетів
Метод service
Коли сервер отримує запит до сервлету, він породжує новий потік і викликає метод service(). Він перевіряє тип HTTP-запиту (GET, POST, PUT, DELETE і т.д.) і, відповідно , викликає метод doGet(), doPost(), doPut(), doDelete()і т.д.
Не рекомендується перевизначати метод service() у сервлетах.
Інтерфейс SingleThreadModel
Звичайно система створює єдиний екземпляр сервлета, а потім породжує новий потік для кожного запиту користувача. Якщо новий запит поступає у той час, коли виконується попередній, то одночасно існує декілька потоків. Це означає, що методи doGet()і doPost() повинні мати ретельно синхронізований доступ до полів та інших сумісно використовуваних даних. Для запобігання одночасного доступу з боку декількох потоків, реалізація сервлета повинна мати інтерфейс SingleThreadModel:
public class YourServlet extends HttpServlet implements SingleThreadModel {
// код сервлету
}
При цьомусистема гарантує, що тільки один потік запиту отримуватиме доступ до єдиного екземпляра сервлету. Однак все-таки необхідно синхронізувати доступ до змінних класу (static) або сумісно використовуваним даним, що знаходяться поза сервлетом.
Метод destroy
Сервер може видалити раніше завантажений екземпляр сервлету або за командою адміністратора, або через те, що сервлет не працює протягом довгого періоду часу. Перед вивантаженням сервлету викликається його метод destroy(). Цей метод надає сервлету можливість закрити з’єднання з базою даних, зупинити фонові потоки, зберегти списки cookie або лічильники відвідувань і т.д.
Обробка клієнтських запитів
Найбільш загальним способом передачі інформації з web-сторінки в серверну програму є використання даних форм (form data або query data). Дані форми додаються в кінець URL адреси, якщо це GET-запити, або надсилаються серверу в окремому рядку, якщо це POST-запити, наприклад:
http://host/path?user=Michael+Jackson&origin=USA&color=white
Сервлети автоматично виконують синтаксичний аналіз даних форми. Для цього необхідно викликати метод getParameter() класу HTTPServletRequest, задавши ім’я параметру (чуттєве до регістру) у якості аргументу. Метод повертає значення типу String, в якому знаходиться значення першої появи цього імені параметра після декодування URL. Якщо параметр існує, але не має значення, то повертається порожній рядок. Якщо такого параметру не існує, повертається null.
Якщо параметр потенційно може мати більше одного значення, необхідно викликати метод getParameterValues(), який повертає масив рядків.
Коли необхідно отримати повний список параметрів, використовується метод getParameterNames(), який повертає його у виді об’єкту класу Enumeration, кожен з елементів якого може бути приведений до типу String і використаний у виклику getParameter() або getParameterValues().
У наступному прикладі сервлет отримує два параметри: ім’я (name)іпрізвище (surname) та виводить їх у вихідний документ.
import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class Greeting extends HttpServlet {
public void doGet (HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
String name = request.getParameter("name");
String surname = request.getParameter("surname");
out.println("<HTML>\n"+
"<HEAD><TITLE>Greeting Page</TITLE></HEAD>\n"+
"<BODY>\n"+
"<P align=center>Hi, "+name+" "+surname+”!</P>\n"+
"</BODY></HTML>");
}
}
HTML-код форми, з якої викликається сервлет:
<html>
<head>
<title>Registration Page</title>
</head>
<body bgcolor=”#FDF5E6”>
<h1 align=”center”>Enter your name</h1>
<form action=”/servlet/Greeting”>
Name: <input type=”text” name=”name”><br>
Surname: <input type=”text” name=”surname”><br>
<input type=”submit”>
</form>
</body>
</html>